@cedros/login-react 0.0.7 → 0.0.8
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/{AuthenticationSettings-BXdMia7P.js → AuthenticationSettings-EaQzrn7-.js} +1 -1
- package/dist/{AuthenticationSettings-BXdMia7P.js.map → AuthenticationSettings-EaQzrn7-.js.map} +1 -1
- package/dist/{AuthenticationSettings-Bfeqd7W-.cjs → AuthenticationSettings-UOHce4G0.cjs} +1 -1
- package/dist/{AuthenticationSettings-Bfeqd7W-.cjs.map → AuthenticationSettings-UOHce4G0.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-WGw9JvgT.cjs → CreditSystemSettings-BClUVM4R.cjs} +1 -1
- package/dist/{CreditSystemSettings-WGw9JvgT.cjs.map → CreditSystemSettings-BClUVM4R.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-DJMEmrf_.js → CreditSystemSettings-BcoLajmO.js} +1 -1
- package/dist/{CreditSystemSettings-DJMEmrf_.js.map → CreditSystemSettings-BcoLajmO.js.map} +1 -1
- package/dist/{DepositsSection-kAvvxI0T.js → DepositsSection-C6DUs6iI.js} +1 -1
- package/dist/{DepositsSection-kAvvxI0T.js.map → DepositsSection-C6DUs6iI.js.map} +1 -1
- package/dist/{DepositsSection-DU4Bhlqq.cjs → DepositsSection-DPr60Pty.cjs} +1 -1
- package/dist/{DepositsSection-DU4Bhlqq.cjs.map → DepositsSection-DPr60Pty.cjs.map} +1 -1
- package/dist/{EmailSettings-BVkP4RUk.cjs → EmailSettings-BM7tGO1t.cjs} +1 -1
- package/dist/{EmailSettings-BVkP4RUk.cjs.map → EmailSettings-BM7tGO1t.cjs.map} +1 -1
- package/dist/{EmailSettings-CVWUlpf0.js → EmailSettings-DFVkODH_.js} +1 -1
- package/dist/{EmailSettings-CVWUlpf0.js.map → EmailSettings-DFVkODH_.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DnfPy42K.js → EmbeddedWalletSettings-BnHEtzpS.js} +1 -1
- package/dist/{EmbeddedWalletSettings-DnfPy42K.js.map → EmbeddedWalletSettings-BnHEtzpS.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-DusUuNnf.cjs → EmbeddedWalletSettings-DGJST5MD.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-DusUuNnf.cjs.map → EmbeddedWalletSettings-DGJST5MD.cjs.map} +1 -1
- package/dist/{ServerSettings-BpuEK_Jg.cjs → ServerSettings-B2YxkgLu.cjs} +1 -1
- package/dist/{ServerSettings-BpuEK_Jg.cjs.map → ServerSettings-B2YxkgLu.cjs.map} +1 -1
- package/dist/{ServerSettings-Bf0ttYFA.js → ServerSettings-jIwIl7mV.js} +1 -1
- package/dist/{ServerSettings-Bf0ttYFA.js.map → ServerSettings-jIwIl7mV.js.map} +1 -1
- package/dist/TeamSection-CnCzNEe9.cjs +1 -0
- package/dist/TeamSection-CnCzNEe9.cjs.map +1 -0
- package/dist/TeamSection-D_9-sbM5.js +150 -0
- package/dist/TeamSection-D_9-sbM5.js.map +1 -0
- package/dist/{UsersSection-C5m0V9hD.js → UsersSection--yCs-uC9.js} +1 -1
- package/dist/{UsersSection-C5m0V9hD.js.map → UsersSection--yCs-uC9.js.map} +1 -1
- package/dist/{UsersSection-NKQI8uhX.cjs → UsersSection-nwTQCl2X.cjs} +1 -1
- package/dist/{UsersSection-NKQI8uhX.cjs.map → UsersSection-nwTQCl2X.cjs.map} +1 -1
- package/dist/{WebhookSettings-DgLem4Gn.cjs → WebhookSettings-CDLNe806.cjs} +1 -1
- package/dist/{WebhookSettings-DgLem4Gn.cjs.map → WebhookSettings-CDLNe806.cjs.map} +1 -1
- package/dist/{WebhookSettings-q5irnlg2.js → WebhookSettings-C_3R0bqk.js} +1 -1
- package/dist/{WebhookSettings-q5irnlg2.js.map → WebhookSettings-C_3R0bqk.js.map} +1 -1
- package/dist/{WithdrawalsSection-D7YieP1d.js → WithdrawalsSection-5I0Ax4H0.js} +1 -1
- package/dist/{WithdrawalsSection-D7YieP1d.js.map → WithdrawalsSection-5I0Ax4H0.js.map} +1 -1
- package/dist/{WithdrawalsSection-CwzpigYd.cjs → WithdrawalsSection-wDptaqpp.cjs} +1 -1
- package/dist/{WithdrawalsSection-CwzpigYd.cjs.map → WithdrawalsSection-wDptaqpp.cjs.map} +1 -1
- package/dist/components/deposit/admin/featureDisabled.d.ts +7 -2
- package/dist/{index-C_Zi7Tna.js → index-BO6O-6S_.js} +1104 -1142
- package/dist/index-BO6O-6S_.js.map +1 -0
- package/dist/{index-UErJ9d0z.cjs → index-RSdLR9t4.cjs} +12 -12
- package/dist/index-RSdLR9t4.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/TeamSection-BsQBGXeH.js +0 -132
- package/dist/TeamSection-BsQBGXeH.js.map +0 -1
- package/dist/TeamSection-D6NxE8fI.cjs +0 -1
- package/dist/TeamSection-D6NxE8fI.cjs.map +0 -1
- package/dist/index-C_Zi7Tna.js.map +0 -1
- package/dist/index-UErJ9d0z.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BO6O-6S_.js","sources":["../node_modules/@scure/base/lib/esm/index.js","../node_modules/@scure/bip39/esm/index.js","../node_modules/@scure/bip39/esm/wordlists/english.js","../src/crypto/bip39.ts","../src/components/LoginButton.tsx","../src/hooks/usePasswordReset.ts","../src/components/email/ForgotPasswordForm.tsx","../src/hooks/useAppleAuth.ts","../src/utils/deviceDetection.ts","../src/components/apple/AppleLoginButton.tsx","../src/utils/webauthnJson.ts","../src/hooks/useWebAuthn.ts","../src/components/webauthn/PasskeyLoginButton.tsx","../src/components/LoginForm.tsx","../src/components/shared/ErrorBoundary.tsx","../src/components/LoginModal.tsx","../src/components/email/ResetPasswordForm.tsx","../src/components/org/OrgAvatar.tsx","../src/components/org/OrgSelector.tsx","../src/components/org/icons.tsx","../src/components/org/OrgListView.tsx","../src/components/org/CreateOrgForm.tsx","../src/components/org/OrgSwitcher.tsx","../src/components/members/MemberList.tsx","../src/components/invites/InviteForm.tsx","../src/components/invites/InviteList.tsx","../src/components/sessions/SessionList.tsx","../src/components/wallet/RecoveryPhraseDisplay.tsx","../src/components/wallet/RecoveryPhraseInput.tsx","../src/components/wallet/CapabilityWarning.tsx","../src/hooks/useWalletDiscovery.ts","../src/hooks/useWalletEnrollment.ts","../src/components/wallet/WalletEnrollment.tsx","../src/hooks/useWalletSigning.ts","../src/components/wallet/PasskeyPrompt.tsx","../src/components/wallet/WalletUnlock.tsx","../src/hooks/useWalletRecovery.ts","../src/components/wallet/WalletRecovery.tsx","../src/components/wallet/WalletAddressRow.tsx","../src/components/wallet/WalletStatus.tsx","../src/components/wallet/WalletManager.tsx","../src/utils/systemSettingsApi.ts","../src/hooks/useSystemSettings.ts","../src/components/admin/SystemSettings.tsx","../src/utils/setupApi.ts","../src/hooks/useSetup.ts","../src/components/admin/SetupWizard.tsx","../src/hooks/useSettingsAutosave.ts","../src/components/admin/settings/settingsMetadata.ts","../src/components/admin/settings/settingsInputs.tsx","../src/components/admin/settings/AutosaveStatus.tsx","../src/components/admin/settings/SettingsPageLayout.tsx","../src/hooks/useSsoProviders.ts","../src/utils/orgApi.ts","../src/hooks/useOrgs.ts","../src/components/admin/settings/SsoProvidersSettings.tsx","../src/components/admin/settings/AuthenticationSettings.tsx","../src/components/admin/settings/EmbeddedWalletSettings.tsx","../src/components/admin/settings/SecuritySettings.tsx","../src/components/admin/settings/EmailSettings.tsx","../src/components/admin/settings/WebhookSettings.tsx","../src/components/admin/settings/MessagingSettings.tsx","../src/components/admin/settings/CreditSystemSettings.tsx","../src/components/admin/settings/ServerSettings.tsx","../src/utils/memberApi.ts","../src/hooks/useMembers.ts","../src/utils/inviteApi.ts","../src/hooks/useInvites.ts","../src/hooks/useServerFeatures.ts","../src/utils/adminUserApi.ts","../src/hooks/useAdminUsers.ts","../src/types/org.ts","../src/hooks/useDashboardPermissions.ts","../src/hooks/useAdminDeposits.ts","../src/components/admin/StatsBar.tsx","../src/components/deposit/admin/AdminDepositStats.tsx","../src/components/deposit/admin/AdminWithdrawalStats.tsx","../src/components/deposit/admin/AdminDepositList.tsx","../src/components/deposit/admin/AdminWithdrawalQueue.tsx","../src/components/deposit/admin/AdminPrivacyPeriodDeposits.tsx","../src/components/deposit/admin/AdminWithdrawalHistory.tsx","../src/components/admin/AdminUserList.tsx","../src/components/admin/AdminUserDetail.tsx","../src/components/admin/PermissionsSection.tsx","../src/components/admin/ProfileDropdown.tsx","../src/components/admin/CedrosAdminDashboard.tsx","../src/admin/AdminShell.tsx","../src/admin/icons.tsx","../src/admin/plugin.tsx","../node_modules/qrcode/lib/can-promise.js","../node_modules/qrcode/lib/core/utils.js","../node_modules/qrcode/lib/core/error-correction-level.js","../node_modules/qrcode/lib/core/bit-buffer.js","../node_modules/qrcode/lib/core/bit-matrix.js","../node_modules/qrcode/lib/core/alignment-pattern.js","../node_modules/qrcode/lib/core/finder-pattern.js","../node_modules/qrcode/lib/core/mask-pattern.js","../node_modules/qrcode/lib/core/error-correction-code.js","../node_modules/qrcode/lib/core/galois-field.js","../node_modules/qrcode/lib/core/polynomial.js","../node_modules/qrcode/lib/core/reed-solomon-encoder.js","../node_modules/qrcode/lib/core/version-check.js","../node_modules/qrcode/lib/core/regex.js","../node_modules/qrcode/lib/core/mode.js","../node_modules/qrcode/lib/core/version.js","../node_modules/qrcode/lib/core/format-info.js","../node_modules/qrcode/lib/core/numeric-data.js","../node_modules/qrcode/lib/core/alphanumeric-data.js","../node_modules/qrcode/lib/core/byte-data.js","../node_modules/qrcode/lib/core/kanji-data.js","../node_modules/dijkstrajs/dijkstra.js","../node_modules/qrcode/lib/core/segments.js","../node_modules/qrcode/lib/core/qrcode.js","../node_modules/qrcode/lib/renderer/utils.js","../node_modules/qrcode/lib/renderer/canvas.js","../node_modules/qrcode/lib/renderer/svg-tag.js","../node_modules/qrcode/lib/browser.js","../src/components/totp/QrCode.tsx","../src/hooks/useTotp.ts","../src/components/totp/TotpSetup.tsx","../src/components/totp/TotpSettings.tsx","../src/utils/profileApi.ts","../src/hooks/useProfile.ts","../src/components/profile/UserProfileSettings.tsx","../src/hooks/useDeposit.ts","../src/components/deposit/TokenSelector.tsx","../src/components/deposit/tierUtils.ts","../src/assets/tokens/sol.webp","../src/components/deposit/TieredAmountSlider.tsx","../src/components/deposit/DepositFlow.tsx","../src/assets/tokens/bonk.webp","../src/assets/tokens/cash.webp","../src/assets/tokens/eurc.webp","../src/assets/tokens/ore.webp","../src/assets/tokens/pyusd.webp","../src/assets/tokens/usdc.webp","../src/assets/tokens/usdh.svg","../src/assets/tokens/usd1.webp","../src/assets/tokens/usdt.svg","../src/components/deposit/tokens.ts","../src/hooks/useCredits.ts","../src/components/deposit/CreditBalance.tsx","../src/components/deposit/History.tsx","../src/components/templates/FullPageLayout.tsx","../src/components/templates/SplitPageLayout.tsx","../src/utils/sessionApi.ts","../src/hooks/useSessions.ts","../src/hooks/useAuthorize.ts","../src/hooks/usePendingRecovery.ts","../src/hooks/useTransactionSigning.ts","../src/i18n/context.ts","../src/i18n/translations.ts","../src/i18n/I18nProvider.tsx","../src/i18n/useI18n.ts"],"sourcesContent":["/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\nfunction isArrayOf(isString, arr) {\n if (!Array.isArray(arr))\n return false;\n if (arr.length === 0)\n return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n }\n else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n// no abytes: seems to have 10% slowdown. Why?!\nfunction afn(input) {\n if (typeof input !== 'function')\n throw new Error('function expected');\n return true;\n}\nfunction astr(label, input) {\n if (typeof input !== 'string')\n throw new Error(`${label}: string expected`);\n return true;\n}\nfunction anumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`invalid integer: ${n}`);\n}\nfunction aArr(input) {\n if (!Array.isArray(input))\n throw new Error('array expected');\n}\nfunction astrArr(label, input) {\n if (!isArrayOf(true, input))\n throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label, input) {\n if (!isArrayOf(false, input))\n throw new Error(`${label}: array of numbers expected`);\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain(...args) {\n const id = (a) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a, b) => (c) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters) {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(`alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`);\n return lettersA[i];\n });\n },\n decode: (input) => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = '') {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits, chr = '=') {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data) {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8)\n data.push(chr);\n return data;\n },\n decode(input) {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0)\n throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize(fn) {\n afn(fn);\n return { encode: (from) => from, decode: (to) => fn(to) };\n}\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data, from, to) {\n // base 1 is impossible\n if (from < 2)\n throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2)\n throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length)\n return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from)\n throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i];\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (!Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done)\n continue;\n else if (!rounded)\n pos = i;\n else\n done = false;\n }\n res.push(carry);\n if (done)\n break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++)\n res.push(0);\n return res.reverse();\n}\nconst gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));\nconst powers = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++)\n res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data, from, to, padding) {\n aArr(data);\n if (from <= 0 || from > 32)\n throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32)\n throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from];\n const mask = powers[to] - 1;\n const res = [];\n for (const n of data) {\n anumber(n);\n if (n >= max)\n throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32)\n throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to)\n res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined)\n throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from)\n throw new Error('Excess padding');\n if (!padding && carry > 0)\n throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0)\n res.push(carry >>> 0);\n return res;\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num) {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits, revPadding = false) {\n anumber(bits);\n if (bits <= 0 || bits > 32)\n throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes) => {\n if (!isBytes(bytes))\n throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\nfunction unsafeWrapper(fn) {\n afn(fn);\n return function (...args) {\n try {\n return fn.apply(null, args);\n }\n catch (e) { }\n };\n}\nfunction checksum(len, fn) {\n anumber(len);\n afn(fn);\n return {\n encode(data) {\n if (!isBytes(data))\n throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data) {\n if (!isBytes(data))\n throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i])\n throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n// prettier-ignore\nexport const utils = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n// RFC 4648 aka RFC 3548\n// ---------------------\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), join(''));\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), join(''));\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toBase64 === 'function' &&\n typeof Uint8Array.fromBase64 === 'function')();\nconst decodeBase64Builtin = (s, isUrl) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s))\n throw new Error('invalid base64');\n return Uint8Array.fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64 = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url = hasBase64Builtin ? {\n encode(b) { abytes(b); return b.toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join(''));\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc) => chain(radix(58), alphabet(abc), join(''));\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr = {\n encode(data) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');\n }\n return res;\n },\n decode(str) {\n let res = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0)\n throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), base58);\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check = createBase58check;\nconst BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre) {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1)\n chk ^= POLYMOD_GENERATORS[i];\n }\n return chk;\n}\nfunction bechChecksum(prefix, words, encodingConst = 1) {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126)\n throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++)\n chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words)\n chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++)\n chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false));\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding) {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n function encode(prefix, words, limit = 90) {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words))\n words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0)\n throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;\n }\n function decode(str, limit = 90) {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6)\n throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum))\n throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n const decodeUnsafe = unsafeWrapper(decode);\n function decodeToBytes(str) {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n function encodeFromBytes(prefix, bytes) {\n return encode(prefix, toWords(bytes));\n }\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32 = genBech32('bech32');\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m = genBech32('bech32m');\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8 = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toHex === 'function' &&\n typeof Uint8Array.fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin = {\n encode(data) { abytes(data); return data.toHex(); },\n decode(s) { astr('hex', s); return Uint8Array.fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex = hasHexBuiltin\n ? hexBuiltin\n : chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);\n return s.toLowerCase();\n }));\n// prettier-ignore\nconst CODERS = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\nconst coderTypeError = 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n/** @deprecated */\nexport const bytesToString = (type, bytes) => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (!isBytes(bytes))\n throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n/** @deprecated */\nexport const str = bytesToString; // as in python, but for bytes only\n/** @deprecated */\nexport const stringToBytes = (type, str) => {\n if (!CODERS.hasOwnProperty(type))\n throw new TypeError(coderTypeError);\n if (typeof str !== 'string')\n throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes = stringToBytes;\n//# sourceMappingURL=index.js.map","/**\n * Audited & minimal JS implementation of\n * [BIP39 mnemonic phrases](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).\n * @module\n * @example\n```js\nimport * as bip39 from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nconst mn = bip39.generateMnemonic(wordlist);\nconsole.log(mn);\nconst ent = bip39.mnemonicToEntropy(mn, wordlist)\nbip39.entropyToMnemonic(ent, wordlist);\nbip39.validateMnemonic(mn, wordlist);\nawait bip39.mnemonicToSeed(mn, 'password');\nbip39.mnemonicToSeedSync(mn, 'password');\n\n// Wordlists\nimport { wordlist as czech } from '@scure/bip39/wordlists/czech';\nimport { wordlist as english } from '@scure/bip39/wordlists/english';\nimport { wordlist as french } from '@scure/bip39/wordlists/french';\nimport { wordlist as italian } from '@scure/bip39/wordlists/italian';\nimport { wordlist as japanese } from '@scure/bip39/wordlists/japanese';\nimport { wordlist as korean } from '@scure/bip39/wordlists/korean';\nimport { wordlist as portuguese } from '@scure/bip39/wordlists/portuguese';\nimport { wordlist as simplifiedChinese } from '@scure/bip39/wordlists/simplified-chinese';\nimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish';\nimport { wordlist as traditionalChinese } from '@scure/bip39/wordlists/traditional-chinese';\n```\n */\n/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2';\nimport { sha256, sha512 } from '@noble/hashes/sha2';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent, 16, 20, 24, 28, 32);\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","export const wordlist = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo`.split('\\n');\n","/**\n * BIP-39 mnemonic encoding/decoding using @scure/bip39\n *\n * Used to encode Share C as a human-readable recovery phrase.\n *\n * Security:\n * - Uses the official BIP-39 English wordlist\n * - 12 words = 128 bits of entropy (16 bytes)\n * - Matches standard Solana wallet format (Phantom, Solflare, etc.)\n * - Includes checksum for error detection\n */\n\nimport {\n generateMnemonic,\n mnemonicToEntropy,\n entropyToMnemonic,\n validateMnemonic,\n} from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport type { Seed, ShamirShare } from './types';\nimport { toSeed, toShamirShare } from './types';\n\n/** Number of words in recovery phrase (12 = 128 bits, standard Solana format) */\nexport const MNEMONIC_WORD_COUNT = 12;\n\n/**\n * Encode a Shamir share as a BIP-39 mnemonic phrase\n *\n * @param share - 16-byte share to encode\n * @returns Array of 12 mnemonic words\n */\nexport function shareToMnemonic(share: ShamirShare): string[] {\n if (share.length !== 16) {\n throw new Error(`Invalid share length: expected 16, got ${share.length}`);\n }\n\n // entropyToMnemonic expects Uint8Array\n const mnemonic = entropyToMnemonic(share, wordlist);\n const words = mnemonic.split(' ');\n\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Unexpected word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n return words;\n}\n\n/**\n * Decode a BIP-39 mnemonic phrase back to a Shamir share\n *\n * @param words - Array of 12 mnemonic words\n * @returns 16-byte share\n * @throws Error if mnemonic is invalid\n */\nexport function mnemonicToShare(words: string[]): ShamirShare {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Invalid word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n\n // Validate mnemonic checksum\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new Error('Invalid recovery phrase: checksum mismatch');\n }\n\n // Convert back to entropy (our share)\n const entropy = mnemonicToEntropy(mnemonic, wordlist);\n\n if (entropy.length !== 16) {\n throw new Error(`Invalid entropy length: expected 16, got ${entropy.length}`);\n }\n\n return toShamirShare(entropy);\n}\n\n/**\n * Encode a 16-byte seed as a BIP-39 mnemonic phrase\n *\n * This is used for the recovery phrase which encodes the FULL SEED\n * (not a Shamir share) to allow complete wallet recovery.\n *\n * @param seed - 16-byte seed to encode\n * @returns Array of 12 mnemonic words\n */\nexport function seedToMnemonic(seed: Seed): string[] {\n if (seed.length !== 16) {\n throw new Error(`Invalid seed length: expected 16, got ${seed.length}`);\n }\n\n const mnemonic = entropyToMnemonic(seed, wordlist);\n const words = mnemonic.split(' ');\n\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Unexpected word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n return words;\n}\n\n/**\n * Decode a BIP-39 mnemonic phrase back to a seed\n *\n * This is used during recovery to restore the full wallet seed.\n *\n * @param words - Array of 12 mnemonic words\n * @returns 16-byte seed\n * @throws Error if mnemonic is invalid\n */\nexport function mnemonicToSeed(words: string[]): Seed {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n throw new Error(`Invalid word count: expected ${MNEMONIC_WORD_COUNT}, got ${words.length}`);\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n\n if (!validateMnemonic(mnemonic, wordlist)) {\n throw new Error('Invalid recovery phrase: checksum mismatch');\n }\n\n const entropy = mnemonicToEntropy(mnemonic, wordlist);\n\n if (entropy.length !== 16) {\n throw new Error(`Invalid entropy length: expected 16, got ${entropy.length}`);\n }\n\n return toSeed(entropy);\n}\n\n/**\n * Validate a mnemonic phrase without decoding\n *\n * @param words - Array of words to validate\n * @returns true if valid BIP-39 mnemonic\n */\nexport function isValidMnemonic(words: string[]): boolean {\n if (words.length !== MNEMONIC_WORD_COUNT) {\n return false;\n }\n\n const mnemonic = words.join(' ').toLowerCase().trim();\n return validateMnemonic(mnemonic, wordlist);\n}\n\n/**\n * Check if a single word is in the BIP-39 wordlist\n *\n * @param word - Word to check\n * @returns true if word is in the wordlist\n */\nexport function isValidWord(word: string): boolean {\n return wordlist.includes(word.toLowerCase().trim());\n}\n\n/**\n * Get word suggestions for autocomplete\n *\n * @param prefix - Partial word input\n * @param limit - Maximum number of suggestions\n * @returns Array of matching words from wordlist\n */\nexport function getWordSuggestions(prefix: string, limit: number = 5): string[] {\n const normalizedPrefix = prefix.toLowerCase().trim();\n\n if (normalizedPrefix.length === 0) {\n return [];\n }\n\n return wordlist.filter((word) => word.startsWith(normalizedPrefix)).slice(0, limit);\n}\n\n/**\n * Generate a random mnemonic for testing purposes\n *\n * WARNING: Do not use this for actual wallet generation.\n * Use the proper enrollment flow which generates a seed and splits it.\n *\n * @returns Array of 12 random words\n */\nexport function generateRandomMnemonic(): string[] {\n const mnemonic = generateMnemonic(wordlist, 128);\n return mnemonic.split(' ');\n}\n\n/**\n * Format mnemonic words for display (groups of 4)\n *\n * @param words - Array of mnemonic words\n * @returns Array of word groups\n */\nexport function formatMnemonicForDisplay(words: string[]): string[][] {\n const groups: string[][] = [];\n for (let i = 0; i < words.length; i += 4) {\n groups.push(words.slice(i, i + 4));\n }\n return groups;\n}\n\n/**\n * Parse user input into word array, handling various formats\n *\n * @param input - User input (space/comma/newline separated)\n * @returns Array of normalized words\n */\nexport function parseMnemonicInput(input: string): string[] {\n return input\n .toLowerCase()\n .replace(/[,\\n\\r\\t]+/g, ' ') // Replace separators with space\n .split(/\\s+/) // Split on whitespace\n .map((w) => w.trim())\n .filter((w) => w.length > 0);\n}\n\n/**\n * Securely wipe mnemonic array\n *\n * @security CRYPTO-2: This is BEST-EFFORT only. JavaScript strings are immutable\n * and the original word values WILL persist in memory until garbage collected.\n * See secureWipe.ts wipeString() for details on JS string wiping limitations.\n *\n * @param words - Array of words to wipe\n */\nexport function wipeMnemonic(words: string[]): void {\n // Replace all words with empty strings (best-effort - see CRYPTO-2)\n for (let i = 0; i < words.length; i++) {\n words[i] = '';\n }\n words.length = 0;\n}\n\n/**\n * Get the BIP-39 wordlist for UI purposes (e.g., validation indicators)\n *\n * @returns Copy of the wordlist\n */\nexport function getWordlist(): readonly string[] {\n return wordlist;\n}\n\n/**\n * Calculate the index of a word in the wordlist\n *\n * @param word - Word to look up\n * @returns Index (0-2047) or -1 if not found\n */\nexport function getWordIndex(word: string): number {\n return wordlist.indexOf(word.toLowerCase().trim());\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useAuth } from '../hooks/useAuth';\nimport { LoadingSpinner } from './shared/LoadingSpinner';\nimport { sanitizeImageUrl } from '../utils/sanitization';\n\nexport interface MenuItemConfig {\n /** Label to display */\n label: string;\n /** Click handler */\n onClick: () => void;\n /** Optional icon element */\n icon?: React.ReactNode;\n}\n\nexport interface LoginButtonProps {\n className?: string;\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n children?: React.ReactNode;\n /** Custom menu items to show above \"Sign out\" */\n menuItems?: MenuItemConfig[];\n /** Hide the default \"Sign out\" item (default: false) */\n hideSignOut?: boolean;\n}\n\n/**\n * Login button that opens the login modal when clicked.\n * Shows user info when authenticated.\n */\nexport function LoginButton({\n className = '',\n variant = 'default',\n size = 'md',\n children,\n menuItems = [],\n hideSignOut = false,\n}: LoginButtonProps) {\n const { user, isAuthenticated, isLoading, openLoginModal, logout } = useAuth();\n // L-08: State for keyboard-accessible dropdown\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const menuRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Build list of all menu items (custom items + sign out)\n // Memoize to avoid recreating array on every render (fixes react-hooks/exhaustive-deps warning)\n const allMenuItems = useMemo(\n () => [...menuItems, ...(hideSignOut ? [] : [{ label: 'Sign out', onClick: logout }])],\n [menuItems, hideSignOut, logout]\n );\n\n // L-08: Close menu on outside click or Escape\n useEffect(() => {\n if (!isMenuOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isMenuOpen]);\n\n // L-08: Keyboard navigation for menu\n const handleMenuKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isMenuOpen || allMenuItems.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setFocusedIndex((i) => (i + 1) % allMenuItems.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((i) => (i - 1 + allMenuItems.length) % allMenuItems.length);\n break;\n case 'Home':\n e.preventDefault();\n setFocusedIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setFocusedIndex(allMenuItems.length - 1);\n break;\n case 'Enter':\n case ' ':\n if (focusedIndex >= 0) {\n e.preventDefault();\n allMenuItems[focusedIndex].onClick();\n setIsMenuOpen(false);\n setFocusedIndex(-1);\n }\n break;\n }\n },\n [isMenuOpen, focusedIndex, allMenuItems]\n );\n\n const toggleMenu = useCallback(() => {\n if (allMenuItems.length === 0) return;\n setIsMenuOpen((open) => !open);\n setFocusedIndex(-1);\n }, [allMenuItems.length]);\n\n const sizeClasses = {\n sm: 'cedros-button-sm',\n md: 'cedros-button-md',\n lg: 'cedros-button-lg',\n };\n\n const variantClasses = {\n default: 'cedros-button-primary',\n outline: 'cedros-button-outline',\n ghost: 'cedros-button-ghost',\n };\n\n if (isLoading) {\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n disabled\n >\n <LoadingSpinner size=\"sm\" />\n </button>\n );\n }\n\n if (isAuthenticated && user) {\n const displayName = user.name || user.email || 'User';\n // COMP-07: Cache sanitized URL to avoid double-call and ensure consistent validation\n const sanitizedPicture = sanitizeImageUrl(user.picture);\n return (\n // L-08: Added keyboard handler and ref for accessibility\n <div className=\"cedros-user-menu\" ref={menuRef} onKeyDown={handleMenuKeyDown}>\n {/* M-13: Added ARIA attributes for accessibility */}\n <button\n ref={buttonRef}\n type=\"button\"\n className={`cedros-button cedros-user-button ${sizeClasses[size]} ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n aria-label={`User menu for ${displayName}`}\n onClick={toggleMenu}\n >\n {sanitizedPicture ? (\n <img\n src={sanitizedPicture}\n alt={displayName}\n className=\"cedros-user-avatar\"\n referrerPolicy=\"no-referrer\"\n crossOrigin=\"anonymous\"\n />\n ) : (\n <div className=\"cedros-user-avatar-placeholder\">\n {(displayName[0] || '?').toUpperCase()}\n </div>\n )}\n <span className=\"cedros-user-name\">{displayName}</span>\n </button>\n {/* M-13: Added role=\"menu\" for ARIA menu pattern */}\n {/* L-08: Show/hide controlled by state, keyboard navigable */}\n {isMenuOpen && (\n <div className=\"cedros-dropdown cedros-dropdown-open\" role=\"menu\">\n {menuItems.map((item, index) => (\n <button\n key={index}\n type=\"button\"\n className={`cedros-dropdown-item ${focusedIndex === index ? 'cedros-dropdown-item-focused' : ''}`}\n role=\"menuitem\"\n tabIndex={focusedIndex === index ? 0 : -1}\n onClick={() => {\n item.onClick();\n setIsMenuOpen(false);\n }}\n >\n {item.icon && <span className=\"cedros-dropdown-icon\">{item.icon}</span>}\n {item.label}\n </button>\n ))}\n {menuItems.length > 0 && !hideSignOut && (\n <div className=\"cedros-dropdown-divider\" role=\"separator\" />\n )}\n {!hideSignOut && (\n <button\n type=\"button\"\n className={`cedros-dropdown-item cedros-dropdown-item-danger ${focusedIndex === menuItems.length ? 'cedros-dropdown-item-focused' : ''}`}\n role=\"menuitem\"\n tabIndex={focusedIndex === menuItems.length ? 0 : -1}\n onClick={() => {\n logout();\n setIsMenuOpen(false);\n }}\n >\n Sign out\n </button>\n )}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n onClick={openLoginModal}\n >\n {children || 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { validateEmail } from '../utils/validation';\nimport { useRateLimiter } from './useRateLimiter';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthError } from '../types';\n\nexport interface UsePasswordResetReturn {\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, newPassword: string) => Promise<void>;\n isLoading: boolean;\n isSuccess: boolean;\n error: AuthError | null;\n clearError: () => void;\n reset: () => void;\n /** Number of remaining attempts before rate limiting */\n remainingAttempts: number;\n}\n\n/**\n * Hook for password reset functionality.\n *\n * @example\n * ```tsx\n * function ForgotPasswordForm() {\n * const { forgotPassword, isLoading, isSuccess, error } = usePasswordReset();\n *\n * const handleSubmit = async (e) => {\n * e.preventDefault();\n * await forgotPassword(email);\n * };\n *\n * if (isSuccess) {\n * return <p>Check your email for reset instructions</p>;\n * }\n * }\n * ```\n */\nexport function usePasswordReset(): UsePasswordResetReturn {\n const { config } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // M-08: Use ApiClient for consistent error handling and timeout/retry\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n // Rate limiter for password reset attempts (3 attempts per 5 minutes)\n const { checkLimit, getRemainingAttempts } = useRateLimiter({\n maxAttempts: 3,\n windowMs: 300000,\n });\n\n const forgotPassword = useCallback(\n async (email: string): Promise<void> => {\n // Validate email format before API call\n if (!validateEmail(email)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a valid email address',\n };\n setError(validationError);\n throw validationError;\n }\n\n // Check rate limit before API call\n try {\n checkLimit();\n } catch (err) {\n const rateLimitError: AuthError = {\n code: 'RATE_LIMITED',\n message: err instanceof Error ? err.message : 'Too many attempts',\n };\n setError(rateLimitError);\n throw rateLimitError;\n }\n\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n // M-08: Use ApiClient for consistent error handling\n await apiClient.post('/forgot-password', { email });\n setIsSuccess(true);\n } catch (err) {\n const authError = handleApiError(err, 'Failed to send reset email');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, checkLimit]\n );\n\n const resetPassword = useCallback(\n async (token: string, newPassword: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n // M-08: Use ApiClient for consistent error handling\n await apiClient.post('/reset-password', { token, newPassword });\n setIsSuccess(true);\n } catch (err) {\n const authError = handleApiError(err, 'Failed to reset password');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const reset = useCallback(() => {\n setError(null);\n setIsSuccess(false);\n setIsLoading(false);\n }, []);\n\n return {\n forgotPassword,\n resetPassword,\n isLoading,\n isSuccess,\n error,\n clearError,\n reset,\n remainingAttempts: getRemainingAttempts(),\n };\n}\n","import { useState, useId, type FormEvent } from 'react';\nimport { usePasswordReset } from '../../hooks/usePasswordReset';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\n\nexport interface ForgotPasswordFormProps {\n onSuccess?: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * Form for requesting a password reset email.\n *\n * @example\n * ```tsx\n * <ForgotPasswordForm\n * onSuccess={() => console.log('Email sent!')}\n * onCancel={() => setShowForgotPassword(false)}\n * />\n * ```\n */\nexport function ForgotPasswordForm({\n onSuccess,\n onCancel,\n className = '',\n}: ForgotPasswordFormProps) {\n const [email, setEmail] = useState('');\n const { forgotPassword, isLoading, isSuccess, error, clearError } = usePasswordReset();\n const emailId = useId();\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n try {\n await forgotPassword(email);\n onSuccess?.();\n } catch {\n // Error is already set in the hook\n }\n };\n\n if (isSuccess) {\n return (\n <div className={`cedros-forgot-password-success ${className}`}>\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-success-title\">Check your email</h3>\n <p className=\"cedros-success-message\">\n If an account exists for <strong>{email}</strong>, you will receive a password reset link\n shortly.\n </p>\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-outline\"\n onClick={onCancel}\n >\n Back to login\n </button>\n )}\n </div>\n );\n }\n\n return (\n <form className={`cedros-forgot-password-form ${className}`} onSubmit={handleSubmit}>\n <div className=\"cedros-form-header\">\n <h3 className=\"cedros-form-title\">Forgot password?</h3>\n <p className=\"cedros-form-subtitle\">\n Enter your email address and we'll send you a link to reset your password.\n </p>\n </div>\n\n <ErrorMessage error={error} onDismiss={clearError} />\n\n <div className=\"cedros-form-field\">\n <label htmlFor={emailId} className=\"cedros-label\">\n Email address\n </label>\n <input\n id={emailId}\n type=\"email\"\n className=\"cedros-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n disabled={isLoading}\n />\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-md cedros-button-primary cedros-button-full\"\n disabled={isLoading || !email}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n Sending...\n </>\n ) : (\n 'Send reset link'\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-ghost cedros-button-full\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back to login\n </button>\n )}\n </div>\n </form>\n );\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthResponse, AuthError } from '../types';\n\n// Module-level singleton for Apple Sign In script loading\n// Prevents race conditions when multiple components mount simultaneously\nconst scriptLoader = {\n loading: false,\n loaded: false,\n error: null as Error | null,\n callbacks: [] as Array<{ resolve: () => void; reject: (err: Error) => void }>,\n\n load(): Promise<void> {\n if (this.loaded) {\n return Promise.resolve();\n }\n\n if (this.loading) {\n return new Promise((resolve, reject) => {\n this.callbacks.push({ resolve, reject });\n });\n }\n\n this.loading = true;\n return new Promise((resolve, reject) => {\n this.callbacks.push({ resolve, reject });\n\n const existingScript = document.getElementById('apple-signin-script');\n if (existingScript) {\n if (window.AppleID) {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n } else {\n existingScript.addEventListener('load', () => {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n });\n }\n return;\n }\n\n const script = document.createElement('script');\n script.src =\n 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js';\n script.async = true;\n script.defer = true;\n script.id = 'apple-signin-script';\n\n script.onload = () => {\n this.loaded = true;\n this.loading = false;\n this.callbacks.forEach((cb) => cb.resolve());\n this.callbacks = [];\n };\n\n script.onerror = () => {\n this.loading = false;\n // M-03: Remove failed script from DOM to allow retry on next load() call.\n // Without removal, retry finds existingScript and waits for a load event\n // that will never fire on an already-failed script.\n script.remove();\n const error = new Error('Failed to load Apple Sign In script');\n this.callbacks.forEach((cb) => cb.reject(error));\n this.callbacks = [];\n };\n\n document.head.appendChild(script);\n });\n },\n};\n\nexport interface UseAppleAuthReturn {\n signIn: () => Promise<AuthResponse>;\n isLoading: boolean;\n isInitialized: boolean;\n error: AuthError | null;\n clearError: () => void;\n}\n\n/**\n * Hook for Apple Sign In authentication.\n *\n * @example\n * ```tsx\n * function AppleButton() {\n * const { signIn, isLoading, isInitialized, error } = useAppleAuth();\n *\n * return (\n * <button onClick={signIn} disabled={!isInitialized || isLoading}>\n * {isLoading ? 'Signing in...' : 'Sign in with Apple'}\n * </button>\n * );\n * }\n * ```\n */\nexport function useAppleAuth(): UseAppleAuthReturn {\n const { config, _internal } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const configRef = useRef(config);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Initialize Apple Sign In SDK\n useEffect(() => {\n if (!config.appleClientId) {\n return;\n }\n\n let isMounted = true;\n\n const initializeAppleSignIn = () => {\n if (!isMounted) return;\n\n try {\n window.AppleID?.auth?.init({\n clientId: config.appleClientId!,\n scope: 'name email',\n redirectURI: window.location.origin,\n usePopup: true,\n });\n\n if (isMounted) {\n setIsInitialized(true);\n }\n } catch {\n if (isMounted) {\n setError({\n code: 'SERVER_ERROR',\n message: 'Failed to initialize Apple Sign In',\n });\n }\n }\n };\n\n scriptLoader\n .load()\n .then(() => {\n if (isMounted) {\n initializeAppleSignIn();\n }\n })\n .catch(() => {\n if (isMounted) {\n setError({\n code: 'SERVER_ERROR',\n message: 'Failed to load Apple Sign In',\n });\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [config.appleClientId]);\n\n const signIn = useCallback(async (): Promise<AuthResponse> => {\n if (!config.appleClientId) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Apple Client ID not configured',\n };\n setError(err);\n throw err;\n }\n\n if (!isInitialized) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Apple Sign In not initialized',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Trigger Apple Sign In popup\n const response = await window.AppleID!.auth!.signIn();\n\n // Apple returns authorization with id_token\n const idToken = response.authorization?.id_token;\n if (!idToken) {\n throw new Error('No ID token received from Apple');\n }\n\n // Apple only provides user info on first sign-in\n // The name comes from response.user (if available)\n const userName = response.user?.name\n ? `${response.user.name.firstName || ''} ${response.user.name.lastName || ''}`.trim()\n : undefined;\n\n // Send to our backend\n const data = await apiClient.post<AuthResponse>('/apple', {\n idToken,\n name: userName || undefined,\n });\n\n configRef.current.callbacks?.onLoginSuccess?.(data.user, 'apple');\n _internal?.handleLoginSuccess(data.user, data.tokens);\n setIsLoading(false);\n return data;\n } catch (err) {\n // Check if user cancelled\n const appleError = err as { error?: string };\n if (appleError.error === 'popup_closed_by_user') {\n const authError: AuthError = {\n code: 'SERVER_ERROR',\n message: 'Apple Sign In was cancelled',\n };\n setError(authError);\n setIsLoading(false);\n throw authError;\n }\n\n const authError = handleApiError(err, 'Apple sign-in failed');\n setError(authError);\n setIsLoading(false);\n throw authError;\n }\n }, [config.appleClientId, isInitialized, apiClient, _internal]);\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n signIn,\n isLoading,\n isInitialized,\n error,\n clearError,\n };\n}\n\n// Type declaration for Apple Sign In JS SDK\ndeclare global {\n interface Window {\n AppleID?: {\n auth?: {\n init: (config: {\n clientId: string;\n scope: string;\n redirectURI: string;\n usePopup?: boolean;\n }) => void;\n signIn: () => Promise<{\n authorization?: {\n id_token?: string;\n code?: string;\n };\n user?: {\n email?: string;\n name?: {\n firstName?: string;\n lastName?: string;\n };\n };\n }>;\n };\n };\n }\n}\n","/**\n * Device detection utilities\n */\n\n/**\n * Detects if the current device is an Apple device (macOS, iOS, iPadOS).\n * Apple Sign In is most useful on Apple devices where users have Apple ID readily available.\n *\n * @returns true if running on an Apple device\n *\n * @example\n * ```tsx\n * if (isAppleDevice()) {\n * // Show Apple Sign In button\n * }\n * ```\n */\nexport function isAppleDevice(): boolean {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n const platform = (navigator.platform || '').toLowerCase();\n\n // Check for iOS devices (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(userAgent)) {\n return true;\n }\n\n // Check for macOS\n if (platform.includes('mac') || /macintosh/.test(userAgent)) {\n return true;\n }\n\n // Check for iPad on iOS 13+ (reports as MacIntel but has touch)\n if (platform === 'macintel' && navigator.maxTouchPoints > 1) {\n return true;\n }\n\n return false;\n}\n","import { useState } from 'react';\nimport { useAppleAuth } from '../../hooks/useAppleAuth';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { isAppleDevice } from '../../utils/deviceDetection';\n\nexport interface AppleLoginButtonProps {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n variant?: 'default' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n /**\n * Hide the button on non-Apple devices (macOS, iOS, iPadOS).\n * When true (default), button only renders on Apple devices.\n * When false, button always renders regardless of device.\n * @default true\n */\n hideOnNonApple?: boolean;\n}\n\n/**\n * Apple Sign In button\n *\n * Requires `appleClientId` to be configured in CedrosLoginProvider.\n *\n * @example\n * ```tsx\n * <AppleLoginButton\n * onSuccess={() => console.log('Logged in!')}\n * onError={(err) => console.error(err)}\n * />\n * ```\n */\nexport function AppleLoginButton({\n onSuccess,\n onError,\n className = '',\n variant = 'default',\n size = 'md',\n disabled = false,\n hideOnNonApple = true,\n}: AppleLoginButtonProps) {\n const { signIn, isLoading, isInitialized } = useAppleAuth();\n\n // Detect Apple device on initial render (lazy initializer avoids re-detection)\n const [isApple] = useState(() => isAppleDevice());\n\n // Hide button on non-Apple devices if hideOnNonApple is true\n if (hideOnNonApple && !isApple) {\n return null;\n }\n\n const handleClick = async () => {\n try {\n await signIn();\n onSuccess?.();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n }\n };\n\n const sizeClasses = {\n sm: 'cedros-button-sm',\n md: 'cedros-button-md',\n lg: 'cedros-button-lg',\n };\n\n const variantClasses = {\n default: 'cedros-button-apple',\n outline: 'cedros-button-apple-outline',\n };\n\n return (\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n onClick={handleClick}\n disabled={disabled || !isInitialized || isLoading}\n aria-label=\"Sign in with Apple\"\n >\n {isLoading ? (\n <LoadingSpinner size=\"sm\" />\n ) : (\n <svg\n className=\"cedros-button-icon\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\" />\n </svg>\n )}\n <span>Continue with Apple</span>\n </button>\n );\n}\n","// Minimal WebAuthn JSON helpers (no external deps).\n//\n// WebAuthn request/response objects contain ArrayBuffers, which can't be sent\n// over JSON. Server endpoints in this repo expose options with base64url fields\n// and expect credentials back with base64url fields.\n\ntype Base64UrlString = string;\n\nfunction assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new Error(message);\n}\n\nfunction normalizeBase64Url(input: string): string {\n // Browser encoders may return base64url without padding.\n return input.replace(/-/g, '+').replace(/_/g, '/');\n}\n\nexport function base64UrlToArrayBuffer(b64url: Base64UrlString): ArrayBuffer {\n assert(typeof b64url === 'string' && b64url.length > 0, 'Expected base64url string');\n const base64 = normalizeBase64Url(b64url);\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function arrayBufferToBase64Url(buffer: ArrayBuffer): Base64UrlString {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n const base64 = btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction mapCredentialDescriptor(desc: unknown): PublicKeyCredentialDescriptor {\n assert(typeof desc === 'object' && desc !== null, 'Invalid credential descriptor');\n const d = desc as Record<string, unknown>;\n assert(typeof d.type === 'string', 'Invalid credential descriptor type');\n assert(typeof d.id === 'string', 'Invalid credential descriptor id');\n\n return {\n type: d.type as PublicKeyCredentialType,\n id: base64UrlToArrayBuffer(d.id as string),\n transports: Array.isArray(d.transports) ? (d.transports as AuthenticatorTransport[]) : undefined,\n };\n}\n\nexport type ServerCreationOptions = {\n publicKey: Record<string, unknown>;\n};\n\nexport function parseCreationOptionsFromServer(\n options: ServerCreationOptions\n): PublicKeyCredentialCreationOptions {\n assert(options && typeof options === 'object', 'Missing creation options');\n const publicKey = options.publicKey as Record<string, unknown>;\n assert(publicKey && typeof publicKey === 'object', 'Missing creation options.publicKey');\n\n assert(typeof publicKey.challenge === 'string', 'Missing creation challenge');\n assert(typeof publicKey.rp === 'object' && publicKey.rp !== null, 'Missing rp');\n assert(typeof publicKey.user === 'object' && publicKey.user !== null, 'Missing user');\n\n const rp = publicKey.rp as Record<string, unknown>;\n const user = publicKey.user as Record<string, unknown>;\n\n assert(typeof rp.name === 'string', 'Missing rp.name');\n assert(typeof user.id === 'string', 'Missing user.id');\n assert(typeof user.name === 'string', 'Missing user.name');\n assert(typeof user.displayName === 'string', 'Missing user.displayName');\n\n const exclude = Array.isArray(publicKey.excludeCredentials)\n ? (publicKey.excludeCredentials as unknown[]).map(mapCredentialDescriptor)\n : undefined;\n\n const pubKeyCredParams = Array.isArray(publicKey.pubKeyCredParams)\n ? (publicKey.pubKeyCredParams as Array<{ type: string; alg: number }>).map((p) => ({\n type: p.type as PublicKeyCredentialType,\n alg: p.alg,\n }))\n : [];\n\n return {\n challenge: base64UrlToArrayBuffer(publicKey.challenge as string),\n rp: {\n name: rp.name as string,\n id: typeof rp.id === 'string' ? (rp.id as string) : undefined,\n },\n user: {\n id: base64UrlToArrayBuffer(user.id as string),\n name: user.name as string,\n displayName: user.displayName as string,\n },\n pubKeyCredParams,\n timeout: typeof publicKey.timeout === 'number' ? (publicKey.timeout as number) : undefined,\n attestation: typeof publicKey.attestation === 'string' ? (publicKey.attestation as AttestationConveyancePreference) : undefined,\n authenticatorSelection:\n typeof publicKey.authenticatorSelection === 'object' && publicKey.authenticatorSelection !== null\n ? (publicKey.authenticatorSelection as AuthenticatorSelectionCriteria)\n : undefined,\n excludeCredentials: exclude,\n extensions:\n typeof publicKey.extensions === 'object' && publicKey.extensions !== null\n ? (publicKey.extensions as AuthenticationExtensionsClientInputs)\n : undefined,\n };\n}\n\nexport type ServerRequestOptions = {\n publicKey: Record<string, unknown>;\n};\n\nexport function parseRequestOptionsFromServer(\n options: ServerRequestOptions\n): PublicKeyCredentialRequestOptions {\n assert(options && typeof options === 'object', 'Missing request options');\n const publicKey = options.publicKey as Record<string, unknown>;\n assert(publicKey && typeof publicKey === 'object', 'Missing request options.publicKey');\n\n assert(typeof publicKey.challenge === 'string', 'Missing request challenge');\n\n const allow = Array.isArray(publicKey.allowCredentials)\n ? (publicKey.allowCredentials as unknown[]).map(mapCredentialDescriptor)\n : undefined;\n\n return {\n challenge: base64UrlToArrayBuffer(publicKey.challenge as string),\n rpId: typeof publicKey.rpId === 'string' ? (publicKey.rpId as string) : undefined,\n timeout: typeof publicKey.timeout === 'number' ? (publicKey.timeout as number) : undefined,\n userVerification:\n typeof publicKey.userVerification === 'string'\n ? (publicKey.userVerification as UserVerificationRequirement)\n : undefined,\n allowCredentials: allow,\n extensions:\n typeof publicKey.extensions === 'object' && publicKey.extensions !== null\n ? (publicKey.extensions as AuthenticationExtensionsClientInputs)\n : undefined,\n };\n}\n\nexport type PublicKeyCredentialJSON = {\n id: string;\n rawId: string;\n type: string;\n authenticatorAttachment?: string;\n clientExtensionResults?: AuthenticationExtensionsClientOutputs;\n response: Record<string, unknown>;\n};\n\nexport function credentialToServerJson(cred: PublicKeyCredential): PublicKeyCredentialJSON {\n const rawId = arrayBufferToBase64Url(cred.rawId);\n const response = cred.response as AuthenticatorResponse;\n\n const common = {\n clientDataJSON: arrayBufferToBase64Url(response.clientDataJSON),\n };\n\n const responseJson: Record<string, unknown> = { ...common };\n\n // Registration\n if ('attestationObject' in response) {\n const att = response as AuthenticatorAttestationResponse;\n responseJson.attestationObject = arrayBufferToBase64Url(att.attestationObject);\n if (typeof att.getTransports === 'function') {\n try {\n responseJson.transports = att.getTransports();\n } catch {\n // ignore\n }\n }\n }\n\n // Authentication\n if ('authenticatorData' in response) {\n const asr = response as AuthenticatorAssertionResponse;\n responseJson.authenticatorData = arrayBufferToBase64Url(asr.authenticatorData);\n responseJson.signature = arrayBufferToBase64Url(asr.signature);\n if (asr.userHandle) {\n responseJson.userHandle = arrayBufferToBase64Url(asr.userHandle);\n }\n }\n\n return {\n id: cred.id,\n rawId,\n type: cred.type,\n authenticatorAttachment: cred.authenticatorAttachment ?? undefined,\n clientExtensionResults: cred.getClientExtensionResults?.() ?? {},\n response: responseJson,\n };\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type { AuthError, AuthResponse } from '../types';\nimport {\n credentialToServerJson,\n parseCreationOptionsFromServer,\n parseRequestOptionsFromServer,\n} from '../utils/webauthnJson';\n\ntype WebAuthnOptionsResponse = {\n challengeId: string;\n options: {\n publicKey: Record<string, unknown>;\n };\n};\n\nexport interface UseWebAuthnReturn {\n isSupported: boolean;\n isLoading: boolean;\n error: AuthError | null;\n clearError: () => void;\n\n /** Start a server-managed WebAuthn authentication ceremony (login). */\n authenticatePasskey: (params?: { email?: string }) => Promise<AuthResponse>;\n /** Register a new passkey for the currently authenticated user. */\n registerPasskey: (params?: { label?: string }) => Promise<{ credentialId: string; label?: string }>;\n}\n\nfunction isWebAuthnAvailable(): boolean {\n if (typeof window !== 'undefined') {\n const hostname = window.location?.hostname;\n const isLocalhost = hostname === 'localhost' || hostname === '127.0.0.1' || hostname?.endsWith('.localhost');\n const isSecure = (window as unknown as { isSecureContext?: boolean }).isSecureContext === true;\n if (!isSecure && !isLocalhost) {\n return false;\n }\n }\n return (\n typeof window !== 'undefined' &&\n typeof window.PublicKeyCredential !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n typeof navigator.credentials !== 'undefined'\n );\n}\n\nfunction mapWebAuthnDomError(err: unknown): AuthError | null {\n if (!(err instanceof Error)) return null;\n // DOMExceptions inherit from Error in modern browsers.\n const name = err.name;\n\n // User cancelled, dismissed, timed out, or no available credential.\n if (name === 'NotAllowedError') {\n return { code: 'SERVER_ERROR', message: 'Passkey operation was cancelled or timed out' };\n }\n\n // Common for trying to create a credential that already exists (or unusable state).\n if (name === 'InvalidStateError') {\n return { code: 'VALIDATION_ERROR', message: 'Passkey is not available for this operation' };\n }\n\n // Thrown for non-secure contexts, or RP ID / origin mismatches.\n if (name === 'SecurityError') {\n return {\n code: 'VALIDATION_ERROR',\n message:\n 'Passkeys require HTTPS and a correctly configured relying party (WEBAUTHN_RP_ID / WEBAUTHN_RP_ORIGIN)',\n };\n }\n\n return null;\n}\n\n/**\n * Server-managed WebAuthn (passkey) authentication + registration.\n *\n * - Login: /webauthn/auth/options -> navigator.credentials.get -> /webauthn/auth/verify\n * - Registration: /webauthn/register/options -> navigator.credentials.create -> /webauthn/register/verify\n */\nexport function useWebAuthn(): UseWebAuthnReturn {\n const { config, _internal } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n // Needed for authenticated registration endpoints when cookie auth is disabled\n getAccessToken: _internal?.getAccessToken,\n }),\n [_internal?.getAccessToken, config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const isSupported = isWebAuthnAvailable();\n\n const authenticatePasskey = useCallback(\n async (params?: { email?: string }): Promise<AuthResponse> => {\n if (!isSupported) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Passkeys are not supported in this browser',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const optionsResponse = await apiClient.post<WebAuthnOptionsResponse>(\n '/webauthn/auth/options',\n { email: params?.email }\n );\n\n const publicKey = parseRequestOptionsFromServer(optionsResponse.options);\n\n const assertion = (await navigator.credentials.get({\n publicKey,\n })) as PublicKeyCredential | null;\n\n if (!assertion) {\n throw new Error('Passkey authentication returned no credential');\n }\n\n const data = await apiClient.post<AuthResponse>('/webauthn/auth/verify', {\n challengeId: optionsResponse.challengeId,\n credential: credentialToServerJson(assertion),\n });\n\n config.callbacks?.onLoginSuccess?.(data.user, 'webauthn');\n _internal?.handleLoginSuccess(data.user, data.tokens);\n\n return data;\n } catch (err) {\n const domMapped = mapWebAuthnDomError(err);\n const authError = domMapped ?? handleApiError(err, 'Passkey sign-in failed');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, config.callbacks, _internal, isSupported]\n );\n\n const registerPasskey = useCallback(\n async (params?: { label?: string }): Promise<{ credentialId: string; label?: string }> => {\n if (!isSupported) {\n const err: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Passkeys are not supported in this browser',\n };\n setError(err);\n throw err;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const optionsResponse = await apiClient.post<WebAuthnOptionsResponse>(\n '/webauthn/register/options',\n {}\n );\n\n const publicKey = parseCreationOptionsFromServer(optionsResponse.options);\n\n const created = (await navigator.credentials.create({\n publicKey,\n })) as PublicKeyCredential | null;\n\n if (!created) {\n throw new Error('Passkey registration returned no credential');\n }\n\n const result = await apiClient.post<{ success: boolean; credentialId: string; label?: string }>(\n '/webauthn/register/verify',\n {\n challengeId: optionsResponse.challengeId,\n credential: credentialToServerJson(created),\n label: params?.label,\n }\n );\n\n if (!result.success) {\n throw new Error('Passkey registration failed');\n }\n\n return { credentialId: result.credentialId, label: result.label };\n } catch (err) {\n const domMapped = mapWebAuthnDomError(err);\n const authError = domMapped ?? handleApiError(err, 'Passkey registration failed');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, isSupported]\n );\n\n return {\n isSupported,\n isLoading,\n error,\n clearError,\n authenticatePasskey,\n registerPasskey,\n };\n}\n","import type { ReactNode } from 'react';\nimport { useWebAuthn } from '../../hooks/useWebAuthn';\n\nexport interface PasskeyLoginButtonProps {\n onSuccess?: () => void;\n className?: string;\n children?: ReactNode;\n disabled?: boolean;\n}\n\nexport function PasskeyLoginButton({\n onSuccess,\n className = '',\n children,\n disabled,\n}: PasskeyLoginButtonProps) {\n const { authenticatePasskey, isLoading, isSupported } = useWebAuthn();\n\n const isDisabled = disabled || !isSupported || isLoading;\n\n return (\n <button\n type=\"button\"\n className={`cedros-button cedros-button-social ${className}`}\n onClick={async () => {\n await authenticatePasskey();\n onSuccess?.();\n }}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n <span className=\"cedros-social-icon\" aria-hidden=\"true\">\n <PasskeyIcon />\n </span>\n <span>{children ?? (isLoading ? 'Continuing...' : 'Continue with Passkey')}</span>\n </button>\n );\n}\n\nfunction PasskeyIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { EmailLoginForm } from './email/EmailLoginForm';\nimport { EmailRegisterForm } from './email/EmailRegisterForm';\nimport { ForgotPasswordForm } from './email/ForgotPasswordForm';\nimport { GoogleLoginButton } from './google/GoogleLoginButton';\nimport { AppleLoginButton } from './apple/AppleLoginButton';\nimport { SolanaLoginButton } from './solana/SolanaLoginButton';\nimport { PasskeyLoginButton } from './webauthn/PasskeyLoginButton';\nimport { detectSolanaWallets } from '../utils/walletDetection';\nimport { isAppleDevice } from '../utils/deviceDetection';\n\ntype TabValue = 'login' | 'register';\ntype ViewState = 'form' | 'forgotPassword';\nconst TABS: TabValue[] = ['login', 'register'];\n\nexport interface LoginFormProps {\n onSuccess?: () => void;\n className?: string;\n defaultTab?: 'login' | 'register';\n}\n\n/**\n * Combined login form with all enabled auth methods\n */\nexport function LoginForm({ onSuccess, className = '', defaultTab = 'login' }: LoginFormProps) {\n const { config } = useCedrosLogin();\n const [activeTab, setActiveTab] = useState<TabValue>(defaultTab);\n const [viewState, setViewState] = useState<ViewState>('form');\n // Detect wallets on initial render and re-check on window load/focus\n const [hasWallets, setHasWallets] = useState(() => detectSolanaWallets());\n const [isApple] = useState(() => isAppleDevice());\n\n useEffect(() => {\n const updateWallets = () => setHasWallets(detectSolanaWallets());\n updateWallets();\n window.addEventListener('load', updateWallets);\n window.addEventListener('focus', updateWallets);\n return () => {\n window.removeEventListener('load', updateWallets);\n window.removeEventListener('focus', updateWallets);\n };\n }, []);\n\n // Get forgot password mode from config (only show link in 'reset' mode - instantLink is handled inline)\n const forgotPasswordMode = config.forms?.forgotPassword?.mode ?? 'reset';\n\n // UI-04: Handle Arrow key navigation for tabs (ARIA tabs pattern)\n const handleTabKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const currentIndex = TABS.indexOf(activeTab);\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n // Move to previous tab (wrapping to end)\n newIndex = currentIndex === 0 ? TABS.length - 1 : currentIndex - 1;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n // Move to next tab (wrapping to start)\n newIndex = currentIndex === TABS.length - 1 ? 0 : currentIndex + 1;\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = TABS.length - 1;\n break;\n default:\n return; // Don't prevent default for other keys\n }\n\n e.preventDefault();\n const newTab = TABS[newIndex];\n setActiveTab(newTab);\n // Focus the new tab button\n const newButton = document.getElementById(`cedros-tab-${newTab}`);\n newButton?.focus();\n },\n [activeTab]\n );\n\n const features = config.features ?? {\n email: true,\n google: true,\n apple: true,\n solana: true,\n webauthn: true,\n };\n const showEmail = features.email !== false;\n const showGoogle = features.google !== false && config.googleClientId;\n // Only show Apple button if feature enabled, clientId configured, AND on Apple device\n const showApple = features.apple !== false && config.appleClientId && isApple;\n // Only show Solana button if feature enabled AND wallets are installed\n const showSolana = features.solana !== false && hasWallets;\n const showPasskey = features.webauthn !== false;\n\n const showDivider = showEmail && (showGoogle || showApple || showSolana || showPasskey);\n\n // Show forgot password form\n if (viewState === 'forgotPassword') {\n return (\n <div className={`cedros-login-form ${className}`}>\n <ForgotPasswordForm onCancel={() => setViewState('form')} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-login-form ${className}`}>\n {/* Social login buttons */}\n {(showPasskey || showGoogle || showApple || showSolana) && (\n <div className=\"cedros-social-buttons\">\n {showPasskey && <PasskeyLoginButton onSuccess={onSuccess} />}\n {showGoogle && <GoogleLoginButton onSuccess={onSuccess} />}\n {showApple && <AppleLoginButton onSuccess={onSuccess} />}\n {showSolana && <SolanaLoginButton onSuccess={onSuccess} />}\n </div>\n )}\n\n {/* Divider */}\n {showDivider && (\n <div className=\"cedros-divider\">\n <span>Or continue with</span>\n </div>\n )}\n\n {/* Email forms */}\n {showEmail && (\n <>\n {/* Tabs */}\n <div className=\"cedros-tabs\" role=\"tablist\" aria-label=\"Authentication method\">\n <button\n type=\"button\"\n role=\"tab\"\n id=\"cedros-tab-login\"\n className={`cedros-tab ${activeTab === 'login' ? 'cedros-tab-active' : ''}`}\n onClick={() => setActiveTab('login')}\n onKeyDown={handleTabKeyDown}\n aria-selected={activeTab === 'login'}\n aria-controls=\"cedros-tabpanel-login\"\n tabIndex={activeTab === 'login' ? 0 : -1}\n >\n Sign in\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n id=\"cedros-tab-register\"\n className={`cedros-tab ${activeTab === 'register' ? 'cedros-tab-active' : ''}`}\n onClick={() => setActiveTab('register')}\n onKeyDown={handleTabKeyDown}\n aria-selected={activeTab === 'register'}\n aria-controls=\"cedros-tabpanel-register\"\n tabIndex={activeTab === 'register' ? 0 : -1}\n >\n Sign up\n </button>\n </div>\n\n {/* Tab panels */}\n <div\n role=\"tabpanel\"\n id={`cedros-tabpanel-${activeTab}`}\n aria-labelledby={`cedros-tab-${activeTab}`}\n >\n {activeTab === 'login' ? (\n <EmailLoginForm\n onSuccess={onSuccess}\n onSwitchToRegister={() => setActiveTab('register')}\n onForgotPassword={\n forgotPasswordMode === 'reset' ? () => setViewState('forgotPassword') : undefined\n }\n />\n ) : (\n <EmailRegisterForm\n onSuccess={onSuccess}\n onSwitchToLogin={() => setActiveTab('login')}\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\n\nexport interface ErrorBoundaryProps {\n /** Child components to render */\n children: ReactNode;\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode;\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Whether to show error details (useful for development) */\n showDetails?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\n/**\n * Error Boundary component that catches JavaScript errors in child components.\n * Prevents the entire app from crashing and shows a fallback UI.\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={<div>Something went wrong</div>}\n * onError={(error) => logError(error)}\n * >\n * <LoginForm />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.setState({ errorInfo });\n\n // Log error to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('[Cedros Login] Error caught by ErrorBoundary:', error);\n console.error('[Cedros Login] Component stack:', errorInfo.componentStack);\n }\n\n // Call optional error callback\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n };\n\n render(): ReactNode {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, showDetails = false } = this.props;\n\n if (hasError) {\n // Custom fallback provided\n if (fallback) {\n return fallback;\n }\n\n // Default fallback UI\n return (\n <div className=\"cedros-error-boundary\" role=\"alert\" aria-live=\"assertive\">\n <div className=\"cedros-error-boundary-content\">\n <svg\n className=\"cedros-error-boundary-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n\n <h2 className=\"cedros-error-boundary-title\">Something went wrong</h2>\n\n <p className=\"cedros-error-boundary-message\">\n We encountered an unexpected error. Please try again.\n </p>\n\n {showDetails && error && (\n <details className=\"cedros-error-boundary-details\">\n <summary>Error details</summary>\n <pre>\n {error.toString()}\n {errorInfo?.componentStack}\n </pre>\n </details>\n )}\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={this.handleRetry}\n >\n Try again\n </button>\n </div>\n </div>\n );\n }\n\n return children;\n }\n}\n","import { useEffect, useRef } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { LoginForm } from './LoginForm';\nimport { ErrorBoundary } from './shared/ErrorBoundary';\n\nexport interface LoginModalProps {\n className?: string;\n title?: string;\n}\n\n/**\n * Modal containing the login form.\n * Controlled by the CedrosLoginProvider context.\n */\nexport function LoginModal({ className = '', title = 'Sign in to your account' }: LoginModalProps) {\n const { isModalOpen, closeModal } = useCedrosLogin();\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<Element | null>(null);\n\n // C-03: Use ref to avoid closeModal in effect dependencies\n // Prevents event listener leak when closeModal identity changes\n const closeModalRef = useRef(closeModal);\n useEffect(() => {\n closeModalRef.current = closeModal;\n }, [closeModal]);\n\n // Handle escape key and focus trapping\n useEffect(() => {\n if (!isModalOpen) return;\n\n // Store currently focused element\n previousActiveElement.current = document.activeElement;\n\n // Focus the modal\n modalRef.current?.focus();\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModalRef.current();\n }\n\n // Focus trap\n if (e.key === 'Tab' && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n // Prevent body scroll\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.overflow = previousOverflow;\n\n // Restore focus\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isModalOpen]);\n\n if (!isModalOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n closeModal();\n }\n };\n\n return (\n <div\n className={`cedros-modal-backdrop ${className}`}\n onClick={handleBackdropClick}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n className=\"cedros-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"cedros-modal-title\"\n tabIndex={-1}\n >\n <div className=\"cedros-modal-header\">\n <h2 id=\"cedros-modal-title\" className=\"cedros-modal-title\">\n {title}\n </h2>\n <button\n type=\"button\"\n className=\"cedros-modal-close\"\n onClick={closeModal}\n aria-label=\"Close\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n {/* M-06: ErrorBoundary catches rendering errors in login form */}\n <div className=\"cedros-modal-content\">\n <ErrorBoundary>\n <LoginForm onSuccess={closeModal} />\n </ErrorBoundary>\n </div>\n </div>\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { usePasswordReset } from '../../hooks/usePasswordReset';\nimport { PasswordInput } from './PasswordInput';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { validatePassword } from '../../utils/validation';\nimport type { PasswordValidation } from '../../types';\n\nexport interface ResetPasswordFormProps {\n token: string;\n onSuccess?: () => void;\n onLoginClick?: () => void;\n className?: string;\n}\n\n/**\n * Form for resetting password using a reset token.\n *\n * @example\n * ```tsx\n * // Get token from URL params\n * const token = new URLSearchParams(location.search).get('token');\n *\n * <ResetPasswordForm\n * token={token}\n * onSuccess={() => navigate('/login')}\n * onLoginClick={() => navigate('/login')}\n * />\n * ```\n */\nexport function ResetPasswordForm({\n token,\n onSuccess,\n onLoginClick,\n className = '',\n}: ResetPasswordFormProps) {\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [validation, setValidation] = useState<PasswordValidation | null>(null);\n const { resetPassword, isLoading, isSuccess, error, clearError } = usePasswordReset();\n\n const passwordsMatch = password === confirmPassword;\n const isValid = validation?.isValid && passwordsMatch && password.length > 0;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (!isValid) return;\n\n try {\n await resetPassword(token, password);\n onSuccess?.();\n } catch {\n // Error is already set in the hook\n }\n };\n\n if (isSuccess) {\n return (\n <div className={`cedros-reset-password-success ${className}`}>\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-success-title\">Password reset successful</h3>\n <p className=\"cedros-success-message\">\n Your password has been reset. You can now log in with your new password.\n </p>\n {onLoginClick && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-primary\"\n onClick={onLoginClick}\n >\n Go to login\n </button>\n )}\n </div>\n );\n }\n\n return (\n <form className={`cedros-reset-password-form ${className}`} onSubmit={handleSubmit}>\n <div className=\"cedros-form-header\">\n <h3 className=\"cedros-form-title\">Reset your password</h3>\n <p className=\"cedros-form-subtitle\">Enter your new password below.</p>\n </div>\n\n <ErrorMessage error={error} onDismiss={clearError} />\n\n <div className=\"cedros-form-field\">\n <PasswordInput\n label=\"New password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setValidation(validatePassword(e.target.value));\n }}\n showStrengthMeter\n onValidationChange={setValidation}\n disabled={isLoading}\n autoComplete=\"new-password\"\n error={\n validation && !validation.isValid\n ? Object.values(validation.errors).find(Boolean)\n : undefined\n }\n />\n </div>\n\n <div className=\"cedros-form-field\">\n <PasswordInput\n label=\"Confirm password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n disabled={isLoading}\n autoComplete=\"new-password\"\n error={confirmPassword && !passwordsMatch ? 'Passwords do not match' : undefined}\n />\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-md cedros-button-primary cedros-button-full\"\n disabled={isLoading || !isValid}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n Resetting...\n </>\n ) : (\n 'Reset password'\n )}\n </button>\n\n {onLoginClick && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-md cedros-button-ghost cedros-button-full\"\n onClick={onLoginClick}\n disabled={isLoading}\n >\n Back to login\n </button>\n )}\n </div>\n </form>\n );\n}\n","/**\n * Organization avatar component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport type { OrgWithMembership } from '../../types';\nimport { sanitizeImageUrl } from '../../utils/sanitization';\n\nexport interface OrgAvatarProps {\n org: OrgWithMembership;\n size?: 'sm' | 'lg';\n className?: string;\n}\n\nexport function OrgAvatar({ org, size = 'lg', className = '' }: OrgAvatarProps) {\n const sanitizedLogoUrl = sanitizeImageUrl(org.logoUrl);\n const sizeClass = size === 'lg' ? 'cedros-org-avatar-lg' : '';\n const imageClassName = ['cedros-org-avatar', sizeClass, className].filter(Boolean).join(' ');\n const placeholderClassName = ['cedros-org-avatar-placeholder', sizeClass, className]\n .filter(Boolean)\n .join(' ');\n if (sanitizedLogoUrl) {\n return (\n <img\n src={sanitizedLogoUrl}\n alt={org.name}\n className={imageClassName}\n referrerPolicy=\"no-referrer\"\n />\n );\n }\n\n return <div className={placeholderClassName}>{org.name[0]?.toUpperCase() || '?'}</div>;\n}\n","import { useCallback, useState, useRef, useEffect } from 'react';\nimport type { OrgWithMembership } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { OrgAvatar } from './OrgAvatar';\n\nexport interface OrgSelectorProps {\n /** List of organizations to display */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** Loading state */\n isLoading?: boolean;\n /** Callback when organization is selected */\n onSelect: (orgId: string) => void;\n /** Callback when \"Create organization\" is clicked */\n onCreateClick?: () => void;\n /** Additional CSS class */\n className?: string;\n /** Placeholder when no orgs */\n placeholder?: string;\n}\n\n/**\n * Dropdown selector for switching between organizations.\n *\n * ## A11Y-02: Keyboard Navigation Limitation\n *\n * Currently supports:\n * - Tab/Shift+Tab: Move focus between trigger and items\n * - Escape: Close dropdown\n * - Enter/Space: Select focused item\n *\n * FUTURE: Consider implementing arrow key navigation for enhanced accessibility:\n * - ArrowUp/ArrowDown: Navigate between items in the list\n * - Home/End: Jump to first/last item\n * - Type-ahead: Focus item starting with typed character\n *\n * See WAI-ARIA Listbox Pattern for reference implementation.\n * Currently the component meets basic accessibility requirements.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { orgs, activeOrg, switchOrg } = useOrgs();\n *\n * return (\n * <OrgSelector\n * orgs={orgs}\n * activeOrg={activeOrg}\n * onSelect={switchOrg}\n * onCreateClick={() => setShowCreateModal(true)}\n * />\n * );\n * }\n * ```\n */\nexport function OrgSelector({\n orgs,\n activeOrg,\n isLoading = false,\n onSelect,\n onCreateClick,\n className = '',\n placeholder = 'Select organization',\n}: OrgSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleSelect = useCallback(\n (orgId: string) => {\n onSelect(orgId);\n setIsOpen(false);\n },\n [onSelect]\n );\n\n const handleCreateClick = useCallback(() => {\n setIsOpen(false);\n onCreateClick?.();\n }, [onCreateClick]);\n\n const toggleDropdown = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n if (isLoading) {\n return (\n <div\n className={`cedros-org-selector cedros-org-selector-loading ${className}`}\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <LoadingSpinner size=\"sm\" />\n <span>Loading...</span>\n </div>\n );\n }\n\n return (\n <div ref={dropdownRef} className={`cedros-org-selector ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-org-selector-trigger\"\n onClick={toggleDropdown}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n >\n {activeOrg ? (\n <>\n <OrgAvatar org={activeOrg} size=\"sm\" />\n <span className=\"cedros-org-selector-name\">{activeOrg.name}</span>\n <RoleBadge role={activeOrg.membership.role} />\n </>\n ) : (\n <span className=\"cedros-org-selector-placeholder\">{placeholder}</span>\n )}\n <ChevronIcon isOpen={isOpen} />\n </button>\n\n {isOpen && (\n <div className=\"cedros-org-selector-dropdown\" role=\"listbox\">\n {orgs.length === 0 ? (\n <div className=\"cedros-org-selector-empty\">No organizations</div>\n ) : (\n <ul className=\"cedros-org-selector-list\">\n {orgs.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n className={`cedros-org-selector-item ${\n org.id === activeOrg?.id ? 'cedros-org-selector-item-active' : ''\n }`}\n onClick={() => handleSelect(org.id)}\n role=\"option\"\n aria-selected={org.id === activeOrg?.id}\n >\n <OrgAvatar org={org} size=\"sm\" />\n <span className=\"cedros-org-selector-item-name\">{org.name}</span>\n <RoleBadge role={org.membership.role} />\n {org.id === activeOrg?.id && <CheckIcon />}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateClick && (\n <>\n <div className=\"cedros-org-selector-divider\" />\n <button\n type=\"button\"\n className=\"cedros-org-selector-create\"\n onClick={handleCreateClick}\n >\n <PlusIcon />\n <span>Create organization</span>\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// Helper components\nfunction RoleBadge({ role }: { role: string }) {\n return <span className={`cedros-org-role cedros-org-role-${role}`}>{role}</span>;\n}\n\nfunction ChevronIcon({ isOpen }: { isOpen: boolean }) {\n return (\n <svg\n className={`cedros-org-chevron ${isOpen ? 'cedros-org-chevron-open' : ''}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-org-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg\n className=\"cedros-org-plus\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Icon components for organization UI\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\n\nexport function CloseIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 5L15 15M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon() {\n return (\n <svg\n className=\"cedros-org-check\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 10L8 14L16 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function PlusIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 4V16M4 10H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Organization list view component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport type { OrgWithMembership } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { OrgAvatar } from './OrgAvatar';\nimport { CheckIcon, PlusIcon } from './icons';\n\nexport interface OrgListViewProps {\n orgs: OrgWithMembership[];\n activeOrg: OrgWithMembership | null;\n isLoading: boolean;\n onSelect: (orgId: string) => void;\n onCreateClick?: () => void;\n}\n\nexport function OrgListView({\n orgs,\n activeOrg,\n isLoading,\n onSelect,\n onCreateClick,\n}: OrgListViewProps) {\n if (isLoading) {\n return (\n <div className=\"cedros-org-switcher-loading\">\n <LoadingSpinner />\n <span>Loading organizations...</span>\n </div>\n );\n }\n\n return (\n <>\n {orgs.length === 0 ? (\n <div className=\"cedros-org-switcher-empty\">\n <p>You don't belong to any organizations yet.</p>\n </div>\n ) : (\n <ul className=\"cedros-org-switcher-list\">\n {orgs.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n className={`cedros-org-switcher-item ${\n org.id === activeOrg?.id ? 'cedros-org-switcher-item-active' : ''\n }`}\n onClick={() => onSelect(org.id)}\n >\n <OrgAvatar org={org} />\n <div className=\"cedros-org-switcher-item-content\">\n <span className=\"cedros-org-switcher-item-name\">{org.name}</span>\n <span className=\"cedros-org-switcher-item-slug\">@{org.slug}</span>\n </div>\n <div className=\"cedros-org-switcher-item-meta\">\n <span className={`cedros-org-role cedros-org-role-${org.membership.role}`}>\n {org.membership.role}\n </span>\n {org.isPersonal && <span className=\"cedros-org-personal-badge\">Personal</span>}\n </div>\n {org.id === activeOrg?.id && <CheckIcon />}\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateClick && (\n <button type=\"button\" className=\"cedros-org-switcher-create\" onClick={onCreateClick}>\n <PlusIcon />\n <span>Create new organization</span>\n </button>\n )}\n </>\n );\n}\n","/**\n * Create organization form component\n *\n * Extracted from OrgSwitcher.tsx (F-02)\n */\nimport { useState, useCallback } from 'react';\nimport type { CreateOrgRequest } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface CreateOrgFormProps {\n isLoading: boolean;\n onSubmit: (data: CreateOrgRequest) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function CreateOrgForm({ isLoading, onSubmit, onCancel }: CreateOrgFormProps) {\n const [name, setName] = useState('');\n const [slug, setSlug] = useState('');\n const [formError, setFormError] = useState<string | null>(null);\n\n // Auto-generate slug from name\n const handleNameChange = useCallback((value: string) => {\n setName(value);\n // Generate slug: lowercase, replace spaces with hyphens, remove special chars\n const generatedSlug = value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .substring(0, 50);\n setSlug(generatedSlug);\n }, []);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent) => {\n event.preventDefault();\n setFormError(null);\n\n if (!name.trim()) {\n setFormError('Organization name is required');\n return;\n }\n\n if (!slug.trim()) {\n setFormError('Organization slug is required');\n return;\n }\n\n try {\n await onSubmit({ name: name.trim(), slug: slug.trim() });\n } catch (err) {\n setFormError((err as Error).message || 'Failed to create organization');\n }\n },\n [name, slug, onSubmit]\n );\n\n return (\n <form className=\"cedros-org-create-form\" onSubmit={handleSubmit}>\n {formError && <ErrorMessage error={formError} />}\n\n <div className=\"cedros-form-group\">\n <label htmlFor=\"org-name\" className=\"cedros-form-label\">\n Organization Name\n </label>\n <input\n id=\"org-name\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={name}\n onChange={(e) => handleNameChange(e.target.value)}\n placeholder=\"My Organization\"\n maxLength={255}\n disabled={isLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label htmlFor=\"org-slug\" className=\"cedros-form-label\">\n URL Slug\n </label>\n <div className=\"cedros-form-input-prefix\">\n <span className=\"cedros-form-prefix\">@</span>\n <input\n id=\"org-slug\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={slug}\n onChange={(e) => setSlug(e.target.value.toLowerCase())}\n placeholder=\"my-organization\"\n maxLength={100}\n pattern=\"[a-z0-9-]+\"\n disabled={isLoading}\n />\n </div>\n <span className=\"cedros-form-hint\">Only lowercase letters, numbers, and hyphens</span>\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isLoading || !name.trim() || !slug.trim()}\n >\n {isLoading ? <LoadingSpinner size=\"sm\" /> : 'Create Organization'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Organization switcher modal component\n *\n * Refactored to extract sub-components (F-02):\n * - CreateOrgForm -> ./CreateOrgForm.tsx\n * - OrgListView -> ./OrgListView.tsx\n * - OrgAvatar -> ./OrgAvatar.tsx\n * - Icons -> ./icons.tsx\n */\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { OrgWithMembership, CreateOrgRequest, DisplayError } from '../../types';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { OrgListView } from './OrgListView';\nimport { CreateOrgForm } from './CreateOrgForm';\nimport { CloseIcon } from './icons';\n\nexport interface OrgSwitcherProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** List of organizations */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Callback when organization is selected */\n onSelect: (orgId: string) => void;\n /** Callback when new organization is created */\n onCreate?: (data: CreateOrgRequest) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\ntype ViewMode = 'list' | 'create';\n\n/**\n * Modal for switching organizations and creating new ones.\n *\n * @example\n * ```tsx\n * function App() {\n * const [isOpen, setIsOpen] = useState(false);\n * const { orgs, activeOrg, switchOrg, createOrg } = useOrgs();\n *\n * return (\n * <>\n * <button onClick={() => setIsOpen(true)}>Switch org</button>\n * <OrgSwitcher\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * orgs={orgs}\n * activeOrg={activeOrg}\n * onSelect={switchOrg}\n * onCreate={createOrg}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function OrgSwitcher({\n isOpen,\n onClose,\n orgs,\n activeOrg,\n isLoading = false,\n error,\n onSelect,\n onCreate,\n className = '',\n}: OrgSwitcherProps) {\n // Render null when closed - inner content unmounts, resetting state naturally\n if (!isOpen) return null;\n\n return (\n <OrgSwitcherModal\n onClose={onClose}\n orgs={orgs}\n activeOrg={activeOrg}\n isLoading={isLoading}\n error={error}\n onSelect={onSelect}\n onCreate={onCreate}\n className={className}\n />\n );\n}\n\n// Inner modal component - unmounts when modal closes, resetting viewMode state\nfunction OrgSwitcherModal({\n onClose,\n orgs,\n activeOrg,\n isLoading = false,\n error,\n onSelect,\n onCreate,\n className,\n}: Omit<OrgSwitcherProps, 'isOpen'>) {\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const modalRef = useRef<HTMLDivElement>(null);\n // UI-05: Store previously focused element for restoration\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // UI-05: Focus trap and restoration\n useEffect(() => {\n // Save currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Focus the close button when modal opens\n const closeButton = modalRef.current?.querySelector<HTMLElement>('.cedros-modal-close');\n closeButton?.focus();\n\n return () => {\n // Restore focus when modal closes\n previousFocusRef.current?.focus();\n };\n }, []);\n\n // Close on escape key - runs unconditionally since component only mounts when modal is open\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n return;\n }\n\n // UI-05: Focus trap - Tab/Shift+Tab within modal\n if (event.key === 'Tab' && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift+Tab: wrap from first to last\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab: wrap from last to first\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (event.target === event.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n const handleSelect = useCallback(\n (orgId: string) => {\n onSelect(orgId);\n onClose();\n },\n [onSelect, onClose]\n );\n\n const handleCreate = useCallback(\n async (data: CreateOrgRequest) => {\n await onCreate?.(data);\n onClose();\n },\n [onCreate, onClose]\n );\n\n return (\n <div className=\"cedros-modal-backdrop\" onClick={handleBackdropClick}>\n <div\n ref={modalRef}\n className={`cedros-modal cedros-org-switcher ${className}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"org-switcher-title\"\n >\n <div className=\"cedros-modal-header\">\n <h2 id=\"org-switcher-title\" className=\"cedros-modal-title\">\n {viewMode === 'list' ? 'Switch Organization' : 'Create Organization'}\n </h2>\n <button type=\"button\" className=\"cedros-modal-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n\n <div className=\"cedros-modal-body\">\n {error && <ErrorMessage error={error} />}\n\n {viewMode === 'list' ? (\n <OrgListView\n orgs={orgs}\n activeOrg={activeOrg}\n isLoading={isLoading}\n onSelect={handleSelect}\n onCreateClick={onCreate ? () => setViewMode('create') : undefined}\n />\n ) : (\n <CreateOrgForm\n isLoading={isLoading}\n onSubmit={handleCreate}\n onCancel={() => setViewMode('list')}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { Member, OrgRole, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { sanitizeImageUrl } from '../../utils/sanitization';\n\ntype SortField = 'name' | 'role' | 'joinedAt';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface MemberListProps {\n /** List of members to display */\n members: Member[];\n /** Current user's ID (to prevent self-actions) */\n currentUserId?: string;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Whether the current user can manage members */\n canManage?: boolean;\n /** Whether the current user can change roles */\n canChangeRoles?: boolean;\n /** Callback when role is updated */\n onUpdateRole?: (userId: string, role: OrgRole) => Promise<void>;\n /** Callback when member is removed */\n onRemove?: (userId: string) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\nconst ROLE_OPTIONS: OrgRole[] = ['owner', 'admin', 'member'];\n\n/**\n * Display and manage organization members.\n *\n * @example\n * ```tsx\n * function TeamMembers() {\n * const { activeOrg, hasPermission } = useOrgs();\n * const { members, isLoading, error, updateMemberRole, removeMember } = useMembers(activeOrg?.id);\n * const { user } = useAuth();\n *\n * return (\n * <MemberList\n * members={members}\n * currentUserId={user?.id}\n * isLoading={isLoading}\n * error={error?.message}\n * canManage={hasPermission('member:remove')}\n * canChangeRoles={hasPermission('member:role_change')}\n * onUpdateRole={updateMemberRole}\n * onRemove={removeMember}\n * />\n * );\n * }\n * ```\n */\nexport function MemberList({\n members,\n currentUserId,\n isLoading = false,\n error,\n canManage = false,\n canChangeRoles = false,\n onUpdateRole,\n onRemove,\n className = '',\n}: MemberListProps) {\n const [sortField, setSortField] = useState<SortField>('name');\n const [sortOrder, setSortOrder] = useState<SortOrder>('asc');\n\n const toggleSort = (field: SortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('asc');\n }\n };\n\n const sortedMembers = useMemo(() => {\n const roleOrder: Record<OrgRole, number> = { owner: 0, admin: 1, member: 2 };\n return [...members].sort((a, b) => {\n let aVal: string | number;\n let bVal: string | number;\n\n switch (sortField) {\n case 'name':\n aVal = (a.user.name || a.user.email || '').toLowerCase();\n bVal = (b.user.name || b.user.email || '').toLowerCase();\n break;\n case 'role':\n aVal = roleOrder[a.role] ?? 99;\n bVal = roleOrder[b.role] ?? 99;\n break;\n case 'joinedAt':\n aVal = new Date(a.joinedAt).getTime();\n bVal = new Date(b.joinedAt).getTime();\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [members, sortField, sortOrder]);\n\n if (isLoading && members.length === 0) {\n return (\n <div className={`cedros-member-list cedros-member-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading members...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-member-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (members.length === 0) {\n return (\n <div className={`cedros-member-list cedros-member-list-empty ${className}`}>\n <p>No members found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-member-list ${className}`}>\n <table className=\"cedros-member-table\">\n <thead>\n <tr>\n <th>\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'name' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('name')}\n >\n Member{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'name' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </th>\n <th>\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'role' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('role')}\n >\n Role{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'role' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </th>\n <th>\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'joinedAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('joinedAt')}\n >\n Joined{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'joinedAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </th>\n {(canManage || canChangeRoles) && <th>Actions</th>}\n </tr>\n </thead>\n <tbody>\n {sortedMembers.map((member) => (\n <MemberRow\n key={member.id}\n member={member}\n isCurrentUser={member.userId === currentUserId}\n canManage={canManage}\n canChangeRoles={canChangeRoles}\n onUpdateRole={onUpdateRole}\n onRemove={onRemove}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Member row component\ninterface MemberRowProps {\n member: Member;\n isCurrentUser: boolean;\n canManage: boolean;\n canChangeRoles: boolean;\n onUpdateRole?: (userId: string, role: OrgRole) => Promise<void>;\n onRemove?: (userId: string) => Promise<void>;\n}\n\nfunction MemberRow({\n member,\n isCurrentUser,\n canManage,\n canChangeRoles,\n onUpdateRole,\n onRemove,\n}: MemberRowProps) {\n const [isUpdating, setIsUpdating] = useState(false);\n const [selectedRole, setSelectedRole] = useState<OrgRole>(member.role);\n\n const handleRoleChange = useCallback(\n async (newRole: OrgRole) => {\n if (!onUpdateRole || newRole === member.role) return;\n\n setIsUpdating(true);\n try {\n await onUpdateRole(member.userId, newRole);\n setSelectedRole(newRole);\n } catch {\n // Revert on error\n setSelectedRole(member.role);\n } finally {\n setIsUpdating(false);\n }\n },\n [member.userId, member.role, onUpdateRole]\n );\n\n const handleRemove = useCallback(async () => {\n if (!onRemove) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to remove ${member.user.name || member.user.email} from this organization?`\n );\n if (!confirmed) return;\n\n setIsUpdating(true);\n try {\n await onRemove(member.userId);\n } finally {\n setIsUpdating(false);\n }\n }, [member.userId, member.user.name, member.user.email, onRemove]);\n\n const isOwner = member.role === 'owner';\n const canModify = !isCurrentUser && !isOwner;\n\n return (\n <tr className={`cedros-member-row ${isCurrentUser ? 'cedros-member-row-current' : ''}`}>\n <td className=\"cedros-member-info\">\n <MemberAvatar user={member.user} />\n <div className=\"cedros-member-details\">\n <span className=\"cedros-member-name\">\n {member.user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-member-you\">(you)</span>}\n </span>\n <span className=\"cedros-member-email\">{member.user.email}</span>\n </div>\n </td>\n <td className=\"cedros-member-role\">\n {canChangeRoles && canModify && onUpdateRole ? (\n <select\n value={selectedRole}\n onChange={(e) => handleRoleChange(e.target.value as OrgRole)}\n disabled={isUpdating}\n className=\"cedros-role-select\"\n >\n {ROLE_OPTIONS.map((role) => (\n <option key={role} value={role}>\n {role.charAt(0).toUpperCase() + role.slice(1)}\n </option>\n ))}\n </select>\n ) : (\n <span className={`cedros-role-badge cedros-role-badge-${member.role}`}>\n {member.role.charAt(0).toUpperCase() + member.role.slice(1)}\n </span>\n )}\n </td>\n <td className=\"cedros-member-joined\">{formatDate(member.joinedAt)}</td>\n {(canManage || canChangeRoles) && (\n <td className=\"cedros-member-actions\">\n {canManage && canModify && onRemove && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger cedros-button-sm\"\n onClick={handleRemove}\n disabled={isUpdating}\n aria-label={`Remove ${member.user.name || member.user.email}`}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Remove'}\n </button>\n )}\n </td>\n )}\n </tr>\n );\n}\n\n// Helper components\nfunction MemberAvatar({ user }: { user: Member['user'] }) {\n // COMP-06: Cache sanitized URL and verify before use (blocks dangerous protocols)\n const sanitizedPicture = sanitizeImageUrl(user.picture);\n if (sanitizedPicture) {\n return (\n <img\n src={sanitizedPicture}\n alt={user.name || user.email || 'Member'}\n className=\"cedros-member-avatar\"\n referrerPolicy=\"no-referrer\"\n />\n );\n }\n\n const initial = (user.name?.[0] || user.email?.[0] || '?').toUpperCase();\n return <div className=\"cedros-member-avatar-placeholder\">{initial}</div>;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { OrgRole, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { validateEmail } from '../../utils/validation';\n\ntype InviteRole = Exclude<OrgRole, 'owner'>;\n\nexport interface InviteFormProps {\n /** Callback when invite is submitted */\n onSubmit: (email: string, role: InviteRole) => Promise<void>;\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Available roles for invite (default: admin, member) */\n availableRoles?: InviteRole[];\n /** Default role for new invites */\n defaultRole?: InviteRole;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_ROLES: InviteRole[] = ['admin', 'member'];\n\n/**\n * Form for inviting new members to an organization.\n *\n * @example\n * ```tsx\n * function InviteManager() {\n * const { activeOrg } = useOrgs();\n * const { createInvite, isLoading, error } = useInvites(activeOrg?.id);\n *\n * return (\n * <InviteForm\n * onSubmit={createInvite}\n * isLoading={isLoading}\n * error={error?.message}\n * defaultRole=\"member\"\n * />\n * );\n * }\n * ```\n */\nexport function InviteForm({\n onSubmit,\n isLoading = false,\n error,\n availableRoles = DEFAULT_ROLES,\n defaultRole = 'member',\n className = '',\n}: InviteFormProps) {\n const [email, setEmail] = useState('');\n const [role, setRole] = useState<InviteRole>(defaultRole);\n const [formError, setFormError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const successTimerRef = useRef<number | null>(null);\n // UI-03: Track mounted state to prevent state updates after unmount\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n if (successTimerRef.current !== null) {\n window.clearTimeout(successTimerRef.current);\n successTimerRef.current = null;\n }\n };\n }, []);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n setSuccess(false);\n\n const trimmedEmail = email.trim();\n\n if (!trimmedEmail) {\n setFormError('Email is required');\n return;\n }\n\n if (!validateEmail(trimmedEmail)) {\n setFormError('Please enter a valid email address');\n return;\n }\n\n try {\n await onSubmit(trimmedEmail, role);\n setEmail('');\n setRole(defaultRole);\n setSuccess(true);\n // Clear success message after 3 seconds\n if (successTimerRef.current !== null) {\n window.clearTimeout(successTimerRef.current);\n }\n successTimerRef.current = window.setTimeout(() => {\n // UI-03: Check mounted before state update to prevent memory leak warnings\n if (isMountedRef.current) {\n setSuccess(false);\n }\n successTimerRef.current = null;\n }, 3000);\n } catch {\n // H-05: Error handling is delegated to parent component.\n // Parent's onSubmit throws -> parent catches -> sets error prop -> ErrorMessage displays it.\n // This pattern allows the parent to control error display and retry logic.\n }\n },\n [email, role, defaultRole, onSubmit]\n );\n\n return (\n <form className={`cedros-invite-form ${className}`} onSubmit={handleSubmit}>\n {(error || formError) && <ErrorMessage error={formError ?? error ?? null} />}\n\n {success && (\n <div className=\"cedros-invite-success\" role=\"status\">\n <CheckIcon />\n <span>Invitation sent successfully!</span>\n </div>\n )}\n\n <div className=\"cedros-invite-form-row\">\n <div className=\"cedros-form-group cedros-invite-email-group\">\n <label htmlFor=\"invite-email\" className=\"cedros-form-label\">\n Email Address\n </label>\n <input\n id=\"invite-email\"\n type=\"email\"\n className=\"cedros-form-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"colleague@example.com\"\n disabled={isLoading}\n autoComplete=\"email\"\n />\n </div>\n\n <div className=\"cedros-form-group cedros-invite-role-group\">\n <label htmlFor=\"invite-role\" className=\"cedros-form-label\">\n Role\n </label>\n <select\n id=\"invite-role\"\n className=\"cedros-form-select\"\n value={role}\n onChange={(e) => setRole(e.target.value as InviteRole)}\n disabled={isLoading}\n >\n {availableRoles.map((r) => (\n <option key={r} value={r}>\n {r.charAt(0).toUpperCase() + r.slice(1)}\n </option>\n ))}\n </select>\n </div>\n\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary cedros-invite-submit\"\n disabled={isLoading || !email.trim()}\n >\n {isLoading ? <LoadingSpinner size=\"sm\" /> : 'Send Invite'}\n </button>\n </div>\n\n <p className=\"cedros-form-hint\">\n The invited user will receive an email with a link to join your organization.\n </p>\n </form>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-invite-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { Invite, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface InviteListProps {\n /** List of pending invites */\n invites: Invite[];\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Whether the current user can manage invites */\n canManage?: boolean;\n /** Callback when invite is cancelled */\n onCancel?: (inviteId: string) => Promise<void>;\n /** Callback when invite is resent */\n onResend?: (inviteId: string) => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Display and manage pending organization invites.\n *\n * @example\n * ```tsx\n * function PendingInvites() {\n * const { activeOrg, hasPermission } = useOrgs();\n * const { invites, isLoading, error, cancelInvite, resendInvite } = useInvites(activeOrg?.id);\n *\n * return (\n * <InviteList\n * invites={invites}\n * isLoading={isLoading}\n * error={error?.message}\n * canManage={hasPermission('invite:cancel')}\n * onCancel={cancelInvite}\n * onResend={resendInvite}\n * />\n * );\n * }\n * ```\n */\nexport function InviteList({\n invites,\n isLoading = false,\n error,\n canManage = false,\n onCancel,\n onResend,\n className = '',\n}: InviteListProps) {\n if (isLoading && invites.length === 0) {\n return (\n <div className={`cedros-invite-list cedros-invite-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading invites...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-invite-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (invites.length === 0) {\n return (\n <div className={`cedros-invite-list cedros-invite-list-empty ${className}`}>\n <p>No pending invites.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-invite-list ${className}`}>\n <ul className=\"cedros-invite-items\">\n {invites.map((invite) => (\n <InviteItem\n key={invite.id}\n invite={invite}\n canManage={canManage}\n onCancel={onCancel}\n onResend={onResend}\n />\n ))}\n </ul>\n </div>\n );\n}\n\n// Invite item component\ninterface InviteItemProps {\n invite: Invite;\n canManage: boolean;\n onCancel?: (inviteId: string) => Promise<void>;\n onResend?: (inviteId: string) => Promise<void>;\n}\n\nfunction InviteItem({ invite, canManage, onCancel, onResend }: InviteItemProps) {\n const [isUpdating, setIsUpdating] = useState(false);\n const [resendSuccess, setResendSuccess] = useState(false);\n const resendTimerRef = useRef<number | null>(null);\n\n const isExpired = new Date(invite.expiresAt) < new Date();\n\n const handleCancel = useCallback(async () => {\n if (!onCancel) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to cancel the invite for ${invite.email}?`\n );\n if (!confirmed) return;\n\n setIsUpdating(true);\n try {\n await onCancel(invite.id);\n } finally {\n setIsUpdating(false);\n }\n }, [invite.id, invite.email, onCancel]);\n\n const handleResend = useCallback(async () => {\n if (!onResend) return;\n\n setIsUpdating(true);\n setResendSuccess(false);\n try {\n await onResend(invite.id);\n setResendSuccess(true);\n if (resendTimerRef.current !== null) {\n window.clearTimeout(resendTimerRef.current);\n }\n resendTimerRef.current = window.setTimeout(() => {\n setResendSuccess(false);\n resendTimerRef.current = null;\n }, 3000);\n } finally {\n setIsUpdating(false);\n }\n }, [invite.id, onResend]);\n\n useEffect(() => {\n return () => {\n if (resendTimerRef.current !== null) {\n window.clearTimeout(resendTimerRef.current);\n resendTimerRef.current = null;\n }\n };\n }, []);\n\n return (\n <li className={`cedros-invite-item ${isExpired ? 'cedros-invite-item-expired' : ''}`}>\n <div className=\"cedros-invite-item-info\">\n <div className=\"cedros-invite-item-main\">\n <span className=\"cedros-invite-item-email\">{invite.email}</span>\n <span className={`cedros-role-badge cedros-role-badge-${invite.role}`}>\n {invite.role.charAt(0).toUpperCase() + invite.role.slice(1)}\n </span>\n {isExpired && <span className=\"cedros-invite-expired-badge\">Expired</span>}\n </div>\n <div className=\"cedros-invite-item-meta\">\n <span className=\"cedros-invite-item-date\">\n {/* TYPE-05: invitedByName removed - backend doesn't populate it */}\n Invited {formatDate(invite.createdAt)}\n </span>\n {!isExpired && (\n <span className=\"cedros-invite-item-expires\">\n Expires {formatRelativeTime(invite.expiresAt)}\n </span>\n )}\n </div>\n </div>\n\n {canManage && (\n <div className=\"cedros-invite-item-actions\">\n {resendSuccess && <span className=\"cedros-invite-resend-success\">Sent!</span>}\n {onResend && !isExpired && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={handleResend}\n disabled={isUpdating}\n aria-label={`Resend invite to ${invite.email}`}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Resend'}\n </button>\n )}\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger cedros-button-sm\"\n onClick={handleCancel}\n disabled={isUpdating}\n aria-label={`Cancel invite for ${invite.email}`}\n >\n Cancel\n </button>\n )}\n </div>\n )}\n </li>\n );\n}\n\n// Helper functions\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n return 'expired';\n } else if (diffDays === 0) {\n return 'today';\n } else if (diffDays === 1) {\n return 'tomorrow';\n } else if (diffDays < 7) {\n return `in ${diffDays} days`;\n } else {\n return formatDate(dateString);\n }\n}\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport type { Session, DisplayError } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface SessionListProps {\n /** List of active sessions */\n sessions: Session[];\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: DisplayError;\n /** Callback to revoke all other sessions */\n onRevokeAll?: () => Promise<void>;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Display active sessions and allow revoking all other sessions.\n *\n * @example\n * ```tsx\n * function SecuritySettings() {\n * const { sessions, isLoading, error, revokeAllSessions } = useSessions();\n *\n * return (\n * <SessionList\n * sessions={sessions}\n * isLoading={isLoading}\n * error={error?.message}\n * onRevokeAll={revokeAllSessions}\n * />\n * );\n * }\n * ```\n */\nexport function SessionList({\n sessions,\n isLoading = false,\n error,\n onRevokeAll,\n className = '',\n}: SessionListProps) {\n const [isRevoking, setIsRevoking] = useState(false);\n const [revokeSuccess, setRevokeSuccess] = useState(false);\n const revokeTimerRef = useRef<number | null>(null);\n\n // PERF-05: Memoize filtered count to avoid O(n) filter on every render.\n // This count is used in the button text and handleRevokeAll callback.\n const otherSessionCount = useMemo(() => sessions.filter((s) => !s.isCurrent).length, [sessions]);\n\n const handleRevokeAll = useCallback(async () => {\n if (!onRevokeAll) return;\n\n // M-09: Recalculate count inside handler to avoid stale closure.\n // If sessions change between callback creation and confirm dialog,\n // we want the confirm message to show the current count.\n const currentOtherCount = sessions.filter((s) => !s.isCurrent).length;\n if (currentOtherCount === 0) return;\n\n const confirmed = window.confirm(\n `Are you sure you want to sign out of ${currentOtherCount} other device(s)? This will log you out everywhere except this browser.`\n );\n if (!confirmed) return;\n\n setIsRevoking(true);\n setRevokeSuccess(false);\n\n try {\n await onRevokeAll();\n setRevokeSuccess(true);\n if (revokeTimerRef.current !== null) {\n window.clearTimeout(revokeTimerRef.current);\n }\n revokeTimerRef.current = window.setTimeout(() => {\n setRevokeSuccess(false);\n revokeTimerRef.current = null;\n }, 3000);\n } finally {\n setIsRevoking(false);\n }\n }, [onRevokeAll, sessions]);\n\n useEffect(() => {\n return () => {\n if (revokeTimerRef.current !== null) {\n window.clearTimeout(revokeTimerRef.current);\n revokeTimerRef.current = null;\n }\n };\n }, []);\n\n if (isLoading && sessions.length === 0) {\n return (\n <div className={`cedros-session-list cedros-session-list-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading sessions...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-session-list ${className}`}>\n <ErrorMessage error={error} />\n </div>\n );\n }\n\n if (sessions.length === 0) {\n return (\n <div className={`cedros-session-list cedros-session-list-empty ${className}`}>\n <p>No active sessions found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-session-list ${className}`}>\n {revokeSuccess && (\n <div className=\"cedros-session-success\" role=\"status\">\n <CheckIcon />\n <span>All other sessions have been revoked.</span>\n </div>\n )}\n\n <ul className=\"cedros-session-items\">\n {sessions.map((session) => (\n <SessionItem key={session.id} session={session} />\n ))}\n </ul>\n\n {onRevokeAll && otherSessionCount > 0 && (\n <div className=\"cedros-session-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger\"\n onClick={handleRevokeAll}\n disabled={isRevoking}\n >\n {isRevoking ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Signing out...</span>\n </>\n ) : (\n `Sign out of ${otherSessionCount} other device${otherSessionCount > 1 ? 's' : ''}`\n )}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// Session item component\nfunction SessionItem({ session }: { session: Session }) {\n const browserInfo = parseUserAgent(session.userAgent);\n const isExpiringSoon = isSessionExpiringSoon(session.expiresAt);\n\n return (\n <li className={`cedros-session-item ${session.isCurrent ? 'cedros-session-item-current' : ''}`}>\n <div className=\"cedros-session-item-icon\">\n <DeviceIcon userAgent={session.userAgent} />\n </div>\n <div className=\"cedros-session-item-info\">\n <div className=\"cedros-session-item-main\">\n <span className=\"cedros-session-item-device\">\n {browserInfo.browser} on {browserInfo.os}\n </span>\n {session.isCurrent && (\n <span className=\"cedros-session-current-badge\">Current session</span>\n )}\n </div>\n <div className=\"cedros-session-item-meta\">\n {session.ipAddress && (\n <span className=\"cedros-session-item-ip\">IP: {session.ipAddress}</span>\n )}\n <span className=\"cedros-session-item-created\">\n Started {formatRelativeTime(session.createdAt)}\n </span>\n {isExpiringSoon && <span className=\"cedros-session-expiring\">Expires soon</span>}\n </div>\n </div>\n </li>\n );\n}\n\n// Helper functions\ninterface BrowserInfo {\n browser: string;\n os: string;\n}\n\nfunction parseUserAgent(userAgent?: string): BrowserInfo {\n if (!userAgent) {\n return { browser: 'Unknown browser', os: 'Unknown device' };\n }\n\n // Simple browser detection\n let browser = 'Unknown browser';\n if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) {\n browser = 'Chrome';\n } else if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) {\n browser = 'Safari';\n } else if (userAgent.includes('Firefox')) {\n browser = 'Firefox';\n } else if (userAgent.includes('Edg')) {\n browser = 'Edge';\n }\n\n // Simple OS detection\n let os = 'Unknown device';\n if (userAgent.includes('Windows')) {\n os = 'Windows';\n } else if (userAgent.includes('Mac')) {\n os = 'macOS';\n } else if (userAgent.includes('Linux')) {\n os = 'Linux';\n } else if (userAgent.includes('iPhone') || userAgent.includes('iPad')) {\n os = 'iOS';\n } else if (userAgent.includes('Android')) {\n os = 'Android';\n }\n\n return { browser, os };\n}\n\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / (1000 * 60));\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffMins < 1) {\n return 'just now';\n } else if (diffMins < 60) {\n return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`;\n } else if (diffHours < 24) {\n return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n } else if (diffDays < 7) {\n return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n } else {\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n}\n\nfunction isSessionExpiringSoon(expiresAt: string): boolean {\n const expires = new Date(expiresAt);\n const now = new Date();\n const hourInMs = 60 * 60 * 1000;\n return expires.getTime() - now.getTime() < hourInMs;\n}\n\n// Icon components\nfunction DeviceIcon({ userAgent }: { userAgent?: string }) {\n const isMobile =\n userAgent?.includes('iPhone') || userAgent?.includes('iPad') || userAgent?.includes('Android');\n\n if (isMobile) {\n return (\n <svg\n className=\"cedros-session-device-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n }\n\n return (\n <svg\n className=\"cedros-session-device-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 21H16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M12 18V21\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n className=\"cedros-session-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8L6 11L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Component to display BIP-39 recovery phrase\n *\n * Shows 12 words in a grid format with copy functionality.\n * Includes security warnings about storing the phrase safely.\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { formatMnemonicForDisplay } from '../../crypto';\n\nexport interface RecoveryPhraseDisplayProps {\n /** Array of 12 mnemonic words */\n words: string[];\n /** Callback when user confirms they've saved the phrase */\n onConfirm: () => void;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Display recovery phrase with security warnings\n */\nexport function RecoveryPhraseDisplay({\n words,\n onConfirm,\n className = '',\n}: RecoveryPhraseDisplayProps) {\n const [copied, setCopied] = useState(false);\n const [confirmed, setConfirmed] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n const wordGroups = formatMnemonicForDisplay(words);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(words.join(' '));\n setCopied(true);\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [words]);\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n // COMP-02: The `confirmed` check is defense-in-depth - button is disabled when\n // !confirmed, but check guards against CSS/JS injection enabling the button\n const handleConfirm = useCallback(() => {\n if (confirmed) {\n onConfirm();\n }\n }, [confirmed, onConfirm]);\n\n return (\n <div className={`cedros-recovery-phrase-display ${className}`}>\n <div className=\"cedros-recovery-header\">\n <h3 className=\"cedros-recovery-title\">Recovery Phrase</h3>\n <p className=\"cedros-recovery-warning\">\n Write down these 12 words in order and store them securely. This is the only way to\n recover your wallet if you lose access.\n </p>\n </div>\n\n <div className=\"cedros-recovery-grid\">\n {wordGroups.map((group, groupIndex) => (\n <div key={groupIndex} className=\"cedros-word-group\">\n {group.map((word, wordIndex) => {\n const number = groupIndex * 4 + wordIndex + 1;\n return (\n <div key={number} className=\"cedros-word-item\">\n <span className=\"cedros-word-number\">{number}.</span>\n <span className=\"cedros-word-text\">{word}</span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary cedros-copy-btn\"\n onClick={handleCopy}\n >\n {copied ? 'Copied!' : 'Copy to Clipboard'}\n </button>\n\n <div className=\"cedros-recovery-security\">\n <div className=\"cedros-warning-box\">\n <svg\n className=\"cedros-warning-icon\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10 6v4m0 4h.01M19 10a9 9 0 11-18 0 9 9 0 0118 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <div className=\"cedros-warning-content\">\n <strong>Security Warning</strong>\n <ul>\n <li>Never share this phrase with anyone</li>\n <li>Store it offline in a secure location</li>\n <li>Anyone with this phrase can access your wallet</li>\n <li>Cedros cannot recover this phrase for you</li>\n </ul>\n </div>\n </div>\n </div>\n\n <div className=\"cedros-recovery-confirm\">\n <label className=\"cedros-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={confirmed}\n onChange={(e) => setConfirmed(e.target.checked)}\n className=\"cedros-checkbox\"\n />\n <span>I have written down and securely stored my recovery phrase</span>\n </label>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleConfirm}\n disabled={!confirmed}\n >\n Continue\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Component for entering BIP-39 recovery phrase\n *\n * Provides input fields for 12 words with validation and autocomplete.\n */\n\nimport { useState, useCallback, useId, useRef, useEffect } from 'react';\nimport {\n isValidWord,\n getWordSuggestions,\n parseMnemonicInput,\n isValidMnemonic,\n MNEMONIC_WORD_COUNT,\n} from '../../crypto';\n\nexport interface RecoveryPhraseInputProps {\n /** Callback when valid phrase is entered */\n onSubmit: (words: string[]) => void;\n /** Callback to cancel */\n onCancel?: () => void;\n /** Whether submission is in progress */\n isSubmitting?: boolean;\n /** Error message to display */\n error?: string;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Input form for recovery phrase\n */\nexport function RecoveryPhraseInput({\n onSubmit,\n onCancel,\n isSubmitting = false,\n error,\n className = '',\n}: RecoveryPhraseInputProps) {\n const [words, setWords] = useState<string[]>(Array(MNEMONIC_WORD_COUNT).fill(''));\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [validationError, setValidationError] = useState<string | null>(null);\n const inputId = useId();\n const suggestionsTimerRef = useRef<number | null>(null);\n\n const handleWordChange = useCallback(\n (index: number, value: string) => {\n const newWords = [...words];\n newWords[index] = value.toLowerCase().trim();\n setWords(newWords);\n\n // Update suggestions\n if (value.length > 0) {\n const newSuggestions = getWordSuggestions(value, 5);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n\n // Clear validation error while typing\n setValidationError(null);\n },\n [words]\n );\n\n const handleWordFocus = useCallback((index: number) => {\n setActiveIndex(index);\n setSuggestions([]);\n }, []);\n\n const handleWordBlur = useCallback(\n (index: number) => {\n // Validate word on blur\n const word = words[index];\n if (word && !isValidWord(word)) {\n setValidationError(`Word ${index + 1} is not in the wordlist`);\n }\n\n // Clear suggestions after a delay (allows clicking suggestions)\n if (suggestionsTimerRef.current !== null) {\n window.clearTimeout(suggestionsTimerRef.current);\n }\n suggestionsTimerRef.current = window.setTimeout(() => {\n if (activeIndex === index) {\n setSuggestions([]);\n }\n }, 200);\n },\n [words, activeIndex]\n );\n\n useEffect(() => {\n return () => {\n if (suggestionsTimerRef.current !== null) {\n window.clearTimeout(suggestionsTimerRef.current);\n suggestionsTimerRef.current = null;\n }\n };\n }, []);\n\n const handleSuggestionClick = useCallback(\n (suggestion: string) => {\n if (activeIndex !== null) {\n const newWords = [...words];\n newWords[activeIndex] = suggestion;\n setWords(newWords);\n setSuggestions([]);\n\n // Move to next input\n const nextInput = document.querySelector<HTMLInputElement>(\n `[data-word-index=\"${activeIndex + 1}\"]`\n );\n nextInput?.focus();\n }\n },\n [activeIndex, words]\n );\n\n const handlePaste = useCallback((e: React.ClipboardEvent) => {\n const pastedText = e.clipboardData.getData('text');\n const parsedWords = parseMnemonicInput(pastedText);\n\n if (parsedWords.length === MNEMONIC_WORD_COUNT) {\n e.preventDefault();\n setWords(parsedWords);\n setValidationError(null);\n }\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate all words are filled\n const emptyCount = words.filter((w) => !w).length;\n if (emptyCount > 0) {\n setValidationError(`Please enter all ${MNEMONIC_WORD_COUNT} words`);\n return;\n }\n\n // Validate each word is in wordlist\n const invalidWords = words\n .map((w, i) => ({ word: w, index: i + 1 }))\n .filter(({ word }) => !isValidWord(word));\n\n if (invalidWords.length > 0) {\n setValidationError(`Invalid words: ${invalidWords.map((w) => `#${w.index}`).join(', ')}`);\n return;\n }\n\n // Validate checksum\n if (!isValidMnemonic(words)) {\n setValidationError('Invalid recovery phrase - please check your words');\n return;\n }\n\n onSubmit(words);\n },\n [words, onSubmit]\n );\n\n const displayError = error || validationError;\n\n return (\n <form\n className={`cedros-recovery-phrase-input ${className}`}\n onSubmit={handleSubmit}\n onPaste={handlePaste}\n >\n <div className=\"cedros-recovery-input-header\">\n <h3 className=\"cedros-recovery-input-title\">Enter Recovery Phrase</h3>\n <p className=\"cedros-recovery-input-description\">\n Enter your 12-word recovery phrase. You can paste the entire phrase at once.\n </p>\n </div>\n\n <div className=\"cedros-word-inputs\">\n {Array.from({ length: MNEMONIC_WORD_COUNT }, (_, index) => (\n <div key={index} className=\"cedros-word-input-wrapper\">\n <label className=\"cedros-word-label\">{index + 1}.</label>\n <input\n type=\"text\"\n className={`cedros-word-input ${\n words[index] && !isValidWord(words[index])\n ? 'cedros-word-invalid'\n : words[index] && isValidWord(words[index])\n ? 'cedros-word-valid'\n : ''\n }`}\n value={words[index]}\n onChange={(e) => handleWordChange(index, e.target.value)}\n onFocus={() => handleWordFocus(index)}\n onBlur={() => handleWordBlur(index)}\n data-word-index={index}\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n spellCheck={false}\n disabled={isSubmitting}\n aria-label={`Word ${index + 1}`}\n />\n </div>\n ))}\n </div>\n\n {activeIndex !== null && suggestions.length > 0 && (\n <div className=\"cedros-suggestions\" role=\"listbox\" id={`${inputId}-suggestions`}>\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"cedros-suggestion\"\n onClick={() => handleSuggestionClick(suggestion)}\n role=\"option\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n\n {displayError && (\n <p className=\"cedros-input-error\" role=\"alert\">\n {displayError}\n </p>\n )}\n\n <div className=\"cedros-recovery-input-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Recovering...' : 'Recover Wallet'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Component to display warnings about missing crypto capabilities\n */\n\nimport { getMissingCapabilitiesMessage, getBrowserSupportInfo } from '../../crypto';\nimport type { CryptoCapabilities } from '../../crypto';\n\nexport interface CapabilityWarningProps {\n /** Capability check results */\n capabilities: CryptoCapabilities;\n /** Optional class name */\n className?: string;\n}\n\n/**\n * Warning display for missing capabilities\n */\nexport function CapabilityWarning({ capabilities, className = '' }: CapabilityWarningProps) {\n if (capabilities.allSupported) {\n return null;\n }\n\n const message = getMissingCapabilitiesMessage(capabilities);\n const browserInfo = getBrowserSupportInfo();\n\n return (\n <div className={`cedros-capability-warning ${className}`} role=\"alert\">\n <div className=\"cedros-warning-header\">\n <svg\n className=\"cedros-warning-icon\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 9v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3 className=\"cedros-warning-title\">Wallet Feature Unavailable</h3>\n </div>\n\n <p className=\"cedros-warning-message\">{message}</p>\n\n <div className=\"cedros-capability-details\">\n <h4>Browser Compatibility</h4>\n <p>\n Detected: {browserInfo.browser} {browserInfo.version}\n {browserInfo.likelySupported ? ' (likely supported)' : ' (may not be supported)'}\n </p>\n\n <h4>Required Features</h4>\n <ul className=\"cedros-capability-list\">\n <li className={capabilities.webCrypto ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n Web Crypto API: {capabilities.webCrypto ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.aesGcm ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n AES-GCM Encryption: {capabilities.aesGcm ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.hkdf ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n HKDF Key Derivation: {capabilities.hkdf ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.webAuthn ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n WebAuthn/Passkeys: {capabilities.webAuthn ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.webAuthnPrf ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n WebAuthn PRF Extension: {capabilities.webAuthnPrf ? 'Available' : 'Missing'}\n </li>\n <li className={capabilities.argon2 ? 'cedros-cap-ok' : 'cedros-cap-missing'}>\n Argon2 Password Hashing: {capabilities.argon2 ? 'Available' : 'Missing'}\n </li>\n </ul>\n </div>\n\n <div className=\"cedros-capability-help\">\n <h4>Recommended Browsers</h4>\n <ul>\n <li>Chrome 116+ on Windows, macOS, or Android</li>\n <li>Safari 17+ on macOS or iOS</li>\n <li>Edge 116+ on Windows</li>\n </ul>\n <p className=\"cedros-capability-note\">\n A platform authenticator (Touch ID, Face ID, or Windows Hello) is required.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * Hook to fetch wallet discovery config from server\n *\n * Fetches wallet configuration from the discovery endpoint to determine\n * recovery mode and other wallet settings.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient } from '../utils/apiClient';\nimport type { WalletDiscoveryConfig, WalletRecoveryMode } from '../types/wallet';\n\n/** Discovery endpoint response */\ninterface DiscoveryResponse {\n wallet?: {\n enabled: boolean;\n recoveryMode: string;\n unlockTtlSeconds: number;\n };\n}\n\nconst VALID_RECOVERY_MODES: WalletRecoveryMode[] = ['share_c_only', 'full_seed', 'none'];\n\nfunction normalizeRecoveryMode(mode: string | undefined): WalletRecoveryMode {\n if (!mode) return 'share_c_only';\n return VALID_RECOVERY_MODES.includes(mode as WalletRecoveryMode)\n ? (mode as WalletRecoveryMode)\n : 'share_c_only';\n}\n\n/** Return type for useWalletDiscovery hook */\nexport interface UseWalletDiscoveryReturn {\n /** Whether wallet feature is enabled on server */\n walletEnabled: boolean;\n /** Recovery mode: share_c_only or full_seed */\n recoveryMode: WalletRecoveryMode;\n /** Session unlock TTL in seconds */\n unlockTtlSeconds: number;\n /** Whether config is still loading */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n /** Refetch the config */\n refetch: () => Promise<void>;\n}\n\n/** Default return value when outside provider context */\nconst DEFAULT_RETURN: UseWalletDiscoveryReturn = {\n walletEnabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n isLoading: false,\n error: null,\n refetch: async () => {},\n};\n\n/**\n * Hook to fetch wallet discovery configuration from server\n *\n * Automatically fetches on mount and caches the result.\n * Default values are used if fetch fails or wallet is not enabled.\n * Returns defaults when used outside CedrosLoginProvider.\n */\nexport function useWalletDiscovery(): UseWalletDiscoveryReturn {\n const context = useCedrosLoginOptional();\n\n const [walletConfig, setWalletConfig] = useState<WalletDiscoveryConfig | null>(null);\n const [isLoading, setIsLoading] = useState(!!context);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n });\n }, [context]);\n\n const fetchConfig = useCallback(async () => {\n if (!apiClient) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.get<DiscoveryResponse>('/discovery');\n\n if (response.wallet) {\n setWalletConfig({\n enabled: response.wallet.enabled,\n recoveryMode: normalizeRecoveryMode(response.wallet.recoveryMode),\n unlockTtlSeconds: response.wallet.unlockTtlSeconds,\n });\n } else {\n // Wallet not configured on server\n setWalletConfig({\n enabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to fetch wallet config';\n setError(message);\n // Use defaults on error\n setWalletConfig({\n enabled: false,\n recoveryMode: 'share_c_only',\n unlockTtlSeconds: 900,\n });\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n useEffect(() => {\n if (apiClient) {\n fetchConfig();\n }\n }, [apiClient, fetchConfig]);\n\n // Return defaults when outside provider\n if (!context) {\n return DEFAULT_RETURN;\n }\n\n return {\n walletEnabled: walletConfig?.enabled ?? false,\n recoveryMode: walletConfig?.recoveryMode ?? 'share_c_only',\n unlockTtlSeconds: walletConfig?.unlockTtlSeconds ?? 900,\n isLoading,\n error,\n refetch: fetchConfig,\n };\n}\n","/**\n * Hook for wallet enrollment flow (server-side signing)\n *\n * Orchestrates the complete enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares\n * 3. Encrypt Share A with password/PIN or passkey PRF\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n * 6. Display recovery phrase (Share C or full seed based on config)\n *\n * Recovery modes:\n * - share_c_only: User gets Share C. Recovery within app only (not portable).\n * - full_seed: User gets full seed. Can use wallet elsewhere (portable).\n *\n * Share B is sent as plaintext (SSS math protects it - 1 share reveals nothing).\n * Passkey PRF is used only for passkey auth method. Server combines shares for signing.\n *\n * H-03: Security Note - Recovery Phrase Visibility\n * The recovery phrase is stored in React state during the 'showing_recovery' step.\n * This is intentional - the user MUST see the phrase to back it up. The phrase:\n * - Is visible in React DevTools during enrollment\n * - Is cleared from state when the component unmounts or enrollment completes\n * - Byte arrays (seed, shares) are securely wiped via sensitiveData ref\n * - String mnemonics cannot be securely wiped (JS string immutability)\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport {\n generateSeed,\n generateArgon2Salt,\n generatePrfSalt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n authenticateWithDiscoverablePrf,\n registerPasskeyWithPrf,\n deriveKeyFromPrf,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n seedToMnemonic,\n shareToMnemonic,\n wipeAll,\n toEncryptionKey,\n toShamirShare,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { useWalletDiscovery } from './useWalletDiscovery';\nimport type {\n UseWalletEnrollmentReturn,\n EnrollmentState,\n WalletEnrollRequest,\n ShareAAuthMethod,\n} from '../types/wallet';\n\n/**\n * Hook for wallet enrollment\n *\n * Supports auth methods:\n * - password: User sets a wallet password (Argon2id KDF)\n * - passkey: Uses passkey PRF extension\n */\nexport function useWalletEnrollment(): UseWalletEnrollmentReturn {\n const { user } = useCedrosLogin();\n const { enroll } = useWalletMaterial();\n const { recoveryMode } = useWalletDiscovery();\n\n const [state, setState] = useState<EnrollmentState>({ step: 'idle' });\n const [isEnrolling, setIsEnrolling] = useState(false);\n\n // Store sensitive data for cleanup\n const sensitiveData = useRef<Uint8Array[]>([]);\n\n const cleanup = useCallback(() => {\n wipeAll(...sensitiveData.current);\n sensitiveData.current = [];\n }, []);\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n /**\n * Core enrollment logic shared by all auth methods\n */\n const doEnrollment = useCallback(\n async (\n authMethod: ShareAAuthMethod,\n encryptionKey: Uint8Array,\n kdfSalt?: Uint8Array,\n prfSalt?: string\n ): Promise<void> => {\n // Step 1: Generate seed\n setState({ step: 'generating_seed' });\n const seed = generateSeed();\n sensitiveData.current.push(seed);\n\n // Step 2: Split into shares\n setState({ step: 'splitting_shares' });\n const { shareA, shareB, shareC } = splitSecret(seed);\n sensitiveData.current.push(shareA, shareB, shareC);\n\n // Step 3: Encrypt Share A\n setState({ step: 'encrypting_shares' });\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(encryptionKey));\n\n // Step 4: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 5: Upload to server\n setState({ step: 'uploading' });\n\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: authMethod,\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n // Share B is now plaintext (SSS math protects it)\n shareB: uint8ArrayToBase64(shareB),\n };\n\n // Add auth-method-specific fields\n if (authMethod === 'password') {\n if (!kdfSalt) throw new Error('KDF salt required for password method');\n request.shareAKdfSalt = uint8ArrayToBase64(kdfSalt);\n request.shareAKdfParams = DEFAULT_KDF_PARAMS;\n }\n\n if (authMethod === 'passkey' && prfSalt) {\n request.prfSalt = prfSalt;\n }\n\n await enroll(request);\n\n // Step 6: Show recovery phrase based on recovery mode\n // - share_c_only: Show Share C (app-locked, not portable)\n // - full_seed: Show full seed (portable to other wallets)\n // - none: Skip recovery phrase entirely (Privacy Cash mode)\n if (recoveryMode === 'none') {\n // No recovery option - go straight to complete\n cleanup();\n setState({\n step: 'complete',\n solanaPubkey,\n });\n } else {\n const recoveryPhrase =\n recoveryMode === 'full_seed'\n ? seedToMnemonic(seed)\n : shareToMnemonic(toShamirShare(shareC));\n\n setState({\n step: 'showing_recovery',\n recoveryPhrase,\n solanaPubkey,\n });\n }\n },\n [enroll, recoveryMode, cleanup]\n );\n\n /**\n * Start enrollment with password (email users)\n * Uses user's login password for Share A encryption\n */\n const startEnrollmentWithPassword = useCallback(\n async (password: string): Promise<void> => {\n if (!user) {\n setState({ step: 'error', error: 'User not authenticated' });\n return;\n }\n\n setIsEnrolling(true);\n cleanup();\n\n try {\n // Derive key from password using Argon2id\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.current.push(key);\n\n await doEnrollment('password', key, salt);\n } catch (err) {\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Enrollment failed',\n });\n } finally {\n setIsEnrolling(false);\n }\n },\n [user, cleanup, doEnrollment]\n );\n\n /**\n * Start enrollment with passkey PRF\n * Uses WebAuthn PRF extension for Share A encryption\n */\n const startEnrollmentWithPasskey = useCallback(async (): Promise<void> => {\n if (!user) {\n setState({ step: 'error', error: 'User not authenticated' });\n return;\n }\n\n setIsEnrolling(true);\n cleanup();\n\n try {\n // Generate PRF salt\n const prfSalt = generatePrfSalt();\n const prfSaltBase64 = uint8ArrayToBase64(prfSalt);\n\n // Register passkey with PRF; fallback to authenticate if credential exists\n setState({ step: 'registering_passkey' });\n let prfOutput: Uint8Array;\n try {\n const userIdBytes = new TextEncoder().encode(user.id);\n const displayName = user.name ?? user.email ?? 'User';\n const userName = user.email ?? user.id;\n const registration = await registerPasskeyWithPrf(\n userIdBytes,\n userName,\n displayName,\n prfSalt\n );\n prfOutput = registration.prfOutput;\n } catch (err) {\n const error = err as DOMException;\n if (error?.name !== 'InvalidStateError') {\n throw err;\n }\n const prfResult = await authenticateWithDiscoverablePrf(prfSaltBase64);\n prfOutput = prfResult.prfOutput;\n }\n sensitiveData.current.push(prfOutput);\n\n // Derive key from PRF output\n const key = await deriveKeyFromPrf(prfOutput, prfSalt);\n sensitiveData.current.push(key);\n\n await doEnrollment('passkey', key, undefined, prfSaltBase64);\n } catch (err) {\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Enrollment failed',\n });\n } finally {\n setIsEnrolling(false);\n }\n }, [user, cleanup, doEnrollment]);\n\n const confirmRecoveryPhrase = useCallback(() => {\n // User confirmed they saved the recovery phrase\n const solanaPubkey = state.solanaPubkey;\n cleanup();\n\n setState({\n step: 'complete',\n solanaPubkey,\n });\n }, [state.solanaPubkey, cleanup]);\n\n const cancel = useCallback(() => {\n cleanup();\n setState({ step: 'idle' });\n setIsEnrolling(false);\n }, [cleanup]);\n\n return {\n state,\n startEnrollmentWithPassword,\n startEnrollmentWithPasskey,\n confirmRecoveryPhrase,\n cancel,\n isEnrolling,\n };\n}\n","/**\n * Wallet enrollment wizard component (server-side signing)\n *\n * Guides user through the complete wallet enrollment process:\n * 1. Choose authentication method (password/passkey)\n * 2. Enter credentials for Share A encryption\n * 3. Display and confirm recovery phrase\n *\n * Share B is stored as plaintext on the server (SSS math protects it).\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { useWalletEnrollment } from '../../hooks/useWalletEnrollment';\nimport { PasswordInput } from '../email/PasswordInput';\nimport { RecoveryPhraseDisplay } from './RecoveryPhraseDisplay';\nimport type { ShareAAuthMethod } from '../../types/wallet';\n\nexport interface WalletEnrollmentProps {\n /** Callback when enrollment completes */\n onComplete?: (solanaPubkey: string) => void;\n /** Callback to cancel enrollment */\n onCancel?: () => void;\n /** Optional class name */\n className?: string;\n /** Force a specific auth method (otherwise auto-detected) */\n forceAuthMethod?: ShareAAuthMethod;\n}\n\n/**\n * Wallet enrollment wizard\n */\nexport function WalletEnrollment({\n onComplete,\n onCancel,\n className = '',\n forceAuthMethod,\n}: WalletEnrollmentProps) {\n const { user } = useCedrosLogin();\n const {\n state,\n startEnrollmentWithPassword,\n startEnrollmentWithPasskey,\n confirmRecoveryPhrase,\n cancel,\n isEnrolling,\n } = useWalletEnrollment();\n\n // Determine default auth method based on user type\n const getDefaultAuthMethod = (): ShareAAuthMethod => {\n if (forceAuthMethod) return forceAuthMethod;\n return 'password';\n };\n\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod>(getDefaultAuthMethod);\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [passwordError, setPasswordError] = useState<string | null>(null);\n\n // MAINT-02: Update authMethod when user changes (e.g., different login)\n useEffect(() => {\n setAuthMethod(getDefaultAuthMethod());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id, forceAuthMethod]);\n\n const handlePasswordSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate passwords match\n if (password !== confirmPassword) {\n setPasswordError('Passwords do not match');\n return;\n }\n\n // Validate password strength (minimum 8 characters)\n if (password.length < 8) {\n setPasswordError('Password must be at least 8 characters');\n return;\n }\n\n setPasswordError(null);\n await startEnrollmentWithPassword(password);\n },\n [password, confirmPassword, startEnrollmentWithPassword]\n );\n\n const handlePasskeySubmit = useCallback(async () => {\n await startEnrollmentWithPasskey();\n }, [startEnrollmentWithPasskey]);\n\n const handleRecoveryConfirm = useCallback(() => {\n confirmRecoveryPhrase();\n if (state.solanaPubkey) {\n onComplete?.(state.solanaPubkey);\n }\n }, [confirmRecoveryPhrase, state.solanaPubkey, onComplete]);\n\n const handleCancel = useCallback(() => {\n cancel();\n onCancel?.();\n }, [cancel, onCancel]);\n\n // Show loading/progress indicator during enrollment steps\n // A11Y-03: aria-busy indicates async operation in progress\n if (state.step === 'generating_seed' || state.step === 'splitting_shares') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Generating secure wallet...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'encrypting_shares') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Encrypting wallet shares...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'registering_passkey') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-passkey-prompt\">\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"8\"\n y=\"16\"\n width=\"32\"\n height=\"24\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n <h3>Authenticate with Passkey</h3>\n <p>Follow your browser's prompt to use your passkey.</p>\n </div>\n </div>\n </div>\n );\n }\n\n if (state.step === 'uploading') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`} aria-busy=\"true\">\n <div className=\"cedros-enrollment-progress\" role=\"status\" aria-live=\"polite\">\n <div className=\"cedros-spinner\" aria-hidden=\"true\" />\n <p>Saving wallet...</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'showing_recovery' && state.recoveryPhrase) {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <RecoveryPhraseDisplay words={state.recoveryPhrase} onConfirm={handleRecoveryConfirm} />\n </div>\n );\n }\n\n if (state.step === 'complete') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-complete\">\n <svg\n className=\"cedros-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"20\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M16 24l6 6 12-12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3>Wallet Created!</h3>\n <p className=\"cedros-pubkey\">\n <strong>Address:</strong> {state.solanaPubkey}\n </p>\n <p>Your non-custodial Solana wallet is ready to use.</p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'error') {\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-error\">\n <svg\n className=\"cedros-error-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"20\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M24 16v12m0 6h.01\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n <h3>Enrollment Failed</h3>\n <p className=\"cedros-error-message\">{state.error}</p>\n <div className=\"cedros-error-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={() => cancel()}\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Default: credential entry form\n return (\n <div className={`cedros-wallet-enrollment ${className}`}>\n <div className=\"cedros-enrollment-header\">\n <h2>Create Wallet</h2>\n <p>Secure your wallet with a {authMethod === 'passkey' ? 'passkey' : 'password'}.</p>\n </div>\n\n {/* Auth method selector (only show if not forced) */}\n {!forceAuthMethod && (\n <div className=\"cedros-auth-method-selector\">\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"password\"\n checked={authMethod === 'password'}\n onChange={() => setAuthMethod('password')}\n disabled={isEnrolling}\n />\n <span>Password</span>\n </label>\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"passkey\"\n checked={authMethod === 'passkey'}\n onChange={() => setAuthMethod('passkey')}\n disabled={isEnrolling}\n />\n <span>Passkey</span>\n </label>\n </div>\n )}\n\n {/* Password form */}\n {authMethod === 'password' && (\n <form onSubmit={handlePasswordSubmit} className=\"cedros-enrollment-form\">\n <PasswordInput\n label=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n showStrengthMeter\n disabled={isEnrolling}\n required\n minLength={8}\n placeholder=\"Enter a strong password\"\n />\n\n <PasswordInput\n label=\"Confirm Password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n error={passwordError ?? undefined}\n disabled={isEnrolling}\n required\n minLength={8}\n placeholder=\"Confirm your password\"\n />\n\n <div className=\"cedros-password-info\">\n <p>This password will be used to sign transactions.</p>\n </div>\n\n <div className=\"cedros-enrollment-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isEnrolling}\n >\n Cancel\n </button>\n )}\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isEnrolling || !password || !confirmPassword}\n >\n {isEnrolling ? 'Creating...' : 'Continue'}\n </button>\n </div>\n </form>\n )}\n\n {/* Passkey form */}\n {authMethod === 'passkey' && (\n <div className=\"cedros-enrollment-form\">\n <div className=\"cedros-passkey-info\">\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"8\"\n y=\"16\"\n width=\"32\"\n height=\"24\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n <p>Use your passkey (Touch ID, Face ID, or Windows Hello) to secure your wallet.</p>\n <p>You'll use the same passkey to sign transactions.</p>\n </div>\n\n <div className=\"cedros-enrollment-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isEnrolling}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handlePasskeySubmit}\n disabled={isEnrolling}\n >\n {isEnrolling ? 'Creating...' : 'Use Passkey'}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Hook for wallet transaction signing (server-side signing)\n *\n * Signing happens server-side:\n * - User provides unlock credential (password/PIN/passkey PRF)\n * - Server decrypts Share A, combines with Share B, signs, wipes\n * - Client just sends credential and transaction, receives signature\n */\n\nimport { useState, useCallback } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { authenticateWithDiscoverablePrf, base64ToUint8Array, uint8ArrayToBase64 } from '../crypto';\nimport type { UseWalletSigningReturn, UnlockCredential } from '../types/wallet';\nimport { toCredentialRequest } from '../utils/unlockCredential';\n\n/**\n * Hook for wallet transaction signing\n *\n * Usage:\n * ```tsx\n * const { signTransaction, isSigning, error } = useWalletSigning();\n *\n * // Sign with password\n * const signature = await signTransaction(txBytes, { type: 'password', password: 'xxx' });\n *\n * // Sign with PIN\n * const signature = await signTransaction(txBytes, { type: 'password', password: 'secret' });\n *\n * // Sign with passkey (PRF)\n * const signature = await signTransaction(txBytes, { type: 'prfOutput', prfOutput: 'base64...' });\n * ```\n */\nexport function useWalletSigning(): UseWalletSigningReturn {\n const { user } = useCedrosLogin();\n const { signTransaction: apiSignTransaction } = useWalletMaterial();\n\n const [isSigning, setIsSigning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Sign a transaction with the wallet\n *\n * @param transaction - Transaction bytes to sign\n * @param credential - Unlock credential (password, PIN, or PRF output)\n * @returns Ed25519 signature (64 bytes)\n */\n const signTransaction = useCallback(\n async (transaction: Uint8Array, credential?: UnlockCredential): Promise<Uint8Array> => {\n if (!user) {\n const msg = 'User not authenticated';\n setError(msg);\n throw new Error(msg);\n }\n\n setIsSigning(true);\n setError(null);\n\n try {\n const request = {\n transaction: uint8ArrayToBase64(transaction),\n ...(credential ? { credential: toCredentialRequest(credential) } : {}),\n };\n\n const response = await apiSignTransaction(request);\n\n // Decode signature from base64\n return base64ToUint8Array(response.signature);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Signing failed';\n setError(msg);\n throw err;\n } finally {\n setIsSigning(false);\n }\n },\n [user, apiSignTransaction]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n signTransaction,\n isSigning,\n error,\n clearError,\n };\n}\n\n/**\n * Helper hook to get PRF output for passkey signing\n *\n * This handles the WebAuthn PRF flow and returns a credential\n * that can be used with useWalletSigning.\n */\nexport function usePasskeySigning() {\n const { getMaterial } = useWalletMaterial();\n const [isAuthenticating, setIsAuthenticating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Get PRF output from passkey for wallet signing\n *\n * @returns UnlockCredential with PRF output, or null if cancelled\n */\n const getPasskeyCredential = useCallback(async (): Promise<UnlockCredential | null> => {\n setIsAuthenticating(true);\n setError(null);\n\n try {\n // Get wallet material to get PRF salt\n const material = await getMaterial();\n if (!material) {\n throw new Error('No wallet enrolled');\n }\n\n if (material.shareAAuthMethod !== 'passkey') {\n throw new Error('Wallet is not configured for passkey authentication');\n }\n\n if (!material.prfSalt) {\n throw new Error('No PRF salt configured for wallet');\n }\n\n // Authenticate with passkey and get PRF output\n const result = await authenticateWithDiscoverablePrf(material.prfSalt);\n\n return {\n type: 'prfOutput',\n prfOutput: uint8ArrayToBase64(result.prfOutput),\n };\n } catch (err) {\n // User cancelled or error occurred\n const msg = err instanceof Error ? err.message : 'Passkey authentication failed';\n setError(msg);\n return null;\n } finally {\n setIsAuthenticating(false);\n }\n }, [getMaterial]);\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n getPasskeyCredential,\n isAuthenticating,\n error,\n clearError,\n };\n}\n","/**\n * Passkey prompt component for WebAuthn interactions\n *\n * Provides visual feedback during WebAuthn ceremonies:\n * - Registration of new passkeys\n * - Authentication with existing passkeys\n * - PRF extension operations\n */\n\nimport { useCallback } from 'react';\n\nexport interface PasskeyPromptProps {\n /** Type of WebAuthn operation */\n mode: 'register' | 'authenticate';\n /** Whether the operation is in progress */\n isLoading?: boolean;\n /** Error message if operation failed */\n error?: string;\n /** Callback to trigger the operation */\n onPrompt?: () => void;\n /** Callback to retry after error */\n onRetry?: () => void;\n /** Callback to cancel the operation */\n onCancel?: () => void;\n /** Optional custom title */\n title?: string;\n /** Optional custom description */\n description?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * WebAuthn passkey interaction prompt\n *\n * Displays appropriate UI and messaging for passkey operations.\n */\nexport function PasskeyPrompt({\n mode,\n isLoading = false,\n error,\n onPrompt,\n onRetry,\n onCancel,\n title,\n description,\n className = '',\n}: PasskeyPromptProps) {\n const handlePrompt = useCallback(() => {\n if (!isLoading) {\n onPrompt?.();\n }\n }, [isLoading, onPrompt]);\n\n const handleRetry = useCallback(() => {\n onRetry?.();\n }, [onRetry]);\n\n const defaultTitle = mode === 'register' ? 'Set Up Passkey' : 'Verify with Passkey';\n\n const defaultDescription =\n mode === 'register'\n ? 'Create a passkey to securely encrypt your wallet on this device. You will use your fingerprint, face, or device PIN.'\n : 'Use your passkey to unlock your wallet. You will be prompted for biometric verification.';\n\n return (\n <div className={`cedros-passkey-prompt ${className}`}>\n <div className=\"cedros-passkey-icon\">\n {isLoading ? <LoadingSpinner /> : error ? <ErrorIcon /> : <PasskeyIcon />}\n </div>\n\n <h3 className=\"cedros-passkey-title\">{title ?? defaultTitle}</h3>\n\n <p className=\"cedros-passkey-description\">{description ?? defaultDescription}</p>\n\n {error && (\n <div className=\"cedros-passkey-error\" role=\"alert\">\n <p>{error}</p>\n </div>\n )}\n\n <div className=\"cedros-passkey-actions\">\n {error ? (\n <>\n {onRetry && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n )}\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n </>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handlePrompt}\n disabled={isLoading}\n >\n {isLoading ? (\n <>\n <span className=\"cedros-button-spinner\" aria-hidden=\"true\" />\n Waiting for passkey...\n </>\n ) : mode === 'register' ? (\n 'Create Passkey'\n ) : (\n 'Use Passkey'\n )}\n </button>\n {onCancel && !isLoading && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n </>\n )}\n </div>\n\n {isLoading && (\n <p className=\"cedros-passkey-hint\">\n Follow the prompts on your device to {mode === 'register' ? 'create' : 'verify'} your\n passkey.\n </p>\n )}\n </div>\n );\n}\n\n/** Fingerprint icon for passkey */\nfunction PasskeyIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n\n/** Loading spinner icon */\nfunction LoadingSpinner() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"cedros-spinner\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path d=\"M12 3a9 9 0 0 1 9 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\n/** Error icon */\nfunction ErrorIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4M12 16h.01\" />\n </svg>\n );\n}\n","/**\n * Wallet unlock component (v2 - server-side signing)\n *\n * Provides the UI for unlocking an enrolled wallet.\n * User enters their credential (password or passkey),\n * server validates and caches the derived key for session signing.\n *\n * No client-side share reconstruction - server handles everything.\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { FormEvent } from 'react';\nimport { useWalletMaterial } from '../../hooks/useWalletMaterial';\nimport { usePasskeySigning } from '../../hooks/useWalletSigning';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { PasskeyPrompt } from './PasskeyPrompt';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { PasswordInput } from '../email/PasswordInput';\nimport type { ShareAAuthMethod, UnlockCredential } from '../../types/wallet';\n\nexport interface WalletUnlockProps {\n /** Callback when wallet is successfully unlocked */\n onUnlock?: () => void;\n /** Callback when unlock is cancelled */\n onCancel?: () => void;\n /** Whether to show the cancel button */\n showCancel?: boolean;\n /** The wallet's auth method (if known) */\n authMethod?: ShareAAuthMethod;\n /** Additional CSS classes */\n className?: string;\n}\n\ntype UnlockPhase = 'idle' | 'credential' | 'unlocking' | 'unlocked' | 'error';\n\n/**\n * Wallet unlock form\n *\n * Simple single-credential flow:\n * - Password users: Enter password\n * - Passkey users: Authenticate with passkey\n *\n * Server validates credential and caches derived key for session signing.\n */\nexport function WalletUnlock({\n onUnlock,\n onCancel,\n showCancel = true,\n authMethod: propAuthMethod,\n className = '',\n}: WalletUnlockProps) {\n useCedrosLogin(); // Ensure user is authenticated\n const { unlock, getMaterial, isLoading } = useWalletMaterial();\n const { getPasskeyCredential, isAuthenticating } = usePasskeySigning();\n\n const [phase, setPhase] = useState<UnlockPhase>('idle');\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod | null>(propAuthMethod ?? null);\n const [credential, setCredential] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // MAINT-01: Sync authMethod state when prop changes\n useEffect(() => {\n if (propAuthMethod !== undefined) {\n setAuthMethod(propAuthMethod);\n }\n }, [propAuthMethod]);\n\n // Determine credential type based on auth method\n const isPasswordAuth = authMethod === 'password';\n const isPasskeyAuth = authMethod === 'passkey';\n\n // Start the unlock flow - fetch material to get auth method\n const startUnlock = useCallback(async () => {\n setPhase('credential');\n setError(null);\n\n if (!authMethod) {\n try {\n const material = await getMaterial();\n if (material) {\n setAuthMethod(material.shareAAuthMethod);\n } else {\n setError('No wallet enrolled');\n setPhase('error');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to get wallet info');\n setPhase('error');\n }\n }\n }, [authMethod, getMaterial]);\n\n // Handle credential submission\n const handleSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n setPhase('unlocking');\n\n try {\n let unlockCredential: UnlockCredential;\n\n if (isPasswordAuth) {\n unlockCredential = { type: 'password', password: credential };\n } else {\n throw new Error('Invalid auth method');\n }\n\n await unlock(unlockCredential);\n setPhase('unlocked');\n onUnlock?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to unlock wallet');\n setPhase('error');\n }\n },\n [isPasswordAuth, credential, unlock, onUnlock]\n );\n\n // Handle passkey authentication\n const handlePasskeyUnlock = useCallback(async () => {\n setError(null);\n setPhase('unlocking');\n\n try {\n const passkeyCredential = await getPasskeyCredential();\n if (!passkeyCredential) {\n setPhase('credential');\n return;\n }\n\n await unlock(passkeyCredential);\n setPhase('unlocked');\n onUnlock?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to unlock wallet');\n setPhase('error');\n }\n }, [getPasskeyCredential, unlock, onUnlock]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n setCredential('');\n setPhase('idle');\n setError(null);\n onCancel?.();\n }, [onCancel]);\n\n // Retry from error state\n const handleRetry = useCallback(() => {\n setCredential('');\n setPhase('credential');\n setError(null);\n }, []);\n\n const isProcessing = isLoading || isAuthenticating;\n\n // Render based on phase\n const renderContent = () => {\n switch (phase) {\n case 'idle':\n return (\n <div className=\"cedros-wallet-unlock-idle\">\n <div className=\"cedros-wallet-unlock-icon\">\n <LockIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Wallet Locked</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Unlock your wallet to sign transactions.\n </p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={startUnlock}\n >\n Unlock Wallet\n </button>\n </div>\n );\n\n case 'credential':\n // Password form\n if (isPasswordAuth) {\n return (\n <form className=\"cedros-wallet-unlock-form\" onSubmit={handleSubmit}>\n <h3 className=\"cedros-wallet-unlock-title\">Enter Password</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Enter your wallet password to unlock.\n </p>\n\n <PasswordInput\n label=\"Password\"\n value={credential}\n onChange={(e) => setCredential(e.target.value)}\n disabled={isProcessing}\n autoComplete=\"current-password\"\n error={error ?? undefined}\n />\n\n <div className=\"cedros-wallet-unlock-actions\">\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={isProcessing || credential.length === 0}\n >\n {isProcessing ? 'Unlocking...' : 'Unlock'}\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n disabled={isProcessing}\n >\n Cancel\n </button>\n )}\n </div>\n </form>\n );\n }\n\n // Passkey authentication\n if (isPasskeyAuth) {\n return (\n <div className=\"cedros-wallet-unlock-passkey\">\n <h3 className=\"cedros-wallet-unlock-title\">Verify with Passkey</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Use your passkey to unlock your wallet.\n </p>\n\n <PasskeyPrompt\n mode=\"authenticate\"\n isLoading={isProcessing}\n error={error ?? undefined}\n onPrompt={handlePasskeyUnlock}\n onRetry={handlePasskeyUnlock}\n onCancel={showCancel ? handleCancel : undefined}\n />\n </div>\n );\n }\n\n // Loading auth method\n return (\n <div className=\"cedros-wallet-unlock-loading\">\n <LoadingSpinner size=\"xl\" />\n <p>Loading wallet info...</p>\n </div>\n );\n\n case 'unlocking':\n return (\n <div className=\"cedros-wallet-unlock-progress\">\n <div className=\"cedros-wallet-unlock-icon\">\n <LoadingSpinner size=\"xl\" />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Unlocking Wallet</h3>\n <p className=\"cedros-wallet-unlock-description\">Verifying your credentials...</p>\n </div>\n );\n\n case 'unlocked':\n return (\n <div className=\"cedros-wallet-unlock-success\">\n <div className=\"cedros-wallet-unlock-icon\">\n <SuccessIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Wallet Unlocked</h3>\n <p className=\"cedros-wallet-unlock-description\">\n Your wallet is ready to sign transactions.\n </p>\n </div>\n );\n\n case 'error':\n return (\n <div className=\"cedros-wallet-unlock-error\">\n <div className=\"cedros-wallet-unlock-icon\">\n <ErrorIcon />\n </div>\n <h3 className=\"cedros-wallet-unlock-title\">Unlock Failed</h3>\n <p className=\"cedros-wallet-unlock-description\">\n {error ?? 'Failed to unlock wallet. Please try again.'}\n </p>\n <div className=\"cedros-wallet-unlock-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n {showCancel && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n )}\n </div>\n </div>\n );\n }\n };\n\n return <div className={`cedros-wallet-unlock ${className}`}>{renderContent()}</div>;\n}\n\n// Icon components\nfunction LockIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"10\"\n y=\"22\"\n width=\"28\"\n height=\"20\"\n rx=\"4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-muted, #f3f4f6)\"\n />\n <path d=\"M16 22V16a8 8 0 1 1 16 0v6\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\n <circle cx=\"24\" cy=\"32\" r=\"3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SuccessIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-success-light, #dcfce7)\"\n />\n <path\n d=\"M16 24l6 6 10-10\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction ErrorIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-destructive-light, #fee2e2)\"\n />\n <path\n d=\"M24 16v10M24 30v2\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","/**\n * Hook for wallet recovery flow\n *\n * Handles recovery using the BIP-39 mnemonic (recovery phrase):\n *\n * Two recovery modes supported:\n * - full_seed: User enters 12-word full seed mnemonic (portable to other wallets)\n * - share_c_only: User enters 12-word Share C mnemonic (app-locked recovery)\n *\n * Recovery flow:\n * 1. User enters 12-word recovery phrase\n * 2. Validate and decode to seed (or Share C → fetch Share B → combine)\n * 3. Re-derive Solana pubkey (proves ownership)\n * 4. Re-split seed into new Shamir shares\n * 5. Encrypt Share A with new credential\n * 6. Send to server (pubkey match verifies ownership)\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n mnemonicToSeed,\n mnemonicToShare,\n isValidMnemonic,\n combineShares,\n splitSecret,\n generateArgon2Salt,\n generatePrfSalt,\n argon2DeriveInWorker,\n authenticateWithDiscoverablePrf,\n deriveKeyFromPrf,\n aesGcmEncryptToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n toShamirShare,\n DEFAULT_KDF_PARAMS,\n base64ToUint8Array,\n uint8ArrayToBase64,\n type Seed,\n type Argon2Salt,\n} from '../crypto';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport { useWalletDiscovery } from './useWalletDiscovery';\nimport type {\n UseWalletRecoveryReturn,\n RecoveryState,\n WalletRecoverRequest,\n ShareAAuthMethod,\n} from '../types/wallet';\n\n/**\n * Hook for wallet recovery\n *\n * Supports two recovery modes based on server config:\n * - full_seed: User enters the full 12-word seed phrase (portable)\n * - share_c_only: User enters 12-word Share C phrase, server provides Share B (app-locked)\n */\nexport function useWalletRecovery(): UseWalletRecoveryReturn {\n const { recover, getShareBForRecovery } = useWalletMaterial();\n const { recoveryMode } = useWalletDiscovery();\n\n const [state, setState] = useState<RecoveryState>({ step: 'idle' });\n const [isRecovering, setIsRecovering] = useState(false);\n\n // Store sensitive data for cleanup\n const sensitiveData = useRef<Uint8Array[]>([]);\n\n const cleanup = useCallback(() => {\n wipeAll(...sensitiveData.current);\n sensitiveData.current = [];\n }, []);\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n /**\n * Start and complete recovery in one step\n *\n * @param words - 12-word recovery phrase (full seed or Share C based on mode)\n * @param method - New auth method (password or passkey)\n * @param credential - New password (ignored for passkey)\n */\n const startRecovery = useCallback(\n async (words: string[], method: ShareAAuthMethod, credential: string): Promise<void> => {\n setIsRecovering(true);\n cleanup();\n\n try {\n // Step 1: Validate mnemonic\n setState({ step: 'validating' });\n\n if (!isValidMnemonic(words)) {\n throw new Error('Invalid recovery phrase. Please check your words.');\n }\n\n let seed: Seed;\n\n if (recoveryMode === 'share_c_only') {\n // Share C mode: decode to Share C, fetch Share B, combine\n const shareC = mnemonicToShare(words);\n sensitiveData.current.push(shareC);\n\n // Send Share C to server to get Share B\n const shareCBase64 = uint8ArrayToBase64(shareC);\n const response = await getShareBForRecovery({ shareC: shareCBase64 });\n\n // Decode Share B from response\n const shareB = base64ToUint8Array(response.shareB);\n sensitiveData.current.push(shareB);\n\n // Combine Share B + Share C to reconstruct seed\n seed = combineShares(toShamirShare(shareB), toShamirShare(shareC));\n sensitiveData.current.push(seed);\n } else {\n // Full seed mode: decode mnemonic directly to seed\n seed = mnemonicToSeed(words);\n sensitiveData.current.push(seed);\n }\n\n // Step 3: Derive Solana pubkey (proves ownership when server verifies match)\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 4: Re-split seed into new shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.current.push(shareA, shareB);\n\n // Step 5: Encrypt Share A with new credential\n setState({ step: 'encrypting' });\n\n let encryptionKey: Uint8Array;\n let kdfSalt: Argon2Salt | undefined;\n let prfSaltBase64: string | undefined;\n\n if (method === 'passkey') {\n // Passkey method: authenticate and derive key from PRF\n const prfSalt = generatePrfSalt();\n prfSaltBase64 = uint8ArrayToBase64(prfSalt);\n\n const prfResult = await authenticateWithDiscoverablePrf(prfSaltBase64);\n sensitiveData.current.push(prfResult.prfOutput);\n\n encryptionKey = await deriveKeyFromPrf(prfResult.prfOutput, prfSalt);\n sensitiveData.current.push(encryptionKey);\n } else {\n // Password method: derive key with Argon2id\n kdfSalt = generateArgon2Salt();\n encryptionKey = await argon2DeriveInWorker(credential, kdfSalt, DEFAULT_KDF_PARAMS);\n sensitiveData.current.push(encryptionKey);\n }\n\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(encryptionKey));\n\n // Step 6: Build request and send to server\n setState({ step: 'uploading' });\n\n const request: WalletRecoverRequest = {\n solanaPubkey,\n shareAAuthMethod: method,\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n };\n\n // Add method-specific fields\n if (method === 'password') {\n request.shareAKdfSalt = uint8ArrayToBase64(kdfSalt!);\n request.shareAKdfParams = DEFAULT_KDF_PARAMS;\n }\n\n if (method === 'passkey') {\n request.prfSalt = prfSaltBase64;\n }\n\n await recover(request);\n\n // Success\n cleanup();\n setState({ step: 'complete' });\n } catch (err) {\n cleanup();\n setState({\n step: 'error',\n error: err instanceof Error ? err.message : 'Recovery failed',\n });\n } finally {\n setIsRecovering(false);\n }\n },\n [recover, getShareBForRecovery, recoveryMode, cleanup]\n );\n\n const cancel = useCallback(() => {\n cleanup();\n setState({ step: 'idle' });\n setIsRecovering(false);\n }, [cleanup]);\n\n return {\n state,\n startRecovery,\n cancel,\n isRecovering,\n };\n}\n","/**\n * Wallet recovery wizard component\n *\n * Guides users through wallet recovery using their BIP-39 recovery phrase:\n * 1. Enter 12-word recovery phrase\n * 2. Choose new auth method (password/passkey)\n * 3. Enter new credential\n * 4. Submit to re-encrypt and replace wallet material\n */\n\nimport { useState, useCallback } from 'react';\nimport type { FormEvent } from 'react';\nimport { useWalletRecovery } from '../../hooks/useWalletRecovery';\nimport { RecoveryPhraseInput } from './RecoveryPhraseInput';\nimport type { ShareAAuthMethod } from '../../types/wallet';\n\nexport interface WalletRecoveryProps {\n /** Callback when recovery completes successfully */\n onComplete?: () => void;\n /** Callback when user cancels recovery */\n onCancel?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Default auth method (optional) */\n defaultAuthMethod?: ShareAAuthMethod;\n}\n\n/**\n * Wallet recovery wizard\n *\n * Two-phase flow:\n * 1. Enter recovery phrase\n * 2. Enter new credential (password/passkey)\n */\nexport function WalletRecovery({\n onComplete,\n onCancel,\n className = '',\n defaultAuthMethod = 'password',\n}: WalletRecoveryProps) {\n const { state, startRecovery, cancel, isRecovering } = useWalletRecovery();\n\n // Phase 1: Recovery phrase\n const [words, setWords] = useState<string[]>([]);\n const [phraseValidated, setPhraseValidated] = useState(false);\n\n // Phase 2: New credential\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod>(defaultAuthMethod);\n const [credential, setCredential] = useState('');\n const [confirmCredential, setConfirmCredential] = useState('');\n const [credentialError, setCredentialError] = useState<string | null>(null);\n\n // Handle phrase submission (phase 1 complete)\n const handlePhraseSubmit = useCallback((submittedWords: string[]) => {\n setWords(submittedWords);\n setPhraseValidated(true);\n }, []);\n\n // Handle credential submission (phase 2 complete)\n const handleCredentialSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n setCredentialError(null);\n\n // Passkey doesn't need confirmation\n if (authMethod !== 'passkey') {\n if (credential !== confirmCredential) {\n setCredentialError('Passwords do not match');\n return;\n }\n\n if (authMethod === 'password' && credential.length < 8) {\n setCredentialError('Password must be at least 8 characters');\n return;\n }\n }\n\n await startRecovery(words, authMethod, credential);\n },\n [words, authMethod, credential, confirmCredential, startRecovery]\n );\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n cancel();\n setWords([]);\n setPhraseValidated(false);\n setCredential('');\n setConfirmCredential('');\n onCancel?.();\n }, [cancel, onCancel]);\n\n // Handle back to phrase entry\n const handleBack = useCallback(() => {\n setPhraseValidated(false);\n setCredential('');\n setConfirmCredential('');\n }, []);\n\n // Handle completion\n const handleComplete = useCallback(() => {\n onComplete?.();\n }, [onComplete]);\n\n // Render based on state\n if (state.step === 'validating' || state.step === 'encrypting' || state.step === 'uploading') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-progress\">\n <div className=\"cedros-wallet-recovery-icon\">\n <LoadingSpinner />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">\n {state.step === 'validating' && 'Validating Recovery Phrase'}\n {state.step === 'encrypting' && 'Encrypting Wallet'}\n {state.step === 'uploading' && 'Saving to Server'}\n </h3>\n <p className=\"cedros-wallet-recovery-description\">\n {state.step === 'validating' && 'Checking your recovery phrase...'}\n {state.step === 'encrypting' && 'Securing your wallet with new encryption...'}\n {state.step === 'uploading' && 'Uploading encrypted wallet data...'}\n </p>\n </div>\n </div>\n );\n }\n\n if (state.step === 'complete') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-success\">\n <div className=\"cedros-wallet-recovery-icon\">\n <SuccessIcon />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">Wallet Recovered</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Your wallet has been successfully recovered and secured with your new{' '}\n {authMethod === 'passkey' ? 'passkey' : 'password'}.\n </p>\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleComplete}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (state.step === 'error') {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-error\">\n <div className=\"cedros-wallet-recovery-icon\">\n <ErrorIcon />\n </div>\n <h3 className=\"cedros-wallet-recovery-title\">Recovery Failed</h3>\n <p className=\"cedros-wallet-recovery-description\">\n {state.error ?? 'An error occurred during recovery. Please try again.'}\n </p>\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleCancel}\n >\n Start Over\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Phase 1: Enter recovery phrase\n if (!phraseValidated) {\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <div className=\"cedros-wallet-recovery-phrase\">\n <div className=\"cedros-wallet-recovery-header\">\n <h3 className=\"cedros-wallet-recovery-title\">Recover Your Wallet</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Enter your 12-word recovery phrase to restore your wallet.\n </p>\n </div>\n\n <RecoveryPhraseInput\n onSubmit={handlePhraseSubmit}\n onCancel={handleCancel}\n isSubmitting={false}\n />\n </div>\n </div>\n );\n }\n\n // Phase 2: Enter new credential\n return (\n <div className={`cedros-wallet-recovery ${className}`}>\n <form className=\"cedros-wallet-recovery-credential\" onSubmit={handleCredentialSubmit}>\n <div className=\"cedros-wallet-recovery-header\">\n <h3 className=\"cedros-wallet-recovery-title\">Set New Security</h3>\n <p className=\"cedros-wallet-recovery-description\">\n Choose how to secure your recovered wallet.\n </p>\n </div>\n\n {/* Auth method selector */}\n <div className=\"cedros-auth-method-selector\">\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"password\"\n checked={authMethod === 'password'}\n onChange={() => setAuthMethod('password')}\n disabled={isRecovering}\n />\n <span>Password</span>\n </label>\n <label className=\"cedros-radio-label\">\n <input\n type=\"radio\"\n name=\"authMethod\"\n value=\"passkey\"\n checked={authMethod === 'passkey'}\n onChange={() => setAuthMethod('passkey')}\n disabled={isRecovering}\n />\n <span>Passkey</span>\n </label>\n </div>\n\n {/* Password input */}\n {authMethod === 'password' && (\n <>\n <div className=\"cedros-password-input\">\n <label htmlFor=\"recovery-password\" className=\"cedros-label\">\n New Password\n </label>\n <input\n id=\"recovery-password\"\n type=\"password\"\n className=\"cedros-input\"\n value={credential}\n onChange={(e) => setCredential(e.target.value)}\n disabled={isRecovering}\n minLength={8}\n placeholder=\"Enter a strong password\"\n />\n </div>\n <div className=\"cedros-password-input\">\n <label htmlFor=\"recovery-password-confirm\" className=\"cedros-label\">\n Confirm Password\n </label>\n <input\n id=\"recovery-password-confirm\"\n type=\"password\"\n className=\"cedros-input\"\n value={confirmCredential}\n onChange={(e) => setConfirmCredential(e.target.value)}\n disabled={isRecovering}\n aria-invalid={credentialError ? 'true' : undefined}\n placeholder=\"Confirm your password\"\n />\n {credentialError && (\n <p className=\"cedros-input-error\" role=\"alert\">\n {credentialError}\n </p>\n )}\n </div>\n </>\n )}\n\n {/* Passkey info */}\n {authMethod === 'passkey' && (\n <div className=\"cedros-passkey-info\">\n <PasskeyIcon />\n <p>Use your passkey (Touch ID, Face ID, or Windows Hello) to secure your wallet.</p>\n </div>\n )}\n\n <div className=\"cedros-wallet-recovery-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleBack}\n disabled={isRecovering}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"cedros-button cedros-button-primary\"\n disabled={\n isRecovering ||\n (authMethod !== 'passkey' &&\n (credential.length === 0 || confirmCredential.length === 0))\n }\n >\n {isRecovering ? 'Recovering...' : 'Recover Wallet'}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\n// Icon components\nfunction LoadingSpinner() {\n return (\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"cedros-spinner\"\n >\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-muted, #e5e7eb)\"\n strokeWidth=\"3\"\n fill=\"none\"\n />\n <path\n d=\"M24 4a20 20 0 0 1 20 20\"\n stroke=\"var(--cedros-primary, #6366f1)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction SuccessIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-success-light, #dcfce7)\"\n />\n <path\n d=\"M16 24l6 6 10-10\"\n stroke=\"var(--cedros-success, #22c55e)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nfunction ErrorIcon() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" aria-hidden=\"true\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"2\"\n fill=\"var(--cedros-destructive-light, #fee2e2)\"\n />\n <path\n d=\"M24 16v10M24 30v2\"\n stroke=\"var(--cedros-destructive, #ef4444)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction PasskeyIcon() {\n return (\n <svg\n className=\"cedros-passkey-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <rect x=\"8\" y=\"16\" width=\"32\" height=\"24\" rx=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"24\" cy=\"28\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M24 32v4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useCedrosLoginOptional } from '../../context/useCedrosLogin';\n\nexport interface WalletAddressRowProps {\n address: string;\n label?: string;\n showCopy?: boolean;\n showExplorerLink?: boolean;\n /** If address is long, show a truncated preview with a reveal toggle. */\n allowReveal?: boolean;\n className?: string;\n}\n\nexport function WalletAddressRow({\n address,\n label = 'Wallet Address',\n showCopy = true,\n showExplorerLink = true,\n allowReveal = true,\n className = '',\n}: WalletAddressRowProps) {\n const context = useCedrosLoginOptional();\n const [copied, setCopied] = useState(false);\n const [copyError, setCopyError] = useState<string | null>(null);\n const [revealFull, setRevealFull] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n const network = context?.config.solana?.network ?? 'mainnet-beta';\n const explorerHref = useMemo(() => {\n const base = `https://explorer.solana.com/address/${address}`;\n if (network === 'mainnet-beta') return base;\n return `${base}?cluster=${encodeURIComponent(network)}`;\n }, [address, network]);\n\n const isTruncatable = allowReveal && address.length > 18;\n\n const displayAddress = useMemo(() => {\n if (!isTruncatable || revealFull) return address;\n return `${address.slice(0, 8)}...${address.slice(-8)}`;\n }, [address, isTruncatable, revealFull]);\n\n const handleCopy = useCallback(async () => {\n try {\n setCopyError(null);\n await navigator.clipboard.writeText(address);\n setCopied(true);\n\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => {\n setCopied(false);\n copyTimerRef.current = null;\n }, 2000);\n } catch (err) {\n setCopied(false);\n setCopyError(err instanceof Error ? err.message : 'Copy failed');\n }\n }, [address]);\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n return (\n <div className={`cedros-wallet-address-row ${className}`}>\n <div className=\"cedros-wallet-address-row-header\">\n <span className=\"cedros-wallet-status-pubkey-label\">{label}</span>\n <div className=\"cedros-wallet-address-row-actions\">\n {isTruncatable && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n onClick={() => setRevealFull((v) => !v)}\n aria-label={revealFull ? 'Hide full wallet address' : 'Show full wallet address'}\n >\n {revealFull ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.7 10.7a3 3 0 0 0 4.24 4.24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.88 5.09A10.94 10.94 0 0 1 12 5c5 0 9.27 3.11 11 7-0.55 1.23-1.32 2.33-2.27 3.25\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.61 6.61C4.4 7.9 2.74 9.8 1 12c1.73 3.89 6 7 11 7 1.14 0 2.25-0.16 3.3-0.46\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7S1 12 1 12Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n {showExplorerLink && (\n <a\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n href={explorerHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Explorer\n </a>\n )}\n {showCopy && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-outline\"\n onClick={handleCopy}\n aria-label=\"Copy wallet address\"\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n )}\n </div>\n </div>\n <code className=\"cedros-wallet-status-pubkey-value\" title={address}>\n {displayAddress}\n </code>\n {copyError && (\n <p className=\"cedros-input-hint\" role=\"status\">\n {copyError}\n </p>\n )}\n </div>\n );\n}\n","/**\n * Wallet status indicator component\n *\n * Displays the current state of the user's wallet:\n * - Loading: Checking wallet status\n * - Not enrolled: No wallet created yet\n * - Enrolled (locked): Wallet exists but needs unlock\n * - Enrolled (unlocked): Wallet ready for transactions\n * - Error: Something went wrong\n *\n * Supports two modes:\n * - Uncontrolled (default): Gets status from useWallet() hook\n * - Controlled: Accepts status/publicKey props (useful for stories/demos)\n */\n\nimport { useWallet } from '../../hooks/useWallet';\nimport type { WalletStatus as WalletStatusType } from '../../types/wallet';\nimport { WalletAddressRow } from './WalletAddressRow';\n\nexport interface WalletStatusProps {\n /** Controlled mode: Override wallet status (for demos/stories) */\n status?: WalletStatusType;\n /** Controlled mode: Override public key display */\n publicKey?: string;\n /** Controlled mode: Override lock state */\n onLock?: () => void;\n /** Callback when user wants to create a wallet */\n onEnroll?: () => void;\n /** Callback when user wants to unlock wallet */\n onUnlock?: () => void;\n /** Callback when user wants to recover wallet */\n onRecover?: () => void;\n /** Whether to show action buttons */\n showActions?: boolean;\n /** Compact display mode */\n compact?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Wallet status indicator\n *\n * Shows current wallet state with optional action buttons.\n * Pass `status` prop to use in controlled mode (bypasses hook).\n */\nexport function WalletStatus({\n status: controlledStatus,\n publicKey: controlledPubkey,\n onLock: _onLock,\n onEnroll,\n onUnlock,\n onRecover,\n showActions = true,\n compact = false,\n className = '',\n}: WalletStatusProps) {\n // onLock reserved for future use\n void _onLock;\n // Use controlled mode if status prop is provided, otherwise use hook\n const isControlled = controlledStatus !== undefined;\n const wallet = useWallet();\n\n const status = isControlled ? controlledStatus : wallet.status;\n const solanaPubkey = isControlled ? (controlledPubkey ?? null) : wallet.solanaPubkey;\n const error = isControlled ? null : wallet.error;\n const refresh = isControlled ? () => {} : wallet.refresh;\n const clearError = isControlled ? () => {} : wallet.clearError;\n\n const statusConfig = getStatusConfig(status, error);\n\n if (compact) {\n return (\n <div className={`cedros-wallet-status cedros-wallet-status-compact ${className}`}>\n <span\n className={`cedros-wallet-status-dot cedros-wallet-status-${statusConfig.color}`}\n title={statusConfig.label}\n />\n <span className=\"cedros-wallet-status-label\">{statusConfig.label}</span>\n {solanaPubkey && (\n <span className=\"cedros-wallet-status-pubkey\" title={solanaPubkey}>\n {truncatePubkey(solanaPubkey)}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div className={`cedros-wallet-status ${className}`}>\n <div className=\"cedros-wallet-status-header\">\n <div\n className={`cedros-wallet-status-icon cedros-wallet-status-icon-${statusConfig.color}`}\n >\n <StatusIcon status={status} />\n </div>\n <div className=\"cedros-wallet-status-info\">\n <h4 className=\"cedros-wallet-status-title\">{statusConfig.title}</h4>\n <p className=\"cedros-wallet-status-description\">{statusConfig.description}</p>\n </div>\n </div>\n\n {solanaPubkey && (\n <div className=\"cedros-wallet-status-pubkey-full\">\n <WalletAddressRow address={solanaPubkey} />\n </div>\n )}\n\n {error && (\n <div className=\"cedros-wallet-status-error-box\" role=\"alert\">\n <p>{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-secondary\"\n onClick={clearError}\n >\n Dismiss\n </button>\n </div>\n )}\n\n {showActions && (\n <div className=\"cedros-wallet-status-actions\">\n {status === 'not_enrolled' && onEnroll && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={onEnroll}\n >\n Create Wallet\n </button>\n )}\n\n {status === 'enrolled_locked' && onUnlock && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={onUnlock}\n >\n Unlock Wallet\n </button>\n )}\n\n {(status === 'not_enrolled' || status === 'error') && onRecover && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRecover}\n >\n Recover Wallet\n </button>\n )}\n\n {status === 'error' && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={refresh}\n >\n Retry\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\ninterface StatusConfig {\n label: string;\n title: string;\n description: string;\n color: 'loading' | 'success' | 'warning' | 'error' | 'muted';\n}\n\nfunction getStatusConfig(status: WalletStatusType, error: string | null): StatusConfig {\n switch (status) {\n case 'loading':\n return {\n label: 'Loading',\n title: 'Checking Wallet',\n description: 'Verifying wallet status...',\n color: 'loading',\n };\n\n case 'not_enrolled':\n return {\n label: 'Not Set Up',\n title: 'No Wallet',\n description: 'Create a wallet to start using Solana.',\n color: 'muted',\n };\n\n case 'enrolled_locked':\n return {\n label: 'Locked',\n title: 'Wallet Locked',\n description: 'Unlock your wallet to sign transactions.',\n color: 'warning',\n };\n\n case 'enrolled_unlocked':\n case 'unlocked':\n return {\n label: 'Ready',\n title: 'Wallet Ready',\n description: 'Your wallet is unlocked and ready to use.',\n color: 'success',\n };\n\n case 'error':\n default:\n return {\n label: 'Error',\n title: 'Wallet Error',\n description: error ?? 'An error occurred with your wallet.',\n color: 'error',\n };\n }\n}\n\nfunction truncatePubkey(pubkey: string): string {\n if (pubkey.length <= 12) return pubkey;\n return `${pubkey.slice(0, 4)}...${pubkey.slice(-4)}`;\n}\n\nfunction StatusIcon({ status }: { status: WalletStatusType }) {\n switch (status) {\n case 'loading':\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"cedros-spinner\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path\n d=\"M12 3a9 9 0 0 1 9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n\n case 'not_enrolled':\n // Plus icon (add wallet)\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M8 12h8M12 8v8\" />\n </svg>\n );\n\n case 'enrolled_locked':\n // Lock icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\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 );\n\n case 'enrolled_unlocked':\n case 'unlocked':\n // Check icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n );\n\n case 'error':\n // Alert triangle icon\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n );\n\n default:\n return null;\n }\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { useWallet } from '../../hooks/useWallet';\nimport { WalletEnrollment } from './WalletEnrollment';\nimport { WalletRecovery } from './WalletRecovery';\nimport { WalletStatus } from './WalletStatus';\nimport { WalletUnlock } from './WalletUnlock';\n\ntype WalletManagerView = 'status' | 'enroll' | 'unlock' | 'recover_intro' | 'recover';\n\nexport interface WalletManagerProps {\n className?: string;\n showActions?: boolean;\n}\n\n/**\n * Orchestrates embedded wallet flows in one cohesive surface:\n * status -> enroll/unlock/recover.\n */\nexport function WalletManager({ className = '', showActions = true }: WalletManagerProps) {\n const wallet = useWallet();\n\n const [view, setView] = useState<WalletManagerView>('status');\n\n const header = useMemo(() => {\n switch (view) {\n case 'enroll':\n return { title: 'Create Wallet', description: 'Set up your embedded wallet.' };\n case 'unlock':\n return { title: 'Unlock Wallet', description: 'Unlock to sign transactions.' };\n case 'recover_intro':\n case 'recover':\n return {\n title: 'Recover Wallet',\n description: 'Restore access using your recovery phrase.',\n };\n case 'status':\n default:\n return null;\n }\n }, [view]);\n\n const handleBackToStatus = useCallback(() => setView('status'), []);\n\n const handleEnrollComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n const handleUnlockComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n const handleRecoverComplete = useCallback(async () => {\n setView('status');\n await wallet.refresh();\n }, [wallet]);\n\n return (\n <div className={`cedros-wallet-manager ${className}`}>\n {view !== 'status' && header && (\n <div className=\"cedros-wallet-manager-header\">\n <div className=\"cedros-wallet-manager-header-text\">\n <h3 className=\"cedros-wallet-manager-title\">{header.title}</h3>\n <p className=\"cedros-wallet-manager-subtitle\">{header.description}</p>\n </div>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-sm cedros-button-ghost\"\n onClick={handleBackToStatus}\n >\n Back\n </button>\n </div>\n )}\n\n {view === 'status' && (\n <WalletStatus\n onEnroll={() => setView('enroll')}\n onUnlock={() => setView('unlock')}\n onRecover={() => setView('recover_intro')}\n showActions={showActions}\n />\n )}\n\n {view === 'enroll' && (\n <WalletEnrollment\n onComplete={() => {\n void handleEnrollComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n\n {view === 'unlock' && (\n <WalletUnlock\n onUnlock={() => {\n void handleUnlockComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n\n {view === 'recover_intro' && (\n <div className=\"cedros-wallet-manager-intro\">\n <div className=\"cedros-wallet-manager-intro-card\">\n <h4 className=\"cedros-wallet-manager-intro-title\">Before you start</h4>\n <ul className=\"cedros-wallet-manager-intro-list\">\n <li>You’ll need your 12-word recovery phrase.</li>\n <li>You’ll set a new password or passkey for this wallet.</li>\n <li>If you’re on a shared device, avoid copying the phrase into other apps.</li>\n </ul>\n <div className=\"cedros-wallet-manager-intro-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={() => setView('recover')}\n >\n Start recovery\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleBackToStatus}\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )}\n\n {view === 'recover' && (\n <WalletRecovery\n onComplete={() => {\n void handleRecoverComplete();\n }}\n onCancel={handleBackToStatus}\n />\n )}\n </div>\n );\n}\n","import type {\n ListSystemSettingsResponse,\n UpdateSettingRequest,\n UpdateSystemSettingsResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for system settings operations (admin only)\n */\nexport class SystemSettingsApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * Get all system settings grouped by category\n * Requires system admin privileges\n */\n async getSettings(): Promise<ListSystemSettingsResponse> {\n try {\n return await this.client.get<ListSystemSettingsResponse>('/admin/settings');\n } catch (error) {\n throw handleApiError(error, 'Failed to fetch system settings');\n }\n }\n\n /**\n * Update one or more system settings\n * Requires system admin privileges\n */\n async updateSettings(settings: UpdateSettingRequest[]): Promise<UpdateSystemSettingsResponse> {\n try {\n return await this.client.patch<UpdateSystemSettingsResponse>('/admin/settings', {\n settings,\n });\n } catch (error) {\n throw handleApiError(error, 'Failed to update system settings');\n }\n }\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type { SystemSetting, UpdateSettingRequest, UseSystemSettingsReturn } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { SystemSettingsApiClient } from '../utils/systemSettingsApi';\n\n/**\n * Hook for managing system settings (admin only).\n *\n * Provides CRUD operations for system-wide configuration settings\n * stored in the database. Only accessible to system administrators.\n *\n * @example\n * ```tsx\n * function SystemSettingsPanel() {\n * const {\n * settings,\n * isLoading,\n * error,\n * fetchSettings,\n * updateSettings,\n * getValue,\n * } = useSystemSettings();\n *\n * useEffect(() => {\n * fetchSettings();\n * }, [fetchSettings]);\n *\n * const handleSave = async () => {\n * await updateSettings([\n * { key: 'privacy_period_secs', value: '1209600' },\n * ]);\n * };\n *\n * return (\n * <div>\n * {Object.entries(settings).map(([category, items]) => (\n * <section key={category}>\n * <h3>{category}</h3>\n * {items.map(item => (\n * <div key={item.key}>\n * {item.key}: {item.value}\n * </div>\n * ))}\n * </section>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSystemSettings(): UseSystemSettingsReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [settings, setSettings] = useState<Record<string, SystemSetting[]>>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new SystemSettingsApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // Use ref to avoid apiClient in callback dependencies\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchSettings = useCallback(async () => {\n if (authState !== 'authenticated') {\n setSettings({});\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const response = await apiClientRef.current.getSettings();\n if (requestId !== requestIdRef.current) return;\n setSettings(response.settings);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err instanceof Error ? err : new Error('Failed to fetch settings'));\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [authState]);\n\n const updateSettings = useCallback(\n async (updates: UpdateSettingRequest[]): Promise<void> => {\n if (authState !== 'authenticated') {\n throw new Error('Not authenticated');\n }\n\n setIsUpdating(true);\n setError(null);\n\n try {\n await apiClientRef.current.updateSettings(updates);\n // Refresh settings after update\n await fetchSettings();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update settings');\n setError(error);\n throw error;\n } finally {\n setIsUpdating(false);\n }\n },\n [authState, fetchSettings]\n );\n\n const getValue = useCallback(\n (key: string): string | undefined => {\n for (const categorySettings of Object.values(settings)) {\n const found = categorySettings.find((s) => s.key === key);\n if (found) return found.value;\n }\n return undefined;\n },\n [settings]\n );\n\n return {\n settings,\n isLoading,\n isUpdating,\n error,\n fetchSettings,\n updateSettings,\n getValue,\n };\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting, UpdateSettingRequest, SettingMeta } from '../../types';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { useSystemSettings } from '../../hooks/useSystemSettings';\n\n// =============================================================================\n// DURATION UTILITIES\n// =============================================================================\n\ninterface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction secondsToDuration(totalSeconds: number): DurationParts {\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n return { days, hours, minutes, seconds };\n}\n\nfunction formatDuration(totalSeconds: number): string {\n const { days, hours, minutes } = secondsToDuration(totalSeconds);\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (parts.length === 0) parts.push(`${totalSeconds}s`);\n return parts.join(' ');\n}\n\n// =============================================================================\n// SETTING METADATA - Rich descriptions and input configuration\n// =============================================================================\n\nconst SETTING_METADATA: Record<string, SettingMeta> = {\n // ============= Authentication Providers =============\n // Email auth\n auth_email_enabled: {\n key: 'auth_email_enabled',\n label: 'Enable Email Authentication',\n description: 'Allow users to sign up and log in with email/password.',\n inputType: 'boolean',\n },\n auth_email_require_verification: {\n key: 'auth_email_require_verification',\n label: 'Require Email Verification',\n description: 'Users must verify their email address before they can log in.',\n inputType: 'boolean',\n },\n auth_email_block_disposable: {\n key: 'auth_email_block_disposable',\n label: 'Block Disposable Emails',\n description: 'Reject registrations from known disposable email providers.',\n inputType: 'boolean',\n },\n\n // Google OAuth\n auth_google_enabled: {\n key: 'auth_google_enabled',\n label: 'Enable Google Sign-In',\n description: 'Allow users to authenticate with their Google account.',\n inputType: 'boolean',\n },\n auth_google_client_id: {\n key: 'auth_google_client_id',\n label: 'Google Client ID',\n description: 'OAuth 2.0 client ID from Google Cloud Console.',\n inputType: 'text',\n },\n auth_google_client_secret: {\n key: 'auth_google_client_secret',\n label: 'Google Client Secret',\n description: 'OAuth 2.0 client secret from Google Cloud Console.',\n inputType: 'secret',\n },\n\n // Apple OAuth\n auth_apple_enabled: {\n key: 'auth_apple_enabled',\n label: 'Enable Sign in with Apple',\n description: 'Allow users to authenticate with their Apple ID.',\n inputType: 'boolean',\n },\n auth_apple_client_id: {\n key: 'auth_apple_client_id',\n label: 'Apple Services ID',\n description: 'The Services ID configured in your Apple Developer account.',\n inputType: 'text',\n },\n auth_apple_team_id: {\n key: 'auth_apple_team_id',\n label: 'Apple Team ID',\n description: 'Your Apple Developer Team ID.',\n inputType: 'text',\n },\n auth_apple_key_id: {\n key: 'auth_apple_key_id',\n label: 'Apple Key ID',\n description: 'The Key ID for your Sign in with Apple private key.',\n inputType: 'text',\n },\n auth_apple_private_key: {\n key: 'auth_apple_private_key',\n label: 'Apple Private Key',\n description: 'The private key file contents (PEM format) for Sign in with Apple.',\n inputType: 'secret',\n multiline: true,\n },\n\n // Solana auth\n auth_solana_enabled: {\n key: 'auth_solana_enabled',\n label: 'Enable Solana Wallet Auth',\n description: 'Allow users to authenticate by signing with their Solana wallet.',\n inputType: 'boolean',\n },\n auth_solana_challenge_expiry: {\n key: 'auth_solana_challenge_expiry',\n label: 'Challenge Expiry',\n description: 'How long a wallet signature challenge is valid.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '10 minutes', value: '600' },\n ],\n },\n\n // WebAuthn/Passkeys\n auth_webauthn_enabled: {\n key: 'auth_webauthn_enabled',\n label: 'Enable WebAuthn/Passkeys',\n description: 'Allow passwordless authentication with FIDO2/WebAuthn credentials.',\n inputType: 'boolean',\n },\n auth_webauthn_rp_id: {\n key: 'auth_webauthn_rp_id',\n label: 'Relying Party ID',\n description: 'Usually your domain (e.g., example.com). Passkeys are bound to this.',\n inputType: 'text',\n },\n auth_webauthn_rp_name: {\n key: 'auth_webauthn_rp_name',\n label: 'Relying Party Name',\n description: 'Display name shown to users during passkey registration.',\n inputType: 'text',\n },\n auth_webauthn_rp_origin: {\n key: 'auth_webauthn_rp_origin',\n label: 'Allowed Origins',\n description: 'Comma-separated origins allowed for WebAuthn (e.g., https://example.com).',\n inputType: 'text',\n },\n\n // ============= Feature Flags =============\n feature_privacy_cash: {\n key: 'feature_privacy_cash',\n label: 'Privacy Cash',\n description: 'Enable Privacy Cash deposits and timed withdrawals.',\n inputType: 'boolean',\n },\n feature_wallet_signing: {\n key: 'feature_wallet_signing',\n label: 'Embedded Wallet Signing',\n description: 'Enable the embedded wallet for transaction signing.',\n inputType: 'boolean',\n },\n feature_sso: {\n key: 'feature_sso',\n label: 'Enterprise SSO',\n description: 'Enable SAML/OIDC single sign-on for enterprise customers.',\n inputType: 'boolean',\n },\n feature_organizations: {\n key: 'feature_organizations',\n label: 'Organizations',\n description: 'Enable multi-user organizations with role-based access.',\n inputType: 'boolean',\n },\n feature_mfa: {\n key: 'feature_mfa',\n label: 'Two-Factor Authentication',\n description: 'Allow users to enable TOTP-based two-factor authentication.',\n inputType: 'boolean',\n },\n feature_instant_link: {\n key: 'feature_instant_link',\n label: 'Instant Link Login',\n description: 'Allow passwordless login via magic link sent to email.',\n inputType: 'boolean',\n },\n\n // ============= Security Settings =============\n security_cors_origins: {\n key: 'security_cors_origins',\n label: 'CORS Origins',\n description: 'Allowed origins for cross-origin requests (comma-separated). Empty = same origin only.',\n inputType: 'text',\n },\n security_cookie_domain: {\n key: 'security_cookie_domain',\n label: 'Cookie Domain',\n description: 'Domain for auth cookies. Empty uses the request origin.',\n inputType: 'text',\n },\n security_cookie_secure: {\n key: 'security_cookie_secure',\n label: 'Secure Cookies',\n description: 'Require HTTPS for cookies. Disable only for local development.',\n inputType: 'boolean',\n },\n security_cookie_same_site: {\n key: 'security_cookie_same_site',\n label: 'Cookie SameSite',\n description: 'SameSite policy for cookies. Use \"none\" only if needed for cross-site embeds.',\n inputType: 'select',\n presets: [\n { label: 'Strict', value: 'strict' },\n { label: 'Lax (Recommended)', value: 'lax' },\n { label: 'None (cross-site)', value: 'none' },\n ],\n },\n security_session_timeout: {\n key: 'security_session_timeout',\n label: 'Session Timeout',\n description: 'How long sessions remain valid before requiring re-authentication.',\n inputType: 'duration',\n min: 300,\n presets: [\n { label: '1 hour', value: '3600' },\n { label: '24 hours', value: '86400' },\n { label: '7 days', value: '604800' },\n { label: '30 days', value: '2592000' },\n ],\n },\n security_jwt_issuer: {\n key: 'security_jwt_issuer',\n label: 'JWT Issuer',\n description: 'Issuer claim for JWTs. Empty uses the server URL.',\n inputType: 'text',\n },\n security_jwt_audience: {\n key: 'security_jwt_audience',\n label: 'JWT Audience',\n description: 'Audience claim for JWTs. Empty uses default.',\n inputType: 'text',\n },\n\n // ============= Email/SMTP Settings =============\n email_smtp_host: {\n key: 'email_smtp_host',\n label: 'SMTP Host',\n description: 'SMTP server hostname (e.g., smtp.sendgrid.net).',\n inputType: 'text',\n },\n email_smtp_port: {\n key: 'email_smtp_port',\n label: 'SMTP Port',\n description: 'SMTP server port. Common: 587 (TLS), 465 (SSL), 25 (unencrypted).',\n inputType: 'select',\n presets: [\n { label: '587 (TLS)', value: '587' },\n { label: '465 (SSL)', value: '465' },\n { label: '25 (Plain)', value: '25' },\n ],\n },\n email_smtp_user: {\n key: 'email_smtp_user',\n label: 'SMTP Username',\n description: 'Username for SMTP authentication.',\n inputType: 'text',\n },\n email_smtp_password: {\n key: 'email_smtp_password',\n label: 'SMTP Password',\n description: 'Password or API key for SMTP authentication.',\n inputType: 'secret',\n },\n email_smtp_tls: {\n key: 'email_smtp_tls',\n label: 'Use TLS',\n description: 'Enable TLS encryption for SMTP connections.',\n inputType: 'boolean',\n },\n email_from_address: {\n key: 'email_from_address',\n label: 'From Address',\n description: 'Default sender email address (e.g., noreply@example.com).',\n inputType: 'text',\n },\n email_from_name: {\n key: 'email_from_name',\n label: 'From Name',\n description: 'Default sender display name (e.g., \"My App\").',\n inputType: 'text',\n },\n\n // ============= Webhook Settings =============\n webhook_enabled: {\n key: 'webhook_enabled',\n label: 'Enable Webhooks',\n description: 'Send HTTP notifications for auth events (signup, login, etc.).',\n inputType: 'boolean',\n },\n webhook_url: {\n key: 'webhook_url',\n label: 'Webhook URL',\n description: 'Endpoint to receive webhook POST requests.',\n inputType: 'text',\n },\n webhook_secret: {\n key: 'webhook_secret',\n label: 'Webhook Secret',\n description: 'Secret used to sign webhook payloads (HMAC-SHA256).',\n inputType: 'secret',\n },\n webhook_timeout: {\n key: 'webhook_timeout',\n label: 'Timeout',\n description: 'Maximum time to wait for webhook response.',\n inputType: 'duration',\n min: 5,\n presets: [\n { label: '10 seconds', value: '10' },\n { label: '30 seconds', value: '30' },\n { label: '60 seconds', value: '60' },\n ],\n },\n webhook_retries: {\n key: 'webhook_retries',\n label: 'Max Retries',\n description: 'Number of retry attempts for failed webhooks.',\n inputType: 'select',\n presets: [\n { label: '0 (No retries)', value: '0' },\n { label: '3 (Recommended)', value: '3' },\n { label: '5', value: '5' },\n ],\n },\n\n // ============= Server Settings =============\n server_frontend_url: {\n key: 'server_frontend_url',\n label: 'Frontend URL',\n description: 'URL of your frontend app (for redirects and email links).',\n inputType: 'text',\n },\n server_base_path: {\n key: 'server_base_path',\n label: 'Base Path',\n description: 'Base path for auth endpoints (e.g., /auth).',\n inputType: 'text',\n },\n server_trust_proxy: {\n key: 'server_trust_proxy',\n label: 'Trust Proxy',\n description: 'Trust X-Forwarded-For headers. Enable if behind a reverse proxy.',\n inputType: 'boolean',\n },\n\n // ============= Privacy Settings (existing) =============\n privacy_period_secs: {\n key: 'privacy_period_secs',\n label: 'Privacy Period',\n description:\n 'How long deposits are held before withdrawal to provide timing privacy. Longer periods provide better privacy but delay user access to funds.',\n inputType: 'duration',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n { label: '24 hours', value: '86400' },\n { label: '7 days', value: '604800' },\n { label: '14 days', value: '1209600' },\n { label: '30 days', value: '2592000' },\n ],\n warningThreshold: {\n below: 3600,\n message: 'Very short privacy periods may not provide adequate timing protection.',\n },\n },\n\n // Withdrawal worker settings\n withdrawal_poll_interval_secs: {\n key: 'withdrawal_poll_interval_secs',\n label: 'Worker Poll Interval',\n description:\n 'How often the withdrawal worker checks for deposits ready to process. Lower values process faster but increase server load.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n ],\n warningThreshold: {\n below: 60,\n message: 'Polling more than once per minute may cause excessive load.',\n },\n },\n withdrawal_batch_size: {\n key: 'withdrawal_batch_size',\n label: 'Batch Size',\n description:\n 'Maximum number of withdrawals to process in a single batch. Higher values improve throughput but may cause timeouts.',\n inputType: 'select',\n min: 1,\n max: 100,\n presets: [\n { label: '1 (Sequential)', value: '1' },\n { label: '5', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '25', value: '25' },\n { label: '50', value: '50' },\n { label: '100 (Max)', value: '100' },\n ],\n },\n withdrawal_timeout_secs: {\n key: 'withdrawal_timeout_secs',\n label: 'Transaction Timeout',\n description:\n 'How long to wait for a withdrawal transaction to confirm before considering it failed.',\n inputType: 'duration',\n min: 30,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '2 minutes', value: '120' },\n { label: '5 minutes', value: '300' },\n ],\n warningThreshold: {\n below: 30,\n message: 'Very short timeouts may cause premature failure on slow networks.',\n },\n },\n withdrawal_max_retries: {\n key: 'withdrawal_max_retries',\n label: 'Max Retries',\n description:\n 'Number of times to retry a failed withdrawal before marking it as permanently failed.',\n inputType: 'select',\n min: 0,\n max: 10,\n presets: [\n { label: '0 (No retries)', value: '0' },\n { label: '1', value: '1' },\n { label: '3 (Recommended)', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n withdrawal_percentage: {\n key: 'withdrawal_percentage',\n label: 'Withdrawal Percentage',\n description:\n 'Percentage of ready funds to withdraw each cycle. Lower values spread withdrawals over time for better privacy.',\n inputType: 'percentage',\n min: 1,\n max: 100,\n step: 5,\n presets: [\n { label: '25%', value: '25' },\n { label: '50%', value: '50' },\n { label: '75%', value: '75' },\n { label: '100% (All at once)', value: '100' },\n ],\n warningThreshold: {\n above: 75,\n message:\n 'High percentages may reduce timing privacy by processing most withdrawals together.',\n },\n },\n partial_withdrawal_count: {\n key: 'partial_withdrawal_count',\n label: 'Partial Withdrawals',\n description:\n 'Maximum partial withdrawals per batch. Partial withdrawals add noise to timing analysis. Set to 0 to disable.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1', value: '1' },\n { label: '3', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n partial_withdrawal_min_lamports: {\n key: 'partial_withdrawal_min_lamports',\n label: 'Min Balance for Partial',\n description:\n 'Minimum account balance (in lamports) required before partial withdrawals are considered. 1 SOL = 1,000,000,000 lamports.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: '0.1 SOL', value: '100000000' },\n { label: '0.5 SOL', value: '500000000' },\n { label: '1 SOL', value: '1000000000' },\n { label: '5 SOL', value: '5000000000' },\n { label: '10 SOL', value: '10000000000' },\n ],\n },\n\n // Rate limit settings\n rate_limit_auth: {\n key: 'rate_limit_auth',\n label: 'Auth Request Limit',\n description:\n 'Maximum authentication attempts (login, register, password reset) per IP per window. Protects against brute force attacks.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '5 (Strict)', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '20', value: '20' },\n { label: '50 (Permissive)', value: '50' },\n ],\n warningThreshold: {\n above: 20,\n message: 'High auth limits may allow brute force attempts.',\n },\n },\n rate_limit_general: {\n key: 'rate_limit_general',\n label: 'General Request Limit',\n description: 'Maximum general API requests per IP per window. Affects all non-auth endpoints.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '30', value: '30' },\n { label: '60 (Recommended)', value: '60' },\n { label: '120', value: '120' },\n { label: '300', value: '300' },\n ],\n },\n rate_limit_credit: {\n key: 'rate_limit_credit',\n label: 'Credit Request Limit',\n description:\n 'Maximum credit/balance check requests per IP per window. Higher for apps that poll balance frequently.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '10', value: '10' },\n { label: '30 (Recommended)', value: '30' },\n { label: '60', value: '60' },\n { label: '120', value: '120' },\n ],\n },\n rate_limit_window: {\n key: 'rate_limit_window',\n label: 'Rate Limit Window',\n description:\n 'Time window for rate limiting. All limits above are \"per window\". Shorter windows are stricter.',\n inputType: 'duration',\n min: 1,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n ],\n },\n\n // Deposit settings\n deposit_quick_action_tokens: {\n key: 'deposit_quick_action_tokens',\n label: 'Quick Action Tokens',\n description:\n 'Comma-separated token symbols shown as quick action buttons. First token is the default.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens: {\n key: 'deposit_custom_tokens',\n label: 'Custom Dropdown Tokens',\n description:\n 'Comma-separated token symbols shown in the \"Custom\" dropdown. Leave empty to show all.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens_json: {\n key: 'deposit_custom_tokens_json',\n label: 'Custom Token Definitions',\n description:\n 'Add tokens beyond the built-in list. Define symbol, mint address, decimals, and logo URL.',\n inputType: 'tokenList',\n },\n};\n\n/** Category display metadata */\nconst CATEGORY_METADATA: Record<string, { label: string; description: string; icon: string }> = {\n // Auth providers (sorted alphabetically by subcategory)\n 'auth.apple': {\n label: 'Apple Sign-In',\n description: 'Configure Sign in with Apple OAuth integration.',\n icon: '',\n },\n 'auth.email': {\n label: 'Email Authentication',\n description: 'Configure email/password authentication settings.',\n icon: '',\n },\n 'auth.google': {\n label: 'Google Sign-In',\n description: 'Configure Google OAuth integration.',\n icon: '',\n },\n 'auth.solana': {\n label: 'Solana Wallet Auth',\n description: 'Configure Solana wallet signature authentication.',\n icon: '',\n },\n 'auth.webauthn': {\n label: 'WebAuthn / Passkeys',\n description: 'Configure FIDO2/WebAuthn passwordless authentication.',\n icon: '',\n },\n deposit: {\n label: 'Deposit Settings',\n description: 'Configure token lists and deposit flow display options.',\n icon: '',\n },\n email: {\n label: 'Email / SMTP',\n description: 'Configure outbound email delivery for verification, password reset, and notifications.',\n icon: '',\n },\n features: {\n label: 'Feature Flags',\n description: 'Enable or disable major platform features.',\n icon: '',\n },\n privacy: {\n label: 'Privacy Settings',\n description:\n 'Control the privacy period for deposits. Longer periods provide better timing privacy but delay fund availability.',\n icon: '',\n },\n rate_limit: {\n label: 'Rate Limiting',\n description:\n 'Protect the system from abuse by limiting request rates. Balance security with user experience.',\n icon: '',\n },\n security: {\n label: 'Security',\n description: 'Configure CORS, cookies, sessions, and JWT settings.',\n icon: '',\n },\n server: {\n label: 'Server',\n description: 'Server infrastructure settings. Some may be overridden by environment variables.',\n icon: '',\n },\n webhook: {\n label: 'Webhooks',\n description: 'Configure HTTP webhook notifications for auth events.',\n icon: '',\n },\n withdrawal: {\n label: 'Withdrawal Worker',\n description:\n 'Configure how the automated withdrawal processor handles pending withdrawals. These settings affect throughput and privacy.',\n icon: '',\n },\n};\n\n// =============================================================================\n// COMPONENT PROPS\n// =============================================================================\n\nexport interface SystemSettingsProps {\n /** Whether to show section descriptions */\n showDescriptions?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when settings are saved */\n onSave?: () => void;\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * System settings management component for administrators.\n *\n * Features:\n * - Duration inputs with human-readable display\n * - Percentage sliders\n * - Preset dropdown selectors\n * - Warning indicators for extreme values\n * - Rich descriptions for each setting\n */\nexport function SystemSettings({\n showDescriptions = true,\n className = '',\n onSave,\n}: SystemSettingsProps) {\n const { settings, isLoading, isUpdating, error, fetchSettings, updateSettings } =\n useSystemSettings();\n\n const [edits, setEdits] = useState<Record<string, string>>({});\n const [saveError, setSaveError] = useState<string | null>(null);\n const [saveSuccess, setSaveSuccess] = useState(false);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Clear success message after 3 seconds\n useEffect(() => {\n if (saveSuccess) {\n const timer = setTimeout(() => setSaveSuccess(false), 3000);\n return () => clearTimeout(timer);\n }\n }, [saveSuccess]);\n\n const handleChange = useCallback((key: string, value: string) => {\n setEdits((prev) => ({ ...prev, [key]: value }));\n setSaveError(null);\n setSaveSuccess(false);\n }, []);\n\n const handleSave = useCallback(async () => {\n const updates: UpdateSettingRequest[] = Object.entries(edits).map(([key, value]) => ({\n key,\n value,\n }));\n\n if (updates.length === 0) return;\n\n try {\n await updateSettings(updates);\n setEdits({});\n setSaveError(null);\n setSaveSuccess(true);\n onSave?.();\n } catch (err) {\n setSaveError(err instanceof Error ? err.message : 'Failed to save settings');\n }\n }, [edits, updateSettings, onSave]);\n\n const handleReset = useCallback(() => {\n setEdits({});\n setSaveError(null);\n setSaveSuccess(false);\n }, []);\n\n const hasChanges = Object.keys(edits).length > 0;\n const changeCount = Object.keys(edits).length;\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n const categories = Object.keys(settings).sort();\n\n if (categories.length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-empty ${className}`}>\n <p>No system settings found.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n {saveError && <ErrorMessage error={saveError} />}\n {saveSuccess && <div className=\"cedros-settings-success\">Settings saved successfully.</div>}\n\n {categories.map((category) => (\n <SettingsSection\n key={category}\n category={category}\n settings={settings[category]}\n edits={edits}\n showDescription={showDescriptions}\n onChange={handleChange}\n />\n ))}\n\n <div className=\"cedros-system-settings-actions\">\n {hasChanges && (\n <span className=\"cedros-settings-change-count\">\n {changeCount} unsaved change{changeCount !== 1 ? 's' : ''}\n </span>\n )}\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-secondary\"\n onClick={handleReset}\n disabled={!hasChanges || isUpdating}\n >\n Reset\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary\"\n onClick={handleSave}\n disabled={!hasChanges || isUpdating}\n >\n {isUpdating ? <LoadingSpinner size=\"sm\" /> : 'Save Changes'}\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// SETTINGS SECTION\n// =============================================================================\n\ninterface SettingsSectionProps {\n category: string;\n settings: SystemSetting[];\n edits: Record<string, string>;\n showDescription: boolean;\n onChange: (key: string, value: string) => void;\n}\n\nfunction SettingsSection({\n category,\n settings,\n edits,\n showDescription,\n onChange,\n}: SettingsSectionProps) {\n const meta = CATEGORY_METADATA[category] || {\n label: category,\n description: '',\n icon: '⚙️',\n };\n\n return (\n <section className=\"cedros-settings-section\">\n <div className=\"cedros-settings-section-header\">\n <span className=\"cedros-settings-section-icon\">{meta.icon}</span>\n <div>\n <h3 className=\"cedros-settings-section-title\">{meta.label}</h3>\n {showDescription && meta.description && (\n <p className=\"cedros-settings-section-description\">{meta.description}</p>\n )}\n </div>\n </div>\n\n <div className=\"cedros-settings-grid\">\n {settings.map((setting) => (\n <SettingRow\n key={setting.key}\n setting={setting}\n editValue={edits[setting.key]}\n onChange={onChange}\n />\n ))}\n </div>\n </section>\n );\n}\n\n// =============================================================================\n// SETTING ROW\n// =============================================================================\n\ninterface SettingRowProps {\n setting: SystemSetting;\n editValue?: string;\n onChange: (key: string, value: string) => void;\n}\n\nfunction SettingRow({ setting, editValue, onChange }: SettingRowProps) {\n const meta = SETTING_METADATA[setting.key];\n const currentValue = editValue ?? setting.value;\n const hasChange = editValue !== undefined && editValue !== setting.value;\n\n // Check for warnings\n const warning = useMemo(() => {\n if (!meta?.warningThreshold) return null;\n const numValue = parseInt(currentValue, 10);\n if (isNaN(numValue)) return null;\n const { above, below, message } = meta.warningThreshold;\n if (above !== undefined && numValue > above) return message;\n if (below !== undefined && numValue < below) return message;\n return null;\n }, [currentValue, meta?.warningThreshold]);\n\n if (!meta) {\n // Fallback for unknown settings\n return (\n <div className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''}`}>\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{setting.key}</span>\n {setting.description && (\n <span className=\"cedros-setting-description\">{setting.description}</span>\n )}\n </div>\n <div className=\"cedros-setting-input-wrapper\">\n <input\n type=\"text\"\n value={currentValue}\n onChange={(e) => onChange(setting.key, e.target.value)}\n className=\"cedros-setting-input\"\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''} ${warning ? 'cedros-setting-row-warning' : ''}`}\n >\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{meta.label}</span>\n <span className=\"cedros-setting-description\">{meta.description}</span>\n </div>\n\n <div className=\"cedros-setting-control\">\n {meta.inputType === 'duration' && (\n <DurationInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n presets={meta.presets}\n min={meta.min}\n />\n )}\n\n {meta.inputType === 'percentage' && (\n <PercentageInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n min={meta.min ?? 1}\n max={meta.max ?? 100}\n step={meta.step ?? 5}\n presets={meta.presets}\n />\n )}\n\n {meta.inputType === 'select' && (\n <SelectInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n presets={meta.presets ?? []}\n unit={meta.unit}\n />\n )}\n\n {meta.inputType === 'number' && (\n <NumberInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n min={meta.min}\n max={meta.max}\n unit={meta.unit}\n />\n )}\n\n {meta.inputType === 'tokenList' && (\n <TokenListInput value={currentValue} onChange={(value) => onChange(setting.key, value)} />\n )}\n\n {meta.inputType === 'text' && (\n <input\n type=\"text\"\n value={currentValue}\n onChange={(e) => onChange(setting.key, e.target.value)}\n className=\"cedros-setting-input\"\n placeholder={meta.label}\n />\n )}\n\n {meta.inputType === 'boolean' && (\n <BooleanInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n />\n )}\n\n {meta.inputType === 'secret' && (\n <SecretInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n multiline={meta.multiline}\n />\n )}\n\n {meta.inputType === 'tokenSymbolList' && (\n <TokenSymbolListInput\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n />\n )}\n\n {warning && <div className=\"cedros-setting-warning\">{warning}</div>}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// INPUT COMPONENTS\n// =============================================================================\n\ninterface DurationInputProps {\n value: string;\n onChange: (value: string) => void;\n presets?: { label: string; value: string }[];\n min?: number;\n}\n\nfunction DurationInput({ value, onChange, presets, min = 0 }: DurationInputProps) {\n const numValue = parseInt(value, 10) || 0;\n const displayValue = formatDuration(numValue);\n\n const handlePresetChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value) {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Math.max(min, parseInt(e.target.value, 10) || 0);\n onChange(String(newValue));\n },\n [onChange, min]\n );\n\n return (\n <div className=\"cedros-duration-input\">\n {presets && presets.length > 0 && (\n <select\n value={presets.find((p) => p.value === value)?.value ?? ''}\n onChange={handlePresetChange}\n className=\"cedros-setting-select\"\n >\n <option value=\"\">Custom...</option>\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n </select>\n )}\n <div className=\"cedros-duration-custom\">\n <input\n type=\"number\"\n value={numValue}\n onChange={handleCustomChange}\n min={min}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n <span className=\"cedros-setting-unit\">seconds</span>\n <span className=\"cedros-duration-display\">= {displayValue}</span>\n </div>\n </div>\n );\n}\n\ninterface PercentageInputProps {\n value: string;\n onChange: (value: string) => void;\n min: number;\n max: number;\n step: number;\n presets?: { label: string; value: string }[];\n}\n\nfunction PercentageInput({ value, onChange, min, max, step, presets }: PercentageInputProps) {\n const numValue = parseInt(value, 10) || min;\n\n const handleSliderChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n const handlePresetClick = useCallback(\n (presetValue: string) => {\n onChange(presetValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-percentage-input\">\n <div className=\"cedros-percentage-slider-row\">\n <input\n type=\"range\"\n value={numValue}\n onChange={handleSliderChange}\n min={min}\n max={max}\n step={step}\n className=\"cedros-percentage-slider\"\n />\n <span className=\"cedros-percentage-value\">{numValue}%</span>\n </div>\n {presets && presets.length > 0 && (\n <div className=\"cedros-preset-buttons\">\n {presets.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n className={`cedros-preset-button ${preset.value === value ? 'cedros-preset-button-active' : ''}`}\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface SelectInputProps {\n value: string;\n onChange: (value: string) => void;\n presets: { label: string; value: string }[];\n unit?: string;\n}\n\nfunction SelectInput({ value, onChange, presets, unit }: SelectInputProps) {\n const isCustomValue = !presets.some((p) => p.value === value);\n\n const handleSelectChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value !== '__custom__') {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-select-input\">\n <select\n value={isCustomValue ? '__custom__' : value}\n onChange={handleSelectChange}\n className=\"cedros-setting-select\"\n >\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n <option value=\"__custom__\">Custom...</option>\n </select>\n {isCustomValue && (\n <div className=\"cedros-select-custom\">\n <input\n type=\"number\"\n value={value}\n onChange={handleCustomChange}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n )}\n </div>\n );\n}\n\ninterface NumberInputProps {\n value: string;\n onChange: (value: string) => void;\n min?: number;\n max?: number;\n unit?: string;\n}\n\nfunction NumberInput({ value, onChange, min, max, unit }: NumberInputProps) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-number-input\">\n <input\n type=\"number\"\n value={value}\n onChange={handleChange}\n min={min}\n max={max}\n className=\"cedros-setting-input\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n );\n}\n\n// =============================================================================\n// BOOLEAN INPUT (Toggle)\n// =============================================================================\n\ninterface BooleanInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction BooleanInput({ value, onChange }: BooleanInputProps) {\n const isEnabled = value === 'true';\n\n const handleToggle = useCallback(() => {\n onChange(isEnabled ? 'false' : 'true');\n }, [isEnabled, onChange]);\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isEnabled}\n className={`cedros-toggle ${isEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{isEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n );\n}\n\n// =============================================================================\n// SECRET INPUT (Masked)\n// =============================================================================\n\ninterface SecretInputProps {\n value: string;\n onChange: (value: string) => void;\n multiline?: boolean;\n}\n\nfunction SecretInput({ value, onChange, multiline }: SecretInputProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [showValue, setShowValue] = useState(false);\n const hasValue = value && value.length > 0;\n\n const handleEdit = useCallback(() => {\n setIsEditing(true);\n setShowValue(true);\n }, []);\n\n const handleDone = useCallback(() => {\n setIsEditing(false);\n setShowValue(false);\n }, []);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n if (!isEditing && hasValue) {\n return (\n <div className=\"cedros-secret-input cedros-secret-input-masked\">\n <span className=\"cedros-secret-masked\">{'•'.repeat(Math.min(value.length, 20))}</span>\n <button type=\"button\" className=\"cedros-secret-edit-btn\" onClick={handleEdit}>\n Edit\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"cedros-secret-input\">\n {multiline ? (\n <textarea\n value={value}\n onChange={handleChange}\n className=\"cedros-setting-input cedros-setting-textarea\"\n placeholder=\"Enter secret value...\"\n rows={4}\n />\n ) : (\n <input\n type={showValue ? 'text' : 'password'}\n value={value}\n onChange={handleChange}\n className=\"cedros-setting-input\"\n placeholder=\"Enter secret value...\"\n />\n )}\n <div className=\"cedros-secret-actions\">\n {!multiline && (\n <button\n type=\"button\"\n className=\"cedros-secret-toggle-btn\"\n onClick={() => setShowValue(!showValue)}\n >\n {showValue ? 'Hide' : 'Show'}\n </button>\n )}\n {isEditing && (\n <button type=\"button\" className=\"cedros-secret-done-btn\" onClick={handleDone}>\n Done\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN LIST INPUT\n// =============================================================================\n\n/** Preset tokens that are always available without needing to be redefined */\nconst PRESET_TOKEN_SYMBOLS = [\n 'SOL',\n 'USDC',\n 'USDT',\n 'EURC',\n 'USD1',\n 'PYUSD',\n 'USDH',\n 'CASH',\n 'BONK',\n 'ORE',\n];\n\ninterface TokenDefinition {\n symbol: string;\n mint: string;\n decimals: number;\n logoUrl?: string;\n}\n\ninterface TokenListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction TokenListInput({ value, onChange }: TokenListInputProps) {\n const tokens: TokenDefinition[] = useMemo(() => {\n try {\n return JSON.parse(value || '[]');\n } catch {\n return [];\n }\n }, [value]);\n\n const updateTokens = useCallback(\n (updated: TokenDefinition[]) => {\n onChange(JSON.stringify(updated));\n },\n [onChange]\n );\n\n const addToken = useCallback(() => {\n updateTokens([...tokens, { symbol: '', mint: '', decimals: 6 }]);\n }, [tokens, updateTokens]);\n\n const updateToken = useCallback(\n (index: number, field: keyof TokenDefinition, val: string | number | undefined) => {\n const updated = [...tokens];\n updated[index] = { ...updated[index], [field]: val };\n updateTokens(updated);\n },\n [tokens, updateTokens]\n );\n\n const removeToken = useCallback(\n (index: number) => {\n updateTokens(tokens.filter((_, i) => i !== index));\n },\n [tokens, updateTokens]\n );\n\n return (\n <div className=\"cedros-token-list-input\">\n {/* Preset tokens info */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Built-in tokens:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => (\n <span key={symbol} className=\"cedros-token-preset-chip\">\n {symbol}\n </span>\n ))}\n </div>\n </div>\n\n {tokens.length === 0 && (\n <p className=\"cedros-token-list-empty\">\n No custom tokens added. Use the built-in tokens above or add your own.\n </p>\n )}\n\n {tokens.map((token, i) => (\n <div key={i} className=\"cedros-token-row\">\n <div className=\"cedros-token-row-fields\">\n <input\n type=\"text\"\n placeholder=\"Symbol\"\n value={token.symbol}\n onChange={(e) => updateToken(i, 'symbol', e.target.value.toUpperCase())}\n className=\"cedros-setting-input cedros-token-input-symbol\"\n maxLength={10}\n />\n <input\n type=\"text\"\n placeholder=\"Mint address\"\n value={token.mint}\n onChange={(e) => updateToken(i, 'mint', e.target.value)}\n className=\"cedros-setting-input cedros-token-input-mint\"\n />\n <input\n type=\"number\"\n placeholder=\"Decimals\"\n value={token.decimals}\n onChange={(e) => updateToken(i, 'decimals', parseInt(e.target.value, 10) || 0)}\n className=\"cedros-setting-input cedros-token-input-decimals\"\n min={0}\n max={18}\n />\n <input\n type=\"text\"\n placeholder=\"Logo URL (optional)\"\n value={token.logoUrl || ''}\n onChange={(e) => updateToken(i, 'logoUrl', e.target.value || undefined)}\n className=\"cedros-setting-input cedros-token-input-logo\"\n />\n </div>\n <button\n type=\"button\"\n className=\"cedros-token-remove-btn\"\n onClick={() => removeToken(i)}\n title=\"Remove token\"\n >\n ×\n </button>\n </div>\n ))}\n\n <button type=\"button\" className=\"cedros-token-add-btn\" onClick={addToken}>\n + Add Token\n </button>\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN SYMBOL LIST INPUT\n// =============================================================================\n\ninterface TokenSymbolListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction TokenSymbolListInput({ value, onChange }: TokenSymbolListInputProps) {\n const symbols = useMemo(() => {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }, [value]);\n\n const addSymbol = useCallback(\n (symbol: string) => {\n if (!symbol || symbols.includes(symbol)) return;\n const updated = [...symbols, symbol].join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n const removeSymbol = useCallback(\n (symbol: string) => {\n const updated = symbols.filter((s) => s !== symbol).join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n return (\n <div className=\"cedros-token-symbol-list-input\">\n {/* Preset tokens - click to add */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Click to add:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => {\n const isSelected = symbols.includes(symbol);\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-token-preset-chip ${isSelected ? 'cedros-token-preset-chip-selected' : ''}`}\n onClick={() => (isSelected ? removeSymbol(symbol) : addSymbol(symbol))}\n title={isSelected ? `Remove ${symbol}` : `Add ${symbol}`}\n >\n {symbol}\n {isSelected && <span className=\"cedros-token-chip-check\">✓</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Text input for manual entry or custom symbols */}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"cedros-setting-input\"\n placeholder=\"USDC, SOL, BONK...\"\n />\n </div>\n );\n}\n","import type {\n SetupStatusResponse,\n CreateFirstAdminRequest,\n CreateFirstAdminResponse,\n} from '../types/setup';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for setup operations (unauthenticated)\n *\n * These endpoints are used during first-run configuration before\n * any admin user exists.\n */\nexport class SetupApiClient {\n private client: ApiClient;\n\n constructor(baseUrl: string, timeoutMs?: number, retryAttempts?: number) {\n // No auth token needed - setup endpoints are unauthenticated\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts });\n }\n\n /**\n * Check if initial setup is required\n * Returns whether the system needs initial setup (no admin exists)\n */\n async getStatus(): Promise<SetupStatusResponse> {\n try {\n return await this.client.get<SetupStatusResponse>('/setup/status');\n } catch (error) {\n throw handleApiError(error, 'Failed to check setup status');\n }\n }\n\n /**\n * Create the first admin user\n * Only works when no admin users exist\n */\n async createFirstAdmin(\n request: CreateFirstAdminRequest\n ): Promise<CreateFirstAdminResponse> {\n try {\n return await this.client.post<CreateFirstAdminResponse>(\n '/setup/admin',\n request\n );\n } catch (error) {\n throw handleApiError(error, 'Failed to create admin account');\n }\n }\n}\n","import { useState, useCallback, useMemo, useRef } from 'react';\nimport type {\n SetupStatusResponse,\n CreateFirstAdminRequest,\n CreateFirstAdminResponse,\n UseSetupReturn,\n} from '../types/setup';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { SetupApiClient } from '../utils/setupApi';\n\n/**\n * Hook for first-run setup operations.\n *\n * Checks if setup is needed (no admin exists) and provides\n * ability to create the first admin user.\n *\n * @example\n * ```tsx\n * function SetupCheck() {\n * const { status, isLoading, checkStatus, createAdmin } = useSetup();\n *\n * useEffect(() => {\n * checkStatus();\n * }, [checkStatus]);\n *\n * if (isLoading) return <Loading />;\n * if (status?.needsSetup) {\n * return <SetupWizard onCreateAdmin={createAdmin} />;\n * }\n * return <Dashboard />;\n * }\n * ```\n */\nexport function useSetup(): UseSetupReturn {\n const { config } = useCedrosLogin();\n\n const [status, setStatus] = useState<SetupStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new SetupApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n // Use ref to avoid apiClient in callback dependencies\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const checkStatus = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const response = await apiClientRef.current.getStatus();\n if (requestId !== requestIdRef.current) return;\n setStatus(response);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err instanceof Error ? err : new Error('Failed to check setup status'));\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, []);\n\n const createAdmin = useCallback(\n async (request: CreateFirstAdminRequest): Promise<CreateFirstAdminResponse> => {\n setIsCreating(true);\n setError(null);\n\n try {\n const response = await apiClientRef.current.createFirstAdmin(request);\n // Refresh status after creating admin\n await checkStatus();\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create admin');\n setError(error);\n throw error;\n } finally {\n setIsCreating(false);\n }\n },\n [checkStatus]\n );\n\n return {\n status,\n isLoading,\n isCreating,\n error,\n checkStatus,\n createAdmin,\n };\n}\n","/**\n * Setup Wizard Component\n *\n * Displayed during first-run when no admin user exists.\n * Allows creating the first admin account.\n *\n * @example\n * ```tsx\n * function AdminApp() {\n * const { status, isLoading, checkStatus, createAdmin } = useSetup();\n *\n * useEffect(() => {\n * checkStatus();\n * }, [checkStatus]);\n *\n * if (isLoading) return <LoadingSpinner />;\n * if (status?.needsSetup) {\n * return <SetupWizard onComplete={() => window.location.reload()} />;\n * }\n * return <CedrosAdminDashboard />;\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useSetup } from '../../hooks/useSetup';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface SetupWizardProps {\n /** Callback when setup is complete */\n onComplete?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\ninterface FormState {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n orgName: string;\n}\n\ninterface ValidationErrors {\n email?: string;\n password?: string;\n confirmPassword?: string;\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst MIN_PASSWORD_LENGTH = 8;\n\nfunction validateForm(form: FormState): ValidationErrors {\n const errors: ValidationErrors = {};\n\n if (!form.email) {\n errors.email = 'Email is required';\n } else if (!EMAIL_REGEX.test(form.email)) {\n errors.email = 'Invalid email format';\n }\n\n if (!form.password) {\n errors.password = 'Password is required';\n } else if (form.password.length < MIN_PASSWORD_LENGTH) {\n errors.password = `Password must be at least ${MIN_PASSWORD_LENGTH} characters`;\n }\n\n if (!form.confirmPassword) {\n errors.confirmPassword = 'Please confirm your password';\n } else if (form.password !== form.confirmPassword) {\n errors.confirmPassword = 'Passwords do not match';\n }\n\n return errors;\n}\n\nexport function SetupWizard({ onComplete, className = '' }: SetupWizardProps) {\n const { status, isLoading, isCreating, error, checkStatus, createAdmin } = useSetup();\n const [form, setForm] = useState<FormState>({\n email: '',\n password: '',\n confirmPassword: '',\n name: '',\n orgName: '',\n });\n const [validationErrors, setValidationErrors] = useState<ValidationErrors>({});\n const [success, setSuccess] = useState(false);\n\n useEffect(() => {\n checkStatus();\n }, [checkStatus]);\n\n const handleChange = useCallback(\n (field: keyof FormState) => (e: React.ChangeEvent<HTMLInputElement>) => {\n setForm((prev) => ({ ...prev, [field]: e.target.value }));\n // Clear validation error when user types\n setValidationErrors((prev) => ({ ...prev, [field]: undefined }));\n },\n []\n );\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n\n const errors = validateForm(form);\n if (Object.keys(errors).length > 0) {\n setValidationErrors(errors);\n return;\n }\n\n try {\n await createAdmin({\n email: form.email,\n password: form.password,\n name: form.name || undefined,\n orgName: form.orgName || undefined,\n });\n setSuccess(true);\n onComplete?.();\n } catch {\n // Error is handled by the hook\n }\n },\n [form, createAdmin, onComplete]\n );\n\n if (isLoading) {\n return (\n <div className={`cedros-setup ${className}`}>\n <div className=\"cedros-setup__loading\">\n <LoadingSpinner />\n <span className=\"cedros-setup__loading-text\">Checking setup status...</span>\n </div>\n </div>\n );\n }\n\n if (status && !status.needsSetup) {\n return (\n <div className={`cedros-setup ${className}`}>\n <div className=\"cedros-setup__complete\">\n <div className=\"cedros-setup__icon cedros-setup__icon--success\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n </div>\n <h2 className=\"cedros-setup__title\">Setup Complete</h2>\n <p className=\"cedros-setup__text\">\n An admin account already exists. You can now log in.\n </p>\n </div>\n </div>\n );\n }\n\n if (success) {\n return (\n <div className={`cedros-setup ${className}`}>\n <div className=\"cedros-setup__complete\">\n <div className=\"cedros-setup__icon cedros-setup__icon--success\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n </div>\n <h2 className=\"cedros-setup__title\">Admin Account Created</h2>\n <p className=\"cedros-setup__text\">\n Your admin account has been created successfully. You can now log in with your\n credentials.\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`cedros-setup ${className}`}>\n <div className=\"cedros-setup__container\">\n <div className=\"cedros-setup__header\">\n <div className=\"cedros-setup__logo\">\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n </div>\n <h1 className=\"cedros-setup__title\">Welcome to Cedros</h1>\n <p className=\"cedros-setup__subtitle\">\n Let's set up your admin account to get started.\n </p>\n </div>\n\n <form className=\"cedros-setup__form\" onSubmit={handleSubmit}>\n {error && <ErrorMessage error={error.message} />}\n\n <div className=\"cedros-setup__field\">\n <label htmlFor=\"setup-email\" className=\"cedros-setup__label\">\n Email Address <span className=\"cedros-setup__required\">*</span>\n </label>\n <input\n id=\"setup-email\"\n type=\"email\"\n className={`cedros-setup__input ${validationErrors.email ? 'cedros-setup__input--error' : ''}`}\n value={form.email}\n onChange={handleChange('email')}\n placeholder=\"admin@example.com\"\n autoComplete=\"email\"\n autoFocus\n disabled={isCreating}\n />\n {validationErrors.email && (\n <span className=\"cedros-setup__error\">{validationErrors.email}</span>\n )}\n </div>\n\n <div className=\"cedros-setup__field\">\n <label htmlFor=\"setup-name\" className=\"cedros-setup__label\">\n Display Name\n </label>\n <input\n id=\"setup-name\"\n type=\"text\"\n className=\"cedros-setup__input\"\n value={form.name}\n onChange={handleChange('name')}\n placeholder=\"Admin\"\n autoComplete=\"name\"\n disabled={isCreating}\n />\n </div>\n\n <div className=\"cedros-setup__field\">\n <label htmlFor=\"setup-org-name\" className=\"cedros-setup__label\">\n Organization Name\n </label>\n <input\n id=\"setup-org-name\"\n type=\"text\"\n className=\"cedros-setup__input\"\n value={form.orgName}\n onChange={handleChange('orgName')}\n placeholder=\"My Organization\"\n disabled={isCreating}\n />\n </div>\n\n <div className=\"cedros-setup__field\">\n <label htmlFor=\"setup-password\" className=\"cedros-setup__label\">\n Password <span className=\"cedros-setup__required\">*</span>\n </label>\n <input\n id=\"setup-password\"\n type=\"password\"\n className={`cedros-setup__input ${validationErrors.password ? 'cedros-setup__input--error' : ''}`}\n value={form.password}\n onChange={handleChange('password')}\n placeholder=\"At least 8 characters\"\n autoComplete=\"new-password\"\n disabled={isCreating}\n />\n {validationErrors.password && (\n <span className=\"cedros-setup__error\">{validationErrors.password}</span>\n )}\n </div>\n\n <div className=\"cedros-setup__field\">\n <label htmlFor=\"setup-confirm-password\" className=\"cedros-setup__label\">\n Confirm Password <span className=\"cedros-setup__required\">*</span>\n </label>\n <input\n id=\"setup-confirm-password\"\n type=\"password\"\n className={`cedros-setup__input ${validationErrors.confirmPassword ? 'cedros-setup__input--error' : ''}`}\n value={form.confirmPassword}\n onChange={handleChange('confirmPassword')}\n placeholder=\"Confirm your password\"\n autoComplete=\"new-password\"\n disabled={isCreating}\n />\n {validationErrors.confirmPassword && (\n <span className=\"cedros-setup__error\">{validationErrors.confirmPassword}</span>\n )}\n </div>\n\n <button\n type=\"submit\"\n className=\"cedros-setup__button\"\n disabled={isCreating}\n >\n {isCreating ? (\n <>\n <LoadingSpinner />\n <span>Creating Account...</span>\n </>\n ) : (\n 'Create Admin Account'\n )}\n </button>\n </form>\n\n <div className=\"cedros-setup__footer\">\n <p className=\"cedros-setup__note\">\n This will be the first administrator account for your installation.\n </p>\n {status?.serverVersion && (\n <p className=\"cedros-setup__version\">Server version: {status.serverVersion}</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { UpdateSettingRequest } from '../types';\nimport { useSystemSettings } from './useSystemSettings';\n\n/** Autosave status */\nexport type AutosaveStatus = 'idle' | 'pending' | 'saving' | 'saved' | 'error';\n\n/** Debounce delay in milliseconds */\nconst DEBOUNCE_MS = 800;\n\n/** How long to show \"saved\" status before returning to idle */\nconst SAVED_DISPLAY_MS = 2000;\n\nexport interface UseSettingsAutosaveReturn {\n /** Settings grouped by category */\n settings: Record<string, import('../types').SystemSetting[]>;\n /** Current edits (key -> value) */\n edits: Record<string, string>;\n /** Whether initial load is in progress */\n isLoading: boolean;\n /** Current autosave status */\n autosaveStatus: AutosaveStatus;\n /** Error message if autosave failed */\n autosaveError: string | null;\n /** Loading error */\n error: Error | null;\n /** Fetch settings from server */\n fetchSettings: () => Promise<void>;\n /** Handle a setting change (triggers autosave) */\n handleChange: (key: string, value: string) => void;\n /** Get effective value (edit or original) */\n getEffectiveValue: (key: string) => string;\n}\n\n/**\n * Hook for managing system settings with autosave.\n *\n * Automatically saves changes after a debounce period.\n * Provides status feedback for the autosave process.\n */\nexport function useSettingsAutosave(): UseSettingsAutosaveReturn {\n const { settings, isLoading, error, fetchSettings, updateSettings } = useSystemSettings();\n\n const [edits, setEdits] = useState<Record<string, string>>({});\n const [autosaveStatus, setAutosaveStatus] = useState<AutosaveStatus>('idle');\n const [autosaveError, setAutosaveError] = useState<string | null>(null);\n\n // Refs for debounce timer and pending edits\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const savedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingEditsRef = useRef<Record<string, string>>({});\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n if (savedTimerRef.current) clearTimeout(savedTimerRef.current);\n };\n }, []);\n\n // Perform the actual save\n const performSave = useCallback(async () => {\n const editsToSave = { ...pendingEditsRef.current };\n if (Object.keys(editsToSave).length === 0) {\n setAutosaveStatus('idle');\n return;\n }\n\n setAutosaveStatus('saving');\n setAutosaveError(null);\n\n const updates: UpdateSettingRequest[] = Object.entries(editsToSave).map(([key, value]) => ({\n key,\n value,\n }));\n\n try {\n await updateSettings(updates);\n\n // Clear saved edits from state\n setEdits((prev) => {\n const next = { ...prev };\n for (const key of Object.keys(editsToSave)) {\n delete next[key];\n }\n return next;\n });\n\n // Clear from pending ref\n for (const key of Object.keys(editsToSave)) {\n delete pendingEditsRef.current[key];\n }\n\n setAutosaveStatus('saved');\n\n // Reset to idle after delay\n if (savedTimerRef.current) clearTimeout(savedTimerRef.current);\n savedTimerRef.current = setTimeout(() => {\n setAutosaveStatus('idle');\n }, SAVED_DISPLAY_MS);\n } catch (err) {\n setAutosaveStatus('error');\n setAutosaveError(err instanceof Error ? err.message : 'Failed to save');\n }\n }, [updateSettings]);\n\n // Handle a setting change\n const handleChange = useCallback(\n (key: string, value: string) => {\n // Update local edits\n setEdits((prev) => ({ ...prev, [key]: value }));\n pendingEditsRef.current[key] = value;\n\n // Clear any error state\n setAutosaveError(null);\n\n // Set status to pending\n setAutosaveStatus('pending');\n\n // Reset debounce timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n debounceTimerRef.current = setTimeout(() => {\n performSave();\n }, DEBOUNCE_MS);\n },\n [performSave]\n );\n\n // Get effective value (edit or original)\n const getEffectiveValue = useCallback(\n (key: string) => {\n if (edits[key] !== undefined) return edits[key];\n for (const categorySettings of Object.values(settings)) {\n const found = categorySettings.find((s) => s.key === key);\n if (found) return found.value;\n }\n return '';\n },\n [edits, settings]\n );\n\n return {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n };\n}\n","/**\n * Settings metadata - rich descriptions and input configuration\n */\nimport type { SettingMeta } from '../../../types';\n\n// =============================================================================\n// DURATION UTILITIES\n// =============================================================================\n\nexport interface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport function secondsToDuration(totalSeconds: number): DurationParts {\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n return { days, hours, minutes, seconds };\n}\n\nexport function formatDuration(totalSeconds: number): string {\n const { days, hours, minutes } = secondsToDuration(totalSeconds);\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (parts.length === 0) parts.push(`${totalSeconds}s`);\n return parts.join(' ');\n}\n\n// =============================================================================\n// SETTING METADATA - Rich descriptions and input configuration\n// =============================================================================\n\nexport const SETTING_METADATA: Record<string, SettingMeta> = {\n // ============= Authentication Providers =============\n // Email auth\n auth_email_enabled: {\n key: 'auth_email_enabled',\n label: 'Enable Email Authentication',\n description: 'Allow users to sign up and log in with email/password.',\n inputType: 'boolean',\n },\n auth_email_require_verification: {\n key: 'auth_email_require_verification',\n label: 'Require Email Verification',\n description: 'Users must verify their email address before they can log in.',\n inputType: 'boolean',\n },\n auth_email_block_disposable: {\n key: 'auth_email_block_disposable',\n label: 'Block Disposable Emails',\n description: 'Reject registrations from known disposable email providers.',\n inputType: 'boolean',\n },\n\n // Google OAuth\n auth_google_enabled: {\n key: 'auth_google_enabled',\n label: 'Enable Google Sign-In',\n description: 'Allow users to authenticate with their Google account.',\n inputType: 'boolean',\n },\n auth_google_client_id: {\n key: 'auth_google_client_id',\n label: 'Google Client ID',\n description: 'OAuth 2.0 client ID from Google Cloud Console.',\n inputType: 'text',\n },\n auth_google_client_secret: {\n key: 'auth_google_client_secret',\n label: 'Google Client Secret',\n description: 'OAuth 2.0 client secret from Google Cloud Console.',\n inputType: 'secret',\n },\n\n // Apple OAuth\n auth_apple_enabled: {\n key: 'auth_apple_enabled',\n label: 'Enable Sign in with Apple',\n description: 'Allow users to authenticate with their Apple ID.',\n inputType: 'boolean',\n },\n auth_apple_client_id: {\n key: 'auth_apple_client_id',\n label: 'Apple Services ID',\n description: 'The Services ID configured in your Apple Developer account.',\n inputType: 'text',\n },\n auth_apple_team_id: {\n key: 'auth_apple_team_id',\n label: 'Apple Team ID',\n description: 'Your Apple Developer Team ID.',\n inputType: 'text',\n },\n auth_apple_key_id: {\n key: 'auth_apple_key_id',\n label: 'Apple Key ID',\n description: 'The Key ID for your Sign in with Apple private key.',\n inputType: 'text',\n },\n auth_apple_private_key: {\n key: 'auth_apple_private_key',\n label: 'Apple Private Key',\n description: 'The private key file contents (PEM format) for Sign in with Apple.',\n inputType: 'secret',\n multiline: true,\n },\n\n // Solana auth\n auth_solana_enabled: {\n key: 'auth_solana_enabled',\n label: 'Enable Solana Wallet Auth',\n description: 'Allow users to authenticate by signing with their Solana wallet.',\n inputType: 'boolean',\n },\n auth_solana_challenge_expiry: {\n key: 'auth_solana_challenge_expiry',\n label: 'Challenge Expiry',\n description: 'How long a wallet signature challenge is valid.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '10 minutes', value: '600' },\n ],\n },\n\n // WebAuthn/Passkeys\n auth_webauthn_enabled: {\n key: 'auth_webauthn_enabled',\n label: 'Enable WebAuthn/Passkeys',\n description: 'Allow passwordless authentication with FIDO2/WebAuthn credentials.',\n inputType: 'boolean',\n },\n auth_webauthn_rp_id: {\n key: 'auth_webauthn_rp_id',\n label: 'Relying Party ID',\n description: 'Usually your domain (e.g., example.com). Passkeys are bound to this.',\n inputType: 'text',\n },\n auth_webauthn_rp_name: {\n key: 'auth_webauthn_rp_name',\n label: 'Relying Party Name',\n description: 'Display name shown to users during passkey registration.',\n inputType: 'text',\n },\n auth_webauthn_rp_origin: {\n key: 'auth_webauthn_rp_origin',\n label: 'Allowed Origins',\n description: 'Comma-separated origins allowed for WebAuthn (e.g., https://example.com).',\n inputType: 'text',\n },\n\n // Instant Link (Magic Link)\n auth_instantlink_enabled: {\n key: 'auth_instantlink_enabled',\n label: 'Enable Instant Link',\n description: 'Allow passwordless login via magic link sent to email.',\n inputType: 'boolean',\n },\n auth_instantlink_expiry: {\n key: 'auth_instantlink_expiry',\n label: 'Link Expiry',\n description: 'How long the magic link remains valid.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n { label: '30 minutes', value: '1800' },\n { label: '1 hour', value: '3600' },\n ],\n },\n auth_instantlink_rate_limit: {\n key: 'auth_instantlink_rate_limit',\n label: 'Rate Limit',\n description: 'Maximum instant link requests per email per hour.',\n inputType: 'select',\n presets: [\n { label: '3 per hour', value: '3' },\n { label: '5 per hour', value: '5' },\n { label: '10 per hour', value: '10' },\n ],\n },\n\n // ============= Feature Flags =============\n // Order: organizations, enterprise SSO, 2fa, embedded wallets, credit system\n feature_organizations: {\n key: 'feature_organizations',\n label: 'Organizations',\n description: 'Enable multi-user organizations with role-based access.',\n inputType: 'boolean',\n },\n feature_sso: {\n key: 'feature_sso',\n label: 'Enterprise SSO',\n description: 'Enable SAML/OIDC single sign-on for enterprise customers.',\n inputType: 'boolean',\n },\n feature_mfa: {\n key: 'feature_mfa',\n label: 'Two-Factor Authentication',\n description: 'Allow users to enable TOTP-based two-factor authentication.',\n inputType: 'boolean',\n },\n feature_wallet_signing: {\n key: 'feature_wallet_signing',\n label: 'Enable Embedded Wallet',\n description: 'Enable the embedded wallet for transaction signing.',\n inputType: 'boolean',\n },\n wallet_recovery_mode: {\n key: 'wallet_recovery_mode',\n label: 'Recovery Mode',\n description: 'How users can recover their wallet if they lose access.',\n inputType: 'select',\n presets: [\n { label: 'Share C Only (Recommended)', value: 'share_c_only' },\n { label: 'Full Seed Phrase', value: 'full_seed' },\n { label: 'No Recovery', value: 'none' },\n ],\n },\n feature_credits: {\n key: 'feature_credits',\n label: 'Credit System',\n description: 'Enable the deposits and credits system. Users can deposit tokens to receive platform credits.',\n inputType: 'boolean',\n },\n\n // ============= Security Settings =============\n security_cors_origins: {\n key: 'security_cors_origins',\n label: 'CORS Origins',\n description: 'Allowed origins for cross-origin requests (comma-separated). Empty = same origin only.',\n inputType: 'text',\n },\n security_cookie_domain: {\n key: 'security_cookie_domain',\n label: 'Cookie Domain',\n description: 'Domain for auth cookies. Empty uses the request origin.',\n inputType: 'text',\n },\n security_cookie_secure: {\n key: 'security_cookie_secure',\n label: 'Secure Cookies',\n description: 'Require HTTPS for cookies. Disable only for local development.',\n inputType: 'boolean',\n },\n security_cookie_same_site: {\n key: 'security_cookie_same_site',\n label: 'Cookie SameSite',\n description: 'SameSite policy for cookies. Use \"none\" only if needed for cross-site embeds.',\n inputType: 'select',\n presets: [\n { label: 'Strict', value: 'strict' },\n { label: 'Lax (Recommended)', value: 'lax' },\n { label: 'None (cross-site)', value: 'none' },\n ],\n },\n security_session_timeout: {\n key: 'security_session_timeout',\n label: 'Session Timeout',\n description: 'How long sessions remain valid before requiring re-authentication.',\n inputType: 'duration',\n min: 300,\n presets: [\n { label: '1 hour', value: '3600' },\n { label: '24 hours', value: '86400' },\n { label: '7 days', value: '604800' },\n { label: '30 days', value: '2592000' },\n ],\n },\n security_jwt_issuer: {\n key: 'security_jwt_issuer',\n label: 'JWT Issuer',\n description: 'Issuer claim for JWTs. Empty uses the server URL.',\n inputType: 'text',\n },\n security_jwt_audience: {\n key: 'security_jwt_audience',\n label: 'JWT Audience',\n description: 'Audience claim for JWTs. Empty uses default.',\n inputType: 'text',\n },\n\n // ============= Email/SMTP Settings =============\n email_provider: {\n key: 'email_provider',\n label: 'Email Provider',\n description: 'Select your email service provider for automatic configuration.',\n inputType: 'select',\n presets: [\n { label: 'Mailgun', value: 'mailgun' },\n { label: 'SendGrid', value: 'sendgrid' },\n { label: 'Postmark', value: 'postmark' },\n { label: 'AWS SES', value: 'ses' },\n { label: 'Resend', value: 'resend' },\n { label: 'Custom SMTP', value: 'custom' },\n ],\n },\n email_smtp_host: {\n key: 'email_smtp_host',\n label: 'SMTP Host',\n description: 'SMTP server hostname (e.g., smtp.sendgrid.net).',\n inputType: 'text',\n },\n email_smtp_port: {\n key: 'email_smtp_port',\n label: 'SMTP Port',\n description: 'SMTP server port. Common: 587 (TLS), 465 (SSL), 25 (unencrypted).',\n inputType: 'select',\n presets: [\n { label: '587 (TLS)', value: '587' },\n { label: '465 (SSL)', value: '465' },\n { label: '25 (Plain)', value: '25' },\n ],\n },\n email_smtp_user: {\n key: 'email_smtp_user',\n label: 'SMTP Username',\n description: 'Username for SMTP authentication.',\n inputType: 'text',\n },\n email_smtp_password: {\n key: 'email_smtp_password',\n label: 'API Key',\n description: 'API key or password for your email provider.',\n inputType: 'secret',\n },\n email_smtp_tls: {\n key: 'email_smtp_tls',\n label: 'Use TLS',\n description: 'Enable TLS encryption for SMTP connections.',\n inputType: 'boolean',\n },\n email_from_address: {\n key: 'email_from_address',\n label: 'From Address',\n description: 'Default sender email address (e.g., noreply@example.com).',\n inputType: 'text',\n },\n email_from_name: {\n key: 'email_from_name',\n label: 'From Name',\n description: 'Default sender display name (e.g., \"My App\").',\n inputType: 'text',\n },\n\n // ============= Webhook Settings =============\n webhook_enabled: {\n key: 'webhook_enabled',\n label: 'Enable Webhooks',\n description: 'Send notifications to a Discord or Slack webhook URL.',\n inputType: 'boolean',\n },\n webhook_url: {\n key: 'webhook_url',\n label: 'Webhook URL',\n description: 'Discord or Slack webhook URL to receive notifications.',\n inputType: 'text',\n placeholder: 'https://discord.com/api/webhooks/...',\n },\n webhook_notify_registrations: {\n key: 'webhook_notify_registrations',\n label: 'New Registrations',\n description: 'Notify when a new user registers.',\n inputType: 'boolean',\n },\n webhook_notify_signins: {\n key: 'webhook_notify_signins',\n label: 'Sign-Ins',\n description: 'Notify when a user signs in.',\n inputType: 'boolean',\n },\n webhook_notify_deposits: {\n key: 'webhook_notify_deposits',\n label: 'Deposits',\n description: 'Notify when a user makes a deposit.',\n inputType: 'boolean',\n },\n\n // ============= Server Settings =============\n server_frontend_url: {\n key: 'server_frontend_url',\n label: 'Frontend URL',\n description: 'URL of your frontend app (for redirects and email links).',\n inputType: 'text',\n },\n server_base_path: {\n key: 'server_base_path',\n label: 'Base Path',\n description: 'Base path for auth endpoints (e.g., /auth).',\n inputType: 'text',\n },\n server_trust_proxy: {\n key: 'server_trust_proxy',\n label: 'Trust Proxy',\n description: 'Trust X-Forwarded-For headers. Enable if behind a reverse proxy.',\n inputType: 'boolean',\n },\n server_cedros_pay_api_key: {\n key: 'server_cedros_pay_api_key',\n label: 'Cedros Pay API Key',\n description:\n 'API key for Cedros Pay to authenticate with this server. Copy this into your Cedros Pay settings.',\n inputType: 'secret',\n },\n jupiter_api_key: {\n key: 'jupiter_api_key',\n label: 'Jupiter API Key',\n description:\n 'API key for Jupiter Ultra API (gasless swaps). Get a free key at <a href=\"https://portal.jup.ag\" target=\"_blank\" rel=\"noopener\">portal.jup.ag</a>.',\n inputType: 'secret',\n },\n server_metrics_api_key: {\n key: 'server_metrics_api_key',\n label: 'Metrics API Key',\n description:\n 'API key for Prometheus/Grafana to scrape the /metrics endpoint. Use with Authorization: Bearer header.',\n inputType: 'secret',\n },\n server_log_level: {\n key: 'server_log_level',\n label: 'Log Level',\n description: 'Minimum severity level for log output. Lower levels are more verbose.',\n inputType: 'select',\n presets: [\n { label: 'Trace (most verbose)', value: 'trace' },\n { label: 'Debug', value: 'debug' },\n { label: 'Info', value: 'info' },\n { label: 'Warn', value: 'warn' },\n { label: 'Error (least verbose)', value: 'error' },\n ],\n },\n server_log_format: {\n key: 'server_log_format',\n label: 'Log Format',\n description: 'Output format for log messages.',\n inputType: 'select',\n presets: [\n { label: 'JSON (structured)', value: 'json' },\n { label: 'Pretty (human-readable)', value: 'pretty' },\n ],\n },\n server_environment: {\n key: 'server_environment',\n label: 'Environment',\n description: 'Deployment environment. Affects default behaviors and log verbosity.',\n inputType: 'select',\n presets: [\n { label: 'Development', value: 'development' },\n { label: 'Staging', value: 'staging' },\n { label: 'Production', value: 'production' },\n ],\n },\n\n // ============= Privacy Settings (existing) =============\n privacy_period_secs: {\n key: 'privacy_period_secs',\n label: 'Privacy Period',\n description:\n 'How long deposits are held before withdrawal to provide timing privacy. Longer periods provide better privacy but delay user access to funds.',\n inputType: 'duration',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n { label: '24 hours', value: '86400' },\n { label: '7 days', value: '604800' },\n { label: '14 days', value: '1209600' },\n { label: '30 days', value: '2592000' },\n ],\n warningThreshold: {\n below: 3600,\n message: 'Very short privacy periods may not provide adequate timing protection.',\n },\n },\n\n // Treasury settings\n treasury_wallet_address: {\n key: 'treasury_wallet_address',\n label: 'Treasury Wallet Address',\n description:\n 'Solana wallet address where funds are sent. Used for privacy cash withdrawals, micro payment batches, and direct payments.',\n inputType: 'text',\n placeholder: 'e.g., 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',\n },\n\n // Withdrawal worker settings\n withdrawal_poll_interval_secs: {\n key: 'withdrawal_poll_interval_secs',\n label: 'Worker Poll Interval',\n description:\n 'How often the withdrawal worker checks for deposits ready to process. Lower values process faster but increase server load.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n { label: '1 hour', value: '3600' },\n { label: '6 hours', value: '21600' },\n ],\n warningThreshold: {\n below: 60,\n message: 'Polling more than once per minute may cause excessive load.',\n },\n },\n withdrawal_batch_size: {\n key: 'withdrawal_batch_size',\n label: 'Batch Size',\n description:\n 'Maximum number of withdrawals to process in a single batch. Higher values improve throughput but may cause timeouts.',\n inputType: 'select',\n min: 1,\n max: 100,\n presets: [\n { label: '1 (Sequential)', value: '1' },\n { label: '5', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '25', value: '25' },\n { label: '50', value: '50' },\n { label: '100 (Max)', value: '100' },\n ],\n },\n withdrawal_timeout_secs: {\n key: 'withdrawal_timeout_secs',\n label: 'Transaction Timeout',\n description:\n 'How long to wait for a withdrawal transaction to confirm before considering it failed.',\n inputType: 'duration',\n min: 30,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '2 minutes', value: '120' },\n { label: '5 minutes', value: '300' },\n ],\n warningThreshold: {\n below: 30,\n message: 'Very short timeouts may cause premature failure on slow networks.',\n },\n },\n withdrawal_max_retries: {\n key: 'withdrawal_max_retries',\n label: 'Max Retries',\n description:\n 'Number of times to retry a failed withdrawal before marking it as permanently failed.',\n inputType: 'select',\n min: 0,\n max: 10,\n presets: [\n { label: '0 (No retries)', value: '0' },\n { label: '1', value: '1' },\n { label: '3 (Recommended)', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n withdrawal_percentage: {\n key: 'withdrawal_percentage',\n label: 'Withdrawal Percentage',\n description:\n 'Percentage of ready funds to withdraw each cycle. Lower values spread withdrawals over time for better privacy.',\n inputType: 'percentage',\n min: 1,\n max: 100,\n step: 5,\n presets: [\n { label: '25%', value: '25' },\n { label: '50%', value: '50' },\n { label: '75%', value: '75' },\n { label: '100% (All at once)', value: '100' },\n ],\n warningThreshold: {\n above: 75,\n message:\n 'High percentages may reduce timing privacy by processing most withdrawals together.',\n },\n },\n partial_withdrawal_count: {\n key: 'partial_withdrawal_count',\n label: 'Partial Withdrawals',\n description:\n 'Maximum partial withdrawals per batch. Partial withdrawals add noise to timing analysis. Set to 0 to disable.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '1', value: '1' },\n { label: '3', value: '3' },\n { label: '5', value: '5' },\n { label: '10', value: '10' },\n ],\n },\n partial_withdrawal_min_lamports: {\n key: 'partial_withdrawal_min_lamports',\n label: 'Min Balance for Partial',\n description:\n 'Minimum account balance (in lamports) required before partial withdrawals are considered. 1 SOL = 1,000,000,000 lamports.',\n inputType: 'select',\n min: 0,\n presets: [\n { label: '0.1 SOL', value: '100000000' },\n { label: '0.5 SOL', value: '500000000' },\n { label: '1 SOL', value: '1000000000' },\n { label: '5 SOL', value: '5000000000' },\n { label: '10 SOL', value: '10000000000' },\n ],\n },\n\n // Rate limit settings\n rate_limit_auth: {\n key: 'rate_limit_auth',\n label: 'Auth Request Limit',\n description:\n 'Maximum authentication attempts (login, register, password reset) per IP per window. Protects against brute force attacks.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '5 (Strict)', value: '5' },\n { label: '10 (Recommended)', value: '10' },\n { label: '20', value: '20' },\n { label: '50 (Permissive)', value: '50' },\n ],\n warningThreshold: {\n above: 20,\n message: 'High auth limits may allow brute force attempts.',\n },\n },\n rate_limit_general: {\n key: 'rate_limit_general',\n label: 'General Request Limit',\n description: 'Maximum general API requests per IP per window. Affects all non-auth endpoints.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '30', value: '30' },\n { label: '60 (Recommended)', value: '60' },\n { label: '120', value: '120' },\n { label: '300', value: '300' },\n ],\n },\n rate_limit_credit: {\n key: 'rate_limit_credit',\n label: 'Credit Request Limit',\n description:\n 'Maximum credit/balance check requests per IP per window. Higher for apps that poll balance frequently.',\n inputType: 'select',\n min: 1,\n unit: 'requests',\n presets: [\n { label: '10', value: '10' },\n { label: '30 (Recommended)', value: '30' },\n { label: '60', value: '60' },\n { label: '120', value: '120' },\n ],\n },\n rate_limit_window: {\n key: 'rate_limit_window',\n label: 'Rate Limit Window',\n description:\n 'Time window for rate limiting. All limits above are \"per window\". Shorter windows are stricter.',\n inputType: 'duration',\n min: 1,\n presets: [\n { label: '30 seconds', value: '30' },\n { label: '1 minute', value: '60' },\n { label: '5 minutes', value: '300' },\n { label: '15 minutes', value: '900' },\n ],\n },\n\n // ============= Deposit General Settings =============\n solana_rpc_url: {\n key: 'solana_rpc_url',\n label: 'Solana RPC URL',\n description:\n 'Get a fast RPC endpoint from <a href=\"https://helius.dev\" target=\"_blank\" rel=\"noopener\">Helius</a> or <a href=\"https://quicknode.com\" target=\"_blank\" rel=\"noopener\">QuickNode</a>.',\n inputType: 'text',\n placeholder: 'https://api.mainnet-beta.solana.com',\n },\n solana_network: {\n key: 'solana_network',\n label: 'Solana Network',\n description: 'The Solana network to use for deposits and withdrawals.',\n inputType: 'select',\n presets: [\n { label: 'Mainnet', value: 'mainnet-beta' },\n { label: 'Devnet', value: 'devnet' },\n ],\n },\n deposit_privacy_enabled: {\n key: 'deposit_privacy_enabled',\n label: 'Enable Private Deposits',\n description:\n 'When enabled, deposits are held for a privacy period before withdrawal. Provides timing privacy but delays fund availability.',\n inputType: 'boolean',\n },\n deposit_company_token: {\n key: 'deposit_company_token',\n label: 'Platform Token',\n description:\n 'The token that represents platform credits. Deposits are converted to this token. Common choices: USDC, SOL.',\n inputType: 'select',\n presets: [\n { label: 'USDC', value: 'USDC' },\n { label: 'USDT', value: 'USDT' },\n { label: 'SOL', value: 'SOL' },\n { label: 'EURC', value: 'EURC' },\n ],\n },\n deposit_micro_enabled: {\n key: 'deposit_micro_enabled',\n label: 'SOL Micro Payments',\n description:\n 'Allow small SOL deposits (under $10) that are batched together for efficiency.',\n inputType: 'boolean',\n },\n deposit_gasless_swap_enabled: {\n key: 'deposit_gasless_swap_enabled',\n label: 'Gasless Swap Payments',\n description: 'Allow deposits via Jupiter swaps.',\n inputType: 'boolean',\n },\n deposit_min_usd: {\n key: 'deposit_min_usd',\n label: 'Minimum Deposit',\n description: 'Minimum deposit amount in USD equivalent.',\n inputType: 'select',\n unit: 'USD',\n presets: [\n { label: '$1', value: '1' },\n { label: '$5', value: '5' },\n { label: '$10', value: '10' },\n { label: '$25', value: '25' },\n ],\n },\n deposit_max_usd: {\n key: 'deposit_max_usd',\n label: 'Maximum Deposit',\n description: 'Maximum deposit amount per transaction in USD equivalent. Set to 0 for unlimited.',\n inputType: 'select',\n unit: 'USD',\n presets: [\n { label: 'Unlimited', value: '0' },\n { label: '$1,000', value: '1000' },\n { label: '$10,000', value: '10000' },\n { label: '$100,000', value: '100000' },\n ],\n },\n\n // Deposit component settings\n deposit_show_explainer: {\n key: 'deposit_show_explainer',\n label: 'Show Explainer Screen',\n description: 'Show the introductory explainer screen at the start of the deposit flow.',\n inputType: 'boolean',\n },\n\n // Deposit token settings\n deposit_quick_action_tokens: {\n key: 'deposit_quick_action_tokens',\n label: 'Quick Action Tokens',\n description:\n 'Comma-separated token symbols shown as quick action buttons. First token is the default.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens: {\n key: 'deposit_custom_tokens',\n label: 'Custom Dropdown Tokens',\n description:\n 'Comma-separated token symbols shown in the \"Custom\" dropdown. Leave empty to show all.',\n inputType: 'tokenSymbolList',\n },\n deposit_custom_tokens_json: {\n key: 'deposit_custom_tokens_json',\n label: 'Custom Token Definitions',\n description:\n 'Add tokens beyond the built-in list. Define symbol, mint address, decimals, and logo URL.',\n inputType: 'tokenList',\n },\n\n // Deposit fee settings\n deposit_fee_policy: {\n key: 'deposit_fee_policy',\n label: 'Fee Policy',\n description:\n 'Who pays deposit fees: company absorbs all, or user pays swap/privacy/all fees.',\n inputType: 'select',\n presets: [\n { label: 'Company Pays All', value: 'company_pays_all' },\n { label: 'User Pays Swap Fees', value: 'user_pays_swap' },\n { label: 'User Pays Privacy Fees', value: 'user_pays_privacy' },\n { label: 'User Pays All Fees', value: 'user_pays_all' },\n ],\n },\n privacy_fee_fixed_lamports: {\n key: 'privacy_fee_fixed_lamports',\n label: 'Privacy Fixed Fee',\n description:\n 'Fixed fee for Privacy Cash deposits in lamports. 1 SOL = 1,000,000,000 lamports.',\n inputType: 'select',\n unit: 'lamports',\n presets: [\n { label: '0 SOL', value: '0' },\n { label: '0.001 SOL', value: '1000000' },\n { label: '0.005 SOL', value: '5000000' },\n { label: '0.006 SOL (Default)', value: '6000000' },\n { label: '0.01 SOL', value: '10000000' },\n ],\n },\n privacy_fee_percent_bps: {\n key: 'privacy_fee_percent_bps',\n label: 'Privacy Percentage Fee',\n description:\n 'Percentage fee for Privacy Cash deposits in basis points. 100 bps = 1%.',\n inputType: 'select',\n unit: 'bps',\n presets: [\n { label: '0%', value: '0' },\n { label: '0.25%', value: '25' },\n { label: '0.35% (Default)', value: '35' },\n { label: '0.5%', value: '50' },\n { label: '1%', value: '100' },\n ],\n },\n swap_fee_fixed_lamports: {\n key: 'swap_fee_fixed_lamports',\n label: 'Swap Fixed Fee',\n description:\n 'Fixed fee for Jupiter swaps in lamports. Covers transaction costs.',\n inputType: 'select',\n unit: 'lamports',\n presets: [\n { label: '0 SOL', value: '0' },\n { label: '0.001 SOL (Default)', value: '1000000' },\n { label: '0.002 SOL', value: '2000000' },\n { label: '0.005 SOL', value: '5000000' },\n ],\n },\n swap_fee_percent_bps: {\n key: 'swap_fee_percent_bps',\n label: 'Swap Percentage Fee',\n description:\n 'Percentage fee for Jupiter swaps in basis points. 100 bps = 1%.',\n inputType: 'select',\n unit: 'bps',\n presets: [\n { label: '0%', value: '0' },\n { label: '0.1% (Default)', value: '10' },\n { label: '0.25%', value: '25' },\n { label: '0.5%', value: '50' },\n ],\n },\n company_fee_fixed_lamports: {\n key: 'company_fee_fixed_lamports',\n label: 'Company Fixed Fee',\n description:\n 'Additional fixed processing fee in lamports. Set to 0 to disable.',\n inputType: 'select',\n unit: 'lamports',\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '0.001 SOL', value: '1000000' },\n { label: '0.005 SOL', value: '5000000' },\n { label: '0.01 SOL', value: '10000000' },\n ],\n },\n company_fee_percent_bps: {\n key: 'company_fee_percent_bps',\n label: 'Company Percentage Fee',\n description:\n 'Additional percentage processing fee in basis points. 100 bps = 1%.',\n inputType: 'select',\n unit: 'bps',\n presets: [\n { label: 'Disabled', value: '0' },\n { label: '0.1%', value: '10' },\n { label: '0.25%', value: '25' },\n { label: '0.5%', value: '50' },\n { label: '1%', value: '100' },\n ],\n },\n micro_batch_threshold_usd: {\n key: 'micro_batch_threshold_usd',\n label: 'Batch Threshold',\n description:\n 'Minimum accumulated USD value before triggering a batch swap. Jupiter requires ~$10 minimum.',\n inputType: 'select',\n unit: 'USD',\n presets: [\n { label: '$10 (Minimum)', value: '10' },\n { label: '$25', value: '25' },\n { label: '$50', value: '50' },\n { label: '$100', value: '100' },\n ],\n },\n micro_batch_poll_secs: {\n key: 'micro_batch_poll_secs',\n label: 'Batch Poll Interval',\n description:\n 'How often to check for batchable micro deposits. Lower values process faster but increase load.',\n inputType: 'duration',\n min: 60,\n presets: [\n { label: '1 minute', value: '60' },\n { label: '5 minutes (Default)', value: '300' },\n { label: '15 minutes', value: '900' },\n { label: '1 hour', value: '3600' },\n ],\n },\n private_deposit_min_lamports: {\n key: 'private_deposit_min_lamports',\n label: 'Min Private Deposit',\n description:\n 'Minimum amount for Privacy Cash deposits in lamports. Smaller deposits use micro batching.',\n inputType: 'select',\n unit: 'lamports',\n presets: [\n { label: '0.1 SOL', value: '100000000' },\n { label: '0.25 SOL (Default)', value: '250000000' },\n { label: '0.5 SOL', value: '500000000' },\n { label: '1 SOL', value: '1000000000' },\n ],\n },\n withdrawal_min_lamports: {\n key: 'withdrawal_min_lamports',\n label: 'Min Withdrawal Amount',\n description:\n 'Minimum amount to withdraw in lamports. Deposits below this remain pending. Fees are ~0.006 SOL + 0.35% + Jupiter.',\n inputType: 'select',\n unit: 'lamports',\n presets: [\n { label: '0.5 SOL', value: '500000000' },\n { label: '1 SOL (Default)', value: '1000000000' },\n { label: '2 SOL', value: '2000000000' },\n { label: '5 SOL', value: '5000000000' },\n ],\n warningThreshold: {\n below: 500000000,\n message: 'Very small withdrawals may lose significant value to fees.',\n },\n },\n};\n\n// =============================================================================\n// CATEGORY METADATA\n// =============================================================================\n\nexport interface CategoryMeta {\n label: string;\n description: string;\n icon: string;\n}\n\nexport const CATEGORY_METADATA: Record<string, CategoryMeta> = {\n // Auth providers (sorted alphabetically by subcategory)\n 'auth.apple': {\n label: 'Apple Sign-In',\n description: 'Configure Sign in with Apple OAuth integration.',\n icon: '',\n },\n 'auth.email': {\n label: 'Email Authentication',\n description: 'Configure email/password authentication settings.',\n icon: '',\n },\n 'auth.google': {\n label: 'Google Sign-In',\n description: 'Configure Google OAuth integration.',\n icon: '',\n },\n 'auth.solana': {\n label: 'Solana Wallet Auth',\n description: 'Configure Solana wallet signature authentication.',\n icon: '',\n },\n 'auth.webauthn': {\n label: 'WebAuthn / Passkeys',\n description: 'Configure FIDO2/WebAuthn passwordless authentication.',\n icon: '',\n },\n 'auth.instantlink': {\n label: 'Instant Link',\n description: 'Configure magic link passwordless authentication via email.',\n icon: '',\n },\n 'deposit.general': {\n label: 'General',\n description: 'Core deposit and credit system configuration.',\n icon: '',\n },\n deposit: {\n label: 'Deposit Settings',\n description: 'Configure deposit tokens, fees, and related settings.',\n icon: '',\n },\n email: {\n label: 'Email / SMTP',\n description: 'Configure outbound email delivery for verification, password reset, and notifications.',\n icon: '',\n },\n features: {\n label: 'Feature Flags',\n description: 'Enable or disable major platform features.',\n icon: '',\n },\n privacy: {\n label: 'Privacy Settings',\n description:\n 'Control the privacy period for deposits. Longer periods provide better timing privacy but delay fund availability.',\n icon: '',\n },\n rate_limit: {\n label: 'Rate Limiting',\n description:\n 'Protect the system from abuse by limiting request rates. Balance security with user experience.',\n icon: '',\n },\n security: {\n label: 'Security',\n description: 'Configure CORS, cookies, sessions, and JWT settings.',\n icon: '',\n },\n server: {\n label: 'Server',\n description: 'Server infrastructure settings. Some may be overridden by environment variables.',\n icon: '',\n },\n webhook: {\n label: 'Webhooks',\n description: 'Configure HTTP webhook notifications for auth events.',\n icon: '',\n },\n withdrawal: {\n label: 'Withdrawal Worker',\n description:\n 'Configure how the automated withdrawal processor handles pending withdrawals. These settings affect throughput and privacy.',\n icon: '',\n },\n};\n\n/** Preset tokens that are always available without needing to be redefined */\nexport const PRESET_TOKEN_SYMBOLS = [\n 'SOL',\n 'USDC',\n 'USDT',\n 'EURC',\n 'USD1',\n 'PYUSD',\n 'USDH',\n 'CASH',\n 'BONK',\n 'ORE',\n];\n","/**\n * Settings input components - reusable inputs for system settings\n */\nimport { useState, useCallback, useMemo } from 'react';\nimport type { SystemSetting, SettingMeta } from '../../../types';\nimport { formatDuration, SETTING_METADATA, PRESET_TOKEN_SYMBOLS } from './settingsMetadata';\n\n// =============================================================================\n// SETTINGS SECTION\n// =============================================================================\n\nexport interface SettingsSectionProps {\n settings: SystemSetting[];\n edits: Record<string, string>;\n onChange: (key: string, value: string) => void;\n /** External warnings keyed by setting key */\n externalWarnings?: Record<string, string>;\n}\n\nexport function SettingsSection({\n settings,\n edits,\n onChange,\n externalWarnings,\n}: SettingsSectionProps) {\n return (\n <div className=\"cedros-settings-grid\">\n {settings.map((setting) => (\n <SettingRow\n key={setting.key}\n setting={setting}\n editValue={edits[setting.key]}\n onChange={onChange}\n externalWarning={externalWarnings?.[setting.key]}\n />\n ))}\n </div>\n );\n}\n\n// =============================================================================\n// SETTING ROW\n// =============================================================================\n\ninterface SettingRowProps {\n setting: SystemSetting;\n editValue?: string;\n onChange: (key: string, value: string) => void;\n /** External warning message that overrides threshold-based warnings */\n externalWarning?: string;\n}\n\nexport function SettingRow({ setting, editValue, onChange, externalWarning }: SettingRowProps) {\n const meta = SETTING_METADATA[setting.key];\n const currentValue = editValue ?? setting.value;\n const hasChange = editValue !== undefined && editValue !== setting.value;\n const isBoolean = meta?.inputType === 'boolean';\n\n // Check for warnings (external warnings take precedence)\n const warning = useMemo(() => {\n if (externalWarning) return externalWarning;\n if (!meta?.warningThreshold) return null;\n const numValue = parseInt(currentValue, 10);\n if (isNaN(numValue)) return null;\n const { above, below, message } = meta.warningThreshold;\n if (above !== undefined && numValue > above) return message;\n if (below !== undefined && numValue < below) return message;\n return null;\n }, [currentValue, meta?.warningThreshold, externalWarning]);\n\n if (!meta) {\n // Fallback for unknown settings\n return (\n <div className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''}`}>\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{setting.key}</span>\n {setting.description && (\n <span className=\"cedros-setting-description\">{setting.description}</span>\n )}\n </div>\n <div className=\"cedros-setting-input-wrapper\">\n <input\n type=\"text\"\n value={currentValue}\n onChange={(e) => onChange(setting.key, e.target.value)}\n className=\"cedros-setting-input\"\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`cedros-setting-row ${hasChange ? 'cedros-setting-row-changed' : ''} ${warning ? 'cedros-setting-row-warning' : ''} ${isBoolean ? 'cedros-setting-row-toggle' : ''}`}\n >\n {isBoolean ? (\n <>\n <div className=\"cedros-setting-control cedros-setting-control-toggle\">\n <SettingInput\n meta={meta}\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n />\n {warning && <div className=\"cedros-setting-warning\">{warning}</div>}\n </div>\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{meta.label}</span>\n <span\n className=\"cedros-setting-description\"\n dangerouslySetInnerHTML={{ __html: meta.description }}\n />\n </div>\n </>\n ) : (\n <>\n <div className=\"cedros-setting-label\">\n <span className=\"cedros-setting-name\">{meta.label}</span>\n <span\n className=\"cedros-setting-description\"\n dangerouslySetInnerHTML={{ __html: meta.description }}\n />\n </div>\n\n <div className=\"cedros-setting-control\">\n <SettingInput\n meta={meta}\n value={currentValue}\n onChange={(value) => onChange(setting.key, value)}\n />\n {warning && <div className=\"cedros-setting-warning\">{warning}</div>}\n </div>\n </>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// SETTING INPUT - Renders the appropriate input based on type\n// =============================================================================\n\ninterface SettingInputProps {\n meta: SettingMeta;\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction SettingInput({ meta, value, onChange }: SettingInputProps) {\n switch (meta.inputType) {\n case 'duration':\n return (\n <DurationInput\n value={value}\n onChange={onChange}\n presets={meta.presets}\n min={meta.min}\n />\n );\n case 'percentage':\n return (\n <PercentageInput\n value={value}\n onChange={onChange}\n min={meta.min ?? 1}\n max={meta.max ?? 100}\n step={meta.step ?? 5}\n presets={meta.presets}\n />\n );\n case 'select':\n return (\n <SelectInput\n value={value}\n onChange={onChange}\n presets={meta.presets ?? []}\n unit={meta.unit}\n />\n );\n case 'number':\n return (\n <NumberInput\n value={value}\n onChange={onChange}\n min={meta.min}\n max={meta.max}\n unit={meta.unit}\n />\n );\n case 'tokenList':\n return <TokenListInput value={value} onChange={onChange} />;\n case 'text':\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"cedros-setting-input\"\n placeholder={meta.label}\n />\n );\n case 'boolean':\n return <BooleanInput value={value} onChange={onChange} />;\n case 'secret':\n return <SecretInput value={value} onChange={onChange} multiline={meta.multiline} />;\n case 'tokenSymbolList':\n return <TokenSymbolListInput value={value} onChange={onChange} />;\n default:\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"cedros-setting-input\"\n />\n );\n }\n}\n\n// =============================================================================\n// DURATION INPUT\n// =============================================================================\n\ninterface DurationInputProps {\n value: string;\n onChange: (value: string) => void;\n presets?: { label: string; value: string }[];\n min?: number;\n}\n\nexport function DurationInput({ value, onChange, presets, min = 0 }: DurationInputProps) {\n const numValue = parseInt(value, 10) || 0;\n const displayValue = formatDuration(numValue);\n\n const handlePresetChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value) {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Math.max(min, parseInt(e.target.value, 10) || 0);\n onChange(String(newValue));\n },\n [onChange, min]\n );\n\n return (\n <div className=\"cedros-duration-input\">\n {presets && presets.length > 0 && (\n <select\n value={presets.find((p) => p.value === value)?.value ?? ''}\n onChange={handlePresetChange}\n className=\"cedros-setting-select\"\n >\n <option value=\"\">Custom...</option>\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n </select>\n )}\n <div className=\"cedros-duration-custom\">\n <input\n type=\"number\"\n value={numValue}\n onChange={handleCustomChange}\n min={min}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n <span className=\"cedros-setting-unit\">seconds</span>\n <span className=\"cedros-duration-display\">= {displayValue}</span>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// PERCENTAGE INPUT\n// =============================================================================\n\ninterface PercentageInputProps {\n value: string;\n onChange: (value: string) => void;\n min: number;\n max: number;\n step: number;\n presets?: { label: string; value: string }[];\n}\n\nexport function PercentageInput({ value, onChange, min, max, step, presets }: PercentageInputProps) {\n const numValue = parseInt(value, 10) || min;\n\n const handleSliderChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n const handlePresetClick = useCallback(\n (presetValue: string) => {\n onChange(presetValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-percentage-input\">\n <div className=\"cedros-percentage-slider-row\">\n <input\n type=\"range\"\n value={numValue}\n onChange={handleSliderChange}\n min={min}\n max={max}\n step={step}\n className=\"cedros-percentage-slider\"\n />\n <span className=\"cedros-percentage-value\">{numValue}%</span>\n </div>\n {presets && presets.length > 0 && (\n <div className=\"cedros-preset-buttons\">\n {presets.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n className={`cedros-preset-button ${preset.value === value ? 'cedros-preset-button-active' : ''}`}\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// SELECT INPUT\n// =============================================================================\n\ninterface SelectInputProps {\n value: string;\n onChange: (value: string) => void;\n presets: { label: string; value: string }[];\n unit?: string;\n}\n\nexport function SelectInput({ value, onChange, presets, unit }: SelectInputProps) {\n const isCustomValue = !presets.some((p) => p.value === value);\n\n const handleSelectChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value !== '__custom__') {\n onChange(e.target.value);\n }\n },\n [onChange]\n );\n\n const handleCustomChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-select-input\">\n <select\n value={isCustomValue ? '__custom__' : value}\n onChange={handleSelectChange}\n className=\"cedros-setting-select\"\n >\n {presets.map((preset) => (\n <option key={preset.value} value={preset.value}>\n {preset.label}\n </option>\n ))}\n <option value=\"__custom__\">Custom...</option>\n </select>\n {isCustomValue && (\n <div className=\"cedros-select-custom\">\n <input\n type=\"number\"\n value={value}\n onChange={handleCustomChange}\n className=\"cedros-setting-input cedros-setting-input-sm\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// NUMBER INPUT\n// =============================================================================\n\ninterface NumberInputProps {\n value: string;\n onChange: (value: string) => void;\n min?: number;\n max?: number;\n unit?: string;\n}\n\nexport function NumberInput({ value, onChange, min, max, unit }: NumberInputProps) {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n return (\n <div className=\"cedros-number-input\">\n <input\n type=\"number\"\n value={value}\n onChange={handleChange}\n min={min}\n max={max}\n className=\"cedros-setting-input\"\n />\n {unit && <span className=\"cedros-setting-unit\">{unit}</span>}\n </div>\n );\n}\n\n// =============================================================================\n// BOOLEAN INPUT (Toggle)\n// =============================================================================\n\ninterface BooleanInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function BooleanInput({ value, onChange }: BooleanInputProps) {\n const isEnabled = value === 'true';\n\n const handleToggle = useCallback(() => {\n onChange(isEnabled ? 'false' : 'true');\n }, [isEnabled, onChange]);\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isEnabled}\n className={`cedros-toggle ${isEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{isEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n );\n}\n\n// =============================================================================\n// SECRET INPUT (Masked)\n// =============================================================================\n\ninterface SecretInputProps {\n value: string;\n onChange: (value: string) => void;\n multiline?: boolean;\n}\n\nexport function SecretInput({ value, onChange, multiline }: SecretInputProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [showValue, setShowValue] = useState(false);\n const hasValue = value && value.length > 0;\n\n const handleEdit = useCallback(() => {\n setIsEditing(true);\n setShowValue(true);\n }, []);\n\n const handleDone = useCallback(() => {\n setIsEditing(false);\n setShowValue(false);\n }, []);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n onChange(e.target.value);\n },\n [onChange]\n );\n\n if (!isEditing && hasValue) {\n return (\n <div className=\"cedros-secret-input cedros-secret-input-masked\">\n <span className=\"cedros-secret-masked\">{'•'.repeat(Math.min(value.length, 20))}</span>\n <button type=\"button\" className=\"cedros-secret-edit-btn\" onClick={handleEdit}>\n Edit\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"cedros-secret-input\">\n {multiline ? (\n <textarea\n value={value}\n onChange={handleChange}\n className=\"cedros-setting-input cedros-setting-textarea\"\n placeholder=\"Enter secret value...\"\n rows={4}\n />\n ) : (\n <input\n type={showValue ? 'text' : 'password'}\n value={value}\n onChange={handleChange}\n className=\"cedros-setting-input\"\n placeholder=\"Enter secret value...\"\n />\n )}\n <div className=\"cedros-secret-actions\">\n {!multiline && (\n <button\n type=\"button\"\n className=\"cedros-secret-toggle-btn\"\n onClick={() => setShowValue(!showValue)}\n >\n {showValue ? 'Hide' : 'Show'}\n </button>\n )}\n {isEditing && (\n <button type=\"button\" className=\"cedros-secret-done-btn\" onClick={handleDone}>\n Done\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN LIST INPUT\n// =============================================================================\n\ninterface TokenDefinition {\n symbol: string;\n mint: string;\n decimals: number;\n logoUrl?: string;\n}\n\ninterface TokenListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function TokenListInput({ value, onChange }: TokenListInputProps) {\n const tokens: TokenDefinition[] = useMemo(() => {\n try {\n return JSON.parse(value || '[]');\n } catch {\n return [];\n }\n }, [value]);\n\n const updateTokens = useCallback(\n (updated: TokenDefinition[]) => {\n onChange(JSON.stringify(updated));\n },\n [onChange]\n );\n\n const addToken = useCallback(() => {\n updateTokens([...tokens, { symbol: '', mint: '', decimals: 6 }]);\n }, [tokens, updateTokens]);\n\n const updateToken = useCallback(\n (index: number, field: keyof TokenDefinition, val: string | number | undefined) => {\n const updated = [...tokens];\n updated[index] = { ...updated[index], [field]: val };\n updateTokens(updated);\n },\n [tokens, updateTokens]\n );\n\n const removeToken = useCallback(\n (index: number) => {\n updateTokens(tokens.filter((_, i) => i !== index));\n },\n [tokens, updateTokens]\n );\n\n return (\n <div className=\"cedros-token-list-input\">\n {/* Preset tokens info */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Built-in tokens:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => (\n <span key={symbol} className=\"cedros-token-preset-chip\">\n {symbol}\n </span>\n ))}\n </div>\n </div>\n\n {tokens.length === 0 && (\n <p className=\"cedros-token-list-empty\">\n No custom tokens added. Use the built-in tokens above or add your own.\n </p>\n )}\n\n {tokens.map((token, i) => (\n <div key={i} className=\"cedros-token-row\">\n <div className=\"cedros-token-row-fields\">\n <input\n type=\"text\"\n placeholder=\"Symbol\"\n value={token.symbol}\n onChange={(e) => updateToken(i, 'symbol', e.target.value.toUpperCase())}\n className=\"cedros-setting-input cedros-token-input-symbol\"\n maxLength={10}\n />\n <input\n type=\"text\"\n placeholder=\"Mint address\"\n value={token.mint}\n onChange={(e) => updateToken(i, 'mint', e.target.value)}\n className=\"cedros-setting-input cedros-token-input-mint\"\n />\n <input\n type=\"number\"\n placeholder=\"Decimals\"\n value={token.decimals}\n onChange={(e) => updateToken(i, 'decimals', parseInt(e.target.value, 10) || 0)}\n className=\"cedros-setting-input cedros-token-input-decimals\"\n min={0}\n max={18}\n />\n <input\n type=\"text\"\n placeholder=\"Logo URL (optional)\"\n value={token.logoUrl || ''}\n onChange={(e) => updateToken(i, 'logoUrl', e.target.value || undefined)}\n className=\"cedros-setting-input cedros-token-input-logo\"\n />\n </div>\n <button\n type=\"button\"\n className=\"cedros-token-remove-btn\"\n onClick={() => removeToken(i)}\n title=\"Remove token\"\n >\n ×\n </button>\n </div>\n ))}\n\n <button type=\"button\" className=\"cedros-token-add-btn\" onClick={addToken}>\n + Add Token\n </button>\n </div>\n );\n}\n\n// =============================================================================\n// TOKEN SYMBOL LIST INPUT\n// =============================================================================\n\ninterface TokenSymbolListInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function TokenSymbolListInput({ value, onChange }: TokenSymbolListInputProps) {\n const symbols = useMemo(() => {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }, [value]);\n\n const addSymbol = useCallback(\n (symbol: string) => {\n if (!symbol || symbols.includes(symbol)) return;\n const updated = [...symbols, symbol].join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n const removeSymbol = useCallback(\n (symbol: string) => {\n const updated = symbols.filter((s) => s !== symbol).join(', ');\n onChange(updated);\n },\n [symbols, onChange]\n );\n\n return (\n <div className=\"cedros-token-symbol-list-input\">\n {/* Preset tokens - click to add */}\n <div className=\"cedros-token-presets\">\n <span className=\"cedros-token-presets-label\">Click to add:</span>\n <div className=\"cedros-token-presets-list\">\n {PRESET_TOKEN_SYMBOLS.map((symbol) => {\n const isSelected = symbols.includes(symbol);\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-token-preset-chip ${isSelected ? 'cedros-token-preset-chip-selected' : ''}`}\n onClick={() => (isSelected ? removeSymbol(symbol) : addSymbol(symbol))}\n title={isSelected ? `Remove ${symbol}` : `Add ${symbol}`}\n >\n {symbol}\n {isSelected && <span className=\"cedros-token-chip-check\">✓</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Text input for manual entry or custom symbols */}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"cedros-setting-input\"\n placeholder=\"USDC, SOL, BONK...\"\n />\n </div>\n );\n}\n","/**\n * Autosave status indicator for settings pages\n */\nimport type { AutosaveStatus as Status } from '../../../hooks/useSettingsAutosave';\n\nexport interface AutosaveStatusProps {\n status: Status;\n error?: string | null;\n}\n\nexport function AutosaveStatus({ status, error }: AutosaveStatusProps) {\n if (status === 'idle') return null;\n\n return (\n <div className={`cedros-autosave-status cedros-autosave-status--${status}`}>\n {status === 'pending' && (\n <>\n <span className=\"cedros-autosave-dot\" />\n <span>Unsaved changes</span>\n </>\n )}\n {status === 'saving' && (\n <>\n <span className=\"cedros-autosave-spinner\" />\n <span>Saving...</span>\n </>\n )}\n {status === 'saved' && (\n <>\n <span className=\"cedros-autosave-check\">✓</span>\n <span>Saved</span>\n </>\n )}\n {status === 'error' && (\n <>\n <span className=\"cedros-autosave-error-icon\">!</span>\n <span>{error || 'Save failed'}</span>\n </>\n )}\n </div>\n );\n}\n","/**\n * Shared layout for settings pages with autosave\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\nexport interface SettingsPageLayoutProps {\n /** Page title */\n title: string;\n /** Page description */\n description: string;\n /** Categories to display on this page */\n categories: string[];\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Shared layout component for settings pages.\n * Handles loading and displaying settings for specified categories.\n * Changes are automatically saved after a brief debounce.\n */\nexport function SettingsPageLayout({\n title,\n description,\n categories,\n className = '',\n}: SettingsPageLayoutProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Filter settings to only show relevant categories\n const relevantCategories = categories.filter((cat) => settings[cat]?.length > 0);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">{title}</h2>\n <p className=\"cedros-settings-page-description\">{description}</p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {relevantCategories.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n relevantCategories.map((category) => (\n <SettingsSection\n key={category}\n settings={settings[category]}\n edits={edits}\n onChange={handleChange}\n />\n ))\n )}\n </div>\n );\n}\n","/**\n * Hook for managing SSO providers (admin)\n */\nimport { useState, useCallback, useRef } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\n\nexport interface SsoProvider {\n id: string;\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n scopes: string[];\n enabled: boolean;\n allowRegistration: boolean;\n emailDomain: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateSsoProviderInput {\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\nexport interface UpdateSsoProviderInput {\n name?: string;\n issuerUrl?: string;\n clientId?: string;\n clientSecret?: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\ninterface ListResponse {\n providers: SsoProvider[];\n total: number;\n limit: number;\n offset: number;\n}\n\nexport function useSsoProviders() {\n const { config, _internal } = useCedrosLogin();\n const serverUrl = config.serverUrl;\n\n // PERF-03: Stabilize getAccessToken reference using ref pattern\n // to prevent unnecessary re-creation of callbacks\n const getAccessTokenRef = useRef(_internal?.getAccessToken ?? (() => null));\n getAccessTokenRef.current = _internal?.getAccessToken ?? (() => null);\n\n const [providers, setProviders] = useState<SsoProvider[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Memoize getHeaders with empty deps since it uses ref\n const getHeaders = useCallback(() => {\n const token = getAccessTokenRef.current();\n return {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }, []);\n\n const fetchProviders = useCallback(\n async (orgId?: string, limit = 50, offset = 0) => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (orgId) params.set('org_id', orgId);\n params.set('limit', String(limit));\n params.set('offset', String(offset));\n\n const res = await fetch(`${serverUrl}/admin/sso-providers?${params}`, {\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to fetch SSO providers: ${res.status}`);\n }\n\n const data: ListResponse = await res.json();\n setProviders(data.providers);\n setTotal(data.total);\n return data;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const createProvider = useCallback(\n async (input: CreateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers`, {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to create SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => [...prev, provider]);\n setTotal((prev) => prev + 1);\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const updateProvider = useCallback(\n async (id: string, input: UpdateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'PUT',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to update SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => prev.map((p) => (p.id === id ? provider : p)));\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const deleteProvider = useCallback(\n async (id: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'DELETE',\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to delete SSO provider: ${res.status}`);\n }\n\n setProviders((prev) => prev.filter((p) => p.id !== id));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const toggleProvider = useCallback(\n async (id: string, enabled: boolean): Promise<SsoProvider> => {\n return updateProvider(id, { enabled });\n },\n [updateProvider]\n );\n\n return {\n providers,\n total,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n };\n}\n","import type {\n Organization,\n OrgWithMembership,\n CreateOrgRequest,\n UpdateOrgRequest,\n ListOrgsResponse,\n AuthorizeRequest,\n AuthorizeResponse,\n PermissionsResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for organization operations\n */\nexport class OrgApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all organizations the current user belongs to\n */\n async listOrgs(): Promise<OrgWithMembership[]> {\n try {\n const response = await this.client.get<ListOrgsResponse>('/orgs');\n return response.orgs.map((org) => ({\n ...org,\n membership: {\n orgId: org.id,\n role: org.role,\n },\n }));\n } catch (error) {\n throw handleApiError(error, 'Failed to list organizations');\n }\n }\n\n /**\n * Get a single organization by ID\n */\n async getOrg(orgId: string): Promise<Organization> {\n try {\n return await this.client.get<Organization>(`/orgs/${orgId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to get organization');\n }\n }\n\n /**\n * Create a new organization\n */\n async createOrg(data: CreateOrgRequest): Promise<Organization> {\n try {\n return await this.client.post<Organization>('/orgs', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to create organization');\n }\n }\n\n /**\n * Update an organization\n */\n async updateOrg(orgId: string, data: UpdateOrgRequest): Promise<Organization> {\n try {\n return await this.client.patch<Organization>(`/orgs/${orgId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update organization');\n }\n }\n\n /**\n * Delete an organization\n */\n async deleteOrg(orgId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to delete organization');\n }\n }\n\n /**\n * Check authorization for an action\n */\n async authorize(data: AuthorizeRequest): Promise<AuthorizeResponse> {\n try {\n return await this.client.post<AuthorizeResponse>('/authorize', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to check authorization');\n }\n }\n\n /**\n * Get current user's permissions in an organization\n */\n async getPermissions(orgId: string): Promise<PermissionsResponse> {\n try {\n return await this.client.post<PermissionsResponse>('/permissions', { orgId });\n } catch (error) {\n throw handleApiError(error, 'Failed to get permissions');\n }\n }\n}\n","import { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type {\n OrgWithMembership,\n Organization,\n CreateOrgRequest,\n UpdateOrgRequest,\n Permission,\n OrgRole,\n AuthError,\n} from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { OrgApiClient } from '../utils/orgApi';\n\nexport interface UseOrgsReturn {\n /** All organizations the user belongs to */\n orgs: OrgWithMembership[];\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** User's permissions in the active org */\n permissions: Permission[];\n /** User's role in the active org */\n role: OrgRole | null;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh organizations list */\n fetchOrgs: () => Promise<void>;\n /** Switch to a different organization */\n switchOrg: (orgId: string) => Promise<void>;\n /** Create a new organization */\n createOrg: (data: CreateOrgRequest) => Promise<Organization>;\n /** Update an organization */\n updateOrg: (orgId: string, data: UpdateOrgRequest) => Promise<Organization>;\n /** Delete an organization */\n deleteOrg: (orgId: string) => Promise<void>;\n /** Check if user has a specific permission */\n hasPermission: (permission: Permission) => boolean;\n}\n\nconst ACTIVE_ORG_KEY = 'cedros_active_org';\n\n// P-06: Safe localStorage helpers to handle private browsing and quota errors\nfunction safeGetItem(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSetItem(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Ignore - private browsing or quota exceeded\n }\n}\n\n/**\n * Hook for managing organizations, memberships, and permissions.\n *\n * @example\n * ```tsx\n * function OrgSelector() {\n * const { orgs, activeOrg, switchOrg, hasPermission } = useOrgs();\n *\n * return (\n * <select\n * value={activeOrg?.id}\n * onChange={(e) => switchOrg(e.target.value)}\n * >\n * {orgs.map(org => (\n * <option key={org.id} value={org.id}>{org.name}</option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\nexport function useOrgs(): UseOrgsReturn {\n const { config, user, authState, _internal } = useCedrosLogin();\n const hasStorage = typeof window !== 'undefined' && !!window.localStorage;\n\n const [orgs, setOrgs] = useState<OrgWithMembership[]>([]);\n const [activeOrg, setActiveOrg] = useState<OrgWithMembership | null>(null);\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [role, setRole] = useState<OrgRole | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n // M-03: Memoize API client and use ref to prevent callback dependency cascades\n const apiClient = useMemo(\n () =>\n new OrgApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // M-03: Store apiClient in ref to stabilize callback dependencies\n const apiClientRef = useRef(apiClient);\n useEffect(() => {\n apiClientRef.current = apiClient;\n }, [apiClient]);\n\n // M-03: Use ref in callback to break dependency chain\n const loadPermissions = useCallback(async (orgId: string) => {\n try {\n const response = await apiClientRef.current.getPermissions(orgId);\n setPermissions(response.permissions);\n setRole(response.role);\n } catch {\n // Permissions loading failure is non-fatal, just clear them\n setPermissions([]);\n setRole(null);\n }\n }, []);\n\n // M-03: Use ref to break apiClient dependency chain\n const fetchOrgs = useCallback(async () => {\n if (authState !== 'authenticated' || !user) {\n setOrgs([]);\n setActiveOrg(null);\n setPermissions([]);\n setRole(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const fetchedOrgs = await apiClientRef.current.listOrgs();\n setOrgs(fetchedOrgs);\n\n // P-06: Restore active org from localStorage with safe access\n const savedOrgId = hasStorage ? safeGetItem(ACTIVE_ORG_KEY) : null;\n let selectedOrg = fetchedOrgs.find((org) => org.id === savedOrgId);\n\n if (!selectedOrg && fetchedOrgs.length > 0) {\n // Default to personal org or first org\n selectedOrg = fetchedOrgs.find((org) => org.isPersonal) || fetchedOrgs[0];\n }\n\n if (selectedOrg) {\n setActiveOrg(selectedOrg);\n if (hasStorage) {\n safeSetItem(ACTIVE_ORG_KEY, selectedOrg.id);\n }\n await loadPermissions(selectedOrg.id);\n } else {\n setActiveOrg(null);\n setPermissions([]);\n setRole(null);\n }\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [authState, user, loadPermissions, hasStorage]);\n\n const switchOrg = useCallback(\n async (orgId: string) => {\n const org = orgs.find((o) => o.id === orgId);\n if (!org) {\n setError({ code: 'UNKNOWN_ERROR', message: 'Organization not found' });\n return;\n }\n\n setActiveOrg(org);\n if (hasStorage) {\n safeSetItem(ACTIVE_ORG_KEY, orgId);\n }\n await loadPermissions(orgId);\n },\n [orgs, loadPermissions, hasStorage]\n );\n\n // M-03: Use ref to break apiClient dependency chain\n const createOrg = useCallback(\n async (data: CreateOrgRequest): Promise<Organization> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newOrg = await apiClientRef.current.createOrg(data);\n // Refresh orgs list to include the new org with membership\n await fetchOrgs();\n return newOrg;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const updateOrg = useCallback(\n async (orgId: string, data: UpdateOrgRequest): Promise<Organization> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const updatedOrg = await apiClientRef.current.updateOrg(orgId, data);\n // Refresh orgs list to reflect changes\n await fetchOrgs();\n return updatedOrg;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const deleteOrg = useCallback(\n async (orgId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.deleteOrg(orgId);\n // Refresh orgs list\n await fetchOrgs();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [fetchOrgs]\n );\n\n const hasPermission = useCallback(\n (permission: Permission): boolean => {\n return permissions.includes(permission);\n },\n [permissions]\n );\n\n return {\n orgs,\n activeOrg,\n permissions,\n role,\n isLoading,\n error,\n fetchOrgs,\n switchOrg,\n createOrg,\n updateOrg,\n deleteOrg,\n hasPermission,\n };\n}\n","/**\n * SSO Providers settings - manage OIDC identity providers\n */\nimport { useState, useEffect, useCallback } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport {\n useSsoProviders,\n type SsoProvider,\n type CreateSsoProviderInput,\n type UpdateSsoProviderInput,\n} from '../../../hooks/useSsoProviders';\nimport { useOrgs } from '../../../hooks/useOrgs';\n\nexport interface SsoProvidersSettingsProps {\n className?: string;\n}\n\ntype ViewMode = 'list' | 'add' | 'edit';\n\nexport function SsoProvidersSettings({ className }: SsoProvidersSettingsProps) {\n const {\n providers,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n } = useSsoProviders();\n\n const { activeOrg } = useOrgs();\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [editingProvider, setEditingProvider] = useState<SsoProvider | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n useEffect(() => {\n fetchProviders(activeOrg?.id);\n }, [fetchProviders, activeOrg?.id]);\n\n const handleAdd = () => {\n setEditingProvider(null);\n setFormError(null);\n setViewMode('add');\n };\n\n const handleEdit = (provider: SsoProvider) => {\n setEditingProvider(provider);\n setFormError(null);\n setViewMode('edit');\n };\n\n const handleCancel = () => {\n setViewMode('list');\n setEditingProvider(null);\n setFormError(null);\n };\n\n const handleDelete = async (provider: SsoProvider) => {\n if (!confirm(`Delete SSO provider \"${provider.name}\"? This cannot be undone.`)) {\n return;\n }\n try {\n await deleteProvider(provider.id);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleToggle = async (provider: SsoProvider) => {\n try {\n await toggleProvider(provider.id, !provider.enabled);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleSave = async (data: CreateSsoProviderInput | UpdateSsoProviderInput) => {\n setFormError(null);\n try {\n if (viewMode === 'add') {\n await createProvider(data as CreateSsoProviderInput);\n } else if (editingProvider) {\n await updateProvider(editingProvider.id, data as UpdateSsoProviderInput);\n }\n setViewMode('list');\n setEditingProvider(null);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to save provider');\n }\n };\n\n if (isLoading && providers.length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading SSO providers...</span>\n </div>\n );\n }\n\n if (viewMode === 'add' || viewMode === 'edit') {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <SsoProviderForm\n provider={editingProvider}\n orgId={activeOrg?.id}\n error={formError}\n isLoading={isLoading}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">SSO Providers</h2>\n <p className=\"cedros-settings-page-description\">\n Configure OIDC identity providers for enterprise single sign-on.\n </p>\n </div>\n <button type=\"button\" className=\"cedros-btn cedros-btn-primary\" onClick={handleAdd}>\n Add Provider\n </button>\n </div>\n\n {error && <ErrorMessage error={error.message} />}\n\n {providers.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No SSO providers configured.</p>\n <p className=\"cedros-text-muted\">\n Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO.\n </p>\n </div>\n ) : (\n <div className=\"cedros-sso-provider-list\">\n {providers.map((provider) => (\n <SsoProviderCard\n key={provider.id}\n provider={provider}\n onEdit={() => handleEdit(provider)}\n onDelete={() => handleDelete(provider)}\n onToggle={() => handleToggle(provider)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Provider Card\n// =============================================================================\n\ninterface SsoProviderCardProps {\n provider: SsoProvider;\n onEdit: () => void;\n onDelete: () => void;\n onToggle: () => void;\n}\n\nfunction SsoProviderCard({ provider, onEdit, onDelete, onToggle }: SsoProviderCardProps) {\n return (\n <div className={`cedros-sso-provider-card ${provider.enabled ? '' : 'cedros-sso-provider-card--disabled'}`}>\n <div className=\"cedros-sso-provider-card-header\">\n <div className=\"cedros-sso-provider-card-info\">\n <h3 className=\"cedros-sso-provider-card-name\">{provider.name}</h3>\n <p className=\"cedros-sso-provider-card-issuer\">{provider.issuerUrl}</p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={provider.enabled}\n className={`cedros-toggle ${provider.enabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={onToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{provider.enabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n </div>\n\n <div className=\"cedros-sso-provider-card-details\">\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Client ID</span>\n <code className=\"cedros-sso-provider-card-detail-value\">{provider.clientId}</code>\n </div>\n {provider.emailDomain && (\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Email Domain</span>\n <span className=\"cedros-sso-provider-card-detail-value\">@{provider.emailDomain}</span>\n </div>\n )}\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Registration</span>\n <span className=\"cedros-sso-provider-card-detail-value\">\n {provider.allowRegistration ? 'Allowed' : 'Existing users only'}\n </span>\n </div>\n </div>\n\n <div className=\"cedros-sso-provider-card-actions\">\n <button type=\"button\" className=\"cedros-btn cedros-btn-ghost\" onClick={onEdit}>\n Edit\n </button>\n <button type=\"button\" className=\"cedros-btn cedros-btn-ghost cedros-btn-danger\" onClick={onDelete}>\n Delete\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Provider Form\n// =============================================================================\n\ninterface SsoProviderFormProps {\n provider: SsoProvider | null;\n orgId?: string;\n error: string | null;\n isLoading: boolean;\n onSave: (data: CreateSsoProviderInput | UpdateSsoProviderInput) => void;\n onCancel: () => void;\n}\n\nfunction SsoProviderForm({ provider, orgId, error, isLoading, onSave, onCancel }: SsoProviderFormProps) {\n const isEditing = Boolean(provider);\n\n const [name, setName] = useState(provider?.name ?? '');\n const [issuerUrl, setIssuerUrl] = useState(provider?.issuerUrl ?? '');\n const [clientId, setClientId] = useState(provider?.clientId ?? '');\n const [clientSecret, setClientSecret] = useState('');\n const [emailDomain, setEmailDomain] = useState(provider?.emailDomain ?? '');\n const [allowRegistration, setAllowRegistration] = useState(provider?.allowRegistration ?? true);\n const [enabled, setEnabled] = useState(provider?.enabled ?? true);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n if (isEditing) {\n const updates: UpdateSsoProviderInput = {\n name,\n issuerUrl,\n clientId,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n // Only include secret if changed\n if (clientSecret) {\n updates.clientSecret = clientSecret;\n }\n onSave(updates);\n } else {\n if (!orgId) {\n return;\n }\n const data: CreateSsoProviderInput = {\n orgId,\n name,\n issuerUrl,\n clientId,\n clientSecret,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n onSave(data);\n }\n },\n [isEditing, orgId, name, issuerUrl, clientId, clientSecret, emailDomain, allowRegistration, enabled, onSave]\n );\n\n return (\n <form className=\"cedros-sso-provider-form\" onSubmit={handleSubmit}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">\n {isEditing ? 'Edit SSO Provider' : 'Add SSO Provider'}\n </h2>\n <p className=\"cedros-settings-page-description\">\n Configure an OIDC identity provider for enterprise single sign-on.\n </p>\n </div>\n </div>\n\n {error && <ErrorMessage error={error} />}\n\n <div className=\"cedros-form-section\">\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-name\">\n Provider Name\n </label>\n <input\n id=\"sso-name\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g., Okta, Azure AD\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-issuer\">\n Issuer URL\n </label>\n <input\n id=\"sso-issuer\"\n type=\"url\"\n className=\"cedros-form-input\"\n value={issuerUrl}\n onChange={(e) => setIssuerUrl(e.target.value)}\n placeholder=\"https://your-org.okta.com\"\n required\n />\n <p className=\"cedros-form-hint\">\n The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration\n </p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-id\">\n Client ID\n </label>\n <input\n id=\"sso-client-id\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n placeholder=\"OAuth client ID\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-secret\">\n Client Secret {isEditing && <span className=\"cedros-form-hint-inline\">(leave blank to keep current)</span>}\n </label>\n <input\n id=\"sso-client-secret\"\n type=\"password\"\n className=\"cedros-form-input\"\n value={clientSecret}\n onChange={(e) => setClientSecret(e.target.value)}\n placeholder={isEditing ? '••••••••' : 'OAuth client secret'}\n required={!isEditing}\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-email-domain\">\n Email Domain (optional)\n </label>\n <input\n id=\"sso-email-domain\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={emailDomain}\n onChange={(e) => setEmailDomain(e.target.value)}\n placeholder=\"company.com\"\n />\n <p className=\"cedros-form-hint\">\n Restrict to users with emails from this domain\n </p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={allowRegistration}\n onChange={(e) => setAllowRegistration(e.target.checked)}\n />\n <span>Allow new user registration via SSO</span>\n </label>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n <span>Enable this provider</span>\n </label>\n </div>\n </div>\n\n <div className=\"cedros-form-actions\">\n <button type=\"button\" className=\"cedros-btn cedros-btn-ghost\" onClick={onCancel} disabled={isLoading}>\n Cancel\n </button>\n <button type=\"submit\" className=\"cedros-btn cedros-btn-primary\" disabled={isLoading}>\n {isLoading ? 'Saving...' : isEditing ? 'Save Changes' : 'Add Provider'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Authentication settings page - configure auth providers with tabs\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\nimport { SsoProvidersSettings } from './SsoProvidersSettings';\n\ntype AuthTab = 'email' | 'google' | 'apple' | 'solana' | 'passkeys' | 'instantlink' | 'sso';\n\ninterface TabConfig {\n id: AuthTab;\n label: string;\n /** Categories to pull settings from (not used for 'sso' tab) */\n categories: string[];\n /** Optional list of specific keys to show (if omitted, show all in categories) */\n keys?: string[];\n /** If true, renders a custom component instead of settings section */\n isCustom?: boolean;\n}\n\nconst TABS: TabConfig[] = [\n { id: 'email', label: 'Email', categories: ['auth.email'] },\n { id: 'google', label: 'Google', categories: ['auth.google'] },\n { id: 'apple', label: 'Apple', categories: ['auth.apple'] },\n { id: 'solana', label: 'Solana', categories: ['auth.solana'] },\n { id: 'passkeys', label: 'Passkeys', categories: ['auth.webauthn'] },\n { id: 'instantlink', label: 'Instant Link', categories: ['auth.instantlink'] },\n { id: 'sso', label: 'SSO Providers', categories: [], isCustom: true },\n];\n\nexport interface AuthenticationSettingsProps {\n className?: string;\n}\n\nexport function AuthenticationSettings({ className }: AuthenticationSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<AuthTab>('email');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: typeof settings[string] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n const currentSettings = useMemo(() => {\n if (!currentTab?.keys) return allTabSettings;\n // Filter and sort by keys order\n return allTabSettings\n .filter((s) => currentTab.keys!.includes(s.key))\n .sort((a, b) => currentTab.keys!.indexOf(a.key) - currentTab.keys!.indexOf(b.key));\n }, [allTabSettings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Authentication</h2>\n <p className=\"cedros-settings-page-description\">\n Configure authentication providers and methods for user sign-in.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentTab?.isCustom ? (\n <SsoProvidersSettings />\n ) : currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this provider'}.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * Embedded Wallet settings page - enable/disable and configure recovery\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\n/** Keys to show on this page (excluding the master toggle which is in header) */\nconst SETTINGS_KEYS = ['wallet_recovery_mode'];\n\nexport interface EmbeddedWalletSettingsProps {\n className?: string;\n}\n\nexport function EmbeddedWalletSettings({ className }: EmbeddedWalletSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get wallet settings from features category\n const featuresSettings = settings['features'] ?? [];\n const currentSettings = featuresSettings\n .filter((s) => SETTINGS_KEYS.includes(s.key))\n .sort((a, b) => SETTINGS_KEYS.indexOf(a.key) - SETTINGS_KEYS.indexOf(b.key));\n\n // Embedded wallet master toggle\n const walletEnabled = getEffectiveValue('feature_wallet_signing') === 'true';\n const handleWalletToggle = () => {\n handleChange('feature_wallet_signing', walletEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Embedded Wallet</h2>\n <p className=\"cedros-settings-page-description\">\n Configure the embedded wallet for transaction signing.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={walletEnabled}\n className={`cedros-toggle ${walletEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleWalletToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{walletEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Settings content */}\n <div className=\"cedros-admin-tab-content\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No additional settings available.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * Security settings page - CORS, cookies, sessions, rate limiting\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['security', 'rate_limit'];\n\nexport interface SecuritySettingsProps {\n className?: string;\n}\n\nexport function SecuritySettings({ className }: SecuritySettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Security\"\n description=\"Configure CORS, cookies, sessions, JWT, and rate limiting settings.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n","/**\n * Email settings page - SMTP configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['email'];\n\nexport interface EmailSettingsProps {\n className?: string;\n}\n\nexport function EmailSettings({ className }: EmailSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Email & SMTP\"\n description=\"Configure outbound email delivery for verification, password reset, and notifications.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n","/**\n * Webhook settings page - HTTP webhook configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['webhook'];\n\nexport interface WebhookSettingsProps {\n className?: string;\n}\n\nexport function WebhookSettings({ className }: WebhookSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Webhooks\"\n description=\"Configure HTTP webhook notifications for authentication events.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n","/**\n * Messaging settings page - Email/SMTP and Webhooks with tabs\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype MessagingTab = 'email' | 'webhooks';\n\ninterface TabConfig {\n id: MessagingTab;\n label: string;\n category: string;\n}\n\nconst TABS: TabConfig[] = [\n { id: 'email', label: 'Email', category: 'email' },\n { id: 'webhooks', label: 'Webhooks', category: 'webhook' },\n];\n\n/** SMTP hosts for each provider */\nconst PROVIDER_SMTP_HOSTS: Record<string, string> = {\n mailgun: 'smtp.mailgun.org',\n sendgrid: 'smtp.sendgrid.net',\n postmark: 'smtp.postmarkapp.com',\n ses: 'email-smtp.us-east-1.amazonaws.com',\n resend: 'smtp.resend.com',\n};\n\n/** Fields to show for simplified provider mode (non-custom) */\nconst SIMPLIFIED_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_password', // API key\n 'email_from_address',\n 'email_from_name',\n];\n\n/** All email fields for custom SMTP mode */\nconst ALL_EMAIL_FIELDS = [\n 'email_provider',\n 'email_smtp_host',\n 'email_smtp_port',\n 'email_smtp_user',\n 'email_smtp_password',\n 'email_smtp_tls',\n 'email_from_address',\n 'email_from_name',\n];\n\nexport interface MessagingSettingsProps {\n className?: string;\n}\n\nexport function MessagingSettings({ className }: MessagingSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<MessagingTab>('email');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab's category\n const currentTab = TABS.find((t) => t.id === activeTab);\n const currentCategory = currentTab?.category ?? '';\n\n // Get current email provider\n const emailProvider = getEffectiveValue('email_provider') || 'custom';\n const isCustomProvider = emailProvider === 'custom';\n\n // PERF-02: Compute categorySettings inside useMemo with stable dependencies\n // to prevent re-computation on every render\n const currentSettings = useMemo(() => {\n const categorySettings = settings[currentCategory] ?? [];\n if (activeTab !== 'email') return categorySettings;\n\n const fieldsToShow = isCustomProvider ? ALL_EMAIL_FIELDS : SIMPLIFIED_EMAIL_FIELDS;\n return categorySettings\n .filter((s) => fieldsToShow.includes(s.key))\n .sort((a, b) => fieldsToShow.indexOf(a.key) - fieldsToShow.indexOf(b.key));\n }, [settings, currentCategory, activeTab, isCustomProvider]);\n\n // Auto-set SMTP host when provider changes (for non-custom providers)\n const handleProviderAwareChange = (key: string, value: string) => {\n handleChange(key, value);\n\n // When provider changes, auto-fill the SMTP host\n if (key === 'email_provider' && value !== 'custom') {\n const smtpHost = PROVIDER_SMTP_HOSTS[value];\n if (smtpHost) {\n handleChange('email_smtp_host', smtpHost);\n // Also set default port and TLS for convenience\n handleChange('email_smtp_port', '587');\n handleChange('email_smtp_tls', 'true');\n }\n }\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Messages</h2>\n <p className=\"cedros-settings-page-description\">\n Configure email delivery and webhook notifications.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={activeTab === 'email' ? handleProviderAwareChange : handleChange}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * Credit System settings page - deposits, withdrawals, privacy period (with tabs)\n */\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { SystemSetting } from '../../../types';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype CreditTab = 'deposits' | 'tokens' | 'fees' | 'privacy' | 'treasury';\n\ninterface TabSection {\n title: string;\n description?: string;\n keys: string[];\n}\n\ninterface TabConfig {\n id: CreditTab;\n label: string;\n /** Categories to pull settings from */\n categories: string[];\n /** Specific keys to include (if empty, include all from categories) */\n includeKeys?: string[];\n /** Specific keys to exclude */\n excludeKeys?: string[];\n /** Additional sections rendered below the main settings */\n sections?: TabSection[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'deposits',\n label: 'Deposits',\n categories: ['deposit.general'],\n includeKeys: [\n 'deposit_company_token',\n 'deposit_max_usd',\n 'deposit_min_usd',\n 'deposit_micro_enabled',\n 'deposit_gasless_swap_enabled',\n 'solana_rpc_url',\n 'jupiter_api_key',\n ],\n },\n {\n id: 'tokens',\n label: 'Component',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_show_explainer',\n 'deposit_quick_action_tokens',\n 'deposit_custom_tokens',\n 'deposit_custom_tokens_json',\n ],\n },\n {\n id: 'fees',\n label: 'Fees',\n categories: ['deposit'],\n includeKeys: [\n 'deposit_fee_policy',\n 'privacy_fee_fixed_lamports',\n 'privacy_fee_percent_bps',\n 'swap_fee_fixed_lamports',\n 'swap_fee_percent_bps',\n 'company_fee_fixed_lamports',\n 'company_fee_percent_bps',\n 'private_deposit_min_lamports',\n ],\n },\n {\n id: 'privacy',\n label: 'Privacy',\n categories: ['deposit.general', 'privacy', 'withdrawal'],\n includeKeys: [\n // Enable toggle\n 'deposit_privacy_enabled',\n // Privacy period setting\n 'privacy_period_secs',\n // Withdrawal settings (from privacy pool)\n 'withdrawal_percentage',\n 'withdrawal_min_lamports',\n // Partial withdrawal settings (related to privacy mixing)\n 'partial_withdrawal_count',\n 'partial_withdrawal_min_lamports',\n ],\n sections: [\n {\n title: 'Privacy Pool Worker',\n description: 'Background worker for processing withdrawals from the privacy cash pool.',\n keys: [\n 'withdrawal_poll_interval_secs',\n 'withdrawal_batch_size',\n ],\n },\n ],\n },\n {\n id: 'treasury',\n label: 'Treasury',\n categories: ['withdrawal', 'deposit'],\n includeKeys: [\n // Treasury wallet (separate section)\n 'treasury_wallet_address',\n ],\n sections: [\n {\n title: 'Micropayment Batch Worker',\n description: 'Background worker for batching small SOL deposits together.',\n keys: [\n 'micro_batch_threshold_usd',\n 'micro_batch_poll_secs',\n ],\n },\n ],\n },\n];\n\nexport interface CreditSystemSettingsProps {\n className?: string;\n}\n\nexport function CreditSystemSettings({ className }: CreditSystemSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<CreditTab>('deposits');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config and filter settings\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect all settings from the tab's categories\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: SystemSetting[] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n // Get fee policy for conditional visibility\n const feePolicy = getEffectiveValue('deposit_fee_policy') || 'company_pays_all';\n\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n\n // Apply include/exclude filters\n let filtered = allTabSettings;\n\n if (currentTab.includeKeys && currentTab.includeKeys.length > 0) {\n // Only include specific keys\n filtered = filtered.filter((s) => currentTab.includeKeys!.includes(s.key));\n // Sort by includeKeys order\n filtered.sort(\n (a, b) => currentTab.includeKeys!.indexOf(a.key) - currentTab.includeKeys!.indexOf(b.key)\n );\n } else if (currentTab.excludeKeys && currentTab.excludeKeys.length > 0) {\n // Exclude specific keys\n filtered = filtered.filter((s) => !currentTab.excludeKeys!.includes(s.key));\n }\n\n // Deposits tab: hide SOL micro payments if minimum > $10\n if (currentTab.id === 'deposits') {\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n if (minUsd > 10) {\n filtered = filtered.filter((s) => s.key !== 'deposit_micro_enabled');\n }\n }\n\n // Fees tab: conditionally show fee settings based on policy\n if (currentTab.id === 'fees') {\n const privacyFeeKeys = ['privacy_fee_fixed_lamports', 'privacy_fee_percent_bps', 'private_deposit_min_lamports'];\n const swapFeeKeys = ['swap_fee_fixed_lamports', 'swap_fee_percent_bps'];\n const companyFeeKeys = ['company_fee_fixed_lamports', 'company_fee_percent_bps'];\n\n filtered = filtered.filter((s) => {\n // Always show fee policy selector\n if (s.key === 'deposit_fee_policy') return true;\n\n // Hide all fees if company pays all\n if (feePolicy === 'company_pays_all') return false;\n\n // Show privacy fees for user_pays_privacy or user_pays_all\n if (privacyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_privacy' || feePolicy === 'user_pays_all';\n }\n\n // Show swap fees for user_pays_swap or user_pays_all\n if (swapFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_swap' || feePolicy === 'user_pays_all';\n }\n\n // Show company fees only for user_pays_all\n if (companyFeeKeys.includes(s.key)) {\n return feePolicy === 'user_pays_all';\n }\n\n return true;\n });\n }\n\n return filtered;\n }, [allTabSettings, currentTab, getEffectiveValue, feePolicy]);\n\n // Helper to get settings for a section\n const getSectionSettings = useCallback(\n (keys: string[]) => {\n return allTabSettings\n .filter((s) => keys.includes(s.key))\n .sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));\n },\n [allTabSettings]\n );\n\n // Compute external warnings for the deposits tab\n const externalWarnings = useMemo(() => {\n if (currentTab?.id !== 'deposits') return undefined;\n\n const warnings: Record<string, string> = {};\n const minUsd = parseFloat(getEffectiveValue('deposit_min_usd')) || 0;\n const microEnabled = getEffectiveValue('deposit_micro_enabled');\n const isMicroDisabled = microEnabled === 'false' || microEnabled === '0' || microEnabled === '';\n\n // Warn if micro payments disabled but minimum < $10\n if (isMicroDisabled && minUsd < 10) {\n warnings['deposit_min_usd'] =\n 'SOL micro payments must be enabled for minimum deposits under $10.';\n }\n\n return Object.keys(warnings).length > 0 ? warnings : undefined;\n }, [currentTab?.id, getEffectiveValue]);\n\n // Credit system master toggle\n const creditsEnabled = getEffectiveValue('feature_credits') === 'true';\n const handleCreditsToggle = () => {\n handleChange('feature_credits', creditsEnabled ? 'false' : 'true');\n };\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Credit System</h2>\n <p className=\"cedros-settings-page-description\">\n Configure credit deposits, timed withdrawals, and privacy period settings.\n </p>\n </div>\n <div className=\"cedros-settings-page-header-actions\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={creditsEnabled}\n className={`cedros-toggle ${creditsEnabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={handleCreditsToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{creditsEnabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 && !currentTab?.sections?.length ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <>\n {currentSettings.length > 0 && (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n externalWarnings={externalWarnings}\n />\n )}\n {/* Render additional sections */}\n {currentTab?.sections?.map((section) => {\n const sectionSettings = getSectionSettings(section.keys);\n if (sectionSettings.length === 0) return null;\n return (\n <div key={section.title} className=\"cedros-settings-subsection\">\n <div className=\"cedros-settings-subsection-header\">\n <h4 className=\"cedros-settings-subsection-title\">{section.title}</h4>\n {section.description && (\n <p className=\"cedros-settings-subsection-description\">\n {section.description}\n </p>\n )}\n </div>\n <SettingsSection\n settings={sectionSettings}\n edits={edits}\n onChange={handleChange}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Keep old export name for backwards compatibility\nexport { CreditSystemSettings as PrivacyCashSettings };\nexport type { CreditSystemSettingsProps as PrivacyCashSettingsProps };\n","/**\n * Server settings page - infrastructure configuration with tabs\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype ServerTab = 'general' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'general',\n label: 'Integrations',\n keys: [\n 'server_cedros_pay_api_key',\n ],\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: [\n 'feature_mfa',\n 'security_cors_origins',\n 'security_session_timeout',\n ],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<ServerTab>('general');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: typeof settings[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection\n settings={currentSettings}\n edits={edits}\n onChange={handleChange}\n />\n )}\n </div>\n </div>\n );\n}\n","import type {\n Member,\n MemberApiResponse,\n UpdateMemberRoleRequest,\n ListMembersResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for member operations within an organization\n */\nexport class MemberApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all members of an organization\n */\n async listMembers(\n orgId: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ members: Member[]; total: number }> {\n try {\n const response = await this.client.get<ListMembersResponse>(\n `/orgs/${orgId}/members?limit=${limit}&offset=${offset}`\n );\n return {\n members: response.members.map((member: MemberApiResponse) => ({\n id: member.id,\n userId: member.userId,\n orgId,\n role: member.role,\n joinedAt: member.joinedAt,\n user: {\n id: member.userId,\n email: member.email,\n name: member.name,\n },\n })),\n total: response.total,\n };\n } catch (error) {\n throw handleApiError(error, 'Failed to list members');\n }\n }\n\n /**\n * Update a member's role\n */\n async updateMemberRole(\n orgId: string,\n userId: string,\n data: UpdateMemberRoleRequest\n ): Promise<Member> {\n try {\n return await this.client.patch<Member>(`/orgs/${orgId}/members/${userId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update member role');\n }\n }\n\n /**\n * Remove a member from the organization\n */\n async removeMember(orgId: string, userId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}/members/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to remove member');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport type { Member, OrgRole, AuthError } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { MemberApiClient } from '../utils/memberApi';\n\nexport interface UseMembersReturn {\n /** List of members */\n members: Member[];\n /** Total members available on the server */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh members list */\n fetchMembers: (options?: { limit?: number; offset?: number }) => Promise<void>;\n /** Update a member's role */\n updateMemberRole: (userId: string, role: OrgRole) => Promise<void>;\n /** Remove a member */\n removeMember: (userId: string) => Promise<void>;\n}\n\n/**\n * Hook for managing organization members.\n *\n * @param orgId - The organization ID to manage members for\n *\n * @example\n * ```tsx\n * function MembersList() {\n * const { activeOrg } = useOrgs();\n * const { members, isLoading, updateMemberRole, removeMember } = useMembers(activeOrg?.id);\n *\n * if (!activeOrg) return null;\n *\n * return (\n * <ul>\n * {members.map(member => (\n * <li key={member.id}>\n * {member.user.name} - {member.role}\n * <button onClick={() => updateMemberRole(member.userId, 'admin')}>\n * Make Admin\n * </button>\n * <button onClick={() => removeMember(member.userId)}>\n * Remove\n * </button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useMembers(orgId: string | undefined): UseMembersReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [members, setMembers] = useState<Member[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n // P-12: Track fetched orgId to prevent duplicate fetches on remount\n const fetchedOrgIdRef = useRef<string | undefined>(undefined);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new MemberApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // C-02: Use ref to avoid apiClient in callback dependencies\n // Prevents infinite loop when apiClient identity changes\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchMembers = useCallback(\n async (options?: { limit?: number; offset?: number }) => {\n if (!orgId || authState !== 'authenticated') {\n setMembers([]);\n setTotal(0);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const { limit = 50, offset = 0 } = options ?? {};\n const response = await apiClientRef.current.listMembers(orgId, limit, offset);\n if (requestId !== requestIdRef.current) return;\n setMembers(response.members);\n setTotal(response.total);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err as AuthError);\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n },\n [orgId, authState]\n );\n\n // P-12: Auto-fetch when orgId changes, but not on every remount\n useEffect(() => {\n if (authState !== 'authenticated') {\n fetchedOrgIdRef.current = undefined;\n return;\n }\n\n if (orgId !== fetchedOrgIdRef.current) {\n fetchedOrgIdRef.current = orgId;\n fetchMembers();\n }\n }, [orgId, authState, fetchMembers]);\n\n const updateMemberRole = useCallback(\n async (userId: string, role: OrgRole): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.updateMemberRole(orgId, userId, { role });\n // Refresh members list\n await fetchMembers();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchMembers]\n );\n\n const removeMember = useCallback(\n async (userId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.removeMember(orgId, userId);\n // Refresh members list\n await fetchMembers();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchMembers]\n );\n\n return {\n members,\n total,\n isLoading,\n error,\n fetchMembers,\n updateMemberRole,\n removeMember,\n };\n}\n","import type {\n Invite,\n InviteApiResponse,\n CreateInviteRequest,\n AcceptInviteRequest,\n ListInvitesResponse,\n CreateInviteResponse,\n AcceptInviteResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for invite operations\n */\nexport class InviteApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all pending invites for an organization\n */\n async listInvites(\n orgId: string,\n limit: number = 50,\n offset: number = 0\n ): Promise<{ invites: Invite[]; total: number }> {\n try {\n const response = await this.client.get<ListInvitesResponse>(\n `/orgs/${orgId}/invites?limit=${limit}&offset=${offset}`\n );\n return {\n invites: response.invites.map((invite: InviteApiResponse) => ({\n id: invite.id,\n orgId: invite.orgId,\n email: invite.email,\n role: invite.role,\n invitedBy: invite.invitedBy,\n createdAt: invite.createdAt,\n expiresAt: invite.expiresAt,\n })),\n total: response.total,\n };\n } catch (error) {\n throw handleApiError(error, 'Failed to list invites');\n }\n }\n\n /**\n * Create a new invite\n */\n async createInvite(orgId: string, data: CreateInviteRequest): Promise<CreateInviteResponse> {\n try {\n return await this.client.post<CreateInviteResponse>(`/orgs/${orgId}/invites`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to create invite');\n }\n }\n\n /**\n * Cancel a pending invite\n */\n async cancelInvite(orgId: string, inviteId: string): Promise<void> {\n try {\n await this.client.delete<void>(`/orgs/${orgId}/invites/${inviteId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to cancel invite');\n }\n }\n\n /**\n * Resend an invite email\n */\n async resendInvite(orgId: string, inviteId: string): Promise<void> {\n try {\n await this.client.post<void>(`/orgs/${orgId}/invites/${inviteId}/resend`, {});\n } catch (error) {\n throw handleApiError(error, 'Failed to resend invite');\n }\n }\n\n /**\n * Accept an invite (public endpoint)\n */\n async acceptInvite(data: AcceptInviteRequest): Promise<AcceptInviteResponse> {\n try {\n return await this.client.post<AcceptInviteResponse>('/invites/accept', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to accept invite');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport type { Invite, OrgRole, AuthError, AcceptInviteResponse } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { InviteApiClient } from '../utils/inviteApi';\n\nexport interface UseInvitesReturn {\n /** List of pending invites */\n invites: Invite[];\n /** Total pending invites available on the server */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh invites list */\n fetchInvites: (options?: { limit?: number; offset?: number }) => Promise<void>;\n /** Create a new invite */\n createInvite: (email: string, role?: Exclude<OrgRole, 'owner'>) => Promise<void>;\n /** Cancel a pending invite */\n cancelInvite: (inviteId: string) => Promise<void>;\n /** Resend an invite email */\n resendInvite: (inviteId: string) => Promise<void>;\n /** Accept an invite (public) */\n acceptInvite: (token: string) => Promise<AcceptInviteResponse>;\n}\n\n/**\n * Hook for managing organization invites.\n *\n * @param orgId - The organization ID to manage invites for\n *\n * @example\n * ```tsx\n * function InviteManager() {\n * const { activeOrg } = useOrgs();\n * const { invites, createInvite, cancelInvite, resendInvite } = useInvites(activeOrg?.id);\n *\n * const handleInvite = async (email: string) => {\n * await createInvite(email, 'member');\n * };\n *\n * return (\n * <div>\n * <InviteForm onSubmit={handleInvite} />\n * <ul>\n * {invites.map(invite => (\n * <li key={invite.id}>\n * {invite.email} ({invite.role})\n * <button onClick={() => resendInvite(invite.id)}>Resend</button>\n * <button onClick={() => cancelInvite(invite.id)}>Cancel</button>\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useInvites(orgId: string | undefined): UseInvitesReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [invites, setInvites] = useState<Invite[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n // P-13: Track fetched orgId to prevent duplicate fetches on remount\n const fetchedOrgIdRef = useRef<string | undefined>(undefined);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new InviteApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // H-02: Use ref to avoid apiClient in callback dependencies\n // Prevents infinite loop when apiClient identity changes\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchInvites = useCallback(\n async (options?: { limit?: number; offset?: number }) => {\n if (!orgId || authState !== 'authenticated') {\n setInvites([]);\n setTotal(0);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const { limit = 50, offset = 0 } = options ?? {};\n const response = await apiClientRef.current.listInvites(orgId, limit, offset);\n if (requestId !== requestIdRef.current) return;\n setInvites(response.invites);\n setTotal(response.total);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n setError(err as AuthError);\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n },\n [orgId, authState]\n );\n\n // P-13: Auto-fetch when orgId changes, but not on every remount\n useEffect(() => {\n if (authState !== 'authenticated') {\n fetchedOrgIdRef.current = undefined;\n return;\n }\n\n if (orgId !== fetchedOrgIdRef.current) {\n fetchedOrgIdRef.current = orgId;\n fetchInvites();\n }\n }, [orgId, authState, fetchInvites]);\n\n const createInvite = useCallback(\n async (email: string, role: Exclude<OrgRole, 'owner'> = 'member'): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.createInvite(orgId, { email, role });\n // Refresh invites list\n await fetchInvites();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchInvites]\n );\n\n const cancelInvite = useCallback(\n async (inviteId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.cancelInvite(orgId, inviteId);\n // Refresh invites list\n await fetchInvites();\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId, fetchInvites]\n );\n\n const resendInvite = useCallback(\n async (inviteId: string): Promise<void> => {\n if (!orgId) {\n throw new Error('No organization selected');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClientRef.current.resendInvite(orgId, inviteId);\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n },\n [orgId]\n );\n\n const acceptInvite = useCallback(async (token: string): Promise<AcceptInviteResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClientRef.current.acceptInvite({ token });\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n return {\n invites,\n total,\n isLoading,\n error,\n fetchInvites,\n createInvite,\n cancelInvite,\n resendInvite,\n acceptInvite,\n };\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useSystemSettings } from './useSystemSettings';\n\n/**\n * Server-side feature flags stored in system settings.\n *\n * These control which features are available in the application.\n * Unlike client-side FeatureFlags (passed to CedrosLoginProvider),\n * these can be toggled at runtime via the admin dashboard.\n */\nexport interface ServerFeatures {\n /** Enable multi-tenant organizations. Controls: Team, Invites sections */\n organizations: boolean;\n /** Enable Enterprise SSO for organizations */\n sso: boolean;\n /** Enable two-factor authentication (TOTP) */\n mfa: boolean;\n /** Enable embedded wallet for transaction signing */\n walletSigning: boolean;\n /** Enable deposits and credits system. Controls: Deposits, Withdrawals, Credit System sections */\n credits: boolean;\n /** Enable Cedros Pay integration. Controls: Products, Transactions, Refunds, etc. */\n cedrosPay: boolean;\n}\n\n/**\n * Default feature values when settings haven't loaded yet.\n * All features disabled by default for safety.\n */\nconst DEFAULT_FEATURES: ServerFeatures = {\n organizations: false,\n sso: false,\n mfa: false,\n walletSigning: false,\n credits: false,\n cedrosPay: false,\n};\n\nexport interface UseServerFeaturesReturn {\n /** Current feature flag states */\n features: ServerFeatures;\n /** Whether settings are still loading */\n isLoading: boolean;\n /** Error if settings failed to load */\n error: Error | null;\n /** Refresh feature flags from server */\n refetch: () => Promise<void>;\n /** Check if a specific feature is enabled */\n isEnabled: (feature: keyof ServerFeatures) => boolean;\n}\n\n/**\n * Hook for reading server-side feature flags from system settings.\n *\n * Use this to conditionally show/hide features based on admin settings.\n *\n * @example\n * ```tsx\n * function AdminDashboard() {\n * const { features, isLoading, isEnabled } = useServerFeatures();\n *\n * if (isLoading) return <LoadingSpinner />;\n *\n * return (\n * <nav>\n * {isEnabled('organizations') && <NavItem>Team</NavItem>}\n * {isEnabled('credits') && <NavItem>Deposits</NavItem>}\n * </nav>\n * );\n * }\n * ```\n */\nexport function useServerFeatures(): UseServerFeaturesReturn {\n const { settings, isLoading, error, fetchSettings, getValue } = useSystemSettings();\n const [hasFetched, setHasFetched] = useState(false);\n\n // Fetch settings on mount\n useEffect(() => {\n if (!hasFetched) {\n fetchSettings();\n setHasFetched(true);\n }\n }, [fetchSettings, hasFetched]);\n\n // Parse boolean value from string setting\n const parseBoolean = useCallback((value: string | undefined): boolean => {\n if (value === undefined) return false;\n return value === 'true' || value === '1';\n }, []);\n\n // Derive features from settings\n const features = useMemo<ServerFeatures>(() => {\n // If no settings loaded yet, return defaults\n if (Object.keys(settings).length === 0) {\n return DEFAULT_FEATURES;\n }\n\n return {\n organizations: parseBoolean(getValue('feature_organizations')),\n sso: parseBoolean(getValue('feature_sso')),\n mfa: parseBoolean(getValue('feature_mfa')),\n walletSigning: parseBoolean(getValue('feature_wallet_signing')),\n credits: parseBoolean(getValue('feature_credits')),\n cedrosPay: parseBoolean(getValue('feature_cedros_pay')),\n };\n }, [settings, getValue, parseBoolean]);\n\n const refetch = useCallback(async () => {\n await fetchSettings();\n }, [fetchSettings]);\n\n const isEnabled = useCallback(\n (feature: keyof ServerFeatures): boolean => {\n return features[feature];\n },\n [features]\n );\n\n return {\n features,\n isLoading,\n error,\n refetch,\n isEnabled,\n };\n}\n","import type {\n AdminUser,\n AdminUserChatsResponse,\n AdminUserCreditsResponse,\n AdminUserStatsResponse,\n AdjustCreditsRequest,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for admin user operations\n *\n * Requires system admin privileges.\n */\nexport class AdminUserApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all users in the system\n */\n async listUsers(params?: ListUsersParams): Promise<ListAdminUsersResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<ListAdminUsersResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to list users');\n }\n }\n\n /**\n * Get a specific user by ID\n */\n async getUser(userId: string): Promise<AdminUser> {\n try {\n return await this.client.get<AdminUser>(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user');\n }\n }\n\n /**\n * Set a user's system admin status\n */\n async setSystemAdmin(userId: string, isAdmin: boolean): Promise<void> {\n try {\n await this.client.patch(`/admin/users/${userId}/system-admin`, { isAdmin });\n } catch (error) {\n throw handleApiError(error, 'Failed to update system admin status');\n }\n }\n\n /**\n * Update a user's profile\n */\n async updateUser(userId: string, data: UpdateUserRequest): Promise<AdminUser> {\n try {\n return await this.client.patch<AdminUser>(`/admin/users/${userId}`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update user');\n }\n }\n\n /**\n * Delete a user\n */\n async deleteUser(userId: string): Promise<void> {\n try {\n await this.client.delete(`/admin/users/${userId}`);\n } catch (error) {\n throw handleApiError(error, 'Failed to delete user');\n }\n }\n\n /**\n * Send a password reset email to a user\n */\n async forcePasswordReset(userId: string): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/force-password-reset`, {});\n } catch (error) {\n throw handleApiError(error, 'Failed to send password reset email');\n }\n }\n\n /**\n * Adjust a user's credits\n */\n async adjustCredits(userId: string, data: AdjustCreditsRequest): Promise<void> {\n try {\n await this.client.post(`/admin/users/${userId}/credits`, data);\n } catch (error) {\n throw handleApiError(error, 'Failed to adjust credits');\n }\n }\n\n /**\n * Get a user's deposit history\n */\n async getUserDeposits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminDepositListResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/deposits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminDepositListResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user deposits');\n }\n }\n\n /**\n * Get a user's credit stats and transaction history\n */\n async getUserCredits(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserCreditsResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/credits${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserCreditsResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user credits');\n }\n }\n\n /**\n * Get a user's withdrawal history\n */\n async getUserWithdrawalHistory(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/withdrawal-history${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserWithdrawalHistoryResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user withdrawal history');\n }\n }\n\n /**\n * Get a user's chat history (from cedros-pay)\n * Only available when cedros-pay is enabled.\n */\n async getUserChats(\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserChatsResponse> {\n try {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n const queryString = query.toString();\n const url = `/admin/users/${userId}/chats${queryString ? `?${queryString}` : ''}`;\n return await this.client.get<AdminUserChatsResponse>(url);\n } catch (error) {\n throw handleApiError(error, 'Failed to get user chat history');\n }\n }\n\n /**\n * Get user statistics by auth method\n */\n async getStats(): Promise<AdminUserStatsResponse> {\n try {\n return await this.client.get<AdminUserStatsResponse>('/admin/users/stats');\n } catch (error) {\n throw handleApiError(error, 'Failed to get user stats');\n }\n }\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { AdminUserApiClient } from '../utils/adminUserApi';\nimport type {\n AdminUser,\n AdminUserChatsResponse,\n AdminUserCreditsResponse,\n AdminUserStatsResponse,\n ListAdminUsersResponse,\n ListUsersParams,\n UpdateUserRequest,\n UseAdminUsersReturn,\n} from '../types';\nimport type {\n AdminDepositListResponse,\n AdminUserWithdrawalHistoryResponse,\n} from '../types/deposit';\n\n/**\n * Hook for admin user management operations\n *\n * Provides methods to list all users, get individual users,\n * and manage system admin status. Requires system admin privileges.\n *\n * @example\n * ```tsx\n * function UserManagement() {\n * const { users, total, isLoading, listUsers, setSystemAdmin } = useAdminUsers();\n *\n * useEffect(() => {\n * listUsers({ limit: 20 });\n * }, [listUsers]);\n *\n * return (\n * <AdminUserList\n * users={users}\n * total={total}\n * isLoading={isLoading}\n * onToggleAdmin={(userId, isAdmin) => setSystemAdmin(userId, isAdmin)}\n * />\n * );\n * }\n * ```\n */\nexport function useAdminUsers(): UseAdminUsersReturn {\n const { config, _internal } = useCedrosLogin();\n\n const [users, setUsers] = useState<AdminUser[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastParams, setLastParams] = useState<ListUsersParams>({});\n\n const apiClient = useMemo(\n () =>\n new AdminUserApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const listUsers = useCallback(\n async (params?: ListUsersParams): Promise<ListAdminUsersResponse> => {\n setIsLoading(true);\n setError(null);\n setLastParams(params || {});\n\n try {\n const response = await apiClient.listUsers(params);\n setUsers(response.users);\n setTotal(response.total);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to list users');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUser = useCallback(\n async (userId: string): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUser(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const setSystemAdmin = useCallback(\n async (userId: string, isAdmin: boolean): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.setSystemAdmin(userId, isAdmin);\n // Update local state\n setUsers((prev) =>\n prev.map((user) => (user.id === userId ? { ...user, isSystemAdmin: isAdmin } : user))\n );\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update admin status');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const updateUser = useCallback(\n async (userId: string, data: UpdateUserRequest): Promise<AdminUser> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const updated = await apiClient.updateUser(userId, data);\n // Update local state\n setUsers((prev) => prev.map((user) => (user.id === userId ? updated : user)));\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const deleteUser = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.deleteUser(userId);\n // Remove from local state\n setUsers((prev) => prev.filter((user) => user.id !== userId));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to delete user');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const forcePasswordReset = useCallback(\n async (userId: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.forcePasswordReset(userId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to send password reset');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const adjustCredits = useCallback(\n async (userId: string, amount: number, reason: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.adjustCredits(userId, { amount, reason });\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to adjust credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserDeposits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminDepositListResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserDeposits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user deposits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserCredits = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminUserCreditsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserCredits(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user credits');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserWithdrawalHistory = useCallback(\n async (\n userId: string,\n params?: ListUsersParams\n ): Promise<AdminUserWithdrawalHistoryResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserWithdrawalHistory(userId, params);\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error('Failed to get user withdrawal history');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getUserChats = useCallback(\n async (userId: string, params?: ListUsersParams): Promise<AdminUserChatsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getUserChats(userId, params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user chat history');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminUserStatsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n return await apiClient.getStats();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to get user stats');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const refresh = useCallback(async () => {\n await listUsers(lastParams);\n }, [listUsers, lastParams]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n users,\n total,\n isLoading,\n error,\n listUsers,\n getUser,\n setSystemAdmin,\n updateUser,\n deleteUser,\n forcePasswordReset,\n adjustCredits,\n getUserDeposits,\n getUserCredits,\n getUserWithdrawalHistory,\n getUserChats,\n getStats,\n refresh,\n clearError,\n };\n}\n","/**\n * Organization role in RBAC hierarchy\n * owner > admin > member\n */\nexport type OrgRole = 'owner' | 'admin' | 'member';\n\n/**\n * Organization entity\n */\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string;\n isPersonal: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Membership - user's relationship to an organization\n */\nexport interface Membership {\n id?: string;\n userId?: string;\n orgId?: string;\n role: OrgRole;\n joinedAt?: string;\n}\n\n/**\n * Organization with membership details for the current user\n */\nexport interface OrgWithMembership extends Organization {\n membership: Membership;\n}\n\n/**\n * Permission types for RBAC\n */\nexport type Permission =\n | 'org:delete'\n | 'org:update'\n | 'org:read'\n | 'member:invite'\n | 'member:remove'\n | 'member:role_change'\n | 'member:read'\n | 'invite:create'\n | 'invite:cancel'\n | 'invite:read'\n | 'audit:read';\n\n/**\n * Create organization request\n */\nexport interface CreateOrgRequest {\n name: string;\n slug?: string;\n}\n\n/**\n * Update organization request\n */\nexport interface UpdateOrgRequest {\n name?: string;\n slug?: string;\n logoUrl?: string;\n}\n\n/**\n * List organizations response\n */\nexport interface ListOrgsResponse {\n orgs: Array<Organization & { role: OrgRole }>;\n total?: number;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Authorization check request\n */\nexport interface AuthorizeRequest {\n orgId: string;\n action: string;\n resource?: string;\n resourceId?: string;\n}\n\n/**\n * Authorization check response\n */\nexport interface AuthorizeResponse {\n allowed: boolean;\n reason?: string;\n}\n\n/**\n * Permissions response\n */\nexport interface PermissionsResponse {\n permissions: Permission[];\n role: OrgRole;\n}\n\n/**\n * Organization state for context\n */\nexport interface OrgState {\n /** Currently active organization */\n activeOrg: OrgWithMembership | null;\n /** All organizations the user belongs to */\n orgs: OrgWithMembership[];\n /** User's permissions in the active org */\n permissions: Permission[];\n /** User's role in the active org */\n role: OrgRole | null;\n /** Loading state for org operations */\n isLoading: boolean;\n}\n\n// =============================================================================\n// DASHBOARD PERMISSIONS\n// =============================================================================\n\n/**\n * Admin dashboard sections that can be permission-controlled\n */\nexport type DashboardSection =\n // Cedros Login sections\n | 'users'\n | 'team'\n | 'deposits'\n | 'withdrawals'\n | 'settings-wallet'\n | 'settings-auth'\n | 'settings-messaging'\n | 'settings-credits'\n | 'settings-server'\n // Cedros Pay sections\n | 'pay-products'\n | 'pay-subscriptions'\n | 'pay-transactions'\n | 'pay-coupons'\n | 'pay-refunds'\n | 'pay-storefront'\n | 'pay-ai'\n | 'pay-payment'\n | 'pay-messaging'\n | 'pay-settings';\n\n/**\n * Cedros Login dashboard sections\n */\nexport const LOGIN_DASHBOARD_SECTIONS: DashboardSection[] = [\n 'users',\n 'team',\n 'deposits',\n 'withdrawals',\n 'settings-wallet',\n 'settings-auth',\n 'settings-messaging',\n 'settings-credits',\n 'settings-server',\n];\n\n/**\n * Cedros Pay dashboard sections\n */\nexport const PAY_DASHBOARD_SECTIONS: DashboardSection[] = [\n 'pay-products',\n 'pay-subscriptions',\n 'pay-transactions',\n 'pay-coupons',\n 'pay-refunds',\n 'pay-storefront',\n 'pay-ai',\n 'pay-payment',\n 'pay-messaging',\n 'pay-settings',\n];\n\n/**\n * All available dashboard sections\n */\nexport const ALL_DASHBOARD_SECTIONS: DashboardSection[] = [\n ...LOGIN_DASHBOARD_SECTIONS,\n ...PAY_DASHBOARD_SECTIONS,\n];\n\n/**\n * Human-readable labels for dashboard sections\n */\nexport const DASHBOARD_SECTION_LABELS: Record<DashboardSection, string> = {\n // Cedros Login\n users: 'Users',\n team: 'Team',\n deposits: 'Deposits',\n withdrawals: 'Withdrawals',\n 'settings-wallet': 'Wallet Settings',\n 'settings-auth': 'Auth Settings',\n 'settings-messaging': 'Messages Settings',\n 'settings-credits': 'Credits Settings',\n 'settings-server': 'Server Settings',\n // Cedros Pay\n 'pay-products': 'Products',\n 'pay-subscriptions': 'Subscriptions',\n 'pay-transactions': 'Transactions',\n 'pay-coupons': 'Coupons',\n 'pay-refunds': 'Refunds',\n 'pay-storefront': 'Storefront',\n 'pay-ai': 'Store AI',\n 'pay-payment': 'Payment Options',\n 'pay-messaging': 'Store Messages',\n 'pay-settings': 'Store Server',\n};\n\n/**\n * Dashboard permissions per role\n * Only admin and member are configurable - owner always has full access\n */\nexport interface DashboardPermissions {\n admin: Record<DashboardSection, boolean>;\n member: Record<DashboardSection, boolean>;\n}\n\n/**\n * Default dashboard permissions for new orgs\n */\nexport const DEFAULT_DASHBOARD_PERMISSIONS: DashboardPermissions = {\n admin: {\n // Cedros Login\n users: true,\n team: true,\n deposits: true,\n withdrawals: true,\n 'settings-wallet': true,\n 'settings-auth': true,\n 'settings-messaging': true,\n 'settings-credits': true,\n 'settings-server': true,\n // Cedros Pay\n 'pay-products': true,\n 'pay-subscriptions': true,\n 'pay-transactions': true,\n 'pay-coupons': true,\n 'pay-refunds': true,\n 'pay-storefront': true,\n 'pay-ai': true,\n 'pay-payment': true,\n 'pay-messaging': true,\n 'pay-settings': true,\n },\n member: {\n // Cedros Login\n users: false,\n team: true,\n deposits: false,\n withdrawals: false,\n 'settings-wallet': false,\n 'settings-auth': false,\n 'settings-messaging': false,\n 'settings-credits': false,\n 'settings-server': false,\n // Cedros Pay\n 'pay-products': false,\n 'pay-subscriptions': false,\n 'pay-transactions': false,\n 'pay-coupons': false,\n 'pay-refunds': false,\n 'pay-storefront': false,\n 'pay-ai': false,\n 'pay-payment': false,\n 'pay-messaging': false,\n 'pay-settings': false,\n },\n};\n","import { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type { DashboardSection, DashboardPermissions, AuthError } from '../types';\nimport { DEFAULT_DASHBOARD_PERMISSIONS } from '../types/org';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { useOrgs } from './useOrgs';\nimport { ApiClient } from '../utils/apiClient';\n\nexport interface UseDashboardPermissionsReturn {\n /** Current dashboard permissions config */\n permissions: DashboardPermissions;\n /** Whether the current user can access a specific section */\n canAccess: (section: DashboardSection) => boolean;\n /** Update permissions (owner only) */\n updatePermissions: (permissions: DashboardPermissions) => Promise<void>;\n /** Loading state */\n isLoading: boolean;\n /** Updating state */\n isUpdating: boolean;\n /** Error state */\n error: AuthError | null;\n /** Refresh permissions from server */\n fetchPermissions: () => Promise<void>;\n}\n\n/**\n * Hook for managing dashboard permissions per role.\n *\n * Allows org owners to configure which dashboard sections each role can access.\n * - Owner always has full access (not configurable)\n * - Admin and Member roles are configurable\n *\n * @example\n * ```tsx\n * function AdminDashboard() {\n * const { canAccess, permissions, updatePermissions } = useDashboardPermissions();\n *\n * // Check if current user can access a section\n * if (!canAccess('deposits')) {\n * return <div>You don't have access to deposits</div>;\n * }\n *\n * // Update permissions (owner only)\n * const toggleMemberDeposits = () => {\n * updatePermissions({\n * ...permissions,\n * member: { ...permissions.member, deposits: !permissions.member.deposits },\n * });\n * };\n * }\n * ```\n */\nexport function useDashboardPermissions(): UseDashboardPermissionsReturn {\n const { config, authState, _internal } = useCedrosLogin();\n const { activeOrg, role } = useOrgs();\n\n const [permissions, setPermissions] = useState<DashboardPermissions>(DEFAULT_DASHBOARD_PERMISSIONS);\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n const requestIdRef = useRef(0);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n getAccessToken: _internal?.getAccessToken,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n // Use ref to avoid apiClient in callback dependencies\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n const fetchPermissions = useCallback(async () => {\n if (authState !== 'authenticated' || !activeOrg) {\n setPermissions(DEFAULT_DASHBOARD_PERMISSIONS);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n const requestId = ++requestIdRef.current;\n\n try {\n const response = await apiClientRef.current.get<{ permissions: DashboardPermissions }>(\n '/admin/dashboard-permissions'\n );\n if (requestId !== requestIdRef.current) return;\n setPermissions(response.permissions);\n } catch (err) {\n if (requestId !== requestIdRef.current) return;\n // If 404, use defaults (permissions not configured yet)\n if (err instanceof Error && err.message.includes('404')) {\n setPermissions(DEFAULT_DASHBOARD_PERMISSIONS);\n } else {\n const message = err instanceof Error ? err.message : 'Failed to fetch permissions';\n setError({ code: 'NETWORK_ERROR', message } as AuthError);\n // Fall back to defaults on error\n setPermissions(DEFAULT_DASHBOARD_PERMISSIONS);\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [authState, activeOrg]);\n\n const updatePermissions = useCallback(\n async (newPermissions: DashboardPermissions): Promise<void> => {\n if (authState !== 'authenticated' || !activeOrg) {\n throw new Error('Not authenticated');\n }\n\n if (role !== 'owner') {\n throw new Error('Only owners can modify dashboard permissions');\n }\n\n setIsUpdating(true);\n setError(null);\n\n try {\n await apiClientRef.current.request<{ permissions: DashboardPermissions }>({\n method: 'PUT',\n path: '/admin/dashboard-permissions',\n body: newPermissions,\n });\n setPermissions(newPermissions);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update permissions';\n const authError = { code: 'NETWORK_ERROR', message } as AuthError;\n setError(authError);\n throw new Error(message);\n } finally {\n setIsUpdating(false);\n }\n },\n [authState, activeOrg, role]\n );\n\n /**\n * Check if the current user can access a dashboard section\n * - No org context (system admin): full access (permissions are org-scoped)\n * - Owner: always has full access\n * - Admin: check permissions.admin[section]\n * - Member: check permissions.member[section]\n */\n const canAccess = useCallback(\n (section: DashboardSection): boolean => {\n // No org context = system admin level, allow all\n // (dashboard permissions are org-scoped, not system-scoped)\n if (!activeOrg || !role) {\n return true;\n }\n\n // Owner always has full access\n if (role === 'owner') {\n return true;\n }\n\n // Admin and member: check configured permissions\n const rolePermissions = permissions[role as 'admin' | 'member'];\n return rolePermissions?.[section] ?? false;\n },\n [activeOrg, role, permissions]\n );\n\n // Fetch permissions when org changes\n useEffect(() => {\n if (activeOrg?.id) {\n fetchPermissions();\n }\n }, [activeOrg?.id, fetchPermissions]);\n\n return {\n permissions,\n canAccess,\n updatePermissions,\n isLoading,\n isUpdating,\n error,\n fetchPermissions,\n };\n}\n","/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * StatsBar Component\n *\n * A reusable horizontal stats display for admin sections.\n */\n\nexport interface StatItem {\n label: string;\n value: string | number;\n description?: string;\n variant?: 'default' | 'success' | 'warning' | 'muted';\n}\n\nexport interface StatsBarProps {\n stats: StatItem[];\n isLoading?: boolean;\n onRefresh?: () => void;\n}\n\nconst Icons = {\n loading: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"cedros-admin__spinner\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n ),\n refresh: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n ),\n};\n\nexport function StatsBar({ stats, isLoading = false, onRefresh }: StatsBarProps) {\n return (\n <div className=\"cedros-admin__stats-bar\">\n <div className=\"cedros-admin__stats-bar-grid\">\n {stats.map((stat, index) => (\n <div key={index} className=\"cedros-admin__stats-bar-item\">\n <span className=\"cedros-admin__stats-bar-label\">{stat.label}</span>\n <span\n className={`cedros-admin__stats-bar-value ${\n stat.variant ? `cedros-admin__stats-bar-value--${stat.variant}` : ''\n }`}\n >\n {isLoading ? (\n <span className=\"cedros-admin__skeleton cedros-admin__skeleton--value\" />\n ) : (\n stat.value\n )}\n </span>\n {stat.description && (\n <span className=\"cedros-admin__stats-bar-desc\">{stat.description}</span>\n )}\n </div>\n ))}\n </div>\n {onRefresh && (\n <button\n type=\"button\"\n className=\"cedros-admin__stats-bar-refresh\"\n onClick={onRefresh}\n disabled={isLoading}\n title=\"Refresh stats\"\n >\n {isLoading ? Icons.loading : Icons.refresh}\n </button>\n )}\n </div>\n );\n}\n","/**\n * Admin deposit statistics component\n *\n * Shows aggregate statistics for Privacy Cash deposits.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositStatsResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\nimport { StatsBar } from '../../admin/StatsBar';\n\nexport interface AdminDepositStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\n/**\n * Admin deposit statistics display\n *\n * Shows total deposits, withdrawals, and pending amounts.\n */\nexport function AdminDepositStats({\n refreshInterval = 0,\n className = '',\n onLoad,\n}: AdminDepositStatsProps) {\n const { getStats, isLoading, error, clearError } = useAdminDeposits();\n\n const [stats, setStats] = useState<AdminDepositStatsResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStats = useCallback(async () => {\n try {\n const result = await getStats();\n setStats(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load stats';\n setLoadError(message);\n }\n }, [getStats, onLoad]);\n\n // Fetch on mount\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchStats]);\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStats();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats cedros-admin-stats-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading statistics...</span>\n </div>\n );\n }\n\n if (!stats) {\n return null;\n }\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Deposits', value: stats.totalDeposits },\n { label: 'Private Deposits', value: stats.inPrivacyPeriodCount ?? 0 },\n { label: 'Standard Deposits', value: stats.readyForWithdrawalCount ?? 0 },\n { label: 'Microdeposits', value: stats.nativeSolDepositCount ?? 0 },\n ]}\n isLoading={isLoading}\n onRefresh={fetchStats}\n />\n </div>\n );\n}\n","/**\n * Admin withdrawal statistics component\n *\n * Shows high-level withdrawal pipeline stats in a single row.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositStatsResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\nimport { StatsBar } from '../../admin/StatsBar';\n\nexport interface AdminWithdrawalStatsProps {\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when stats are loaded */\n onLoad?: (stats: AdminDepositStatsResponse) => void;\n}\n\nexport function AdminWithdrawalStats({\n refreshInterval = 0,\n className = '',\n onLoad,\n}: AdminWithdrawalStatsProps) {\n const { getStats, isLoading, error, clearError } = useAdminDeposits();\n\n const [stats, setStats] = useState<AdminDepositStatsResponse | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchStats = useCallback(async () => {\n try {\n const result = await getStats();\n setStats(result);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load stats';\n setLoadError(message);\n }\n }, [getStats, onLoad]);\n\n useEffect(() => {\n fetchStats();\n }, [fetchStats]);\n\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = setInterval(fetchStats, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchStats]);\n\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n if (errorMessage) {\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchStats();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && !stats) {\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Withdrawn', value: 0 },\n { label: 'Pending Withdraw', value: 0 },\n { label: 'In Privacy Period', value: 0 },\n { label: 'Microbatch (SOL)', value: '0.0000' },\n ]}\n isLoading\n />\n </div>\n );\n }\n\n if (!stats) return null;\n\n return (\n <div className={`cedros-admin-stats ${className}`}>\n <StatsBar\n stats={[\n { label: 'Total Withdrawn', value: stats.totalWithdrawnCount },\n { label: 'Pending Withdraw', value: stats.pendingWithdrawalCount },\n { label: 'In Privacy Period', value: stats.inPrivacyPeriodCount ?? 0 },\n { label: 'Microbatch (SOL)', value: stats.readyForWithdrawalSol?.toFixed(4) ?? '0.0000' },\n ]}\n isLoading={isLoading}\n onRefresh={fetchStats}\n />\n </div>\n );\n}\n","/**\n * Admin deposit list component\n *\n * Shows a paginated list of all deposits across all users.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype DepositSortField = 'userId' | 'amountLamports' | 'status' | 'createdAt' | 'txSignature';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminDepositListProps {\n /** Filter by status (comma-separated) */\n statusFilter?: string;\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit is clicked */\n onDepositClick?: (deposit: AdminDepositItem) => void;\n}\n\ntype DepositStatusType =\n | 'pending'\n | 'detected'\n | 'processing'\n | 'completed'\n | 'withdrawn'\n | 'partially_withdrawn'\n | 'expired'\n | 'failed';\n\nfunction getStatusLabel(status: DepositStatusType): string {\n const labels: Record<DepositStatusType, string> = {\n pending: 'Pending',\n detected: 'Detected',\n processing: 'Processing',\n completed: 'Completed',\n withdrawn: 'Withdrawn',\n partially_withdrawn: 'Partially Withdrawn',\n expired: 'Expired',\n failed: 'Failed',\n };\n return labels[status] || status;\n}\n\nfunction getStatusClass(status: DepositStatusType): string {\n if (status === 'completed' || status === 'withdrawn' || status === 'partially_withdrawn') {\n return 'cedros-admin-deposit-success';\n }\n if (status === 'failed' || status === 'expired') return 'cedros-admin-deposit-error';\n if (status === 'processing' || status === 'detected') return 'cedros-admin-deposit-processing';\n return 'cedros-admin-deposit-pending';\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin deposit list display\n *\n * Shows paginated list of all deposits with user info.\n */\nexport function AdminDepositList({\n statusFilter,\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onDepositClick,\n}: AdminDepositListProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [deposits, setDeposits] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<DepositSortField>('createdAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: DepositSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedDeposits = useMemo(() => {\n return [...deposits].sort((a, b) => {\n let aVal: string | number | null;\n let bVal: string | number | null;\n\n switch (sortField) {\n case 'userId':\n aVal = a.userId.toLowerCase();\n bVal = b.userId.toLowerCase();\n break;\n case 'amountLamports':\n aVal = a.amountLamports ?? 0;\n bVal = b.amountLamports ?? 0;\n break;\n case 'status':\n aVal = a.status;\n bVal = b.status;\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'txSignature':\n aVal = a.txSignature || '';\n bVal = b.txSignature || '';\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [deposits, sortField, sortOrder]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const result = await listDeposits({ status: statusFilter, limit: pageSize, offset });\n setDeposits(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load deposits';\n setLoadError(message);\n }\n }, [statusFilter, pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when filters change\n useEffect(() => {\n setOffset(0);\n }, [statusFilter, pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchDeposits();\n }, [fetchDeposits]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchDeposits, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchDeposits]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchDeposits();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && deposits.length === 0) {\n return (\n <div className={`cedros-admin-deposit-list cedros-admin-deposit-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-deposit-list ${className}`}>\n <div className=\"cedros-admin-deposit-list-header\">\n <h4 className=\"cedros-admin-deposit-list-title\">All Deposits</h4>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchDeposits}\n disabled={isLoading}\n title=\"Refresh deposits\"\n aria-label=\"Refresh deposits\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {deposits.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-deposit-table\">\n <div className=\"cedros-admin-deposit-thead\">\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'userId' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('userId')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'userId' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'amountLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('amountLamports')}\n aria-label=\"Sort by amount\"\n >\n Amount{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'amountLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'status' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('status')}\n aria-label=\"Sort by status\"\n >\n Status{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'status' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'createdAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('createdAt')}\n aria-label=\"Sort by created\"\n >\n Created{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'createdAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-deposit-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'txSignature' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('txSignature')}\n aria-label=\"Sort by transaction\"\n >\n Tx{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'txSignature' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedDeposits.map((deposit) => (\n <div\n key={deposit.id}\n className={`cedros-admin-deposit-row ${getStatusClass(deposit.status)}`}\n onClick={() => onDepositClick?.(deposit)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onDepositClick?.(deposit);\n }\n }}\n role={onDepositClick ? 'button' : undefined}\n tabIndex={onDepositClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-deposit-td\" title={deposit.userId}>\n {truncateId(deposit.userId)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n {formatAmount(deposit.amountLamports)}\n </div>\n <div className=\"cedros-admin-deposit-td\">\n <span className=\"cedros-admin-status-badge\">\n {getStatusLabel(deposit.status)}\n </span>\n </div>\n <div className=\"cedros-admin-deposit-td\">{formatDate(deposit.createdAt)}</div>\n <div className=\"cedros-admin-deposit-td\" title={deposit.txSignature || undefined}>\n {deposit.txSignature ? truncateId(deposit.txSignature) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin withdrawal queue component\n *\n * Shows deposits that are ready for withdrawal (privacy period elapsed).\n * Includes buttons to process individual or all withdrawals.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type {\n AdminDepositItem,\n AdminDepositListResponse,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n} from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype QueueSortField = 'userId' | 'amountLamports' | 'withdrawalAvailableAt';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminWithdrawalQueueProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n /** Callback when a withdrawal is processed */\n onWithdrawalProcessed?: (response: ProcessWithdrawalResponse) => void;\n /** Callback when all withdrawals are processed */\n onAllProcessed?: (response: ProcessAllWithdrawalsResponse) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\nfunction getTimeElapsed(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) return `${diffDays}d ago`;\n if (diffHours > 0) return `${diffHours}h ago`;\n if (diffMins > 0) return `${diffMins}m ago`;\n return 'just now';\n}\n\nfunction isWithinPrivacyPeriod(withdrawalAvailableAt: string | undefined): boolean {\n if (!withdrawalAvailableAt) return true;\n return new Date(withdrawalAvailableAt) > new Date();\n}\n\n/**\n * Admin withdrawal queue display\n *\n * Shows deposits ready for withdrawal processing with action buttons.\n */\nexport function AdminWithdrawalQueue({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n onWithdrawalProcessed,\n onAllProcessed,\n}: AdminWithdrawalQueueProps) {\n const {\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n isLoading,\n error,\n clearError,\n } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<QueueSortField>('withdrawalAvailableAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('asc');\n\n const toggleSort = (field: QueueSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder(field === 'withdrawalAvailableAt' ? 'asc' : 'desc');\n }\n };\n\n const sortedItems = useMemo(() => {\n return [...items].sort((a, b) => {\n let aVal: string | number;\n let bVal: string | number;\n\n switch (sortField) {\n case 'userId':\n aVal = a.userId.toLowerCase();\n bVal = b.userId.toLowerCase();\n break;\n case 'amountLamports':\n aVal = a.amountLamports ?? 0;\n bVal = b.amountLamports ?? 0;\n break;\n case 'withdrawalAvailableAt':\n aVal = a.withdrawalAvailableAt ? new Date(a.withdrawalAvailableAt).getTime() : 0;\n bVal = b.withdrawalAvailableAt ? new Date(b.withdrawalAvailableAt).getTime() : 0;\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [items, sortField, sortOrder]);\n\n // Processing state\n const [processingId, setProcessingId] = useState<string | null>(null);\n const [processingAll, setProcessingAll] = useState(false);\n const [processResult, setProcessResult] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Early withdrawal confirmation modal\n const [earlyWithdrawalItem, setEarlyWithdrawalItem] = useState<AdminDepositItem | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listPendingWithdrawals({ limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load pending withdrawals';\n setLoadError(message);\n }\n }, [pageSize, offset, listPendingWithdrawals, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n // Clear result message after 5 seconds\n useEffect(() => {\n if (!processResult) return;\n const timer = setTimeout(() => setProcessResult(null), 5000);\n return () => clearTimeout(timer);\n }, [processResult]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n const handleProcessSingle = async (item: AdminDepositItem, force = false) => {\n // Check if within privacy period and not forcing\n if (!force && isWithinPrivacyPeriod(item.withdrawalAvailableAt)) {\n setEarlyWithdrawalItem(item);\n return;\n }\n\n setProcessingId(item.id);\n setProcessResult(null);\n\n try {\n const result = await processWithdrawal(item.id, { force });\n if (result.success) {\n setProcessResult({\n type: 'success',\n message: `Withdrawal processed: ${result.txSignature?.slice(0, 12)}...`,\n });\n onWithdrawalProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } else {\n setProcessResult({\n type: 'error',\n message: result.error || 'Failed to process withdrawal',\n });\n }\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawal',\n });\n } finally {\n setProcessingId(null);\n setEarlyWithdrawalItem(null);\n }\n };\n\n const handleProcessAll = async () => {\n if (items.length === 0) return;\n\n setProcessingAll(true);\n setProcessResult(null);\n\n try {\n const result = await processAllWithdrawals();\n if (result.totalSucceeded > 0) {\n setProcessResult({\n type: 'success',\n message: `Processed ${result.totalSucceeded}/${result.totalProcessed} withdrawals`,\n });\n } else if (result.totalFailed > 0) {\n setProcessResult({\n type: 'error',\n message: `Failed to process ${result.totalFailed} withdrawals`,\n });\n }\n onAllProcessed?.(result);\n // Refresh the list\n await fetchItems();\n } catch (err) {\n setProcessResult({\n type: 'error',\n message: err instanceof Error ? err.message : 'Failed to process withdrawals',\n });\n } finally {\n setProcessingAll(false);\n }\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0 && !processingId && !processingAll) {\n return (\n <div\n className={`cedros-admin-withdrawal-queue cedros-admin-withdrawal-queue-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal queue...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-queue ${className}`}>\n {/* Early Withdrawal Confirmation Modal */}\n {earlyWithdrawalItem && (\n <div\n className=\"cedros-admin-modal-overlay\"\n onClick={() => setEarlyWithdrawalItem(null)}\n onKeyDown={(e) => e.key === 'Escape' && setEarlyWithdrawalItem(null)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"early-withdrawal-title\"\n >\n <div\n className=\"cedros-admin-modal cedros-admin-modal-warning\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={() => {}}\n role=\"document\"\n >\n <h3 id=\"early-withdrawal-title\" className=\"cedros-admin-modal-title\">\n Early Withdrawal Warning\n </h3>\n <div className=\"cedros-admin-modal-content\">\n <p className=\"cedros-admin-modal-warning-text\">\n <strong>This deposit is still within its privacy period.</strong>\n </p>\n <p>\n Processing this withdrawal early may compromise user privacy. The privacy period\n exists to provide plausible deniability for deposits.\n </p>\n <p className=\"cedros-admin-modal-details\">\n User: {truncateId(earlyWithdrawalItem.userId)}\n <br />\n Amount: {formatAmount(earlyWithdrawalItem.amountLamports)}\n <br />\n Available at:{' '}\n {earlyWithdrawalItem.withdrawalAvailableAt\n ? formatDate(earlyWithdrawalItem.withdrawalAvailableAt)\n : '—'}\n </p>\n <p>Are you sure you want to process this withdrawal early?</p>\n </div>\n <div className=\"cedros-admin-modal-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => setEarlyWithdrawalItem(null)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-danger\"\n onClick={() => handleProcessSingle(earlyWithdrawalItem, true)}\n disabled={processingId === earlyWithdrawalItem.id}\n >\n {processingId === earlyWithdrawalItem.id ? 'Processing...' : 'Process Early'}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Result message */}\n {processResult && (\n <div\n className={`cedros-admin-result cedros-admin-result-${processResult.type}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {processResult.message}\n </div>\n )}\n\n <div className=\"cedros-admin-withdrawal-queue-header\">\n <h4 className=\"cedros-admin-withdrawal-queue-title\">Pending Withdrawals</h4>\n <div className=\"cedros-admin-withdrawal-queue-actions\">\n <span className=\"cedros-admin-queue-count\">{total} pending</span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading || processingAll}\n title=\"Refresh queue\"\n aria-label=\"Refresh queue\"\n >\n {isLoading && !processingAll ? '...' : '↻'}\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-sm\"\n onClick={handleProcessAll}\n disabled={isLoading || processingAll || items.length === 0}\n title=\"Process all ready withdrawals\"\n >\n {processingAll ? 'Processing...' : 'Process All'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No pending withdrawals.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-withdrawal-table\">\n <div className=\"cedros-admin-withdrawal-thead\">\n <div className=\"cedros-admin-withdrawal-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'userId' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('userId')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'userId' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-withdrawal-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'amountLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('amountLamports')}\n aria-label=\"Sort by amount\"\n >\n Amount{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'amountLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-withdrawal-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'withdrawalAvailableAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('withdrawalAvailableAt')}\n aria-label=\"Sort by ready since\"\n >\n Ready Since{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'withdrawalAvailableAt'\n ? sortOrder === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-withdrawal-th\">Waiting</div>\n <div className=\"cedros-admin-withdrawal-th cedros-admin-withdrawal-th-action\">\n Action\n </div>\n </div>\n {sortedItems.map((item) => {\n const withinPrivacyPeriod = isWithinPrivacyPeriod(item.withdrawalAvailableAt);\n const isProcessing = processingId === item.id;\n\n return (\n <div\n key={item.id}\n className={`cedros-admin-withdrawal-row ${withinPrivacyPeriod ? 'cedros-admin-withdrawal-row-early' : ''}`}\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-withdrawal-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {formatAmount(item.amountLamports)}\n </div>\n <div className=\"cedros-admin-withdrawal-td\">\n {item.withdrawalAvailableAt ? formatDate(item.withdrawalAvailableAt) : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-waiting\">\n {item.withdrawalAvailableAt\n ? withinPrivacyPeriod\n ? 'In privacy period'\n : getTimeElapsed(item.withdrawalAvailableAt)\n : '—'}\n </div>\n <div className=\"cedros-admin-withdrawal-td cedros-admin-withdrawal-td-action\">\n <button\n type=\"button\"\n className={`cedros-button cedros-button-sm ${withinPrivacyPeriod ? 'cedros-button-warning' : 'cedros-button-primary'}`}\n onClick={(e) => {\n e.stopPropagation();\n handleProcessSingle(item);\n }}\n disabled={isProcessing || processingAll}\n title={\n withinPrivacyPeriod\n ? 'Early withdrawal (requires confirmation)'\n : 'Process this withdrawal'\n }\n >\n {isProcessing ? '...' : withinPrivacyPeriod ? 'Early' : 'Process'}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin privacy period deposits component\n *\n * Shows deposits that are still in the privacy period (completed but not yet ready for withdrawal).\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\nexport interface AdminPrivacyPeriodDepositsProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a deposit item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\nfunction getTimeRemaining(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n\n if (diffMs <= 0) return 'Ready';\n\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffDays > 0) {\n const remainingHours = diffHours % 24;\n return remainingHours > 0 ? `${diffDays}d ${remainingHours}h` : `${diffDays}d`;\n }\n if (diffHours > 0) {\n const remainingMins = diffMins % 60;\n return remainingMins > 0 ? `${diffHours}h ${remainingMins}m` : `${diffHours}h`;\n }\n return `${diffMins}m`;\n}\n\n/**\n * Admin privacy period deposits display\n *\n * Shows deposits that are still in the privacy period (not yet available for withdrawal).\n */\nexport function AdminPrivacyPeriodDeposits({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminPrivacyPeriodDepositsProps) {\n const { listInPrivacyPeriod, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listInPrivacyPeriod({ limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load deposits';\n setLoadError(message);\n }\n }, [pageSize, offset, listInPrivacyPeriod, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-privacy-deposits cedros-admin-privacy-deposits-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading deposits...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-privacy-deposits ${className}`}>\n <div className=\"cedros-admin-privacy-deposits-header\">\n <h4 className=\"cedros-admin-privacy-deposits-title\">In Privacy Period</h4>\n <div className=\"cedros-admin-privacy-deposits-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} deposit{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No deposits in privacy period.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-privacy-table\">\n <div className=\"cedros-admin-privacy-thead\">\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by user\"\n >\n User <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by amount\"\n >\n Amount <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by deposited\"\n >\n Deposited <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n <div className=\"cedros-admin-privacy-th\">\n <button\n type=\"button\"\n className=\"cedros-admin-sort-button\"\n aria-label=\"Sort by ready in\"\n >\n Ready In <span className=\"cedros-admin-sort-icon\">↕</span>\n </button>\n </div>\n </div>\n {items.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-privacy-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-privacy-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-privacy-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-privacy-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-privacy-td cedros-admin-privacy-remaining\">\n {item.withdrawalAvailableAt ? getTimeRemaining(item.withdrawalAvailableAt) : '—'}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin withdrawal history component\n *\n * Shows deposits that have been fully withdrawn (processed).\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminDeposits } from '../../../hooks/useAdminDeposits';\nimport type { AdminDepositItem, AdminDepositListResponse } from '../../../types/deposit';\nimport { FeatureDisabledMessage } from './FeatureDisabledMessage';\nimport { isFeatureDisabledError } from './featureDisabled';\n\ntype WithdrawalSortField = 'userId' | 'amountLamports' | 'completedAt' | 'withdrawalTxSignature';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminWithdrawalHistoryProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: AdminDepositListResponse) => void;\n /** Callback when a withdrawal item is clicked */\n onItemClick?: (item: AdminDepositItem) => void;\n}\n\nfunction formatAmount(lamports: number | null): string {\n if (lamports === null || lamports === undefined) return '—';\n const solAmount = lamports / 1_000_000_000;\n return `${solAmount.toFixed(4)} SOL`;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction truncateSignature(sig: string): string {\n if (sig.length <= 16) return sig;\n return `${sig.slice(0, 8)}...${sig.slice(-6)}`;\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\n/**\n * Admin withdrawal history display\n *\n * Shows deposits that have been fully withdrawn.\n */\nexport function AdminWithdrawalHistory({\n pageSize = 20,\n refreshInterval = 0,\n className = '',\n onLoad,\n onItemClick,\n}: AdminWithdrawalHistoryProps) {\n const { listDeposits, isLoading, error, clearError } = useAdminDeposits();\n\n const [items, setItems] = useState<AdminDepositItem[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<WithdrawalSortField>('completedAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: WithdrawalSortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedItems = useMemo(() => {\n return [...items].sort((a, b) => {\n let aVal: string | number;\n let bVal: string | number;\n\n switch (sortField) {\n case 'userId':\n aVal = a.userId.toLowerCase();\n bVal = b.userId.toLowerCase();\n break;\n case 'amountLamports':\n aVal = a.amountLamports ?? 0;\n bVal = b.amountLamports ?? 0;\n break;\n case 'completedAt':\n aVal = a.completedAt ? new Date(a.completedAt).getTime() : 0;\n bVal = b.completedAt ? new Date(b.completedAt).getTime() : 0;\n break;\n case 'withdrawalTxSignature':\n aVal = a.withdrawalTxSignature || '';\n bVal = b.withdrawalTxSignature || '';\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [items, sortField, sortOrder]);\n\n const fetchItems = useCallback(async () => {\n try {\n const result = await listDeposits({ status: 'withdrawn', limit: pageSize, offset });\n setItems(result.deposits);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n const message =\n err && typeof err === 'object' && 'message' in err\n ? String((err as { message: unknown }).message)\n : 'Failed to load withdrawal history';\n setLoadError(message);\n }\n }, [pageSize, offset, listDeposits, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchItems();\n }, [fetchItems]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchItems, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchItems]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Feature disabled state\n const errorMessage = loadError || error;\n if (isFeatureDisabledError(errorMessage)) {\n return <FeatureDisabledMessage feature=\"Privacy Cash\" className={className} />;\n }\n\n // Error state\n if (errorMessage) {\n return (\n <div\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-error ${className}`}\n >\n <p className=\"cedros-admin-error\">{errorMessage}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchItems();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && items.length === 0) {\n return (\n <div\n className={`cedros-admin-withdrawal-history cedros-admin-withdrawal-history-loading ${className}`}\n >\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading withdrawal history...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-withdrawal-history ${className}`}>\n <div className=\"cedros-admin-withdrawal-history-header\">\n <h4 className=\"cedros-admin-withdrawal-history-title\">Withdrawal History</h4>\n <div className=\"cedros-admin-withdrawal-history-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} withdrawal{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchItems}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {items.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No withdrawals processed yet.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-history-table\">\n <div className=\"cedros-admin-history-thead\">\n <div className=\"cedros-admin-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'userId' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('userId')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'userId' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'amountLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('amountLamports')}\n aria-label=\"Sort by amount\"\n >\n Amount{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'amountLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'completedAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('completedAt')}\n aria-label=\"Sort by processed\"\n >\n Processed{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'completedAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-history-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'withdrawalTxSignature' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('withdrawalTxSignature')}\n aria-label=\"Sort by transaction\"\n >\n Transaction{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'withdrawalTxSignature'\n ? sortOrder === 'asc'\n ? '↑'\n : '↓'\n : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedItems.map((item) => (\n <div\n key={item.id}\n className=\"cedros-admin-history-row\"\n onClick={() => onItemClick?.(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onItemClick?.(item);\n }\n }}\n role={onItemClick ? 'button' : undefined}\n tabIndex={onItemClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-history-td\" title={item.userId}>\n {truncateId(item.userId)}\n </div>\n <div className=\"cedros-admin-history-td\">{formatAmount(item.amountLamports)}</div>\n <div className=\"cedros-admin-history-td\">\n {item.completedAt ? formatDate(item.completedAt) : '—'}\n </div>\n <div className=\"cedros-admin-history-td\">\n {item.withdrawalTxSignature ? (\n <a\n href={`https://orbmarkets.io/tx/${item.withdrawalTxSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cedros-admin-tx-link\"\n onClick={(e) => e.stopPropagation()}\n title={item.withdrawalTxSignature}\n >\n {truncateSignature(item.withdrawalTxSignature)}\n </a>\n ) : (\n '—'\n )}\n </div>\n </div>\n ))}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin user list component\n *\n * Displays all registered users in the system with management actions.\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type { AdminUser, ListAdminUsersResponse } from '../../types';\n\ntype SortField = 'name' | 'createdAt' | 'lastLoginAt' | 'balanceLamports';\ntype SortOrder = 'asc' | 'desc';\n\nexport interface AdminUserListProps {\n /** Number of items per page (default: 20) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Current user's ID (to highlight current user) */\n currentUserId?: string;\n /** Additional CSS classes */\n className?: string;\n /** Callback when list is loaded */\n onLoad?: (response: ListAdminUsersResponse) => void;\n /** Callback when a user is clicked */\n onUserClick?: (user: AdminUser) => void;\n}\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction truncateId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}...${id.slice(-4)}`;\n}\n\nfunction formatBalance(lamports: number | undefined): string {\n if (lamports === undefined || lamports === null) return '-';\n // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)\n const sol = lamports / 1_000_000_000;\n return sol.toFixed(4);\n}\n\n/**\n * Admin user list display\n *\n * Shows all registered users.\n */\nexport function AdminUserList({\n pageSize = 20,\n refreshInterval = 0,\n currentUserId,\n className = '',\n onLoad,\n onUserClick,\n}: AdminUserListProps) {\n const { users, total, isLoading, error, listUsers, clearError } = useAdminUsers();\n\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [sortField, setSortField] = useState<SortField>('createdAt');\n const [sortOrder, setSortOrder] = useState<SortOrder>('desc');\n\n const toggleSort = (field: SortField) => {\n if (sortField === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n } else {\n setSortField(field);\n setSortOrder('desc');\n }\n };\n\n const sortedUsers = useMemo(() => {\n return [...users].sort((a, b) => {\n let aVal: string | number | null;\n let bVal: string | number | null;\n\n switch (sortField) {\n case 'name':\n aVal = (a.name || a.email || '').toLowerCase();\n bVal = (b.name || b.email || '').toLowerCase();\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'lastLoginAt':\n aVal = a.lastLoginAt ? new Date(a.lastLoginAt).getTime() : 0;\n bVal = b.lastLoginAt ? new Date(b.lastLoginAt).getTime() : 0;\n break;\n case 'balanceLamports':\n aVal = a.balanceLamports ?? 0;\n bVal = b.balanceLamports ?? 0;\n break;\n default:\n return 0;\n }\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n }, [users, sortField, sortOrder]);\n\n const fetchUsers = useCallback(async () => {\n try {\n const result = await listUsers({ limit: pageSize, offset });\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load users');\n }\n }, [pageSize, offset, listUsers, onLoad]);\n\n // Reset offset when page size changes\n useEffect(() => {\n setOffset(0);\n }, [pageSize]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchUsers, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchUsers]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-error ${className}`}>\n <p className=\"cedros-admin-error\">{loadError || error?.message}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchUsers();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && users.length === 0) {\n return (\n <div className={`cedros-admin-user-list cedros-admin-user-list-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading users...</span>\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin-user-list ${className}`}>\n <div className=\"cedros-admin-user-list-header\">\n <h4 className=\"cedros-admin-user-list-title\">All Users</h4>\n <div className=\"cedros-admin-user-list-actions\">\n <span className=\"cedros-admin-queue-count\">\n {total} user{total !== 1 ? 's' : ''}\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-icon-button\"\n onClick={fetchUsers}\n disabled={isLoading}\n title=\"Refresh list\"\n aria-label=\"Refresh list\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n </div>\n\n {users.length === 0 ? (\n <div className=\"cedros-admin-empty\">\n <p className=\"cedros-admin-empty-message\">No users found.</p>\n </div>\n ) : (\n <>\n <div className=\"cedros-admin-user-table\">\n <div className=\"cedros-admin-user-thead\">\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'name' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('name')}\n aria-label=\"Sort by user\"\n >\n User{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'name' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'createdAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('createdAt')}\n aria-label=\"Sort by registered date\"\n >\n Registered{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'createdAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'lastLoginAt' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('lastLoginAt')}\n aria-label=\"Sort by last login\"\n >\n Last Login{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'lastLoginAt' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n <div className=\"cedros-admin-user-th\">\n <button\n type=\"button\"\n className={`cedros-admin-sort-button ${sortField === 'balanceLamports' ? 'cedros-admin-sort-active' : ''}`}\n onClick={() => toggleSort('balanceLamports')}\n aria-label=\"Sort by balance\"\n >\n Balance{' '}\n <span className=\"cedros-admin-sort-icon\">\n {sortField === 'balanceLamports' ? (sortOrder === 'asc' ? '↑' : '↓') : '↕'}\n </span>\n </button>\n </div>\n </div>\n {sortedUsers.map((user) => {\n const isCurrentUser = user.id === currentUserId;\n\n return (\n <div\n key={user.id}\n className={`cedros-admin-user-row ${isCurrentUser ? 'cedros-admin-user-row-current' : ''}`}\n onClick={() => onUserClick?.(user)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onUserClick?.(user);\n }\n }}\n role={onUserClick ? 'button' : undefined}\n tabIndex={onUserClick ? 0 : undefined}\n >\n <div className=\"cedros-admin-user-td cedros-admin-user-info\">\n <div className=\"cedros-admin-user-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-details\">\n <span className=\"cedros-admin-user-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </span>\n <span className=\"cedros-admin-user-email\" title={user.email}>\n {user.email || truncateId(user.id)}\n </span>\n </div>\n </div>\n <div className=\"cedros-admin-user-td\">{formatDate(user.createdAt)}</div>\n <div className=\"cedros-admin-user-td\">\n {user.lastLoginAt ? formatDate(user.lastLoginAt) : '-'}\n </div>\n <div className=\"cedros-admin-user-td\">{formatBalance(user.balanceLamports)}</div>\n </div>\n );\n })}\n </div>\n\n {totalPages > 1 && (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * Admin user detail component\n *\n * Displays detailed information about a specific user including:\n * - Account information (email, auth methods, admin status)\n * - Credit balance and stats\n * - Deposit history\n * - Transaction history\n *\n * Requires system admin privileges.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport type {\n AdminUser,\n AdminUserCreditsResponse,\n AdminUserChatsResponse,\n AdminChatSession,\n AdminCreditTransactionItem,\n ListUsersParams,\n} from '../../types';\nimport type { AdminDepositListResponse, AdminDepositItem } from '../../types/deposit';\n\nexport interface AdminUserDetailProps {\n /** User ID to display */\n userId: string;\n /** Callback when back button is clicked */\n onBack: () => void;\n /** Current user's ID (to prevent self-demotion) */\n currentUserId?: string;\n /** Callback when edit is clicked (parent handles modal) */\n onEditUser?: (user: AdminUser) => void;\n /** Callback when credits adjustment is clicked (parent handles modal) */\n onAdjustCredits?: (user: AdminUser) => void;\n /** Whether cedros-pay is enabled (shows Chats tab) */\n cedrosPayEnabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\ntype TabId = 'deposits' | 'transactions' | 'chats';\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSol(lamports: number | null | undefined): string {\n if (lamports === null || lamports === undefined) return '—';\n const sol = lamports / 1_000_000_000;\n return `${sol.toFixed(4)} SOL`;\n}\n\nfunction formatCredits(lamports: number | null | undefined): string {\n if (lamports === null || lamports === undefined) return '—';\n // Credits are stored in lamports but displayed as a simple number\n const credits = lamports / 1_000_000_000;\n return credits.toFixed(4);\n}\n\nfunction formatTxType(txType: string): string {\n const typeMap: Record<string, string> = {\n DEPOSIT: 'Deposit',\n SPEND: 'Spend',\n ADJUSTMENT: 'Adjustment',\n REFUND: 'Refund',\n };\n return typeMap[txType.toUpperCase()] || txType;\n}\n\nfunction formatTxDescription(txType: string, referenceType?: string): string {\n if (referenceType) {\n const refMap: Record<string, string> = {\n deposit: 'Credit deposit',\n purchase: 'Purchase',\n api_call: 'API usage',\n subscription: 'Subscription',\n refund: 'Refund',\n bonus: 'Bonus credit',\n promo: 'Promotional credit',\n correction: 'Balance correction',\n };\n return refMap[referenceType.toLowerCase()] || referenceType;\n }\n // Fallback based on tx type\n const typeDescriptions: Record<string, string> = {\n DEPOSIT: 'Credit added',\n SPEND: 'Credit used',\n ADJUSTMENT: 'Manual adjustment',\n REFUND: 'Credit refunded',\n };\n return typeDescriptions[txType.toUpperCase()] || '—';\n}\n\n/**\n * Admin user detail display\n *\n * Shows comprehensive user information with deposit and credit history.\n */\nexport function AdminUserDetail({\n userId,\n onBack,\n currentUserId,\n onEditUser,\n onAdjustCredits,\n cedrosPayEnabled = false,\n className = '',\n}: AdminUserDetailProps) {\n const {\n isLoading,\n getUser,\n getUserDeposits,\n getUserCredits,\n getUserChats,\n deleteUser,\n forcePasswordReset,\n clearError,\n } = useAdminUsers();\n\n const [user, setUser] = useState<AdminUser | null>(null);\n const [credits, setCredits] = useState<AdminUserCreditsResponse | null>(null);\n const [deposits, setDeposits] = useState<AdminDepositListResponse | null>(null);\n const [chats, setChats] = useState<AdminUserChatsResponse | null>(null);\n const [activeTab, setActiveTab] = useState<TabId>('deposits');\n const [userError, setUserError] = useState<string | null>(null);\n const [creditsError, setCreditsError] = useState<string | null>(null);\n const [depositsError, setDepositsError] = useState<string | null>(null);\n const [chatsError, setChatsError] = useState<string | null>(null);\n const [actionInProgress, setActionInProgress] = useState(false);\n\n // Pagination state\n const [depositsOffset, setDepositsOffset] = useState(0);\n const [transactionsOffset, setTransactionsOffset] = useState(0);\n const [chatsOffset, setChatsOffset] = useState(0);\n const pageSize = 10;\n\n const fetchUser = useCallback(async () => {\n try {\n const userData = await getUser(userId);\n setUser(userData);\n setUserError(null);\n } catch (err) {\n setUserError(err instanceof Error ? err.message : 'Failed to load user');\n }\n }, [userId, getUser]);\n\n const fetchDeposits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: depositsOffset };\n const depositsData = await getUserDeposits(userId, params);\n setDeposits(depositsData);\n setDepositsError(null);\n } catch (err) {\n setDepositsError(err instanceof Error ? err.message : 'Failed to load deposits');\n }\n }, [userId, getUserDeposits, depositsOffset]);\n\n const fetchCredits = useCallback(async () => {\n try {\n const params: ListUsersParams = { limit: pageSize, offset: transactionsOffset };\n const creditsData = await getUserCredits(userId, params);\n setCredits(creditsData);\n setCreditsError(null);\n } catch (err) {\n setCreditsError(err instanceof Error ? err.message : 'Failed to load credits');\n }\n }, [userId, getUserCredits, transactionsOffset]);\n\n const fetchChats = useCallback(async () => {\n if (!cedrosPayEnabled) return;\n try {\n const params: ListUsersParams = { limit: pageSize, offset: chatsOffset };\n const chatsData = await getUserChats(userId, params);\n setChats(chatsData);\n setChatsError(null);\n } catch (err) {\n setChatsError(err instanceof Error ? err.message : 'Failed to load chat history');\n }\n }, [userId, getUserChats, chatsOffset, cedrosPayEnabled]);\n\n // Initial load\n useEffect(() => {\n fetchUser();\n fetchDeposits();\n fetchCredits();\n if (cedrosPayEnabled) {\n fetchChats();\n }\n }, [fetchUser, fetchDeposits, fetchCredits, fetchChats, cedrosPayEnabled]);\n\n const handleDelete = async () => {\n if (!user) return;\n if (user.id === currentUserId) {\n alert('You cannot delete your own account');\n return;\n }\n if (user.isSystemAdmin) {\n alert('Cannot delete a system admin. Remove admin status first.');\n return;\n }\n\n const confirmed = window.confirm(\n `Are you sure you want to delete ${user.name || user.email || 'this user'}? This action cannot be undone.`\n );\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await deleteUser(user.id);\n onBack();\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n const handlePasswordReset = async () => {\n if (!user?.email) {\n alert('User has no email address');\n return;\n }\n\n const confirmed = window.confirm(`Send a password reset email to ${user.email}?`);\n if (!confirmed) return;\n\n setActionInProgress(true);\n try {\n await forcePasswordReset(user.id);\n alert('Password reset email sent');\n } catch {\n // Error handled by hook\n } finally {\n setActionInProgress(false);\n }\n };\n\n // Pagination handlers\n const depositsTotalPages = deposits ? Math.ceil(deposits.total / pageSize) : 0;\n const depositsCurrentPage = Math.floor(depositsOffset / pageSize) + 1;\n\n const transactionsTotalPages = credits ? Math.ceil(credits.totalTransactions / pageSize) : 0;\n const transactionsCurrentPage = Math.floor(transactionsOffset / pageSize) + 1;\n\n const goToDepositsPage = (page: number) => {\n setDepositsOffset((page - 1) * pageSize);\n };\n\n const goToTransactionsPage = (page: number) => {\n setTransactionsOffset((page - 1) * pageSize);\n };\n\n const chatsTotalPages = chats ? Math.ceil(chats.total / pageSize) : 0;\n const chatsCurrentPage = Math.floor(chatsOffset / pageSize) + 1;\n\n const goToChatsPage = (page: number) => {\n setChatsOffset((page - 1) * pageSize);\n };\n\n // Critical error - user fetch failed\n if (userError) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-error ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-error\">{userError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline\"\n onClick={() => {\n clearError();\n setUserError(null);\n fetchUser();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && !user) {\n return (\n <div className={`cedros-admin-user-detail cedros-admin-user-detail-loading ${className}`}>\n <span className=\"cedros-admin-loading-indicator\" />\n <span className=\"cedros-admin-loading-text\">Loading user...</span>\n </div>\n );\n }\n\n if (!user) {\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onBack}\n >\n Back\n </button>\n <p className=\"cedros-admin-empty-message\">User not found.</p>\n </div>\n );\n }\n\n const isCurrentUser = user.id === currentUserId;\n\n return (\n <div className={`cedros-admin-user-detail ${className}`}>\n {/* Header */}\n <div className=\"cedros-admin-user-detail-header\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-back-btn\"\n onClick={onBack}\n >\n Back to Users\n </button>\n <div className=\"cedros-admin-user-detail-actions\">\n {onEditUser && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onEditUser(user)}\n disabled={actionInProgress}\n >\n Edit\n </button>\n )}\n {user.email && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={handlePasswordReset}\n disabled={actionInProgress}\n >\n Reset Password\n </button>\n )}\n {onAdjustCredits && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onAdjustCredits(user)}\n disabled={actionInProgress}\n >\n Adjust Credits\n </button>\n )}\n {!isCurrentUser && !user.isSystemAdmin && (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm cedros-admin-btn-danger\"\n onClick={handleDelete}\n disabled={actionInProgress}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n\n {/* User Info Section */}\n <div className=\"cedros-admin-user-detail-info\">\n <div className=\"cedros-admin-user-detail-avatar\">\n {user.picture ? (\n <img\n src={user.picture}\n alt={user.name || user.email || 'User'}\n className=\"cedros-admin-user-detail-avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-admin-user-detail-avatar-placeholder\">\n {(user.name?.[0] || user.email?.[0] || '?').toUpperCase()}\n </span>\n )}\n </div>\n <div className=\"cedros-admin-user-detail-meta\">\n <h2 className=\"cedros-admin-user-detail-name\">\n {user.name || 'Unknown'}\n {isCurrentUser && <span className=\"cedros-admin-user-you\">(you)</span>}\n </h2>\n <p className=\"cedros-admin-user-detail-email\">\n {user.email || 'No email'}\n {user.emailVerified && (\n <span className=\"cedros-admin-verified-badge\" title=\"Email verified\">\n Verified\n </span>\n )}\n </p>\n {user.isSystemAdmin && (\n <div className=\"cedros-admin-user-detail-badges\">\n <span className=\"cedros-admin-admin-badge cedros-admin-admin-badge-yes\">\n System Admin\n </span>\n </div>\n )}\n <div className=\"cedros-admin-user-detail-methods\">\n <span className=\"cedros-admin-user-detail-methods-label\">Auth Methods:</span>\n {user.authMethods.length > 0 ? (\n user.authMethods.map((method) => (\n <span\n key={method}\n className={`cedros-admin-auth-badge cedros-admin-auth-badge-${method}`}\n >\n {method}\n </span>\n ))\n ) : (\n <span className=\"cedros-admin-auth-badge cedros-admin-auth-badge-none\">none</span>\n )}\n </div>\n <p className=\"cedros-admin-user-detail-dates\">\n Registered: {formatDate(user.createdAt)} | Updated: {formatDate(user.updatedAt)}\n </p>\n </div>\n </div>\n\n {/* Stats Cards */}\n {creditsError ? (\n <div className=\"cedros-admin-stats-error\">\n <p className=\"cedros-admin-error-inline\">{creditsError}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n >\n Retry\n </button>\n </div>\n ) : credits ? (\n <div className=\"cedros-admin-user-detail-stats\">\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Credit Balance</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.currentBalanceLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Credited</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.totalDepositedLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Total Spent</span>\n <span className=\"cedros-admin-stat-value\">\n {formatCredits(credits.stats.totalSpentLamports)}\n </span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Deposits</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.depositCount}</span>\n </div>\n <div className=\"cedros-admin-stat-card\">\n <span className=\"cedros-admin-stat-label\">Transactions</span>\n <span className=\"cedros-admin-stat-value\">{credits.stats.spendCount}</span>\n </div>\n </div>\n ) : (\n <div className=\"cedros-admin-stats-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading credit stats...</span>\n </div>\n )}\n\n {/* Tabs */}\n <div className=\"cedros-admin-user-detail-tabs\">\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'deposits' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('deposits')}\n >\n Deposits ({deposits?.total ?? 0})\n </button>\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'transactions' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('transactions')}\n >\n Credits ({credits?.totalTransactions ?? 0})\n </button>\n {cedrosPayEnabled && (\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'chats' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('chats')}\n >\n Chats ({chats?.total ?? 0})\n </button>\n )}\n </div>\n\n {/* Tab Content */}\n <div className=\"cedros-admin-user-detail-content\">\n {activeTab === 'deposits' && (\n <DepositsTab\n deposits={deposits?.deposits ?? []}\n total={deposits?.total ?? 0}\n currentPage={depositsCurrentPage}\n totalPages={depositsTotalPages}\n onPageChange={goToDepositsPage}\n isLoading={isLoading}\n error={depositsError}\n onRetry={() => {\n setDepositsError(null);\n fetchDeposits();\n }}\n />\n )}\n {activeTab === 'transactions' && (\n <TransactionsTab\n transactions={credits?.transactions ?? []}\n total={credits?.totalTransactions ?? 0}\n currentPage={transactionsCurrentPage}\n totalPages={transactionsTotalPages}\n onPageChange={goToTransactionsPage}\n error={creditsError}\n onRetry={() => {\n setCreditsError(null);\n fetchCredits();\n }}\n isLoading={isLoading}\n />\n )}\n {activeTab === 'chats' && cedrosPayEnabled && (\n <ChatsTab\n sessions={chats?.sessions ?? []}\n total={chats?.total ?? 0}\n currentPage={chatsCurrentPage}\n totalPages={chatsTotalPages}\n onPageChange={goToChatsPage}\n error={chatsError}\n onRetry={() => {\n setChatsError(null);\n fetchChats();\n }}\n isLoading={isLoading}\n />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Tab Components\n// =============================================================================\n\ninterface DepositsTabProps {\n deposits: AdminDepositItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction DepositsTab({\n deposits,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: DepositsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && deposits.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading deposits...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No deposits found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Amount</div>\n <div className=\"cedros-admin-list-th\">Status</div>\n <div className=\"cedros-admin-list-th\">Transaction</div>\n </div>\n {deposits.map((deposit) => (\n <div key={deposit.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(deposit.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">{formatSol(deposit.amountLamports)}</div>\n <div className=\"cedros-admin-list-td\">\n <span className={`cedros-admin-status-badge cedros-admin-status-${deposit.status}`}>\n {deposit.status}\n </span>\n </div>\n <div className=\"cedros-admin-list-td cedros-admin-list-td-actions\">\n {deposit.txSignature ? (\n <>\n <span\n className=\"cedros-admin-list-td-mono\"\n title={deposit.txSignature}\n >\n {deposit.txSignature.slice(0, 8)}...\n </span>\n <a\n href={`https://orbmarkets.io/tx/${deposit.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"cedros-admin-icon-link\"\n title=\"View on Orbmarkets\"\n aria-label=\"View transaction on Orbmarkets\"\n >\n ↗\n </a>\n </>\n ) : (\n <span className=\"cedros-admin-list-td-muted\">—</span>\n )}\n </div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface TransactionsTabProps {\n transactions: AdminCreditTransactionItem[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction TransactionsTab({\n transactions,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: TransactionsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && transactions.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading transactions...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No credit transactions found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Type</div>\n <div className=\"cedros-admin-list-th\">Description</div>\n <div className=\"cedros-admin-list-th\">Amount</div>\n </div>\n {transactions.map((tx) => (\n <div key={tx.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(tx.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">\n <span\n className={`cedros-admin-tx-type cedros-admin-tx-type-${tx.txType.toLowerCase()}`}\n >\n {formatTxType(tx.txType)}\n </span>\n </div>\n <div className=\"cedros-admin-list-td\">\n {formatTxDescription(tx.txType, tx.referenceType)}\n </div>\n <div\n className={`cedros-admin-list-td ${tx.amountLamports >= 0 ? 'cedros-admin-amount-positive' : 'cedros-admin-amount-negative'}`}\n >\n {tx.amountLamports >= 0 ? '+' : ''}\n {formatCredits(tx.amountLamports)}\n </div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface ChatsTabProps {\n sessions: AdminChatSession[];\n total: number;\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n isLoading: boolean;\n error: string | null;\n onRetry: () => void;\n}\n\nfunction ChatsTab({\n sessions,\n total,\n currentPage,\n totalPages,\n onPageChange,\n isLoading,\n error,\n onRetry,\n}: ChatsTabProps) {\n if (error) {\n return (\n <div className=\"cedros-admin-tab-error\">\n <p className=\"cedros-admin-error-inline\">{error}</p>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={onRetry}\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (isLoading && sessions.length === 0) {\n return (\n <div className=\"cedros-admin-tab-loading\">\n <span className=\"cedros-admin-loading-indicator\" />\n <span>Loading chat history...</span>\n </div>\n );\n }\n\n if (total === 0) {\n return <div className=\"cedros-admin-empty-message\">No chat sessions found.</div>;\n }\n\n return (\n <>\n <div className=\"cedros-admin-list-table\">\n <div className=\"cedros-admin-list-thead\">\n <div className=\"cedros-admin-list-th\">Date</div>\n <div className=\"cedros-admin-list-th\">Session</div>\n <div className=\"cedros-admin-list-th\">Messages</div>\n </div>\n {sessions.map((session) => (\n <div key={session.id} className=\"cedros-admin-list-row\">\n <div className=\"cedros-admin-list-td\">{formatDateTime(session.createdAt)}</div>\n <div className=\"cedros-admin-list-td\">\n {session.title || `Chat ${session.id.slice(0, 8)}...`}\n </div>\n <div className=\"cedros-admin-list-td\">{session.messageCount}</div>\n </div>\n ))}\n </div>\n {totalPages > 1 && (\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n total={total}\n onPageChange={onPageChange}\n />\n )}\n </>\n );\n}\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n total: number;\n onPageChange: (page: number) => void;\n}\n\nfunction Pagination({ currentPage, totalPages, total, onPageChange }: PaginationProps) {\n return (\n <div className=\"cedros-admin-pagination\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-admin-page-info\">\n Page {currentPage} of {totalPages} ({total} total)\n </span>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n );\n}\n","/**\n * PermissionsSection - Dashboard permissions matrix for role configuration\n *\n * Allows org owners to configure which dashboard sections each role can access.\n */\n\nimport React, { useCallback, useRef, useEffect } from 'react';\nimport { useDashboardPermissions } from '../../hooks/useDashboardPermissions';\nimport { useServerFeatures } from '../../hooks/useServerFeatures';\nimport {\n LOGIN_DASHBOARD_SECTIONS,\n PAY_DASHBOARD_SECTIONS,\n DASHBOARD_SECTION_LABELS,\n type DashboardSection,\n type DashboardPermissions,\n type OrgRole,\n} from '../../types/org';\n\ninterface PermissionToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label: string;\n}\n\nfunction PermissionToggle({ checked, onChange, disabled, label }: PermissionToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n className={`cedros-toggle cedros-toggle-sm ${checked ? 'cedros-toggle-on' : 'cedros-toggle-off'} ${disabled ? 'cedros-toggle-disabled' : ''}`}\n onClick={() => !disabled && onChange(!checked)}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n </button>\n );\n}\n\nexport interface PermissionsSectionProps {\n /** Current user's role in the org */\n userRole?: OrgRole | null;\n}\n\nexport function PermissionsSection({ userRole }: PermissionsSectionProps): React.JSX.Element {\n const { permissions, updatePermissions, isLoading, isUpdating, error } = useDashboardPermissions();\n const { features, isLoading: featuresLoading } = useServerFeatures();\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingPermissions = useRef<DashboardPermissions | null>(null);\n\n const isOwner = userRole === 'owner';\n const cedrosPayEnabled = features.cedrosPay;\n\n // Debounced save - batch rapid changes\n const debouncedSave = useCallback(\n (newPermissions: DashboardPermissions) => {\n pendingPermissions.current = newPermissions;\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n if (pendingPermissions.current) {\n updatePermissions(pendingPermissions.current).catch(() => {\n // Error is already set in state by the hook\n });\n pendingPermissions.current = null;\n }\n }, 500);\n },\n [updatePermissions]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, []);\n\n const handleToggle = useCallback(\n (role: 'admin' | 'member', section: DashboardSection, enabled: boolean) => {\n const newPermissions: DashboardPermissions = {\n ...permissions,\n [role]: {\n ...permissions[role],\n [section]: enabled,\n },\n };\n debouncedSave(newPermissions);\n },\n [permissions, debouncedSave]\n );\n\n if (isLoading || featuresLoading) {\n return (\n <div className=\"cedros-dashboard__section\">\n <div className=\"cedros-dashboard__loading\">Loading permissions...</div>\n </div>\n );\n }\n\n if (!isOwner) {\n return (\n <div className=\"cedros-dashboard__section\">\n <div className=\"cedros-dashboard__empty\">\n Only organization owners can configure dashboard permissions.\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"cedros-dashboard__section cedros-permissions-section\">\n <div className=\"cedros-permissions-header\">\n <p className=\"cedros-permissions-description\">\n Configure which dashboard sections each role can access. Owners always have full access.\n </p>\n {error && <div className=\"cedros-permissions-error\">{error.message}</div>}\n {isUpdating && <span className=\"cedros-permissions-saving\">Saving...</span>}\n </div>\n\n <div className=\"cedros-permissions-matrix\">\n <table className=\"cedros-permissions-table\">\n <tbody>\n {/* Cedros Login Sections */}\n <tr className=\"cedros-permissions-group-header\">\n <th className=\"cedros-permissions-section-header\">Cedros Login</th>\n <th className=\"cedros-permissions-role-header\">Admin</th>\n <th className=\"cedros-permissions-role-header\">Member</th>\n </tr>\n {LOGIN_DASHBOARD_SECTIONS.map((section) => (\n <tr key={section} className=\"cedros-permissions-row\">\n <td className=\"cedros-permissions-section-label\">\n {DASHBOARD_SECTION_LABELS[section]}\n </td>\n <td className=\"cedros-permissions-toggle-cell\">\n <PermissionToggle\n checked={permissions.admin[section] ?? false}\n onChange={(enabled) => handleToggle('admin', section, enabled)}\n disabled={isUpdating}\n label={`Admin access to ${DASHBOARD_SECTION_LABELS[section]}`}\n />\n </td>\n <td className=\"cedros-permissions-toggle-cell\">\n <PermissionToggle\n checked={permissions.member[section] ?? false}\n onChange={(enabled) => handleToggle('member', section, enabled)}\n disabled={isUpdating}\n label={`Member access to ${DASHBOARD_SECTION_LABELS[section]}`}\n />\n </td>\n </tr>\n ))}\n\n {/* Cedros Pay Sections (only when cedrosPay feature is enabled) */}\n {cedrosPayEnabled && (\n <>\n <tr className=\"cedros-permissions-group-header\">\n <th className=\"cedros-permissions-section-header\">Cedros Pay</th>\n <th className=\"cedros-permissions-role-header\">Admin</th>\n <th className=\"cedros-permissions-role-header\">Member</th>\n </tr>\n {PAY_DASHBOARD_SECTIONS.map((section) => (\n <tr key={section} className=\"cedros-permissions-row\">\n <td className=\"cedros-permissions-section-label\">\n {DASHBOARD_SECTION_LABELS[section]}\n </td>\n <td className=\"cedros-permissions-toggle-cell\">\n <PermissionToggle\n checked={permissions.admin[section] ?? false}\n onChange={(enabled) => handleToggle('admin', section, enabled)}\n disabled={isUpdating}\n label={`Admin access to ${DASHBOARD_SECTION_LABELS[section]}`}\n />\n </td>\n <td className=\"cedros-permissions-toggle-cell\">\n <PermissionToggle\n checked={permissions.member[section] ?? false}\n onChange={(enabled) => handleToggle('member', section, enabled)}\n disabled={isUpdating}\n label={`Member access to ${DASHBOARD_SECTION_LABELS[section]}`}\n />\n </td>\n </tr>\n ))}\n </>\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","/**\n * Profile Dropdown Component\n *\n * Displays user avatar/name with a dropdown menu for settings and logout.\n */\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\nexport interface ProfileDropdownProps {\n /** User's display name */\n name?: string;\n /** User's email */\n email?: string;\n /** User's profile picture URL */\n picture?: string;\n /** Callback when Settings is clicked */\n onSettings?: () => void;\n /** Callback when Logout is clicked */\n onLogout?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Profile dropdown button with settings and logout options.\n *\n * @example\n * ```tsx\n * <ProfileDropdown\n * name={user.name}\n * email={user.email}\n * picture={user.picture}\n * onSettings={() => navigate('/settings')}\n * onLogout={logout}\n * />\n * ```\n */\nexport function ProfileDropdown({\n name,\n email,\n picture,\n onSettings,\n onLogout,\n className = '',\n}: ProfileDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close dropdown on escape key\n useEffect(() => {\n function handleEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleSettings = useCallback(() => {\n setIsOpen(false);\n onSettings?.();\n }, [onSettings]);\n\n const handleLogout = useCallback(() => {\n setIsOpen(false);\n onLogout?.();\n }, [onLogout]);\n\n const displayName = name || 'User';\n const initial = (name?.[0] || email?.[0] || '?').toUpperCase();\n\n return (\n <div className={`cedros-profile-dropdown ${className}`} ref={dropdownRef}>\n <button\n type=\"button\"\n className=\"cedros-profile-dropdown__trigger\"\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n >\n <div className=\"cedros-profile-dropdown__avatar\">\n {picture ? (\n <img\n src={picture}\n alt={displayName}\n className=\"cedros-profile-dropdown__avatar-img\"\n referrerPolicy=\"no-referrer\"\n />\n ) : (\n <span className=\"cedros-profile-dropdown__avatar-placeholder\">{initial}</span>\n )}\n </div>\n <div className=\"cedros-profile-dropdown__info\">\n <span className=\"cedros-profile-dropdown__name\">{displayName}</span>\n {email && <span className=\"cedros-profile-dropdown__email\">{email}</span>}\n </div>\n <svg\n className={`cedros-profile-dropdown__chevron ${isOpen ? 'cedros-profile-dropdown__chevron--open' : ''}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"cedros-profile-dropdown__menu\" role=\"menu\">\n {onSettings && (\n <button\n type=\"button\"\n className=\"cedros-profile-dropdown__item\"\n onClick={handleSettings}\n role=\"menuitem\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n Settings\n </button>\n )}\n {onLogout && (\n <button\n type=\"button\"\n className=\"cedros-profile-dropdown__item cedros-profile-dropdown__item--danger\"\n onClick={handleLogout}\n role=\"menuitem\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\n </svg>\n Log out\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Unified Admin Dashboard\n *\n * A complete, ready-to-use admin panel following shadcn/ui dashboard patterns.\n *\n * @example\n * ```tsx\n * // Minimal setup - everything included\n * function AdminPage() {\n * return <CedrosAdminDashboard />;\n * }\n *\n * // Customized sections\n * function AdminPage() {\n * return (\n * <CedrosAdminDashboard\n * sections={['users', 'team', 'deposits', 'settings-auth']}\n * title=\"My App Admin\"\n * />\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport type { Permission } from '../../types';\nimport { MemberList } from '../members/MemberList';\nimport { InviteForm } from '../invites/InviteForm';\nimport { InviteList } from '../invites/InviteList';\nimport { SetupWizard } from './SetupWizard';\nimport {\n AuthenticationSettings,\n EmbeddedWalletSettings,\n MessagingSettings,\n CreditSystemSettings,\n ServerSettings,\n} from './settings';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { useOrgs } from '../../hooks/useOrgs';\nimport { useMembers } from '../../hooks/useMembers';\nimport { useInvites } from '../../hooks/useInvites';\nimport { useCedrosLogin } from '../../context/useCedrosLogin';\nimport { useSetup } from '../../hooks/useSetup';\nimport { useServerFeatures } from '../../hooks/useServerFeatures';\nimport { useSystemSettings } from '../../hooks/useSystemSettings';\nimport { useAdminUsers } from '../../hooks/useAdminUsers';\nimport { useDashboardPermissions } from '../../hooks/useDashboardPermissions';\nimport { AdminDepositStats } from '../deposit/admin/AdminDepositStats';\nimport { AdminWithdrawalStats } from '../deposit/admin/AdminWithdrawalStats';\nimport { AdminDepositList } from '../deposit/admin/AdminDepositList';\nimport { AdminWithdrawalQueue } from '../deposit/admin/AdminWithdrawalQueue';\nimport { AdminPrivacyPeriodDeposits } from '../deposit/admin/AdminPrivacyPeriodDeposits';\nimport { AdminWithdrawalHistory } from '../deposit/admin/AdminWithdrawalHistory';\nimport { AdminUserList } from './AdminUserList';\nimport { AdminUserDetail } from './AdminUserDetail';\nimport { StatsBar } from './StatsBar';\nimport { PermissionsSection } from './PermissionsSection';\nimport { ProfileDropdown } from './ProfileDropdown';\nimport type { AdminUser } from '../../types';\n\n/** Available dashboard sections */\nexport type DashboardSection =\n | 'users'\n | 'team'\n | 'deposits'\n | 'withdrawals'\n | 'settings-wallet'\n | 'settings-auth'\n | 'settings-messaging'\n | 'settings-credits'\n | 'settings-server';\n\nexport interface CedrosAdminDashboardProps {\n /** Dashboard title */\n title?: string;\n /** Sections to display (defaults to all) */\n sections?: DashboardSection[];\n /** Initial active section */\n defaultSection?: DashboardSection;\n /** Auto-refresh interval for stats in ms (0 to disable) */\n refreshInterval?: number;\n /** Items per page for lists */\n pageSize?: number;\n /** Callback when section changes */\n onSectionChange?: (section: DashboardSection) => void;\n /** Callback when user clicks Settings in profile dropdown */\n onSettingsClick?: () => void;\n /** Callback when user clicks Logout in profile dropdown (defaults to context logout) */\n onLogoutClick?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n// SVG Icons (Lucide-style, 24x24)\nconst Icons = {\n users: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n members: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n invites: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n deposits: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\" />\n <path d=\"M12 18V6\" />\n </svg>\n ),\n withdrawals: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M9 22v-4h6v4\" />\n <path d=\"M8 6h.01\" />\n <path d=\"M16 6h.01\" />\n <path d=\"M12 6h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M12 14h.01\" />\n <path d=\"M16 10h.01\" />\n <path d=\"M16 14h.01\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M8 14h.01\" />\n </svg>\n ),\n settings: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ),\n wallet: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n ),\n chevronRight: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n ),\n // Settings sub-page icons\n key: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\" />\n </svg>\n ),\n toggles: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"20\" height=\"12\" x=\"2\" y=\"6\" rx=\"6\" />\n <circle cx=\"8\" cy=\"12\" r=\"2\" />\n </svg>\n ),\n shield: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n ),\n mail: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n webhook: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\" />\n <path d=\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\" />\n <path d=\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\" />\n </svg>\n ),\n coins: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M18.09 10.37A6 6 0 1 1 10.34 18\" />\n <path d=\"M7 6h1v4\" />\n <path d=\"m16.71 13.88.7.71-2.82 2.82\" />\n </svg>\n ),\n server: (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\" />\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" x2=\"6.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"6\" x2=\"6.01\" y1=\"18\" y2=\"18\" />\n </svg>\n ),\n};\n\ninterface SectionConfig {\n id: DashboardSection;\n label: string;\n icon: React.ReactNode;\n /** Optional group name for sidebar organization */\n group?: string;\n /** Feature flag required for this section (from server settings) */\n requiredFeature?: 'organizations' | 'credits';\n}\n\nconst ALL_SECTIONS: SectionConfig[] = [\n // Top-level menu items\n { id: 'users', label: 'Users', icon: Icons.users },\n { id: 'team', label: 'Team', icon: Icons.members },\n { id: 'deposits', label: 'Deposits', icon: Icons.deposits, requiredFeature: 'credits' },\n { id: 'withdrawals', label: 'Withdrawals', icon: Icons.withdrawals, requiredFeature: 'credits' },\n // Configuration group\n { id: 'settings-auth', label: 'Authentication', icon: Icons.key, group: 'Configuration' },\n { id: 'settings-messaging', label: 'Auth Messages', icon: Icons.mail, group: 'Configuration' },\n { id: 'settings-wallet', label: 'User Wallets', icon: Icons.wallet, group: 'Configuration' },\n {\n id: 'settings-credits',\n label: 'Credit System',\n icon: Icons.coins,\n group: 'Configuration',\n requiredFeature: 'credits',\n },\n { id: 'settings-server', label: 'Auth Server', icon: Icons.server, group: 'Configuration' },\n];\n\n/**\n * Unified Admin Dashboard\n *\n * Provides a complete admin interface with sidebar navigation.\n * Follows shadcn/ui dashboard patterns.\n */\nexport function CedrosAdminDashboard({\n title = 'Dashboard',\n sections = [\n 'users',\n 'team',\n 'deposits',\n 'withdrawals',\n 'settings-wallet',\n 'settings-auth',\n 'settings-messaging',\n 'settings-credits',\n 'settings-server',\n ],\n defaultSection = 'users',\n refreshInterval = 0,\n pageSize = 20,\n onSectionChange,\n onSettingsClick,\n onLogoutClick,\n className = '',\n}: CedrosAdminDashboardProps) {\n const [activeSection, setActiveSection] = useState<DashboardSection>(defaultSection);\n const [configExpanded, setConfigExpanded] = useState(true);\n\n const { user, logout } = useCedrosLogin();\n const { activeOrg, role, isLoading: orgsLoading, fetchOrgs, hasPermission } = useOrgs();\n const { status, isLoading: setupLoading, checkStatus } = useSetup();\n const { features, isLoading: featuresLoading } = useServerFeatures();\n const { canAccess } = useDashboardPermissions();\n\n const handleSectionChange = useCallback(\n (section: DashboardSection) => {\n setActiveSection(section);\n onSectionChange?.(section);\n },\n [onSectionChange]\n );\n\n // Filter sections by: 1) explicitly enabled in props, 2) feature flag enabled, 3) role permissions\n const enabledSections = ALL_SECTIONS.filter((s) => {\n // Must be in the sections prop\n if (!sections.includes(s.id)) return false;\n // If section requires a feature, check if feature is enabled\n if (s.requiredFeature && !features[s.requiredFeature]) return false;\n // Check role-based dashboard permissions (owner always has access via canAccess)\n if (!canAccess(s.id)) return false;\n return true;\n });\n\n const currentSection = enabledSections.find((s) => s.id === activeSection);\n const activeSectionDisabled = !currentSection && !featuresLoading;\n\n useEffect(() => {\n fetchOrgs();\n checkStatus();\n }, [fetchOrgs, checkStatus]);\n\n // If active section is disabled (feature flag off), redirect to users\n useEffect(() => {\n if (activeSectionDisabled && enabledSections.length > 0) {\n setActiveSection('users');\n }\n }, [activeSectionDisabled, enabledSections.length]);\n\n // Show setup wizard if no admin exists\n if (!setupLoading && status?.needsSetup) {\n return (\n <div className={`cedros-admin cedros-dashboard cedros-dashboard--setup ${className}`}>\n <SetupWizard onComplete={() => checkStatus()} />\n </div>\n );\n }\n\n if ((orgsLoading || setupLoading || featuresLoading) && !activeOrg) {\n return (\n <div className={`cedros-admin cedros-dashboard cedros-dashboard--loading ${className}`}>\n <LoadingSpinner />\n <span className=\"cedros-dashboard__loading-text\">Loading...</span>\n </div>\n );\n }\n\n const needsOrg = activeSection === 'team';\n if (needsOrg && !activeOrg) {\n return (\n <div className={`cedros-admin cedros-dashboard ${className}`}>\n <ErrorMessage error=\"No organization selected. Please select an organization first.\" />\n </div>\n );\n }\n\n return (\n <div className={`cedros-admin cedros-dashboard ${className}`}>\n {/* Sidebar */}\n <aside className=\"cedros-dashboard__sidebar\">\n <div className=\"cedros-dashboard__sidebar-header\">\n <div className=\"cedros-dashboard__logo\">\n {Icons.wallet}\n <span className=\"cedros-dashboard__logo-text\">{title}</span>\n </div>\n </div>\n\n <nav className=\"cedros-dashboard__nav\">\n {/* Top-level menu items (no group) */}\n <div className=\"cedros-dashboard__nav-group\">\n <span className=\"cedros-dashboard__nav-label\">Menu</span>\n {enabledSections\n .filter((s) => !s.group)\n .map((section) => (\n <button\n key={section.id}\n type=\"button\"\n className={`cedros-dashboard__nav-item ${activeSection === section.id ? 'cedros-dashboard__nav-item--active' : ''}`}\n onClick={() => handleSectionChange(section.id)}\n aria-current={activeSection === section.id ? 'page' : undefined}\n >\n <span className=\"cedros-dashboard__nav-icon\">{section.icon}</span>\n <span className=\"cedros-dashboard__nav-text\">{section.label}</span>\n </button>\n ))}\n </div>\n\n {/* Configuration group (collapsible) */}\n {enabledSections.some((s) => s.group === 'Configuration') && (\n <div className=\"cedros-dashboard__nav-group\">\n <button\n type=\"button\"\n className=\"cedros-dashboard__nav-label cedros-dashboard__nav-label--collapsible\"\n onClick={() => setConfigExpanded(!configExpanded)}\n aria-expanded={configExpanded}\n >\n <span>Configuration</span>\n <span className={`cedros-dashboard__nav-chevron ${configExpanded ? 'cedros-dashboard__nav-chevron--expanded' : ''}`}>\n {Icons.chevronRight}\n </span>\n </button>\n {configExpanded &&\n enabledSections\n .filter((s) => s.group === 'Configuration')\n .map((section) => (\n <button\n key={section.id}\n type=\"button\"\n className={`cedros-dashboard__nav-item ${activeSection === section.id ? 'cedros-dashboard__nav-item--active' : ''}`}\n onClick={() => handleSectionChange(section.id)}\n aria-current={activeSection === section.id ? 'page' : undefined}\n >\n <span className=\"cedros-dashboard__nav-icon\">{section.icon}</span>\n <span className=\"cedros-dashboard__nav-text\">{section.label}</span>\n </button>\n ))}\n </div>\n )}\n </nav>\n\n {/* User profile dropdown at bottom */}\n {user && (\n <div className=\"cedros-dashboard__sidebar-footer\">\n <ProfileDropdown\n name={user.name}\n email={user.email}\n picture={user.picture}\n onSettings={onSettingsClick}\n onLogout={onLogoutClick ?? logout}\n />\n </div>\n )}\n </aside>\n\n {/* Main Content */}\n <main className=\"cedros-dashboard__main\">\n <header className=\"cedros-dashboard__header\">\n <div className=\"cedros-dashboard__breadcrumb\">\n <span className=\"cedros-dashboard__breadcrumb-root\">{title}</span>\n <span className=\"cedros-dashboard__breadcrumb-sep\">{Icons.chevronRight}</span>\n <span className=\"cedros-dashboard__breadcrumb-current\">{currentSection?.label}</span>\n </div>\n </header>\n\n <div className=\"cedros-dashboard__content\">\n {activeSection === 'users' && (\n <UsersSection pageSize={pageSize} currentUserId={user?.id} />\n )}\n {activeSection === 'team' && activeOrg && (\n <TeamSection\n orgId={activeOrg.id}\n currentUserId={user?.id}\n hasPermission={hasPermission}\n role={role}\n />\n )}\n {activeSection === 'deposits' && (\n <DepositsSection pageSize={pageSize} refreshInterval={refreshInterval} />\n )}\n {activeSection === 'withdrawals' && (\n <WithdrawalsSection pageSize={pageSize} refreshInterval={refreshInterval} />\n )}\n {activeSection === 'settings-auth' && (\n <div className=\"cedros-dashboard__section\">\n <AuthenticationSettings />\n </div>\n )}\n {activeSection === 'settings-wallet' && (\n <div className=\"cedros-dashboard__section\">\n <EmbeddedWalletSettings />\n </div>\n )}\n {activeSection === 'settings-messaging' && (\n <div className=\"cedros-dashboard__section\">\n <MessagingSettings />\n </div>\n )}\n {activeSection === 'settings-credits' && (\n <div className=\"cedros-dashboard__section\">\n <CreditSystemSettings />\n </div>\n )}\n {activeSection === 'settings-server' && (\n <div className=\"cedros-dashboard__section\">\n <ServerSettings />\n </div>\n )}\n </div>\n </main>\n </div>\n );\n}\n\n// =============================================================================\n// Section Components\n// =============================================================================\n\ninterface UsersSectionProps {\n pageSize: number;\n currentUserId?: string;\n}\n\nfunction UsersSection({ pageSize, currentUserId }: UsersSectionProps) {\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const [stats, setStats] = useState<{\n total: number;\n authMethodCounts: Record<string, number>;\n } | null>(null);\n const [statsLoading, setStatsLoading] = useState(false);\n const [statsError, setStatsError] = useState<string | null>(null);\n const { getStats } = useAdminUsers();\n const { fetchSettings, getValue } = useSystemSettings();\n const [settingsFetched, setSettingsFetched] = useState(false);\n\n useEffect(() => {\n if (!settingsFetched) {\n fetchSettings();\n setSettingsFetched(true);\n }\n }, [fetchSettings, settingsFetched]);\n\n const isSettingEnabled = useCallback(\n (key: string): boolean => {\n const value = getValue(key);\n if (value === undefined) return false;\n return value === 'true' || value === '1';\n },\n [getValue]\n );\n\n const fetchUserStats = useCallback(async () => {\n setStatsLoading(true);\n setStatsError(null);\n\n try {\n const result = await getStats();\n setStats(result);\n } catch (err) {\n setStatsError(err instanceof Error ? err.message : 'Failed to load user stats');\n } finally {\n setStatsLoading(false);\n }\n }, [getStats]);\n\n useEffect(() => {\n fetchUserStats();\n }, [fetchUserStats]);\n\n const statsItems = useMemo(() => {\n const items = [\n { label: 'Total Users', value: stats?.total ?? '—' },\n ];\n\n const showEmail = isSettingEnabled('auth_email_enabled');\n const showGoogle = isSettingEnabled('auth_google_enabled');\n const showApple = isSettingEnabled('auth_apple_enabled');\n const showSolana = isSettingEnabled('auth_solana_enabled');\n const showPasskeys = isSettingEnabled('auth_webauthn_enabled');\n const showSso = isSettingEnabled('feature_sso');\n\n if (showEmail) {\n items.push({ label: 'Email Users', value: stats?.authMethodCounts.email ?? 0 });\n }\n if (showGoogle) {\n items.push({ label: 'Google Users', value: stats?.authMethodCounts.google ?? 0 });\n }\n if (showApple) {\n items.push({ label: 'Apple Users', value: stats?.authMethodCounts.apple ?? 0 });\n }\n if (showSolana) {\n items.push({ label: 'Solana Users', value: stats?.authMethodCounts.solana ?? 0 });\n }\n if (showPasskeys) {\n items.push({ label: 'Passkey Users', value: stats?.authMethodCounts.webauthn ?? 0 });\n }\n if (showSso) {\n items.push({ label: 'SSO Provider Users', value: stats?.authMethodCounts.sso ?? 0 });\n }\n\n return items;\n }, [stats, isSettingEnabled]);\n\n if (selectedUser) {\n return (\n <div className=\"cedros-dashboard__section\">\n <AdminUserDetail\n userId={selectedUser.id}\n currentUserId={currentUserId}\n onBack={() => setSelectedUser(null)}\n />\n </div>\n );\n }\n\n return (\n <div className=\"cedros-dashboard__section\">\n <StatsBar stats={statsItems} isLoading={statsLoading} onRefresh={fetchUserStats} />\n {statsError && <p className=\"cedros-admin-error-inline\">{statsError}</p>}\n\n <AdminUserList\n pageSize={pageSize}\n currentUserId={currentUserId}\n onUserClick={(user) => setSelectedUser(user)}\n />\n </div>\n );\n}\n\ntype TeamTab = 'members' | 'invites' | 'permissions';\n\ninterface TeamSectionProps {\n orgId: string;\n currentUserId?: string;\n hasPermission: (permission: Permission) => boolean;\n role: string | null;\n}\n\nfunction TeamSection({ orgId, currentUserId, hasPermission, role }: TeamSectionProps) {\n const [activeTab, setActiveTab] = useState<TeamTab>('members');\n\n const { members, isLoading: membersLoading, error: membersError, fetchMembers, updateMemberRole, removeMember } =\n useMembers(orgId);\n const { invites, isLoading: invitesLoading, error: invitesError, fetchInvites, createInvite, cancelInvite, resendInvite } =\n useInvites(orgId);\n\n useEffect(() => {\n fetchMembers();\n fetchInvites();\n }, [fetchMembers, fetchInvites]);\n\n const canInvite = hasPermission('invite:create');\n const canCancel = hasPermission('invite:cancel');\n const pendingCount = invites.length;\n const roleCounts = members.reduce(\n (acc, member) => {\n acc[member.role] = (acc[member.role] ?? 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n const ownerCount = roleCounts.owner ?? 0;\n const adminCount = roleCounts.admin ?? 0;\n const memberCount = roleCounts.member ?? 0;\n\n return (\n <div className=\"cedros-dashboard__team\">\n <StatsBar\n stats={[\n { label: 'Owners', value: ownerCount },\n { label: 'Admins', value: adminCount },\n { label: 'Members', value: memberCount },\n { label: 'Pending Invites', value: pendingCount },\n ]}\n />\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'members' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('members')}\n aria-selected={activeTab === 'members'}\n role=\"tab\"\n >\n Members\n </button>\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'invites' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('invites')}\n aria-selected={activeTab === 'invites'}\n role=\"tab\"\n >\n Pending Invites{pendingCount > 0 && ` (${pendingCount})`}\n </button>\n {role === 'owner' && (\n <button\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === 'permissions' ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab('permissions')}\n aria-selected={activeTab === 'permissions'}\n role=\"tab\"\n >\n Permissions\n </button>\n )}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {activeTab === 'members' && (\n <MemberList\n members={members}\n currentUserId={currentUserId}\n isLoading={membersLoading}\n error={membersError?.message}\n canManage={hasPermission('member:remove')}\n canChangeRoles={hasPermission('member:role_change')}\n onUpdateRole={updateMemberRole}\n onRemove={removeMember}\n />\n )}\n\n {activeTab === 'invites' && (\n <div className=\"cedros-dashboard__invites\">\n {canInvite && (\n <div className=\"cedros-dashboard__section\">\n <div className=\"cedros-dashboard__section-header\">\n <h3 className=\"cedros-dashboard__section-title\">Send Invitation</h3>\n </div>\n <InviteForm onSubmit={createInvite} isLoading={invitesLoading} error={invitesError?.message} />\n </div>\n )}\n\n <div className=\"cedros-dashboard__section\">\n <InviteList\n invites={invites}\n isLoading={invitesLoading}\n error={invitesError?.message}\n canManage={canCancel || canInvite}\n onCancel={canCancel ? cancelInvite : undefined}\n onResend={canInvite ? resendInvite : undefined}\n />\n </div>\n </div>\n )}\n\n {activeTab === 'permissions' && role === 'owner' && (\n <PermissionsSection userRole={role} />\n )}\n </div>\n </div>\n );\n}\n\ninterface DepositsSectionProps {\n pageSize: number;\n refreshInterval: number;\n}\n\nfunction DepositsSection({ pageSize, refreshInterval }: DepositsSectionProps) {\n const [statusFilter, setStatusFilter] = useState<string>('');\n\n return (\n <div className=\"cedros-dashboard__deposits\">\n {/* Stats summary */}\n <AdminDepositStats refreshInterval={refreshInterval} />\n\n {/* Filter and list */}\n <div className=\"cedros-dashboard__deposits-list\">\n <div className=\"cedros-dashboard__toolbar\">\n <div className=\"cedros-dashboard__filter\">\n <label className=\"cedros-dashboard__filter-label\" htmlFor=\"status-filter\">\n Status\n </label>\n <select\n id=\"status-filter\"\n className=\"cedros-dashboard__select\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n <option value=\"pending\">Pending</option>\n <option value=\"detected\">Detected</option>\n <option value=\"processing\">Processing</option>\n <option value=\"completed\">Completed</option>\n <option value=\"withdrawn\">Withdrawn</option>\n <option value=\"expired\">Expired</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </div>\n\n <AdminDepositList\n statusFilter={statusFilter || undefined}\n pageSize={pageSize}\n refreshInterval={refreshInterval}\n />\n </div>\n </div>\n );\n}\n\ninterface WithdrawalsSectionProps {\n pageSize: number;\n refreshInterval: number;\n}\n\nfunction WithdrawalsSection({ pageSize, refreshInterval }: WithdrawalsSectionProps) {\n return (\n <div className=\"cedros-dashboard__withdrawals\">\n <AdminWithdrawalStats refreshInterval={refreshInterval} />\n <p className=\"cedros-dashboard__text-muted\">\n Track deposits through the withdrawal pipeline: privacy period, ready for processing, and\n completed.\n </p>\n\n {/* Pipeline view: Privacy Period → Ready → Completed */}\n <div className=\"cedros-dashboard__pipeline\">\n <AdminPrivacyPeriodDeposits pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalQueue pageSize={pageSize} refreshInterval={refreshInterval} />\n <AdminWithdrawalHistory pageSize={pageSize} refreshInterval={refreshInterval} />\n </div>\n </div>\n );\n}\n","/**\n * AdminShell - Unified Admin Dashboard Host\n *\n * A shell component that hosts admin plugins from cedros-login, cedros-pay,\n * or any compatible plugin. Provides unified sidebar navigation and content area.\n *\n * @example\n * ```tsx\n * import { AdminShell } from '@cedros/login-react';\n * import { cedrosLoginPlugin } from '@cedros/login-react';\n * import { cedrosPayPlugin } from '@cedros/pay-react';\n *\n * function AdminPage() {\n * const hostContext = useBuildHostContext();\n * return (\n * <AdminShell\n * plugins={[cedrosLoginPlugin, cedrosPayPlugin]}\n * hostContext={hostContext}\n * />\n * );\n * }\n * ```\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n Suspense,\n type ReactNode,\n} from 'react';\nimport type {\n AdminPlugin,\n PluginRegistry,\n HostContext,\n QualifiedSectionId,\n PluginContext,\n ResolvedSection,\n} from './types';\nimport { LoadingSpinner } from '../components/shared/LoadingSpinner';\nimport { ProfileDropdown } from '../components/admin/ProfileDropdown';\nimport {\n CedrosLoginContext,\n type CedrosLoginContextValue,\n} from '../context/CedrosLoginContext';\nimport type { AuthUser } from '../types';\n\n// ============================================================================\n// Plugin Registry Implementation\n// ============================================================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private plugins = new Map<string, AdminPlugin>();\n private listeners = new Set<(plugins: AdminPlugin[]) => void>();\n\n register(plugin: AdminPlugin): void {\n if (this.plugins.has(plugin.id)) {\n console.warn(`Plugin ${plugin.id} already registered, replacing...`);\n }\n this.plugins.set(plugin.id, plugin);\n plugin.onRegister?.(this);\n this.notify();\n }\n\n unregister(pluginId: string): void {\n const plugin = this.plugins.get(pluginId);\n if (plugin) {\n plugin.onUnregister?.();\n this.plugins.delete(pluginId);\n this.notify();\n }\n }\n\n get(pluginId: string): AdminPlugin | undefined {\n return this.plugins.get(pluginId);\n }\n\n getAll(): AdminPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n subscribe(listener: (plugins: AdminPlugin[]) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n const plugins = this.getAll();\n this.listeners.forEach((listener) => listener(plugins));\n }\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AdminShellContextValue {\n registry: PluginRegistry;\n hostContext: HostContext;\n activeSection: QualifiedSectionId | null;\n setActiveSection: (section: QualifiedSectionId) => void;\n getPluginContext: (pluginId: string) => PluginContext | null;\n}\n\nconst AdminShellContext = createContext<AdminShellContextValue | null>(null);\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useAdminShell(): AdminShellContextValue {\n const ctx = useContext(AdminShellContext);\n if (!ctx) throw new Error('useAdminShell must be used within AdminShell');\n return ctx;\n}\n\n// ============================================================================\n// Props\n// ============================================================================\n\nexport interface AdminShellProps {\n /** Dashboard title */\n title?: string;\n /** Plugins to load */\n plugins?: AdminPlugin[];\n /** Host context from parent providers */\n hostContext: HostContext;\n /** Default active section (qualified ID) */\n defaultSection?: QualifiedSectionId;\n /** Page size for lists */\n pageSize?: number;\n /** Refresh interval in ms (0 to disable) */\n refreshInterval?: number;\n /** Callback when section changes */\n onSectionChange?: (section: QualifiedSectionId) => void;\n /** Custom logo/header content */\n logo?: ReactNode;\n /** Additional sidebar footer content */\n sidebarFooter?: ReactNode;\n /** Callback when user clicks Settings in profile dropdown */\n onSettingsClick?: () => void;\n /** Callback when user clicks Logout in profile dropdown */\n onLogoutClick?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n// ============================================================================\n// Group Order Helpers\n// ============================================================================\n\n/** Build a group-label → order map from all registered plugins' groups[] config. */\nfunction buildGroupOrder(plugins: AdminPlugin[]): Map<string, number> {\n const order = new Map<string, number>();\n for (const plugin of plugins) {\n for (const group of plugin.groups ?? []) {\n // Key by label (sections reference groups by display name via section.group).\n // First plugin to declare a group wins; later plugins don't override.\n if (!order.has(group.label)) {\n order.set(group.label, group.order);\n }\n }\n }\n return order;\n}\n\n// ============================================================================\n// AdminShell Component\n// ============================================================================\n\nexport function AdminShell({\n title = 'Admin',\n plugins: initialPlugins = [],\n hostContext,\n defaultSection,\n pageSize = 20,\n refreshInterval = 0,\n onSectionChange,\n logo,\n sidebarFooter,\n onSettingsClick,\n onLogoutClick,\n className = '',\n}: AdminShellProps): React.JSX.Element {\n // Plugin registry\n const [registry] = useState(() => {\n const reg = new PluginRegistryImpl();\n initialPlugins.forEach((p) => reg.register(p));\n return reg;\n });\n\n // Track registered plugins for re-renders\n const [registeredPlugins, setRegisteredPlugins] = useState<AdminPlugin[]>(() =>\n registry.getAll()\n );\n\n useEffect(() => {\n return registry.subscribe(setRegisteredPlugins);\n }, [registry]);\n\n // Aggregate sections from all plugins\n const allSections = useMemo(() => {\n return registeredPlugins.flatMap((plugin) =>\n plugin.sections\n .filter((section) => {\n // Check RBAC permissions (role-based)\n if (section.requiredPermission) {\n if (!plugin.checkPermission(section.requiredPermission, hostContext)) {\n return false;\n }\n }\n // Check dashboard section permissions (owner-configured per role)\n if (hostContext.dashboardPermissions) {\n if (!hostContext.dashboardPermissions.canAccess(section.id)) {\n return false;\n }\n }\n return true;\n })\n .map(\n (section): ResolvedSection => ({\n ...section,\n qualifiedId: `${plugin.id}:${section.id}` as QualifiedSectionId,\n pluginId: plugin.id,\n cssNamespace: plugin.cssNamespace,\n })\n )\n );\n }, [registeredPlugins, hostContext]);\n\n // Active section state\n const [activeSection, setActiveSectionInternal] = useState<QualifiedSectionId | null>(\n () => defaultSection ?? (allSections[0]?.qualifiedId ?? null)\n );\n\n // Collapsible groups state\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(new Set());\n\n const toggleGroup = useCallback((groupName: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupName)) {\n next.delete(groupName);\n } else {\n next.add(groupName);\n }\n return next;\n });\n }, []);\n\n // Update active section when sections change and current is invalid\n useEffect(() => {\n if (activeSection && !allSections.find((s) => s.qualifiedId === activeSection)) {\n setActiveSectionInternal(allSections[0]?.qualifiedId ?? null);\n }\n }, [allSections, activeSection]);\n\n const setActiveSection = useCallback(\n (section: QualifiedSectionId) => {\n setActiveSectionInternal(section);\n onSectionChange?.(section);\n },\n [onSectionChange]\n );\n\n // Plugin context factory\n const getPluginContext = useCallback(\n (pluginId: string): PluginContext | null => {\n const plugin = registry.get(pluginId);\n if (!plugin) return null;\n return plugin.createPluginContext(hostContext);\n },\n [registry, hostContext]\n );\n\n // Group sections by group name, sorted by plugin-defined group order\n const groupedSections = useMemo(() => {\n const groupOrder = buildGroupOrder(registeredPlugins);\n const groups = new Map<string, ResolvedSection[]>();\n\n allSections.forEach((section) => {\n const groupName = section.group ?? 'Menu';\n const existing = groups.get(groupName) ?? [];\n groups.set(groupName, [...existing, section]);\n });\n\n // Sort groups by plugin-defined order (undeclared groups sink to bottom)\n const sortedGroups = Array.from(groups.entries()).sort(([a], [b]) => {\n const orderA = groupOrder.get(a) ?? 99;\n const orderB = groupOrder.get(b) ?? 99;\n return orderA - orderB;\n });\n\n return sortedGroups;\n }, [allSections, registeredPlugins]);\n\n // Get current section's component\n const currentSection = useMemo(() => {\n if (!activeSection) return null;\n const [pluginId, sectionId] = activeSection.split(':') as [string, string];\n const plugin = registry.get(pluginId);\n if (!plugin) return null;\n const Component = plugin.components[sectionId];\n if (!Component) return null;\n const pluginContext = plugin.createPluginContext(hostContext);\n return { Component, pluginContext, plugin };\n }, [activeSection, registry, hostContext]);\n\n // Context value\n const contextValue = useMemo<AdminShellContextValue>(\n () => ({\n registry,\n hostContext,\n activeSection,\n setActiveSection,\n getPluginContext,\n }),\n [registry, hostContext, activeSection, setActiveSection, getPluginContext]\n );\n\n // Bridge hostContext.cedrosLogin into CedrosLoginContext so hooks\n // (useOrgs, useAdminDeposits, etc.) work inside AdminShell sections.\n const cedrosLoginContextValue = useMemo<CedrosLoginContextValue | null>(() => {\n const cl = hostContext.cedrosLogin;\n if (!cl) return null;\n const user: AuthUser | null = cl.user\n ? { authMethods: [], emailVerified: false, createdAt: '', updatedAt: '', ...cl.user }\n : null;\n return {\n config: { serverUrl: cl.serverUrl },\n user,\n authState: cl.user ? 'authenticated' : 'unauthenticated',\n error: null,\n logout: async () => {},\n refreshUser: async () => {},\n isModalOpen: false,\n openModal: () => {},\n closeModal: () => {},\n _internal: {\n handleLoginSuccess: () => {},\n getAccessToken: cl.getAccessToken,\n },\n };\n }, [hostContext.cedrosLogin]);\n\n return (\n <AdminShellContext.Provider value={contextValue}>\n <CedrosLoginContext.Provider value={cedrosLoginContextValue}>\n <div className={`cedros-admin cedros-admin-shell ${className || ''}`}>\n {/* Sidebar */}\n <aside className=\"cedros-admin-shell__sidebar\">\n <div className=\"cedros-admin-shell__sidebar-header\">\n {logo ?? (\n <div className=\"cedros-admin-shell__logo\">\n <span className=\"cedros-admin-shell__logo-text\">{title}</span>\n </div>\n )}\n </div>\n\n <nav className=\"cedros-admin-shell__nav\">\n {groupedSections.map(([groupName, sections]) => {\n const isCollapsible = groupName === 'Configuration';\n const isCollapsed = collapsedGroups.has(groupName);\n\n return (\n <div key={groupName} className=\"cedros-admin-shell__nav-group\">\n {isCollapsible ? (\n <button\n type=\"button\"\n className=\"cedros-admin-shell__nav-label cedros-admin-shell__nav-label--collapsible\"\n onClick={() => toggleGroup(groupName)}\n aria-expanded={!isCollapsed}\n >\n <span>{groupName}</span>\n <span className={`cedros-admin-shell__nav-chevron ${!isCollapsed ? 'cedros-admin-shell__nav-chevron--expanded' : ''}`}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </span>\n </button>\n ) : (\n <span className=\"cedros-admin-shell__nav-label\">{groupName}</span>\n )}\n {(!isCollapsible || !isCollapsed) &&\n sections\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map((section) => (\n <button\n key={section.qualifiedId}\n type=\"button\"\n className={`cedros-admin-shell__nav-item ${\n activeSection === section.qualifiedId\n ? 'cedros-admin-shell__nav-item--active'\n : ''\n }`}\n onClick={() => setActiveSection(section.qualifiedId)}\n aria-current={\n activeSection === section.qualifiedId ? 'page' : undefined\n }\n >\n <span className=\"cedros-admin-shell__nav-icon\">{section.icon}</span>\n <span className=\"cedros-admin-shell__nav-text\">{section.label}</span>\n {section.badge && (\n <span className=\"cedros-admin-shell__nav-badge\">\n {section.badge}\n </span>\n )}\n </button>\n ))}\n </div>\n );\n })}\n </nav>\n\n {/* User profile dropdown + optional custom footer */}\n {(hostContext.cedrosLogin?.user || sidebarFooter) && (\n <div className=\"cedros-admin-shell__sidebar-footer\">\n {hostContext.cedrosLogin?.user && (\n <ProfileDropdown\n name={hostContext.cedrosLogin.user.name}\n email={hostContext.cedrosLogin.user.email}\n picture={hostContext.cedrosLogin.user.picture}\n onSettings={onSettingsClick}\n onLogout={onLogoutClick}\n />\n )}\n {sidebarFooter}\n </div>\n )}\n </aside>\n\n {/* Main Content */}\n <main className=\"cedros-admin-shell__main\">\n {currentSection ? (\n <Suspense fallback={<LoadingFallback />}>\n <div\n className=\"cedros-admin-shell__section\"\n data-plugin-namespace={currentSection.plugin.cssNamespace}\n >\n <currentSection.Component\n pluginContext={currentSection.pluginContext}\n pageSize={pageSize}\n refreshInterval={refreshInterval}\n />\n </div>\n </Suspense>\n ) : (\n <div className=\"cedros-admin-shell__empty\">\n {allSections.length === 0\n ? 'No plugins loaded'\n : 'Select a section from the sidebar'}\n </div>\n )}\n </main>\n </div>\n </CedrosLoginContext.Provider>\n </AdminShellContext.Provider>\n );\n}\n\n// ============================================================================\n// Helper Components\n// ============================================================================\n\nfunction LoadingFallback(): React.JSX.Element {\n return (\n <div className=\"cedros-admin-shell__loading\">\n <LoadingSpinner />\n <span>Loading...</span>\n </div>\n );\n}\n","/**\n * Admin Dashboard Icons\n *\n * SVG icons for the admin dashboard sidebar and sections.\n * Lucide-style, 24x24 viewBox rendered at 16x16.\n */\n\nimport type { ReactNode } from 'react';\n\nconst iconProps = {\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const Icons: Record<string, ReactNode> = {\n users: (\n <svg {...iconProps}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n\n members: (\n <svg {...iconProps}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n ),\n\n invites: (\n <svg {...iconProps}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n\n deposits: (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\" />\n <path d=\"M12 18V6\" />\n </svg>\n ),\n\n withdrawals: (\n <svg {...iconProps}>\n <rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M9 22v-4h6v4\" />\n <path d=\"M8 6h.01\" />\n <path d=\"M16 6h.01\" />\n <path d=\"M12 6h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M12 14h.01\" />\n <path d=\"M16 10h.01\" />\n <path d=\"M16 14h.01\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M8 14h.01\" />\n </svg>\n ),\n\n settings: (\n <svg {...iconProps}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ),\n\n wallet: (\n <svg {...iconProps}>\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n ),\n\n chevronRight: (\n <svg {...iconProps}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n ),\n\n // Settings sub-page icons\n key: (\n <svg {...iconProps}>\n <path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\" />\n </svg>\n ),\n\n toggles: (\n <svg {...iconProps}>\n <rect width=\"20\" height=\"12\" x=\"2\" y=\"6\" rx=\"6\" />\n <circle cx=\"8\" cy=\"12\" r=\"2\" />\n </svg>\n ),\n\n shield: (\n <svg {...iconProps}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n ),\n\n mail: (\n <svg {...iconProps}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n\n webhook: (\n <svg {...iconProps}>\n <path d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\" />\n <path d=\"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\" />\n <path d=\"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\" />\n </svg>\n ),\n\n coins: (\n <svg {...iconProps}>\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M18.09 10.37A6 6 0 1 1 10.34 18\" />\n <path d=\"M7 6h1v4\" />\n <path d=\"m16.71 13.88.7.71-2.82 2.82\" />\n </svg>\n ),\n\n server: (\n <svg {...iconProps}>\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\" />\n <rect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" x2=\"6.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"6\" x2=\"6.01\" y1=\"18\" y2=\"18\" />\n </svg>\n ),\n};\n","/**\n * Cedros Login Admin Plugin\n *\n * Exports the cedrosLoginPlugin for use with AdminShell.\n * Provides user management, deposits, withdrawals, and configuration sections.\n */\n\nimport { lazy } from 'react';\nimport type { AdminPlugin, HostContext, PluginContext, AdminSectionConfig } from './types';\nimport { Icons } from './icons';\n\n// ============================================================================\n// Lazy-loaded Section Components\n// ============================================================================\n\nconst UsersSection = lazy(() => import('./sections/UsersSection'));\nconst TeamSection = lazy(() => import('./sections/TeamSection'));\nconst DepositsSection = lazy(() => import('./sections/DepositsSection'));\nconst WithdrawalsSection = lazy(() => import('./sections/WithdrawalsSection'));\nconst AuthenticationSettings = lazy(() => import('./sections/AuthenticationSettings'));\nconst EmbeddedWalletSettings = lazy(() => import('./sections/EmbeddedWalletSettings'));\nconst EmailSettings = lazy(() => import('./sections/EmailSettings'));\nconst WebhookSettings = lazy(() => import('./sections/WebhookSettings'));\nconst CreditSystemSettings = lazy(() => import('./sections/CreditSystemSettings'));\nconst ServerSettings = lazy(() => import('./sections/ServerSettings'));\n\n// ============================================================================\n// Permission Mapping\n// ============================================================================\n\ntype LoginPermission =\n | 'login:users:read'\n | 'login:users:write'\n | 'login:members:read'\n | 'login:members:write'\n | 'login:invites:read'\n | 'login:invites:write'\n | 'login:deposits:read'\n | 'login:deposits:write'\n | 'login:settings:read'\n | 'login:settings:write';\n\n/**\n * Maps plugin permissions to org-level permissions/roles.\n */\nconst PERMISSION_MAP: Record<LoginPermission, string[]> = {\n 'login:users:read': ['admin', 'owner'],\n 'login:users:write': ['admin', 'owner'],\n 'login:members:read': ['member:read', 'admin', 'owner'],\n 'login:members:write': ['member:remove', 'member:role_change'],\n 'login:invites:read': ['invite:read', 'admin', 'owner'],\n 'login:invites:write': ['invite:create', 'invite:cancel'],\n 'login:deposits:read': ['admin', 'owner'],\n 'login:deposits:write': ['admin', 'owner'],\n 'login:settings:read': ['admin', 'owner'],\n 'login:settings:write': ['admin', 'owner'],\n};\n\n// ============================================================================\n// Section Configuration\n// ============================================================================\n\nconst SECTIONS: AdminSectionConfig[] = [\n // Users group (main sections)\n {\n id: 'users',\n label: 'Users',\n icon: Icons.users,\n group: 'Users',\n order: 0,\n requiredPermission: 'login:users:read',\n },\n {\n id: 'team',\n label: 'Team',\n icon: Icons.members,\n group: 'Users',\n order: 1,\n requiredPermission: 'login:members:read',\n },\n {\n id: 'deposits',\n label: 'Deposits',\n icon: Icons.deposits,\n group: 'Users',\n order: 2,\n requiredPermission: 'login:deposits:read',\n },\n {\n id: 'withdrawals',\n label: 'Withdrawals',\n icon: Icons.withdrawals,\n group: 'Users',\n order: 3,\n requiredPermission: 'login:deposits:read',\n },\n\n // Configuration group (settings sections)\n {\n id: 'settings-auth',\n label: 'Authentication',\n icon: Icons.key,\n group: 'Configuration',\n order: 0,\n requiredPermission: 'login:settings:read',\n },\n {\n id: 'settings-email',\n label: 'Email & SMTP',\n icon: Icons.mail,\n group: 'Configuration',\n order: 1,\n requiredPermission: 'login:settings:read',\n },\n {\n id: 'settings-webhooks',\n label: 'Webhooks',\n icon: Icons.webhook,\n group: 'Configuration',\n order: 2,\n requiredPermission: 'login:settings:read',\n },\n {\n id: 'settings-wallet',\n label: 'User Wallets',\n icon: Icons.wallet,\n group: 'Configuration',\n order: 3,\n requiredPermission: 'login:settings:read',\n },\n {\n id: 'settings-credits',\n label: 'Credit System',\n icon: Icons.coins,\n group: 'Configuration',\n order: 4,\n requiredPermission: 'login:settings:read',\n },\n {\n id: 'settings-server',\n label: 'Auth Server',\n icon: Icons.server,\n group: 'Configuration',\n order: 5,\n requiredPermission: 'login:settings:read',\n },\n];\n\n// ============================================================================\n// Plugin Definition\n// ============================================================================\n\nexport const cedrosLoginPlugin: AdminPlugin = {\n id: 'cedros-login',\n name: 'Cedros Login',\n version: '1.0.0',\n\n sections: SECTIONS,\n\n groups: [\n { id: 'users', label: 'Users', order: 0 },\n { id: 'configuration', label: 'Configuration', order: 2 },\n ],\n\n components: {\n users: UsersSection,\n team: TeamSection,\n deposits: DepositsSection,\n withdrawals: WithdrawalsSection,\n 'settings-auth': AuthenticationSettings,\n 'settings-wallet': EmbeddedWalletSettings,\n 'settings-email': EmailSettings,\n 'settings-webhooks': WebhookSettings,\n 'settings-credits': CreditSystemSettings,\n 'settings-server': ServerSettings,\n },\n\n createPluginContext(hostContext: HostContext): PluginContext {\n const cedrosLogin = hostContext.cedrosLogin;\n if (!cedrosLogin) {\n throw new Error('cedros-login plugin requires cedrosLogin in hostContext');\n }\n\n return {\n serverUrl: cedrosLogin.serverUrl,\n userId: cedrosLogin.user?.id,\n getAccessToken: cedrosLogin.getAccessToken,\n hasPermission: (permission) => this.checkPermission(permission, hostContext),\n orgId: hostContext.org?.orgId,\n pluginData: {\n user: cedrosLogin.user,\n orgRole: hostContext.org?.role,\n },\n };\n },\n\n checkPermission(permission: string, hostContext: HostContext): boolean {\n const org = hostContext.org;\n\n // No org context = admin-level access (for global admins)\n if (!org) {\n // Check if user is in cedrosLogin context - assume admin if present\n return Boolean(hostContext.cedrosLogin?.user);\n }\n\n const requiredPerms = PERMISSION_MAP[permission as LoginPermission];\n if (!requiredPerms) {\n // Unknown permission - default deny\n return false;\n }\n\n // Check if user has any of the required permissions\n return requiredPerms.some(\n (p) =>\n org.permissions.includes(p) ||\n p === org.role ||\n (p === 'admin' && ['admin', 'owner'].includes(org.role)) ||\n (p === 'owner' && org.role === 'owner')\n );\n },\n\n cssNamespace: 'cedros-dashboard',\n};\n\n// Named export for convenience\nexport { cedrosLoginPlugin as loginPlugin };\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","/**\n * QR Code component for TOTP setup\n *\n * Generates QR codes client-side using the qrcode library.\n * SECURITY: Never sends the TOTP secret to external services.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport QRCode from 'qrcode';\n\nexport interface QrCodeProps {\n /** The data to encode in the QR code (e.g., otpauth:// URL) */\n value: string;\n /** Size in pixels (width and height) */\n size?: number;\n /** Alt text for accessibility */\n alt?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Renders a QR code as a canvas element.\n * Generated entirely client-side for security.\n */\nexport function QrCode({ value, size = 200, alt = 'QR code', className = '' }: QrCodeProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!canvasRef.current || !value) return;\n\n QRCode.toCanvas(canvasRef.current, value, {\n width: size,\n margin: 2,\n color: {\n dark: '#000000',\n light: '#ffffff',\n },\n errorCorrectionLevel: 'M',\n })\n .then(() => {\n // Clear any previous error on successful generation\n setError(null);\n })\n .catch((err) => {\n setError(err instanceof Error ? err.message : 'Failed to generate QR code');\n });\n }, [value, size]);\n\n if (error) {\n return (\n <div\n className={`cedros-qr-error ${className}`}\n style={{ width: size, height: size }}\n role=\"img\"\n aria-label={alt}\n >\n <p>Failed to generate QR code</p>\n </div>\n );\n }\n\n return (\n <canvas\n ref={canvasRef}\n className={`cedros-totp-qr-image ${className}`}\n role=\"img\"\n aria-label={alt}\n style={{ borderRadius: '0.5rem' }}\n />\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n AuthError,\n TotpStatus,\n TotpSetupResponse,\n TotpBackupCodesResponse,\n TotpSetupState,\n} from '../types';\n\nexport interface UseTotpReturn {\n /** Current TOTP status for the user */\n status: TotpStatus | null;\n /** Setup state for the enrollment flow */\n setupState: TotpSetupState;\n /** Setup data (secret, QR URL, backup codes) */\n setupData: TotpSetupResponse | null;\n /** Whether a request is in progress */\n isLoading: boolean;\n /** Error from the last request */\n error: AuthError | null;\n /** Fetch current TOTP status */\n getStatus: () => Promise<TotpStatus>;\n /** Start TOTP setup (generates secret and backup codes) */\n beginSetup: () => Promise<TotpSetupResponse>;\n /** Verify code and enable TOTP */\n enableTotp: (code: string) => Promise<void>;\n /** Disable TOTP (requires password confirmation) */\n disableTotp: (password: string) => Promise<void>;\n /** Regenerate recovery codes (requires current authenticator code) */\n regenerateBackupCodes: (code: string) => Promise<TotpBackupCodesResponse>;\n /** Clear error state */\n clearError: () => void;\n /** Reset to initial state */\n reset: () => void;\n}\n\n/**\n * Hook for TOTP (Time-based One-Time Password) two-factor authentication.\n *\n * Provides methods for:\n * - Setting up TOTP with authenticator apps\n * - Enabling/disabling TOTP for the user's account\n * - Managing backup codes\n *\n * @example\n * ```tsx\n * function TotpSettings() {\n * const { status, beginSetup, enableTotp, setupData } = useTotp();\n *\n * if (status?.enabled) {\n * return <p>2FA is enabled</p>;\n * }\n *\n * const handleSetup = async () => {\n * const data = await beginSetup();\n * // Show QR code from data.otpauthUri\n * };\n * }\n * ```\n */\nexport function useTotp(): UseTotpReturn {\n const { config, _internal } = useCedrosLogin();\n const [status, setStatus] = useState<TotpStatus | null>(null);\n const [setupState, setSetupState] = useState<TotpSetupState>('idle');\n const [setupData, setSetupData] = useState<TotpSetupResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n getAccessToken: _internal?.getAccessToken,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const getStatus = useCallback(async (): Promise<TotpStatus> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.get<TotpStatus>('/mfa/status');\n setStatus(result);\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to get TOTP status');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const beginSetup = useCallback(async (): Promise<TotpSetupResponse> => {\n setIsLoading(true);\n setError(null);\n setSetupState('loading');\n\n try {\n const result = await apiClient.post<TotpSetupResponse>('/mfa/setup', {});\n setSetupData(result);\n setSetupState('setup');\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to start TOTP setup');\n setError(authError);\n setSetupState('error');\n throw authError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const enableTotp = useCallback(\n async (code: string): Promise<void> => {\n if (!/^\\d{6}$/.test(code)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a 6-digit code',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n setSetupState('verifying');\n\n try {\n await apiClient.post('/mfa/enable', { code });\n setSetupState('success');\n setStatus({ enabled: true, recoveryCodesRemaining: setupData?.recoveryCodes.length ?? 0 });\n } catch (err) {\n const authError = handleApiError(err, 'Invalid verification code');\n setError(authError);\n setSetupState('error');\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, setupData]\n );\n\n const disableTotp = useCallback(\n async (password: string): Promise<void> => {\n if (!password) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter your password',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post('/mfa/disable', { password });\n setStatus({ enabled: false, recoveryCodesRemaining: 0 });\n setSetupData(null);\n setSetupState('idle');\n } catch (err) {\n const authError = handleApiError(err, 'Failed to disable TOTP');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const regenerateBackupCodes = useCallback(\n async (code: string): Promise<TotpBackupCodesResponse> => {\n if (!/^\\d{6}$/.test(code)) {\n const validationError: AuthError = {\n code: 'VALIDATION_ERROR',\n message: 'Please enter a 6-digit code',\n };\n setError(validationError);\n throw validationError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.post<TotpBackupCodesResponse>(\n '/mfa/recovery-codes/regenerate',\n { code }\n );\n return result;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to regenerate recovery codes');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n const reset = useCallback(() => {\n setError(null);\n setSetupData(null);\n setSetupState('idle');\n setIsLoading(false);\n }, []);\n\n return {\n status,\n setupState,\n setupData,\n isLoading,\n error,\n getStatus,\n beginSetup,\n enableTotp,\n disableTotp,\n regenerateBackupCodes,\n clearError,\n reset,\n };\n}\n","/**\n * TOTP Setup component for enabling two-factor authentication\n *\n * Guides users through:\n * 1. Scanning QR code with authenticator app\n * 2. Saving backup codes\n * 3. Verifying setup with a code\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport { useTotp } from '../../hooks/useTotp';\nimport { OtpInput } from './OtpInput';\nimport { QrCode } from './QrCode';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface TotpSetupProps {\n /** Called when setup is completed successfully */\n onSuccess?: () => void;\n /** Called when user cancels setup */\n onCancel?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Two-factor authentication setup wizard.\n *\n * Displays QR code for authenticator app scanning,\n * recovery codes for account recovery, and verification step.\n */\nexport function TotpSetup({ onSuccess, onCancel, className = '' }: TotpSetupProps) {\n const { setupState, setupData, isLoading, error, beginSetup, enableTotp, clearError, reset } =\n useTotp();\n\n const [step, setStep] = useState<'qr' | 'backup' | 'verify'>('qr');\n const [verifyCode, setVerifyCode] = useState('');\n const [copiedSecret, setCopiedSecret] = useState(false);\n const [savedBackupCodes, setSavedBackupCodes] = useState(false);\n const copyTimerRef = useRef<number | null>(null);\n\n // Start setup on mount\n useEffect(() => {\n if (setupState === 'idle') {\n beginSetup().catch(() => {\n // Error handled by hook\n });\n }\n }, [setupState, beginSetup]);\n\n // Handle successful setup\n useEffect(() => {\n if (setupState === 'success') {\n onSuccess?.();\n }\n }, [setupState, onSuccess]);\n\n const handleCopySecret = async () => {\n if (setupData?.secret) {\n await navigator.clipboard.writeText(setupData.secret);\n setCopiedSecret(true);\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => setCopiedSecret(false), 2000);\n }\n };\n\n const handleCopyBackupCodes = async () => {\n if (setupData?.recoveryCodes) {\n const codes = setupData.recoveryCodes.join('\\n');\n await navigator.clipboard.writeText(codes);\n }\n };\n\n const handleVerify = async () => {\n try {\n await enableTotp(verifyCode);\n } catch {\n // Error handled by hook\n setVerifyCode('');\n }\n };\n\n const handleCancel = () => {\n reset();\n onCancel?.();\n };\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n copyTimerRef.current = null;\n }\n };\n }, []);\n\n // Loading state\n if (setupState === 'loading' || (setupState === 'idle' && isLoading)) {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <div className=\"cedros-totp-loading\">\n <LoadingSpinner size=\"lg\" label=\"Setting up two-factor authentication\" />\n </div>\n </div>\n );\n }\n\n // Error state (failed to start setup)\n if (setupState === 'error' && !setupData) {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <ErrorMessage error={error} onDismiss={clearError} />\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => beginSetup()}\n >\n Try again\n </button>\n </div>\n </div>\n );\n }\n\n // Success state\n if (setupState === 'success') {\n return (\n <div className={`cedros-totp-setup ${className}`}>\n <div className=\"cedros-totp-success\">\n <svg\n className=\"cedros-totp-success-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"24\" r=\"22\" stroke=\"var(--cedros-success)\" strokeWidth=\"2\" />\n <path\n d=\"M14 24l7 7 13-13\"\n stroke=\"var(--cedros-success)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <h3 className=\"cedros-totp-title\">Two-factor authentication enabled</h3>\n <p className=\"cedros-totp-description\">\n Your account is now protected with an additional layer of security.\n </p>\n </div>\n </div>\n );\n }\n\n if (!setupData) return null;\n\n return (\n <div className={`cedros-totp-setup ${className}`}>\n {/* Step 1: QR Code */}\n {step === 'qr' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Scan QR code</h3>\n <p className=\"cedros-totp-description\">\n Use your authenticator app to scan this QR code.\n </p>\n\n <div className=\"cedros-totp-qr\">\n {/* QR code generated client-side from the server-provided otpauth URI */}\n <QrCode value={setupData.otpauthUri} size={200} alt=\"QR code for authenticator app\" />\n </div>\n\n <div className=\"cedros-totp-manual\">\n <p className=\"cedros-totp-manual-label\">Or enter this code manually:</p>\n <div className=\"cedros-totp-secret\">\n <code className=\"cedros-totp-secret-code\">{setupData.secret}</code>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-ghost cedros-button-sm\"\n onClick={handleCopySecret}\n aria-label=\"Copy secret\"\n >\n {copiedSecret ? 'Copied!' : 'Copy'}\n </button>\n </div>\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setStep('backup')}\n >\n Continue\n </button>\n </div>\n </div>\n )}\n\n {/* Step 2: Recovery Codes */}\n {step === 'backup' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Save recovery codes</h3>\n <p className=\"cedros-totp-description\">\n Save these codes in a secure place. You can use them to access your account if you lose\n your authenticator device.\n </p>\n\n <div className=\"cedros-totp-backup-codes\">\n {setupData.recoveryCodes.map((code, index) => (\n <code key={index} className=\"cedros-totp-backup-code\">\n {code}\n </code>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md cedros-button-full\"\n onClick={handleCopyBackupCodes}\n >\n Copy all codes\n </button>\n\n <label className=\"cedros-checkbox-label cedros-totp-confirm\">\n <input\n type=\"checkbox\"\n className=\"cedros-checkbox\"\n checked={savedBackupCodes}\n onChange={(e) => setSavedBackupCodes(e.target.checked)}\n />\n <span className=\"cedros-checkbox-text\">I have saved these recovery codes</span>\n </label>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setStep('qr')}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setStep('verify')}\n disabled={!savedBackupCodes}\n >\n Continue\n </button>\n </div>\n </div>\n )}\n\n {/* Step 3: Verify */}\n {step === 'verify' && (\n <div className=\"cedros-totp-step\">\n <h3 className=\"cedros-totp-title\">Verify setup</h3>\n <p className=\"cedros-totp-description\">\n Enter the 6-digit code from your authenticator app to complete setup.\n </p>\n\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerify}\n disabled={isLoading}\n error={error?.message}\n autoFocus\n />\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setStep('backup')}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={handleVerify}\n disabled={isLoading || verifyCode.length !== 6}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Verifying...</span>\n </>\n ) : (\n 'Enable 2FA'\n )}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * TOTP Settings component for managing two-factor authentication\n *\n * Allows users to:\n * - View current 2FA status\n * - Enable 2FA (via TotpSetup wizard)\n * - Disable 2FA (requires verification)\n * - Regenerate backup codes\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useTotp } from '../../hooks/useTotp';\nimport { TotpSetup } from './TotpSetup';\nimport { OtpInput } from './OtpInput';\nimport { PasswordInput } from '../email/PasswordInput';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\n\nexport interface TotpSettingsProps {\n /** Called when 2FA status changes */\n onStatusChange?: (enabled: boolean) => void;\n /** Additional CSS class */\n className?: string;\n}\n\ntype SettingsView = 'status' | 'setup' | 'disable' | 'regenerate';\n\n/**\n * Two-factor authentication settings panel.\n *\n * Shows current 2FA status and provides controls for\n * enabling, disabling, and managing backup codes.\n *\n * @example\n * ```tsx\n * function SecuritySettings() {\n * return (\n * <div>\n * <h2>Security</h2>\n * <TotpSettings\n * onStatusChange={(enabled) => {\n * console.log('2FA is now', enabled ? 'enabled' : 'disabled');\n * }}\n * />\n * </div>\n * );\n * }\n * ```\n */\nexport function TotpSettings({ onStatusChange, className = '' }: TotpSettingsProps) {\n const { status, isLoading, error, getStatus, disableTotp, regenerateBackupCodes, clearError } =\n useTotp();\n\n const [view, setView] = useState<SettingsView>('status');\n const [disablePassword, setDisablePassword] = useState('');\n const [regenerateCode, setRegenerateCode] = useState('');\n const [newRecoveryCodes, setNewRecoveryCodes] = useState<string[] | null>(null);\n const [actionLoading, setActionLoading] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n // Fetch status on mount\n useEffect(() => {\n getStatus().catch(() => {\n // Error handled by hook\n });\n }, [getStatus]);\n\n const handleSetupComplete = useCallback(() => {\n setView('status');\n onStatusChange?.(true);\n }, [onStatusChange]);\n\n const handleDisable = async () => {\n setActionLoading(true);\n setActionError(null);\n try {\n await disableTotp(disablePassword);\n setView('status');\n setDisablePassword('');\n onStatusChange?.(false);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Failed to disable 2FA');\n setDisablePassword('');\n } finally {\n setActionLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n setActionLoading(true);\n setActionError(null);\n try {\n const result = await regenerateBackupCodes(regenerateCode);\n setNewRecoveryCodes(result.recoveryCodes);\n setRegenerateCode('');\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Failed to regenerate codes');\n setRegenerateCode('');\n } finally {\n setActionLoading(false);\n }\n };\n\n const handleCopyBackupCodes = async () => {\n if (newRecoveryCodes) {\n await navigator.clipboard.writeText(newRecoveryCodes.join('\\n'));\n }\n };\n\n // Loading state\n if (isLoading && !status) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-loading\">\n <LoadingSpinner size=\"md\" label=\"Loading security settings\" />\n </div>\n </div>\n );\n }\n\n // Error state\n if (error && !status) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <ErrorMessage error={error} onDismiss={clearError} />\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => getStatus()}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Setup view\n if (view === 'setup') {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <TotpSetup onSuccess={handleSetupComplete} onCancel={() => setView('status')} />\n </div>\n );\n }\n\n // Disable confirmation view\n if (view === 'disable') {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">Disable two-factor authentication</h3>\n <p className=\"cedros-totp-description cedros-totp-warning\">\n This will make your account less secure. Enter your password to confirm.\n </p>\n\n {actionError && (\n <div className=\"cedros-totp-error\">\n <ErrorMessage\n error={{ code: 'UNKNOWN_ERROR', message: actionError }}\n onDismiss={() => setActionError(null)}\n />\n </div>\n )}\n\n <div className=\"cedros-totp-verify-input\">\n <PasswordInput\n label=\"Password\"\n placeholder=\"Enter your password\"\n value={disablePassword}\n onChange={(e) => setDisablePassword(e.target.value)}\n disabled={actionLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => {\n setView('status');\n setDisablePassword('');\n setActionError(null);\n }}\n disabled={actionLoading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-destructive cedros-button-md\"\n onClick={handleDisable}\n disabled={actionLoading || disablePassword.length === 0}\n >\n {actionLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Disabling...</span>\n </>\n ) : (\n 'Disable 2FA'\n )}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Regenerate backup codes view\n if (view === 'regenerate') {\n // Show new codes after regeneration\n if (newRecoveryCodes) {\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">New recovery codes</h3>\n <p className=\"cedros-totp-description\">\n Save these codes in a secure place. Your old codes are no longer valid.\n </p>\n\n <div className=\"cedros-totp-backup-codes\">\n {newRecoveryCodes.map((code, index) => (\n <code key={index} className=\"cedros-totp-backup-code\">\n {code}\n </code>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md cedros-button-full\"\n onClick={handleCopyBackupCodes}\n >\n Copy all codes\n </button>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => {\n setView('status');\n setNewRecoveryCodes(null);\n }}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Code entry for regeneration\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <h3 className=\"cedros-totp-title\">Regenerate recovery codes</h3>\n <p className=\"cedros-totp-description\">\n This will invalidate all existing recovery codes. Enter your authenticator code to\n confirm.\n </p>\n\n {actionError && (\n <div className=\"cedros-totp-error\">\n <ErrorMessage\n error={{ code: 'UNKNOWN_ERROR', message: actionError }}\n onDismiss={() => setActionError(null)}\n />\n </div>\n )}\n\n <div className=\"cedros-totp-verify-input\">\n <OtpInput\n value={regenerateCode}\n onChange={setRegenerateCode}\n onComplete={handleRegenerate}\n disabled={actionLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-totp-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => {\n setView('status');\n setRegenerateCode('');\n setActionError(null);\n }}\n disabled={actionLoading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={handleRegenerate}\n disabled={actionLoading || regenerateCode.length !== 6}\n >\n {actionLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Regenerating...</span>\n </>\n ) : (\n 'Regenerate codes'\n )}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Main status view\n return (\n <div className={`cedros-totp-settings ${className}`}>\n <div className=\"cedros-totp-panel\">\n <div className=\"cedros-totp-status-header\">\n <div className=\"cedros-totp-status-info\">\n <h3 className=\"cedros-totp-title\">Two-factor authentication</h3>\n <p className=\"cedros-totp-description\">\n Add an extra layer of security to your account by requiring a verification code from\n your authenticator app when signing in.\n </p>\n </div>\n <div\n className={`cedros-totp-badge ${status?.enabled ? 'cedros-totp-badge-enabled' : 'cedros-totp-badge-disabled'}`}\n >\n {status?.enabled ? 'Enabled' : 'Disabled'}\n </div>\n </div>\n\n {status?.enabled ? (\n <div className=\"cedros-totp-enabled-actions\">\n <div className=\"cedros-totp-description\" style={{ marginTop: '0.25rem' }}>\n Recovery codes remaining: <strong>{status.recoveryCodesRemaining}</strong>\n </div>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={() => setView('regenerate')}\n >\n Regenerate recovery codes\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-destructive-outline cedros-button-md\"\n onClick={() => setView('disable')}\n >\n Disable 2FA\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={() => setView('setup')}\n >\n Enable two-factor authentication\n </button>\n )}\n </div>\n </div>\n );\n}\n","import type {\n ChangePasswordRequest,\n ChangePasswordResponse,\n UpdateProfileRequest,\n UpdateProfileResponse,\n} from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for user profile operations\n *\n * Supports:\n * - POST /auth/change-password - Change user password\n * - PATCH /auth/me - Update profile (name, picture) [requires backend support]\n */\nexport class ProfileApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * Change the user's password\n *\n * Requires the current password for verification. Also revokes all other sessions\n * and re-encrypts wallet Share A if using password-based wallet protection.\n */\n async changePassword(data: ChangePasswordRequest): Promise<ChangePasswordResponse> {\n try {\n return await this.client.post<ChangePasswordResponse>('/auth/change-password', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to change password');\n }\n }\n\n /**\n * Update user profile (name, picture)\n *\n * NOTE: Requires PATCH /auth/me endpoint on the backend.\n * If not implemented, returns a rejection.\n */\n async updateProfile(data: UpdateProfileRequest): Promise<UpdateProfileResponse> {\n try {\n return await this.client.patch<UpdateProfileResponse>('/auth/me', data);\n } catch (error) {\n throw handleApiError(error, 'Failed to update profile');\n }\n }\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type {\n ChangePasswordRequest,\n UpdateProfileRequest,\n UpdateProfileResponse,\n UseProfileReturn,\n} from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ProfileApiClient } from '../utils/profileApi';\n\n/**\n * Hook for managing user profile operations.\n *\n * Provides methods for updating profile information and changing password.\n *\n * @example\n * ```tsx\n * function ProfileSettings() {\n * const { isLoading, error, changePassword, clearError } = useProfile();\n *\n * const handlePasswordChange = async () => {\n * try {\n * await changePassword({\n * currentPassword: 'oldpass',\n * newPassword: 'newpass123',\n * });\n * // Success - other sessions have been revoked\n * } catch (err) {\n * // Error is available via the error property\n * }\n * };\n *\n * return (\n * <div>\n * {error && <p className=\"error\">{error.message}</p>}\n * <button onClick={handlePasswordChange} disabled={isLoading}>\n * Change Password\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useProfile(): UseProfileReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ProfileApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n /**\n * Update profile (name, picture)\n *\n * NOTE: Requires PATCH /auth/me endpoint on the backend.\n */\n const updateProfile = useCallback(\n async (data: UpdateProfileRequest): Promise<UpdateProfileResponse> => {\n if (authState !== 'authenticated') {\n throw new Error('Must be authenticated to update profile');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.updateProfile(data);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to update profile');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [authState, apiClient]\n );\n\n /**\n * Change password\n *\n * Requires current password for verification. On success:\n * - All other sessions are revoked (forced re-login on other devices)\n * - Wallet Share A is re-encrypted if using password-based protection\n */\n const changePassword = useCallback(\n async (data: ChangePasswordRequest): Promise<void> => {\n if (authState !== 'authenticated') {\n throw new Error('Must be authenticated to change password');\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.changePassword(data);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to change password');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [authState, apiClient]\n );\n\n return {\n isLoading,\n error,\n updateProfile,\n changePassword,\n clearError,\n };\n}\n","/**\n * User Profile Settings component\n *\n * Allows users to:\n * - View their profile information\n * - Change their password\n * - (Future) Update name and picture when backend supports it\n */\n\nimport { useState, useCallback } from 'react';\nimport { useProfile } from '../../hooks/useProfile';\nimport { useAuth } from '../../hooks/useAuth';\nimport { PasswordInput } from '../email/PasswordInput';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { ErrorMessage } from '../shared/ErrorMessage';\nimport { validatePassword } from '../../utils/validation';\n\nexport interface UserProfileSettingsProps {\n /** Called when password is changed successfully */\n onPasswordChange?: () => void;\n /** Called when user requests to close/cancel */\n onClose?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\ntype SettingsView = 'main' | 'change-password';\n\n/**\n * User profile settings panel.\n *\n * Shows user profile information and provides controls for\n * changing password and managing profile settings.\n *\n * @example\n * ```tsx\n * function SettingsPage() {\n * return (\n * <UserProfileSettings\n * onPasswordChange={() => console.log('Password changed')}\n * onClose={() => navigate('/dashboard')}\n * />\n * );\n * }\n * ```\n */\nexport function UserProfileSettings({\n onPasswordChange,\n onClose,\n className = '',\n}: UserProfileSettingsProps) {\n const { user } = useAuth();\n const { isLoading, error, changePassword, clearError } = useProfile();\n\n const [view, setView] = useState<SettingsView>('main');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [actionError, setActionError] = useState<string | null>(null);\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n // Password validation\n const passwordValidation = validatePassword(newPassword);\n const passwordsMatch = newPassword === confirmPassword;\n const canSubmitPassword =\n currentPassword.length > 0 &&\n newPassword.length > 0 &&\n confirmPassword.length > 0 &&\n passwordValidation.isValid &&\n passwordsMatch;\n\n const handlePasswordChange = useCallback(async () => {\n if (!canSubmitPassword) return;\n\n setActionError(null);\n setSuccessMessage(null);\n\n try {\n await changePassword({\n currentPassword,\n newPassword,\n });\n\n // Clear form and show success\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n setSuccessMessage('Password changed successfully. Other sessions have been logged out.');\n onPasswordChange?.();\n\n // Return to main view after short delay\n setTimeout(() => {\n setView('main');\n setSuccessMessage(null);\n }, 2000);\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Failed to change password');\n }\n }, [canSubmitPassword, currentPassword, newPassword, changePassword, onPasswordChange]);\n\n const handleCancelPasswordChange = useCallback(() => {\n setView('main');\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n setActionError(null);\n clearError();\n }, [clearError]);\n\n // Get user initials for avatar fallback\n const getInitials = () => {\n if (user?.name) {\n return user.name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n if (user?.email) {\n return user.email[0].toUpperCase();\n }\n return '?';\n };\n\n // Change Password view\n if (view === 'change-password') {\n return (\n <div className={`cedros-profile-settings ${className}`}>\n <div className=\"cedros-profile-panel\">\n <h3 className=\"cedros-profile-title\">Change password</h3>\n <p className=\"cedros-profile-description\">\n Enter your current password and choose a new one. This will log you out of other\n devices.\n </p>\n\n {(actionError || error) && (\n <div className=\"cedros-profile-error\">\n <ErrorMessage\n error={{ code: 'UNKNOWN_ERROR', message: actionError || error?.message || '' }}\n onDismiss={() => {\n setActionError(null);\n clearError();\n }}\n />\n </div>\n )}\n\n {successMessage && (\n <div className=\"cedros-profile-success\">\n <span className=\"cedros-profile-success-icon\">✓</span>\n {successMessage}\n </div>\n )}\n\n <div className=\"cedros-profile-form\">\n <div className=\"cedros-profile-field\">\n <PasswordInput\n label=\"Current password\"\n placeholder=\"Enter your current password\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n disabled={isLoading}\n autoFocus\n />\n </div>\n\n <div className=\"cedros-profile-field\">\n <PasswordInput\n label=\"New password\"\n placeholder=\"Enter new password\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n disabled={isLoading}\n showStrengthMeter\n />\n </div>\n\n <div className=\"cedros-profile-field\">\n <PasswordInput\n label=\"Confirm new password\"\n placeholder=\"Confirm new password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n disabled={isLoading}\n error={\n confirmPassword.length > 0 && !passwordsMatch\n ? 'Passwords do not match'\n : undefined\n }\n />\n </div>\n </div>\n\n <div className=\"cedros-profile-actions\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={handleCancelPasswordChange}\n disabled={isLoading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-primary cedros-button-md\"\n onClick={handlePasswordChange}\n disabled={isLoading || !canSubmitPassword}\n >\n {isLoading ? (\n <>\n <LoadingSpinner size=\"sm\" />\n <span>Changing...</span>\n </>\n ) : (\n 'Change password'\n )}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Main profile view\n return (\n <div className={`cedros-profile-settings ${className}`}>\n <div className=\"cedros-profile-panel\">\n <div className=\"cedros-profile-header\">\n <div className=\"cedros-profile-avatar-container\">\n {user?.picture ? (\n <img\n src={user.picture}\n alt={user.name || 'Profile'}\n className=\"cedros-profile-avatar\"\n />\n ) : (\n <div className=\"cedros-profile-avatar cedros-profile-avatar-fallback\">\n {getInitials()}\n </div>\n )}\n </div>\n <div className=\"cedros-profile-info\">\n <h3 className=\"cedros-profile-name\">{user?.name || 'User'}</h3>\n <p className=\"cedros-profile-email\">{user?.email}</p>\n </div>\n </div>\n\n <div className=\"cedros-profile-section\">\n <h4 className=\"cedros-profile-section-title\">Account</h4>\n\n <div className=\"cedros-profile-row\">\n <div className=\"cedros-profile-row-content\">\n <span className=\"cedros-profile-row-label\">Email</span>\n <span className=\"cedros-profile-row-value\">{user?.email || 'Not set'}</span>\n </div>\n </div>\n\n <div className=\"cedros-profile-row\">\n <div className=\"cedros-profile-row-content\">\n <span className=\"cedros-profile-row-label\">Password</span>\n <span className=\"cedros-profile-row-value\">••••••••</span>\n </div>\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-sm\"\n onClick={() => setView('change-password')}\n >\n Change\n </button>\n </div>\n </div>\n\n {onClose && (\n <div className=\"cedros-profile-footer\">\n <button\n type=\"button\"\n className=\"cedros-button cedros-button-outline cedros-button-md\"\n onClick={onClose}\n >\n Close\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Hook for Privacy Cash deposit operations\n *\n * Handles depositing SOL to the user's Privacy Cash account.\n * Requires an unlocked SSS wallet with no-recovery mode.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseDepositReturn,\n DepositResponse,\n DepositStatusResponse,\n DepositConfigResponse,\n DepositListResponse,\n DepositQuoteResponse,\n PublicDepositRequest,\n MicroDepositRequest,\n TieredDepositResponse,\n} from '../types/deposit';\n\nexport type { UseDepositReturn } from '../types/deposit';\n\n/**\n * Hook for Privacy Cash deposit operations\n *\n * Deposits go to the user's Privacy Cash account (user's pubkey is owner).\n * Credits are issued immediately, withdrawal to company wallet happens later.\n *\n * Requirements:\n * - User must have SSS wallet enrolled\n * - Wallet must be unlocked (call POST /wallet/unlock first)\n * - Wallet must be in \"no recovery\" mode\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useDeposit(): UseDepositReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const deposit = useCallback(\n async (amountLamports: number): Promise<DepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<DepositResponse>('/deposit', {\n amount_lamports: amountLamports,\n });\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStatus = useCallback(\n async (sessionId: string): Promise<DepositStatusResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<DepositStatusResponse>(`/deposit/status/${sessionId}`);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getConfig = useCallback(async (): Promise<DepositConfigResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<DepositConfigResponse>('/deposit/config');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit config');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listDeposits = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<DepositListResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/deposits?${query}` : '/deposits';\n const data = await apiClient.get<DepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getQuote = useCallback(\n async (params: {\n inputMint: string;\n amount: number;\n taker: string;\n }): Promise<DepositQuoteResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const queryParams = new URLSearchParams({\n input_mint: params.inputMint,\n amount: String(params.amount),\n taker: params.taker,\n });\n const data = await apiClient.get<DepositQuoteResponse>(`/deposit/quote?${queryParams}`);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit quote');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const publicDeposit = useCallback(\n async (request: PublicDepositRequest): Promise<TieredDepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<TieredDepositResponse>('/deposit/public', request);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute public deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const microDeposit = useCallback(\n async (request: MicroDepositRequest): Promise<TieredDepositResponse> => {\n if (!apiClient) {\n throw new Error('useDeposit must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<TieredDepositResponse>('/deposit/micro', request);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to execute micro deposit');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n return {\n deposit,\n getQuote,\n publicDeposit,\n microDeposit,\n getStatus,\n getConfig,\n listDeposits,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Token selector component for deposit currency selection\n *\n * Allows users to select which token to deposit.\n * Supports search and displays token icons.\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type { Token } from './tokens';\n\nexport interface TokenSelectorProps {\n /** List of available tokens */\n tokens: Token[];\n /** Currently selected token */\n selectedToken?: Token;\n /** Callback when token is selected */\n onSelect: (token: Token) => void;\n /** Signal to force-open the dropdown */\n openSignal?: number;\n /** Placeholder text when no token selected */\n placeholder?: string;\n /** Disable the selector */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Show search input */\n searchable?: boolean;\n}\n\n/**\n * Token selector dropdown component\n */\nexport function TokenSelector({\n tokens,\n selectedToken,\n onSelect,\n openSignal,\n placeholder = 'Select token',\n disabled = false,\n className = '',\n searchable = true,\n}: TokenSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Filter tokens by search\n const filteredTokens = useMemo(() => {\n if (!search.trim()) return tokens;\n const searchLower = search.toLowerCase();\n return tokens.filter(\n (token) =>\n token.symbol.toLowerCase().includes(searchLower) ||\n token.name.toLowerCase().includes(searchLower) ||\n token.mint.toLowerCase().includes(searchLower)\n );\n }, [tokens, search]);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setSearch('');\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Focus search input when opening\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n useEffect(() => {\n if (openSignal === undefined || disabled) return;\n setIsOpen(true);\n setSearch('');\n }, [openSignal, disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n if (isOpen) {\n setSearch('');\n }\n }\n }, [disabled, isOpen]);\n\n const handleSelect = useCallback(\n (token: Token) => {\n onSelect(token);\n setIsOpen(false);\n setSearch('');\n },\n [onSelect]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n setSearch('');\n } else if (event.key === 'Enter' && filteredTokens.length === 1) {\n handleSelect(filteredTokens[0]);\n }\n },\n [filteredTokens, handleSelect]\n );\n\n return (\n <div\n ref={containerRef}\n className={`cedros-token-selector ${isOpen ? 'cedros-token-selector-open' : ''} ${disabled ? 'cedros-token-selector-disabled' : ''} ${className}`}\n onKeyDown={handleKeyDown}\n >\n {/* Trigger button */}\n <button\n type=\"button\"\n className=\"cedros-token-selector-trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n >\n {selectedToken ? (\n <span className=\"cedros-token-selector-selected\">\n {selectedToken.logoUrl && (\n <img\n src={selectedToken.logoUrl}\n alt={selectedToken.symbol}\n className=\"cedros-token-icon\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n )}\n <span className=\"cedros-token-symbol\">{selectedToken.symbol}</span>\n </span>\n ) : (\n <span className=\"cedros-token-selector-placeholder\">{placeholder}</span>\n )}\n <span className=\"cedros-token-selector-arrow\">{isOpen ? '▲' : '▼'}</span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div className=\"cedros-token-selector-dropdown\" role=\"listbox\">\n {/* Search input */}\n {searchable && (\n <div className=\"cedros-token-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search tokens...\"\n className=\"cedros-token-search-input\"\n />\n </div>\n )}\n\n {/* Token list */}\n <div className=\"cedros-token-list\">\n {filteredTokens.length === 0 ? (\n <div className=\"cedros-token-empty\">No tokens found</div>\n ) : (\n <>\n {filteredTokens.map((token) => (\n <button\n key={token.mint}\n type=\"button\"\n className={`cedros-token-option ${selectedToken?.mint === token.mint ? 'cedros-token-option-selected' : ''}`}\n onClick={() => handleSelect(token)}\n role=\"option\"\n aria-selected={selectedToken?.mint === token.mint}\n >\n {token.logoUrl && (\n <img\n src={token.logoUrl}\n alt={token.symbol}\n className=\"cedros-token-icon\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n )}\n <span className=\"cedros-token-info\">\n <span className=\"cedros-token-symbol\">{token.symbol}</span>\n <span className=\"cedros-token-name\">{token.name}</span>\n </span>\n {selectedToken?.mint === token.mint && (\n <span className=\"cedros-token-check\">✓</span>\n )}\n </button>\n ))}\n </>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { DepositConfigResponse, DepositTier } from '../../types/deposit';\n\n/**\n * Determine which tier an amount falls into\n *\n * When private deposits are disabled (recovery mode enabled), the 'private'\n * tier is not available and amounts that would qualify for it fall back to 'public'.\n */\nexport function getTierForAmount(usd: number, config: DepositConfigResponse): DepositTier {\n // Skip private tier if recovery mode is enabled (privateDepositsEnabled is false)\n if (config.privateDepositsEnabled && usd >= config.privateMinUsd) return 'private';\n if (usd >= config.publicMinUsd) return 'public';\n return 'sol_micro';\n}\n","export default \"data:image/webp;base64,UklGRkACAABXRUJQVlA4IDQCAACQDQCdASo8ADwAPjEWiUMiISEUBFQgAwSgB4Z/TeLt3XMAoQH23eph0gPMB+sn+M9tvngOsA9ADwgPg3/cH9sfZciikEBuA1AB+nf+84CUkAVvA2x4xvyobR+mBaYhjUv/ewHb4hTqOnP38rzsxZX2inOSciAA/v7uqvqGdpWcjjrfMDFaNHumTog38t3yor0kbjn631VsX61cAC749wWuAX74u/f/hpeDFqS/ci8E1g94wk9UVs7BHqtv7f/M9iT1u5ITJV0Gv6tE/CW5j/nVR6yExJ6JoDRDOWQ8zVpWH92r3Lnbnc4WJpOchbRT3H5rv//6PP+F//4ehLUlR/4tkRUKZu/yOa26+sywmY+Xc1X2lXMcUv7+eQ7+FBE7bhKc7htieBfH4eR134AVaILL7PWA2FjzAjfaP1Lgirqoq/ZooE8jVD/b4g3J3O3/TG/4ajHe6clnAI/4NdwrnHX0P/quBU03HqSsQ0qsEMAuhrH/jn+YtDzmjm8q/cGJ44qvi24Hn+G1kxz2XP2S/Gp7ri5cMlo+muuwBjyNJnnEcTt/5cRdYS2cbEBZtpINWj3PuC1EOsd/8cTepSpxODcJHLzktfC1PHW3Pgoh3J5PHjW3TCQ1Wlu/wP8e8OPfNm48BODGChioj3ezblqrOBV+cI+hLi7ReJdvBF/4jY+/Un0asuWnrA6kRNpgOeO8wyl4Ryhkrff+9R1SpyPYP+5T3EuWWLZaCn0bGzyk97S3VAAAAAA=\"","/**\n * Tiered amount input with deposit tier indicator\n *\n * Shows which deposit tier (private, public, sol_micro) applies\n * based on the entered USD amount. Displays tier-specific guidance\n * for privacy and processing expectations.\n */\n\nimport { useMemo } from 'react';\nimport type { DepositTier, DepositConfigResponse } from '../../types/deposit';\nimport { getTierForAmount } from './tierUtils';\nimport solLogo from '../../assets/tokens/sol.webp';\n\nexport interface TieredAmountSliderProps {\n /** Deposit configuration with tier thresholds */\n config: DepositConfigResponse;\n /** Current amount in USD */\n valueUsd: number;\n /** Amount change handler */\n onChange: (valueUsd: number) => void;\n /** Cap in USD (default: 10000) */\n maxUsd?: number;\n /** Disabled state */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst DEFAULT_MAX_USD = 10_000;\nconst SLIDER_STEPS = 1000;\nconst CURVE_POWER = 3;\n\nfunction formatUsd(value: number): string {\n if (!Number.isFinite(value)) return '$0';\n return `$${Math.round(value)}`;\n}\n\nfunction getTierInfo(tier: DepositTier, config: DepositConfigResponse) {\n switch (tier) {\n case 'private':\n return {\n label: 'Private',\n detail: 'Private transaction, instant credit',\n note: null,\n };\n case 'public':\n return {\n label: 'Public',\n detail: 'Visible on-chain, instant credit',\n note: null,\n };\n case 'sol_micro':\n return {\n label: 'SOL Only',\n detail: `SOL only under ${formatUsd(config.solMicroMaxUsd)}`,\n note: 'Small deposits must be sent in SOL and are visible on-chain. Increase the amount to use tokens.',\n };\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction usdToSlider(usd: number, maxUsd: number): number {\n if (maxUsd <= 0) return 0;\n const normalized = clamp(usd / maxUsd, 0, 1);\n return Math.round(Math.pow(normalized, 1 / CURVE_POWER) * SLIDER_STEPS);\n}\n\nfunction sliderToUsd(position: number, maxUsd: number): number {\n const normalized = clamp(position / SLIDER_STEPS, 0, 1);\n return maxUsd * Math.pow(normalized, CURVE_POWER);\n}\n\nfunction getUsdStep(value: number): number {\n if (value < 10) return 0.01;\n if (value < 100) return 1;\n if (value < 500) return 5;\n if (value < 1000) return 10;\n if (value < 5000) return 25;\n return 50;\n}\n\nfunction getStepDecimals(step: number): number {\n if (step < 1) return 2;\n return 0;\n}\n\nfunction roundUsd(value: number): number {\n const step = getUsdStep(value);\n const rounded = Math.round(value / step) * step;\n const decimals = getStepDecimals(step);\n return Number(rounded.toFixed(decimals));\n}\n\n/**\n * Tiered amount input with deposit tier indicator\n */\nexport function TieredAmountSlider({\n config,\n valueUsd,\n onChange,\n maxUsd = DEFAULT_MAX_USD,\n disabled = false,\n className = '',\n}: TieredAmountSliderProps) {\n const normalizedValue = clamp(Number.isFinite(valueUsd) ? valueUsd : 0, 0, maxUsd);\n const tier = useMemo(() => getTierForAmount(normalizedValue, config), [normalizedValue, config]);\n const tierInfo = getTierInfo(tier, config);\n const sliderValue = usdToSlider(normalizedValue, maxUsd);\n const sliderPercent = (sliderValue / SLIDER_STEPS) * 100;\n\n return (\n <div className={`cedros-tiered-slider ${className}`}>\n <div className=\"cedros-tiered-slider-input-row\">\n <div className=\"cedros-tiered-slider-input\">\n <span className=\"cedros-tiered-slider-currency\">$</span>\n <input\n type=\"number\"\n value={normalizedValue || ''}\n onChange={(e) => onChange(roundUsd(parseFloat(e.target.value) || 0))}\n placeholder=\"Enter amount\"\n disabled={disabled}\n min={0}\n step={getUsdStep(normalizedValue)}\n className=\"cedros-deposit-flow-input cedros-tiered-slider-input-field\"\n aria-label=\"Deposit amount\"\n />\n </div>\n <div className=\"cedros-tiered-slider-tier\">\n <span className={`cedros-tiered-slider-badge cedros-tiered-slider-badge-${tier}`}>\n {tier === 'sol_micro' && (\n <img src={solLogo} alt=\"SOL\" className=\"cedros-tiered-slider-badge-icon\" />\n )}\n {tierInfo.label}\n </span>\n <span className=\"cedros-tiered-slider-tier-detail\">{tierInfo.detail}</span>\n </div>\n </div>\n\n <input\n type=\"range\"\n min={0}\n max={SLIDER_STEPS}\n step={1}\n value={sliderValue}\n onChange={(e) => onChange(roundUsd(sliderToUsd(parseFloat(e.target.value), maxUsd)))}\n className=\"cedros-tiered-slider-range\"\n style={{\n background: `linear-gradient(to right, var(--cedros-primary) 0%, var(--cedros-primary) ${sliderPercent}%, var(--cedros-border) ${sliderPercent}%, var(--cedros-border) 100%)`,\n }}\n disabled={disabled}\n aria-label=\"Deposit amount slider\"\n />\n\n {tierInfo.note && <div className=\"cedros-tiered-slider-note\">{tierInfo.note}</div>}\n </div>\n );\n}\n","/**\n * Multi-step deposit flow component\n *\n * Provides a complete deposit wizard with configurable currency support:\n * - SOL only mode\n * - Single token mode (admin-configured token)\n * - Multi-token mode (user selects from allowed tokens)\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { useDeposit } from '../../hooks/useDeposit';\nimport { useWallet } from '../../hooks/useWallet';\nimport { TokenSelector } from './TokenSelector';\nimport { TieredAmountSlider } from './TieredAmountSlider';\nimport { getTierForAmount } from './tierUtils';\nimport solLogo from '../../assets/tokens/sol.webp';\nimport { sanitizeExternalUrl } from '../../utils/sanitization';\nimport type { Token } from './tokens';\nimport type { DepositResponse, DepositConfigResponse } from '../../types/deposit';\n\n/** Check if any user-facing fee is enabled */\nfunction hasUserFee(config: DepositConfigResponse): boolean {\n return (\n config.companyFeePercent > 0 ||\n config.feePolicy === 'user_pays_all' ||\n config.feePolicy === 'user_pays_swap' ||\n config.feePolicy === 'user_pays_privacy'\n );\n}\n\n/** Calculate effective fee percentage based on config and deposit type */\nfunction getEffectiveFeePercent(\n config: DepositConfigResponse,\n isPrivate: boolean,\n isMicro: boolean\n): number {\n const { feePolicy, privacyFeePercent, swapFeePercent, companyFeePercent } = config;\n let userFee = companyFeePercent;\n if (isMicro) return userFee;\n if (feePolicy === 'user_pays_all') {\n userFee += swapFeePercent;\n if (isPrivate) {\n userFee += privacyFeePercent;\n }\n } else if (feePolicy === 'user_pays_privacy' && isPrivate) {\n userFee += privacyFeePercent;\n } else if (feePolicy === 'user_pays_swap') {\n userFee += swapFeePercent;\n }\n return userFee;\n}\n\n/** Currency configuration mode */\nexport type CurrencyMode = 'sol' | 'single-token' | 'multi-token';\n\n/** Deposit method - how the user will deposit funds */\nexport type DepositMethod = 'sign' | 'receive';\n\n/** Flow step */\nexport type DepositFlowStep =\n | 'explainer'\n | 'unlock'\n | 'confirm' // Sign mode: select token + enter amount + sign\n | 'signing'\n | 'show-address' // Receive mode: select token + show address, auto-detect amount\n | 'waiting'\n | 'success'\n | 'error';\n\n/** Configuration for the optional explainer step */\nexport interface ExplainerConfig {\n /** Custom title (default: \"How Deposits Work\") */\n title?: string;\n /** Custom body text (default explains Solana and suggests exchange) */\n body?: string;\n /** Exchange URL (default: \"https://www.coinbase.com\") */\n exchangeUrl?: string;\n /** Exchange name (default: \"Coinbase\") */\n exchangeName?: string;\n /** Whether to show the exchange suggestion (default: true) */\n showExchangeSuggestion?: boolean;\n}\n\nexport interface DepositFlowProps {\n /** Deposit configuration (required) */\n config: DepositConfigResponse;\n /**\n * Currency mode determines what tokens users can deposit:\n * - 'sol': SOL only (no token selection step)\n * - 'single-token': Single admin-configured token (shows token info, no selection)\n * - 'multi-token': User selects from available tokens\n */\n currencyMode: CurrencyMode;\n /**\n * Deposit method determines how the user deposits:\n * - 'sign': User has a connected wallet and signs transactions (default for browser wallets)\n * - 'receive': User sends from external source (exchange) to deposit address (embedded wallet)\n *\n * If not specified, auto-detects based on wallet status:\n * - If user has external wallet connected → 'sign'\n * - If user has embedded wallet only → 'receive'\n */\n depositMethod?: DepositMethod;\n /**\n * Available tokens for single-token or multi-token modes.\n * For single-token mode, only the first token is used.\n * Ignored in 'sol' mode.\n */\n tokens?: Token[];\n /** Pre-selected token (for multi-token mode) */\n defaultToken?: Token;\n /** Minimum deposit amount (overrides server config) */\n minAmount?: number;\n /** Maximum deposit amount */\n maxAmount?: number;\n /** Callback on successful deposit */\n onSuccess?: (result: DepositFlowResult) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback when user cancels */\n onCancel?: () => void;\n /** Callback to request wallet unlock */\n onUnlockRequired?: () => void;\n /**\n * Callback to authorize deposit with password/PIN.\n * This sends the password to the server to decrypt Share B for withdrawal signing.\n * Returns the session ID for tracking the deposit.\n *\n * For sign mode: amount is the user-entered deposit amount\n * For receive mode: amount is 0 (auto-detected when deposit arrives)\n */\n onAuthorize?: (\n password: string,\n amount: number | null,\n token: Token\n ) => Promise<{ sessionId: string; depositAddress: string }>;\n /** Additional CSS classes */\n className?: string;\n /** Show step indicator */\n showStepIndicator?: boolean;\n /** Polling interval for checking deposit status in receive mode (ms, default: 5000) */\n pollInterval?: number;\n /** Demo mode - skips wallet checks for Storybook/testing (default: false) */\n demoMode?: boolean;\n /** Demo mode auto-confirm delay in ms (storybook only) */\n demoAutoConfirmMs?: number;\n /** USD price overrides for non-USD tokens (by symbol) */\n tokenPriceUsd?: Record<string, number>;\n /**\n * Show an optional explainer step for non-crypto-native users.\n * This explains Solana and suggests an exchange for purchasing.\n * Admin-controlled setting (default: false)\n */\n showExplainer?: boolean;\n /** Site name to display in explainer (e.g., \"Acme Inc\") */\n siteName?: string;\n /** Configuration for the explainer step content */\n explainerConfig?: ExplainerConfig;\n}\n\nexport interface DepositFlowResult {\n /** Selected token (null for SOL) */\n token: Token | null;\n /** Amount in token units */\n amount: number;\n /** Amount in lamports (for SOL) or smallest unit */\n amountSmallestUnit: number;\n /** Transaction signature (for sign mode) */\n txSignature: string;\n /** Session ID for tracking */\n sessionId: string;\n /** Deposit response from server */\n response: DepositResponse;\n /** Deposit method used */\n method: DepositMethod;\n /** Deposit address (for receive mode) */\n depositAddress?: string;\n}\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * SOL token definition for SOL-only mode\n */\nconst SOL_TOKEN: Token = {\n mint: 'So11111111111111111111111111111111111111112',\n symbol: 'SOL',\n name: 'Solana',\n decimals: 9,\n logoUrl: solLogo,\n};\n\nconst OTHER_TOKEN: Token = {\n mint: 'other',\n symbol: 'OTHER',\n name: 'Other',\n decimals: 6,\n};\n\nconst MAX_DEPOSIT_USD = 10_000;\n\ninterface FeeLineItem {\n label: string;\n solAmount: number;\n percent: number;\n usdAmount: number;\n}\n\nfunction calculateFeeLines(config: DepositConfigResponse, amountUsd: number): FeeLineItem[] {\n const isMicro = amountUsd < config.publicMinUsd;\n const isPrivate = amountUsd >= config.privateMinUsd;\n const lines: FeeLineItem[] = [];\n\n const privacyActive =\n !isMicro &&\n isPrivate &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_privacy') &&\n (config.privacyFeeFixedLamports > 0 || config.privacyFeePercent > 0);\n const swapActive =\n !isMicro &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_swap') &&\n (config.swapFeeFixedLamports > 0 || config.swapFeePercent > 0);\n const companyActive = config.companyFeeFixedLamports > 0 || config.companyFeePercent > 0;\n\n if (privacyActive) {\n const solAmount = config.privacyFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.privacyFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Privacy', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n if (swapActive) {\n const solAmount = config.swapFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.swapFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Swap', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n if (companyActive) {\n const solAmount = config.companyFeeFixedLamports / LAMPORTS_PER_SOL;\n const percent = config.companyFeePercent;\n const fixedUsd = solAmount * config.solPriceUsd;\n const percentUsd = amountUsd * (percent / 100);\n lines.push({ label: 'Service', solAmount, percent, usdAmount: fixedUsd + percentUsd });\n }\n\n return lines;\n}\n\nfunction formatFeeTooltip(\n config: DepositConfigResponse,\n amountUsd: number,\n totalFeeUsd: number\n): string {\n const feeLines = calculateFeeLines(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n\n if (feeLines.length === 0) {\n return `Total: $${feeTotalDisplay.toFixed(2)}`;\n }\n\n // Calculate totals\n const totalSol = feeLines.reduce((sum, line) => sum + line.solAmount, 0);\n const totalPercent = feeLines.reduce((sum, line) => sum + line.percent, 0);\n\n // Format as a table with column dividers\n // Fixed column widths for alignment (with padding space on each side)\n const COL = { fee: 7, sol: 8, rate: 7, usd: 8 };\n\n const formatLine = (item: FeeLineItem): string => {\n const label = item.label.padEnd(COL.fee);\n const sol = item.solAmount.toFixed(4).padStart(6).padEnd(COL.sol);\n const pct = (item.percent.toFixed(2) + '%').padStart(5).padEnd(COL.rate);\n const usd = ('$' + Math.max(item.usdAmount, 0.01).toFixed(2)).padEnd(COL.usd);\n return `${label} │ ${sol} │ ${pct} │ ${usd}`;\n };\n\n const header = `${'Fee'.padEnd(COL.fee)} │ ${'SOL'.padEnd(COL.sol)} │ ${'+ Rate'.padEnd(COL.rate)} │ ${'= Total'.padEnd(COL.usd)}`;\n const divider = `${'─'.repeat(COL.fee)}─┼─${'─'.repeat(COL.sol)}─┼─${'─'.repeat(COL.rate)}─┼─${'─'.repeat(COL.usd)}`;\n\n const totalUsdStr = ('$' + feeTotalDisplay.toFixed(2)).padEnd(COL.usd);\n const totalLine = `${'TOTAL'.padEnd(COL.fee)} │ ${totalSol.toFixed(4).padStart(6).padEnd(COL.sol)} │ ${(totalPercent.toFixed(2) + '%').padStart(5).padEnd(COL.rate)} │ ${totalUsdStr}`;\n\n const lines = [header, divider, ...feeLines.map(formatLine), divider, totalLine];\n return lines.join('\\n');\n}\n\nfunction formatExplainerFeeSummary(config: DepositConfigResponse): string {\n const feeLabels: string[] = [];\n const hasPrivacyFee = config.privacyFeeFixedLamports > 0 || config.privacyFeePercent > 0;\n const hasSwapFee = config.swapFeeFixedLamports > 0 || config.swapFeePercent > 0;\n const hasCompanyFee = config.companyFeeFixedLamports > 0 || config.companyFeePercent > 0;\n\n if (hasPrivacyFee) feeLabels.push('Privacy Cash fee');\n if (hasSwapFee) feeLabels.push('swap fee');\n if (hasCompanyFee) feeLabels.push('company service fee');\n\n if (feeLabels.length === 0) {\n return 'No processing fees apply to deposits.';\n }\n\n return \"A small fee may apply. We'll show exact totals before you confirm.\";\n}\n\nfunction getTotalFeeUsd(config: DepositConfigResponse, amountUsd: number): number {\n if (amountUsd <= 0) return 0;\n const isMicro = amountUsd < config.publicMinUsd;\n const isPrivate = amountUsd >= config.privateMinUsd;\n const feePercent = getEffectiveFeePercent(config, isPrivate, isMicro);\n let userFixedLamports = config.companyFeeFixedLamports;\n if (!isMicro) {\n if (\n isPrivate &&\n (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_privacy')\n ) {\n userFixedLamports += config.privacyFeeFixedLamports;\n }\n if (config.feePolicy === 'user_pays_all' || config.feePolicy === 'user_pays_swap') {\n userFixedLamports += config.swapFeeFixedLamports;\n }\n }\n const fixedFeeUsd = (userFixedLamports / LAMPORTS_PER_SOL) * config.solPriceUsd;\n const percentFeeUsd = amountUsd * (feePercent / 100);\n return fixedFeeUsd + percentFeeUsd;\n}\n\nfunction getPurchaseCurrencyLabel(\n currencyMode: CurrencyMode,\n token: Token,\n tokens: Token[]\n): string {\n if (currencyMode === 'sol') {\n return 'SOL';\n }\n if (currencyMode === 'single-token') {\n return token.symbol;\n }\n const hasUsdc = tokens.some((supported) => supported.symbol === 'USDC');\n return hasUsdc ? 'SOL or USDC' : 'SOL or supported tokens';\n}\n\nfunction normalizeTokenSymbols(symbols: string[]): string[] {\n return symbols.map((symbol) => symbol.trim()).filter(Boolean);\n}\n\nconst USD_STABLE_TOKENS = new Set(['USDC', 'USDT', 'USD1', 'PYUSD', 'USDH', 'CASH']);\n\nfunction getTokenUsdPrice(\n token: Token,\n config: DepositConfigResponse,\n priceOverrides?: Record<string, number>\n): number | null {\n // USD stablecoins are always $1\n if (USD_STABLE_TOKENS.has(token.symbol)) return 1;\n\n // Check server-provided token prices first (includes SOL, BONK, ORE, EURC)\n const serverPrice = config.tokenPrices?.[token.symbol];\n if (serverPrice && serverPrice > 0) return serverPrice;\n\n // Fallback to SOL price for backwards compatibility\n if (token.symbol === 'SOL') return config.solPriceUsd || null;\n\n // Check prop overrides for custom tokens\n const override = priceOverrides?.[token.symbol];\n if (override && override > 0) return override;\n\n return null;\n}\n\nfunction formatTokenAmount(amount: number, symbol: string): string {\n const decimals = USD_STABLE_TOKENS.has(symbol) ? 2 : 4;\n return amount.toFixed(decimals);\n}\n\n/**\n * Multi-step deposit flow component\n */\nexport function DepositFlow({\n config,\n currencyMode,\n depositMethod: depositMethodProp,\n tokens = [],\n defaultToken,\n minAmount,\n maxAmount = 10000,\n onSuccess,\n onError,\n onCancel,\n onUnlockRequired,\n onAuthorize,\n className = '',\n showStepIndicator = true,\n pollInterval = 5000,\n demoMode = false,\n demoAutoConfirmMs,\n tokenPriceUsd,\n showExplainer = false,\n siteName,\n explainerConfig,\n}: DepositFlowProps) {\n const { deposit, getStatus, error: depositError, clearError } = useDeposit();\n const wallet = useWallet();\n const quickActionSymbols = normalizeTokenSymbols(config.quickActionTokens);\n const customTokenSymbols = normalizeTokenSymbols(config.customTokenSymbols);\n // Merge preset tokens with admin-configured custom tokens\n const mergedTokens = useMemo(() => {\n const customDefs = config.customTokens ?? [];\n if (customDefs.length === 0) return tokens;\n\n // Build set of existing symbols for deduplication\n const seen = new Set(tokens.map((t) => t.symbol));\n const merged = [...tokens];\n\n // Add custom tokens that don't conflict with presets\n for (const def of customDefs) {\n if (!seen.has(def.symbol)) {\n merged.push({\n mint: def.mint,\n symbol: def.symbol,\n name: def.symbol, // Use symbol as name for custom tokens\n decimals: def.decimals,\n logoUrl: def.logoUrl,\n });\n seen.add(def.symbol);\n }\n }\n return merged;\n }, [tokens, config.customTokens]);\n\n // Filter merged tokens based on customTokenSymbols setting\n const customListTokens = useMemo(() => {\n if (customTokenSymbols.length === 0) return mergedTokens;\n const filtered = mergedTokens.filter((token) => customTokenSymbols.includes(token.symbol));\n return filtered.length > 0 ? filtered : mergedTokens;\n }, [mergedTokens, customTokenSymbols]);\n\n // Auto-detect deposit method if not specified\n // - Sign mode requires private deposits enabled (server-side signing via SSS)\n // - If private deposits disabled (recovery mode enabled), force receive mode\n // - If user has external wallet (browser extension) → sign mode (if allowed)\n // - If user has embedded wallet only → receive mode\n const canUseSignMode = config.privateDepositsEnabled;\n const depositMethod: DepositMethod = depositMethodProp\n ? depositMethodProp === 'sign' && !canUseSignMode\n ? 'receive'\n : depositMethodProp\n : canUseSignMode && wallet.hasExternalWallet\n ? 'sign'\n : 'receive';\n\n // Determine effective token based on mode\n // Priority: defaultToken > first quick action token > USDC > first non-SOL > first token > SOL\n const firstQuickActionToken = quickActionSymbols[0]\n ? mergedTokens.find((t) => t.symbol === quickActionSymbols[0])\n : undefined;\n const effectiveToken =\n currencyMode === 'sol'\n ? SOL_TOKEN\n : currencyMode === 'single-token'\n ? (firstQuickActionToken ??\n mergedTokens.find((t) => t.symbol === 'USDC') ??\n mergedTokens[0] ??\n SOL_TOKEN)\n : (defaultToken ??\n firstQuickActionToken ??\n mergedTokens.find((candidate) => candidate.symbol === 'USDC') ??\n mergedTokens.find((candidate) => candidate.symbol !== 'SOL') ??\n mergedTokens[0] ??\n SOL_TOKEN);\n\n // Determine the first step based on configuration\n const getFirstStep = useCallback((): DepositFlowStep => {\n if (showExplainer) return 'explainer';\n return 'unlock';\n }, [showExplainer]);\n\n // State\n const [step, setStep] = useState<DepositFlowStep>(getFirstStep);\n const [selectedToken, setSelectedToken] = useState<Token>(effectiveToken);\n const [amount, setAmount] = useState<string>('');\n const [result, setResult] = useState<DepositFlowResult | null>(null);\n const [flowError, setFlowError] = useState<string | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [depositAddress, setDepositAddress] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [isAuthorizing, setIsAuthorizing] = useState(false);\n const [receiveAmountUsd, setReceiveAmountUsd] = useState<number | null>(null);\n\n // Reset flow when currencyMode or depositMethod changes\n useEffect(() => {\n setStep(getFirstStep());\n setSelectedToken(effectiveToken);\n setAmount('');\n setResult(null);\n setFlowError(null);\n setSessionId(null);\n setDepositAddress(null);\n setCopied(false);\n setIsAuthorizing(false);\n setReceiveAmountUsd(null);\n clearError();\n }, [currencyMode, depositMethod, effectiveToken, clearError, getFirstStep]);\n\n const effectiveMin = minAmount ?? config.privateMinSol;\n const effectiveMax = maxAmount;\n\n // Parse amount (used by handleDeposit for sign mode)\n const parsedAmount = parseFloat(amount);\n\n // Wallet status\n const isEnrolled =\n wallet.status === 'enrolled_locked' ||\n wallet.status === 'enrolled_unlocked' ||\n wallet.status === 'unlocked';\n const walletReady = isEnrolled && wallet.isUnlocked;\n const needsUnlock = isEnrolled && !wallet.isUnlocked;\n\n // Get steps based on mode and deposit method\n const getSteps = useCallback((): { key: DepositFlowStep; label: string }[] => {\n // Sign mode: authorize → select token + enter amount & sign → complete\n const signSteps = [\n { key: 'unlock' as const, label: 'Authorize' },\n { key: 'confirm' as const, label: 'Send' },\n { key: 'signing' as const, label: 'Signing' },\n { key: 'success' as const, label: 'Complete' },\n ];\n\n // Receive mode: authorize → select token + show address → auto-detect deposit → complete\n const receiveSteps = [\n { key: 'unlock' as const, label: 'Authorize' },\n { key: 'show-address' as const, label: 'Send' },\n { key: 'waiting' as const, label: 'Confirming' },\n { key: 'success' as const, label: 'Complete' },\n ];\n\n let steps: { key: DepositFlowStep; label: string }[] =\n depositMethod === 'sign' ? signSteps : receiveSteps;\n\n if (showExplainer) {\n steps = [{ key: 'explainer', label: 'Info' }, ...steps];\n }\n\n return steps;\n }, [depositMethod, showExplainer]);\n\n const steps = getSteps();\n const currentStepIndex = steps.findIndex((s) => s.key === step);\n\n // Handle token selection\n const handleTokenSelect = useCallback((token: Token) => {\n setSelectedToken(token);\n }, []);\n\n // Handle authorization (password submission to decrypt Share B on server)\n const handleAuthorize = useCallback(\n async (password: string) => {\n if (!onAuthorize) {\n // If no onAuthorize callback, skip to next step\n setStep(depositMethod === 'sign' ? 'confirm' : 'show-address');\n return;\n }\n\n setIsAuthorizing(true);\n setFlowError(null);\n\n try {\n // For receive mode, amount is null (auto-detected when deposit arrives)\n const authorizeAmount = depositMethod === 'sign' ? parsedAmount : null;\n const result = await onAuthorize(password, authorizeAmount, selectedToken);\n setSessionId(result.sessionId);\n setDepositAddress(result.depositAddress);\n setStep(depositMethod === 'sign' ? 'confirm' : 'show-address');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Authorization failed');\n setFlowError(error.message);\n } finally {\n setIsAuthorizing(false);\n }\n },\n [onAuthorize, depositMethod, parsedAmount, selectedToken]\n );\n\n // Handle deposit submission (sign mode)\n const handleDeposit = useCallback(\n async (depositAmount?: number, depositToken?: Token) => {\n clearError();\n setFlowError(null);\n setStep('signing');\n\n const finalAmount = depositAmount ?? parsedAmount;\n const finalToken = depositToken ?? selectedToken;\n\n // Skip wallet checks in demo mode\n if (!demoMode) {\n if (needsUnlock && onUnlockRequired) {\n onUnlockRequired();\n setStep('confirm');\n return;\n }\n\n if (!walletReady) {\n setFlowError('Wallet not ready');\n setStep('error');\n return;\n }\n }\n\n try {\n // Convert amount to smallest unit\n const smallestUnit = Math.floor(finalAmount * Math.pow(10, finalToken.decimals));\n\n // Demo mode: simulate signing delay and success\n if (demoMode) {\n await new Promise((resolve) => setTimeout(resolve, 1500));\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : finalToken,\n amount: finalAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: `demo-tx-${Date.now()}`,\n sessionId: sessionId || `demo-session-${Date.now()}`,\n response: {\n sessionId: sessionId || `demo-session-${Date.now()}`,\n txSignature: `demo-tx-${Date.now()}`,\n amountLamports: smallestUnit,\n message: 'Demo deposit successful',\n withdrawalAvailableAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n method: 'sign',\n };\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n return;\n }\n\n // For now, deposit API only supports SOL (lamports)\n // Token deposits would need Jupiter swap integration\n const response = await deposit(smallestUnit);\n\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : finalToken,\n amount: finalAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: response.txSignature,\n sessionId: response.sessionId,\n response,\n method: 'sign',\n };\n\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Deposit failed');\n setFlowError(error.message);\n setStep('error');\n onError?.(error);\n }\n },\n [\n deposit,\n parsedAmount,\n selectedToken,\n currencyMode,\n demoMode,\n sessionId,\n walletReady,\n needsUnlock,\n onUnlockRequired,\n onSuccess,\n onError,\n clearError,\n ]\n );\n\n // Handle \"I've sent it\" button - start polling\n const handleSentDeposit = useCallback(() => {\n setStep('waiting');\n }, []);\n\n // Copy address to clipboard\n const handleCopyAddress = useCallback(async () => {\n const address = depositAddress || wallet.solanaPubkey;\n if (address) {\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea');\n textArea.value = address;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }\n }, [depositAddress, wallet.solanaPubkey]);\n\n // Poll for deposit status as soon as we show the address (don't wait for \"I've sent it\")\n // This enables auto-detection: if user sends deposit, we detect it and skip to success\n useEffect(() => {\n // Start polling when showing deposit address (confirm step in sign mode, show-address/waiting in receive mode)\n // Skip in demo mode - user must click \"I've sent it\" to proceed\n const isListeningStep = step === 'confirm' || step === 'show-address' || step === 'waiting';\n if (!isListeningStep || !sessionId || demoMode) return;\n\n let cancelled = false;\n let pollCount = 0;\n const maxPolls = 360; // 30 minutes at 5s interval (user may take time to send from exchange)\n\n const poll = async () => {\n if (cancelled || pollCount >= maxPolls) return;\n pollCount++;\n\n try {\n // Check for deposit status from server\n // Server auto-detects incoming deposits and returns the amount\n const status = await getStatus(sessionId);\n\n if (status.status === 'completed' || status.status === 'detected') {\n // Get the actual deposited amount from the server response\n const detectedAmount = status.amountLamports\n ? status.amountLamports / Math.pow(10, selectedToken.decimals)\n : 0;\n const smallestUnit = status.amountLamports || 0;\n\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : selectedToken,\n amount: detectedAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: status.txSignature || '',\n sessionId: sessionId,\n response: status as unknown as DepositResponse,\n method: 'receive',\n depositAddress: wallet.solanaPubkey ?? undefined,\n };\n\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n return;\n }\n } catch {\n // Continue polling on error\n }\n\n if (!cancelled) {\n setTimeout(poll, pollInterval);\n }\n };\n\n poll();\n\n return () => {\n cancelled = true;\n };\n }, [\n step,\n sessionId,\n demoMode,\n getStatus,\n selectedToken,\n currencyMode,\n wallet.solanaPubkey,\n onSuccess,\n pollInterval,\n ]);\n\n useEffect(() => {\n if (!demoMode || !demoAutoConfirmMs || step !== 'waiting' || depositMethod !== 'receive')\n return;\n if (!depositAddress) return;\n\n const timeout = window.setTimeout(() => {\n const amountUsd = receiveAmountUsd ?? config.privateMinUsd;\n const tokenAmount =\n selectedToken.symbol === 'SOL' && config.solPriceUsd > 0\n ? amountUsd / config.solPriceUsd\n : amountUsd;\n const smallestUnit = Math.floor(tokenAmount * Math.pow(10, selectedToken.decimals));\n const flowResult: DepositFlowResult = {\n token: currencyMode === 'sol' ? null : selectedToken,\n amount: tokenAmount,\n amountSmallestUnit: smallestUnit,\n txSignature: `demo-tx-${Date.now()}`,\n sessionId: sessionId || `demo-session-${Date.now()}`,\n response: {\n sessionId: sessionId || `demo-session-${Date.now()}`,\n txSignature: `demo-tx-${Date.now()}`,\n amountLamports: smallestUnit,\n message: 'Demo deposit detected',\n withdrawalAvailableAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n method: 'receive',\n depositAddress: depositAddress ?? undefined,\n };\n setResult(flowResult);\n setStep('success');\n onSuccess?.(flowResult);\n }, demoAutoConfirmMs);\n\n return () => window.clearTimeout(timeout);\n }, [\n demoMode,\n demoAutoConfirmMs,\n step,\n depositMethod,\n depositAddress,\n receiveAmountUsd,\n config,\n selectedToken,\n currencyMode,\n sessionId,\n onSuccess,\n ]);\n\n // Reset flow\n const handleReset = useCallback(() => {\n setStep(getFirstStep());\n setAmount('');\n setResult(null);\n setFlowError(null);\n clearError();\n }, [getFirstStep, clearError]);\n\n // Deposits disabled\n if (!config.enabled) {\n return (\n <div className={`cedros-deposit-flow cedros-deposit-flow-disabled ${className}`}>\n <p>Deposits are not currently available.</p>\n </div>\n );\n }\n\n return (\n <div className={`cedros-deposit-flow ${className}`}>\n {/* Step Indicator */}\n {showStepIndicator && step !== 'error' && (\n <div className=\"cedros-deposit-flow-steps\">\n {steps.map((s, idx) => {\n const isActive = currentStepIndex >= idx;\n const isCurrent = s.key === step;\n return (\n <div\n key={s.key}\n className={`cedros-deposit-flow-step-item ${isActive ? 'step-active' : ''}`}\n >\n <div\n className={`cedros-deposit-flow-step-circle ${isActive ? 'active' : ''} ${isCurrent ? 'current' : ''}`}\n >\n {idx + 1}\n </div>\n <span className={`cedros-deposit-flow-step-label ${isActive ? 'active' : ''}`}>\n {s.label}\n </span>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Step Content */}\n <div className=\"cedros-deposit-flow-content\">\n {step === 'explainer' && (\n <ExplainerStep\n siteName={siteName}\n config={explainerConfig}\n depositConfig={config}\n currencyMode={currencyMode}\n token={selectedToken}\n tokens={customListTokens}\n onContinue={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'unlock' && (\n <UnlockStep\n token={selectedToken}\n tokens={customListTokens}\n currencyMode={currencyMode}\n depositMethod={depositMethod}\n isAuthorizing={isAuthorizing}\n error={flowError}\n onAuthorize={handleAuthorize}\n onBack={showExplainer ? () => setStep('explainer') : undefined}\n onCancel={onCancel}\n />\n )}\n\n {/* Sign mode steps */}\n {step === 'confirm' && depositMethod === 'sign' && (\n <ConfirmStep\n token={selectedToken}\n tokens={mergedTokens}\n quickActionSymbols={quickActionSymbols}\n customTokenSymbols={customTokenSymbols}\n currencyMode={currencyMode}\n minAmount={effectiveMin}\n maxAmount={effectiveMax}\n depositAddress={depositAddress || wallet.solanaPubkey}\n walletReady={walletReady || demoMode}\n needsUnlock={needsUnlock && !demoMode}\n copied={copied}\n isListening={!!sessionId && !demoMode}\n config={config}\n onCopy={handleCopyAddress}\n onTokenSelect={handleTokenSelect}\n onUnlockRequired={onUnlockRequired}\n onConfirm={(amt, tkn) => handleDeposit(amt, tkn)}\n onBack={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'signing' && <SigningStep depositAddress={wallet.solanaPubkey} />}\n\n {/* Receive mode steps */}\n {step === 'show-address' && (\n <ShowAddressStep\n token={selectedToken}\n tokens={mergedTokens}\n quickActionSymbols={quickActionSymbols}\n customTokenSymbols={customTokenSymbols}\n tokenPriceUsd={tokenPriceUsd}\n currencyMode={currencyMode}\n depositAddress={depositAddress || wallet.solanaPubkey}\n copied={copied}\n isListening={!!sessionId && !demoMode}\n config={config}\n onCopy={handleCopyAddress}\n onTokenSelect={handleTokenSelect}\n onAmountChange={setReceiveAmountUsd}\n onSent={handleSentDeposit}\n onBack={() => setStep('unlock')}\n onCancel={onCancel}\n />\n )}\n\n {step === 'waiting' && (\n <WaitingStep\n token={selectedToken}\n depositAddress={depositAddress || wallet.solanaPubkey}\n copied={copied}\n feeLine={\n receiveAmountUsd\n ? `Fees: $${Math.max(getTotalFeeUsd(config, receiveAmountUsd), 0.01).toFixed(2)} total`\n : 'Fees: calculated after deposit'\n }\n onCopy={handleCopyAddress}\n />\n )}\n\n {step === 'success' && result && (\n <SuccessStep result={result} config={config} onNewDeposit={handleReset} />\n )}\n\n {step === 'error' && (\n <ErrorStep\n error={flowError || depositError || 'An error occurred'}\n onRetry={() => setStep('confirm')}\n onCancel={onCancel}\n />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// STEP COMPONENTS\n// =============================================================================\n\ninterface ExplainerStepProps {\n siteName?: string;\n config?: ExplainerConfig;\n depositConfig: DepositConfigResponse;\n currencyMode: CurrencyMode;\n token: Token;\n tokens: Token[];\n onContinue: () => void;\n onCancel?: () => void;\n}\n\nfunction ExplainerStep({\n siteName,\n config,\n depositConfig,\n currencyMode,\n token,\n tokens,\n onContinue,\n onCancel,\n}: ExplainerStepProps) {\n const title = config?.title ?? 'How Deposits Work';\n const exchangeName = config?.exchangeName ?? 'Coinbase';\n const exchangeUrl = sanitizeExternalUrl(config?.exchangeUrl) ?? 'https://www.coinbase.com';\n const showExchange = config?.showExchangeSuggestion !== false;\n const purchaseCurrencyLabel = getPurchaseCurrencyLabel(currencyMode, token, tokens);\n\n const defaultBody = siteName\n ? `${siteName} uses the Solana blockchain to process secure, private payments.`\n : 'This site uses the Solana blockchain to process secure, private payments.';\n\n const body = config?.body ?? defaultBody;\n\n // Calculate fee info for display\n const showUserFee = hasUserFee(depositConfig);\n const feeDescription = formatExplainerFeeSummary(depositConfig);\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">{title}</h4>\n <p className=\"cedros-deposit-flow-step-desc\">{body}</p>\n\n <div className=\"cedros-deposit-flow-explainer-content\">\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-shield\" />\n <div>\n <strong>Private & Secure</strong>\n <p>Your deposits are protected by cryptographic privacy technology.</p>\n </div>\n </div>\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-bolt\" />\n <div>\n <strong>Fast Transactions</strong>\n <p>Solana transactions confirm in seconds, not minutes.</p>\n </div>\n </div>\n <div className=\"cedros-deposit-flow-explainer-item\">\n <span className=\"cedros-deposit-flow-explainer-icon cedros-deposit-flow-icon-coin\" />\n <div>\n <strong>{showUserFee ? 'Transparent Fees' : 'Low Fees'}</strong>\n <p>{feeDescription}</p>\n </div>\n </div>\n </div>\n\n {showExchange && (\n <div className=\"cedros-deposit-flow-explainer-exchange\">\n <p className=\"cedros-deposit-flow-explainer-exchange-text\">\n <strong>New to Solana?</strong> You can purchase {purchaseCurrencyLabel} using your\n credit card at{' '}\n <a href={exchangeUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {exchangeName}\n </a>\n , then send it here to fund your account.\n </p>\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onContinue}\n >\n Continue\n </button>\n </div>\n </div>\n );\n}\n\ninterface UnlockStepProps {\n token: Token;\n tokens: Token[];\n currencyMode: CurrencyMode;\n depositMethod: DepositMethod;\n isAuthorizing: boolean;\n error: string | null;\n onAuthorize: (password: string) => void;\n onBack?: () => void;\n onCancel?: () => void;\n}\n\nfunction UnlockStep({\n token,\n tokens,\n currencyMode,\n depositMethod,\n isAuthorizing,\n error,\n onAuthorize,\n onBack,\n}: UnlockStepProps) {\n const [password, setPassword] = useState('');\n const purchaseCurrencyLabel = getPurchaseCurrencyLabel(currencyMode, token, tokens);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (password.trim()) {\n onAuthorize(password);\n }\n };\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Authorize Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n {depositMethod === 'sign'\n ? currencyMode === 'multi-token'\n ? 'Enter your password to authorize a deposit. This allows us to process your withdrawal when the privacy period ends.'\n : `Enter your password to authorize a ${purchaseCurrencyLabel} deposit. This allows us to process your withdrawal when the privacy period ends.`\n : currencyMode === 'multi-token'\n ? 'Enter your password to get your deposit address. Any supported token sent to this address will be credited to your account.'\n : `Enter your password to get your deposit address. Any ${purchaseCurrencyLabel} sent to this address will be credited to your account.`}\n </p>\n\n <form onSubmit={handleSubmit}>\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\" htmlFor=\"deposit-password\">\n Password\n </label>\n <input\n id=\"deposit-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"cedros-deposit-flow-input\"\n placeholder=\"Enter your password\"\n disabled={isAuthorizing}\n autoComplete=\"current-password\"\n />\n </div>\n\n {error && <p className=\"cedros-deposit-flow-error\">{error}</p>}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n disabled={isAuthorizing}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n disabled={!password.trim() || isAuthorizing}\n >\n {isAuthorizing ? 'Authorizing...' : 'Continue'}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\ninterface ConfirmStepProps {\n token: Token;\n tokens: Token[];\n quickActionSymbols: string[];\n customTokenSymbols: string[];\n currencyMode: CurrencyMode;\n minAmount: number;\n maxAmount: number;\n depositAddress: string | null;\n walletReady: boolean;\n needsUnlock: boolean;\n copied: boolean;\n isListening: boolean;\n config: DepositConfigResponse;\n onCopy: () => void;\n onTokenSelect: (token: Token) => void;\n onUnlockRequired?: () => void;\n onConfirm: (amount: number, token: Token) => void;\n onBack: () => void;\n onCancel?: () => void;\n}\n\nfunction ConfirmStep({\n token,\n tokens,\n quickActionSymbols,\n customTokenSymbols,\n currencyMode,\n minAmount,\n maxAmount,\n depositAddress,\n walletReady,\n needsUnlock,\n copied,\n isListening,\n config,\n onCopy,\n onTokenSelect,\n onUnlockRequired,\n onConfirm,\n onBack,\n}: ConfirmStepProps) {\n const [amountUsd, setAmountUsd] = useState(config.privateMinUsd);\n const [showCustomToken, setShowCustomToken] = useState(false);\n const [feeTooltipOpen, setFeeTooltipOpen] = useState(false);\n const [customOpenSignal, setCustomOpenSignal] = useState(0);\n // Track the token selected before auto-switching to SOL for micro tier\n const [preMicroToken, setPreMicroToken] = useState<Token | null>(null);\n const tier = getTierForAmount(amountUsd, config);\n const isMicroTier = tier === 'sol_micro';\n const isOtherToken = token.symbol === OTHER_TOKEN.symbol;\n const customTokens = useMemo(() => {\n const baseTokens =\n customTokenSymbols.length === 0\n ? tokens\n : tokens.filter((candidate) => customTokenSymbols.includes(candidate.symbol));\n const resolved = baseTokens.length > 0 ? baseTokens : tokens;\n const hasOther = resolved.some((candidate) => candidate.symbol === OTHER_TOKEN.symbol);\n return hasOther ? resolved : [...resolved, OTHER_TOKEN];\n }, [tokens, customTokenSymbols]);\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n const feeLine = isOtherToken\n ? 'Fees: calculated after deposit'\n : `Fees: $${feeTotalDisplay.toFixed(2)} total`;\n const feeTooltip = isOtherToken ? '' : formatFeeTooltip(config, amountUsd, totalFeeUsd);\n\n const tokenUsdPrice = getTokenUsdPrice(isMicroTier ? SOL_TOKEN : token, config);\n const tokenAmount = tokenUsdPrice\n ? amountUsd / tokenUsdPrice\n : token.symbol === 'SOL' && config.solPriceUsd > 0\n ? amountUsd / config.solPriceUsd\n : amountUsd;\n const sendAmountLabel = tokenAmount\n ? formatTokenAmount(tokenAmount, isMicroTier ? 'SOL' : token.symbol)\n : null;\n\n // Check if fees exceed the deposit amount (effective minimum)\n const netAmountUsd = amountUsd - totalFeeUsd;\n const feesExceedAmount = netAmountUsd <= 0 && amountUsd > 0;\n\n const isValidAmount =\n !isOtherToken &&\n amountUsd > 0 &&\n !feesExceedAmount &&\n tokenAmount >= minAmount &&\n tokenAmount <= maxAmount;\n\n // Auto-select SOL for micro tier, restore previous token when leaving micro tier\n useEffect(() => {\n if (currencyMode !== 'multi-token') return;\n\n if (isMicroTier && token.symbol !== 'SOL') {\n // Entering micro tier with non-SOL token: save it and switch to SOL\n setPreMicroToken(token);\n const solToken = tokens.find((t) => t.symbol === 'SOL');\n if (solToken) onTokenSelect(solToken);\n } else if (!isMicroTier && preMicroToken && token.symbol === 'SOL') {\n // Leaving micro tier: restore the previously selected token\n onTokenSelect(preMicroToken);\n setPreMicroToken(null);\n }\n }, [isMicroTier, token.symbol, currencyMode, tokens, onTokenSelect, preMicroToken, token]);\n\n const handleConfirm = () => {\n if (isValidAmount) {\n onConfirm(tokenAmount, token);\n }\n };\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Choose Amount</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Set how much you want to deposit. Higher tiers unlock privacy.\n </p>\n\n {/* Token Selector - only show for non-micro tiers in multi-token mode */}\n {currencyMode === 'multi-token' && !isMicroTier && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Token</label>\n <div className=\"cedros-deposit-flow-token-quick\">\n {quickActionSymbols.map((symbol) => {\n const quickToken = tokens.find((candidate) => candidate.symbol === symbol);\n const isActive = token.symbol === symbol;\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (quickToken) {\n setShowCustomToken(false);\n onTokenSelect(quickToken);\n }\n }}\n disabled={!quickToken}\n >\n {quickToken?.logoUrl && (\n <img\n className=\"cedros-deposit-flow-token-quick-icon\"\n src={quickToken.logoUrl}\n alt={`${symbol} logo`}\n />\n )}\n {symbol}\n </button>\n );\n })}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${showCustomToken ? 'is-active' : ''}`}\n onClick={() => {\n setShowCustomToken(true);\n setCustomOpenSignal((current) => current + 1);\n }}\n >\n Custom\n </button>\n </div>\n {showCustomToken && (\n <div className=\"cedros-deposit-flow-token-custom\">\n <TokenSelector\n tokens={customTokens}\n selectedToken={token}\n onSelect={onTokenSelect}\n openSignal={customOpenSignal}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Amount Selector with Tier Indicator */}\n <div className=\"cedros-deposit-flow-field\">\n <TieredAmountSlider\n config={config}\n valueUsd={amountUsd}\n onChange={setAmountUsd}\n maxUsd={MAX_DEPOSIT_USD}\n />\n </div>\n\n {/* Deposit Address */}\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">\n {isOtherToken\n ? 'Sign to send tokens to this address'\n : `Sign to send ${sendAmountLabel ?? '--'} ${isMicroTier ? 'SOL' : token.symbol} to this address`}\n </label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">{depositAddress || 'Loading...'}</code>\n <div className=\"cedros-deposit-flow-address-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-icon\"\n onClick={onCopy}\n title=\"Copy address\"\n disabled={!depositAddress}\n >\n {copied ? '✓' : '⧉'}\n </button>\n {depositAddress && (\n <a\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-link cedros-deposit-flow-copy-icon\"\n href={`https://orbmarkets.io/account/${depositAddress}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"View on Orb Markets\"\n >\n ↗\n </a>\n )}\n </div>\n </div>\n {copied && <p className=\"cedros-deposit-flow-copied-msg\">Copied!</p>}\n </div>\n\n {/* Warning if fees exceed amount */}\n {feesExceedAmount && (\n <div className=\"cedros-deposit-flow-warning\">\n <p>Deposit amount is less than the fees. Increase the amount to proceed.</p>\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>\n {feeLine}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-fee-info ${feeTooltipOpen ? 'is-open' : ''}`}\n data-tooltip={feeTooltip}\n aria-label={`Fee breakdown: ${feeTooltip.replaceAll('\\n', ', ')}`}\n aria-expanded={feeTooltipOpen}\n onClick={(event) => {\n event.stopPropagation();\n setFeeTooltipOpen((current) => !current);\n }}\n onBlur={() => setFeeTooltipOpen(false)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setFeeTooltipOpen(false);\n }\n }}\n >\n i\n </button>\n </span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Credits appear after network confirmation.</span>\n </div>\n </div>\n\n {isListening && (\n <div className=\"cedros-deposit-flow-info-banner\">\n Listening for incoming transfers. We will confirm automatically.\n </div>\n )}\n\n {needsUnlock && (\n <div className=\"cedros-deposit-flow-warning\">\n <p>Your wallet is locked. Unlock it to continue.</p>\n {onUnlockRequired && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onUnlockRequired}\n >\n Unlock Wallet\n </button>\n )}\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={handleConfirm}\n disabled={!isValidAmount || !walletReady || !depositAddress}\n >\n Deposit\n </button>\n </div>\n </div>\n );\n}\n\ninterface SigningStepProps {\n depositAddress: string | null;\n}\n\nfunction SigningStep({ depositAddress }: SigningStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-spinner\" />\n <h4 className=\"cedros-deposit-flow-step-title\">Signing Transfer</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Approve the transfer in your wallet extension...\n </p>\n {depositAddress && (\n <p className=\"cedros-deposit-flow-signing-dest\">\n Sending to:{' '}\n <code>\n {depositAddress.slice(0, 6)}...{depositAddress.slice(-4)}\n </code>\n </p>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// RECEIVE MODE STEP COMPONENTS\n// =============================================================================\n\ninterface ShowAddressStepProps {\n token: Token;\n tokens: Token[];\n quickActionSymbols: string[];\n customTokenSymbols: string[];\n tokenPriceUsd?: Record<string, number>;\n currencyMode: CurrencyMode;\n depositAddress: string | null;\n copied: boolean;\n isListening: boolean;\n config: DepositConfigResponse;\n onCopy: () => void;\n onTokenSelect: (token: Token) => void;\n onAmountChange: (amountUsd: number) => void;\n onSent: () => void;\n onBack: () => void;\n onCancel?: () => void;\n}\n\nfunction ShowAddressStep({\n token,\n tokens,\n quickActionSymbols,\n customTokenSymbols,\n tokenPriceUsd,\n currencyMode,\n depositAddress,\n copied,\n isListening,\n config,\n onCopy,\n onTokenSelect,\n onAmountChange,\n onSent,\n onBack,\n}: ShowAddressStepProps) {\n const [amountUsd, setAmountUsd] = useState(config.privateMinUsd);\n const [showCustomToken, setShowCustomToken] = useState(false);\n const [feeTooltipOpen, setFeeTooltipOpen] = useState(false);\n const [customOpenSignal, setCustomOpenSignal] = useState(0);\n // Track the token selected before auto-switching to SOL for micro tier\n const [preMicroToken, setPreMicroToken] = useState<Token | null>(null);\n const tier = getTierForAmount(amountUsd, config);\n const isMicroTier = tier === 'sol_micro';\n const isOtherToken = token.symbol === OTHER_TOKEN.symbol;\n const customTokens = useMemo(() => {\n const baseTokens =\n customTokenSymbols.length === 0\n ? tokens\n : tokens.filter((candidate) => customTokenSymbols.includes(candidate.symbol));\n const resolved = baseTokens.length > 0 ? baseTokens : tokens;\n const hasOther = resolved.some((candidate) => candidate.symbol === OTHER_TOKEN.symbol);\n return hasOther ? resolved : [...resolved, OTHER_TOKEN];\n }, [tokens, customTokenSymbols]);\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const feeTotalDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n const feeLine = isOtherToken\n ? 'Fees: calculated after deposit'\n : `Fees: $${feeTotalDisplay.toFixed(2)} total`;\n const feeTooltip = isOtherToken ? '' : formatFeeTooltip(config, amountUsd, totalFeeUsd);\n const canSubmit = isOtherToken || amountUsd > 0;\n const tokenUsdPrice = getTokenUsdPrice(isMicroTier ? SOL_TOKEN : token, config, tokenPriceUsd);\n const tokenAmount = tokenUsdPrice ? amountUsd / tokenUsdPrice : null;\n const sendAmountLabel = tokenAmount ? formatTokenAmount(tokenAmount, token.symbol) : null;\n\n // Auto-select SOL for micro tier, restore previous token when leaving micro tier\n useEffect(() => {\n if (currencyMode !== 'multi-token') return;\n\n if (isMicroTier && token.symbol !== 'SOL') {\n // Entering micro tier with non-SOL token: save it and switch to SOL\n setPreMicroToken(token);\n const solToken = tokens.find((t) => t.symbol === 'SOL');\n if (solToken) onTokenSelect(solToken);\n } else if (!isMicroTier && preMicroToken && token.symbol === 'SOL') {\n // Leaving micro tier: restore the previously selected token\n onTokenSelect(preMicroToken);\n setPreMicroToken(null);\n }\n }, [isMicroTier, token.symbol, currencyMode, tokens, onTokenSelect, preMicroToken, token]);\n\n useEffect(() => {\n onAmountChange(amountUsd);\n }, [amountUsd, onAmountChange]);\n\n if (!depositAddress) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-error-icon\">!</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Wallet Not Ready</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Your embedded wallet is not set up. Please complete wallet enrollment first.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"cedros-deposit-flow-step\">\n <h4 className=\"cedros-deposit-flow-step-title\">Send Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Send funds to your deposit address. We'll confirm automatically.\n </p>\n\n {/* Token Selector - only show for non-micro tiers in multi-token mode */}\n {currencyMode === 'multi-token' && !isMicroTier && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Token</label>\n <div className=\"cedros-deposit-flow-token-quick\">\n {quickActionSymbols.map((symbol) => {\n const quickToken = tokens.find((candidate) => candidate.symbol === symbol);\n const isActive = token.symbol === symbol;\n return (\n <button\n key={symbol}\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (quickToken) {\n setShowCustomToken(false);\n onTokenSelect(quickToken);\n }\n }}\n disabled={!quickToken}\n >\n {quickToken?.logoUrl && (\n <img\n className=\"cedros-deposit-flow-token-quick-icon\"\n src={quickToken.logoUrl}\n alt={`${symbol} logo`}\n />\n )}\n {symbol}\n </button>\n );\n })}\n <button\n type=\"button\"\n className={`cedros-deposit-flow-token-quick-btn ${showCustomToken ? 'is-active' : ''}`}\n onClick={() => {\n setShowCustomToken(true);\n setCustomOpenSignal((current) => current + 1);\n }}\n >\n Custom\n </button>\n </div>\n {showCustomToken && (\n <div className=\"cedros-deposit-flow-token-custom\">\n <TokenSelector\n tokens={customTokens}\n selectedToken={token}\n onSelect={onTokenSelect}\n openSignal={customOpenSignal}\n />\n </div>\n )}\n </div>\n )}\n\n {/* Amount Selector with Tier Indicator */}\n {!isOtherToken && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Deposit Amount</label>\n <TieredAmountSlider\n config={config}\n valueUsd={amountUsd}\n onChange={setAmountUsd}\n maxUsd={MAX_DEPOSIT_USD}\n />\n </div>\n )}\n\n {isOtherToken && (\n <div className=\"cedros-deposit-flow-note\">\n Send any token you want. We'll detect the deposit, swap it, and credit your balance\n automatically.\n </div>\n )}\n\n {/* Deposit Address */}\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">\n {isOtherToken\n ? 'Send any token to this address'\n : `Send ${sendAmountLabel ?? '--'} ${isMicroTier ? 'SOL' : token.symbol} to this address`}\n </label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">{depositAddress}</code>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn\"\n onClick={onCopy}\n title=\"Copy address\"\n >\n {copied ? '✓' : '📋'}\n </button>\n </div>\n {copied && <p className=\"cedros-deposit-flow-copied-msg\">Copied!</p>}\n </div>\n\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>\n {feeLine}\n {!isOtherToken && (\n <button\n type=\"button\"\n className={`cedros-deposit-flow-fee-info ${feeTooltipOpen ? 'is-open' : ''}`}\n data-tooltip={feeTooltip}\n aria-label={`Fee breakdown: ${feeTooltip.replaceAll('\\n', ', ')}`}\n aria-expanded={feeTooltipOpen}\n onClick={(event) => {\n event.stopPropagation();\n setFeeTooltipOpen((current) => !current);\n }}\n onBlur={() => setFeeTooltipOpen(false)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setFeeTooltipOpen(false);\n }\n }}\n >\n i\n </button>\n )}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Credits appear after confirmation (typically ~30s).</span>\n </div>\n </div>\n\n {isListening && (\n <div className=\"cedros-deposit-flow-info-banner\">\n Listening for your deposit. We'll notify you when it arrives.\n </div>\n )}\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onBack}\n >\n Back\n </button>\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onSent}\n disabled={!canSubmit}\n >\n I've Sent It\n </button>\n </div>\n </div>\n );\n}\n\ninterface WaitingStepProps {\n token: Token;\n depositAddress: string | null;\n copied: boolean;\n feeLine: string;\n onCopy: () => void;\n}\n\nfunction WaitingStep({ token, depositAddress, copied, feeLine, onCopy }: WaitingStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-spinner\" />\n <h4 className=\"cedros-deposit-flow-step-title\">Waiting for Deposit</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Looking for incoming <strong>{token.symbol}</strong> deposits...\n </p>\n\n <div className=\"cedros-deposit-flow-waiting-info\">\n <p className=\"cedros-deposit-flow-waiting-text\">\n Once your transaction is confirmed on the Solana network, your account will be credited\n automatically. This usually takes 20-30 seconds.\n </p>\n {depositAddress && (\n <div className=\"cedros-deposit-flow-field\">\n <label className=\"cedros-deposit-flow-label\">Deposit address</label>\n <div className=\"cedros-deposit-flow-address-box\">\n <code className=\"cedros-deposit-flow-address\">\n {depositAddress.slice(0, 6)}...{depositAddress.slice(-6)}\n </code>\n <div className=\"cedros-deposit-flow-address-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-icon\"\n onClick={onCopy}\n title=\"Copy address\"\n >\n {copied ? '✓' : '⧉'}\n </button>\n <a\n className=\"cedros-deposit-flow-copy-btn cedros-deposit-flow-copy-link cedros-deposit-flow-copy-icon\"\n href={`https://orbmarkets.io/account/${depositAddress}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"View on Orb Markets\"\n >\n ↗\n </a>\n </div>\n </div>\n </div>\n )}\n <div className=\"cedros-deposit-flow-info-stack\">\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>Send only on the Solana network.</span>\n </div>\n <div className=\"cedros-deposit-flow-info-item\">\n <span className=\"cedros-deposit-flow-info-dot\" />\n <span>{feeLine}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface SuccessStepProps {\n result: DepositFlowResult;\n config: DepositConfigResponse;\n onNewDeposit: () => void;\n}\n\nfunction SuccessStep({ result, config, onNewDeposit }: SuccessStepProps) {\n const token = result.token ?? SOL_TOKEN;\n const amountUsd =\n token.symbol === 'SOL' && config.solPriceUsd > 0\n ? result.amount * config.solPriceUsd\n : result.amount;\n const totalFeeUsd = getTotalFeeUsd(config, amountUsd);\n const creditsUsd = Math.max(amountUsd - totalFeeUsd, 0);\n const totalFeeDisplay = totalFeeUsd < 0.01 ? 0.01 : totalFeeUsd;\n\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-success-icon\">✓</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Deposit Successful!</h4>\n <p className=\"cedros-deposit-flow-step-desc\">\n Your deposit of {result.amount.toLocaleString()} {token.symbol} has been received.\n </p>\n\n <div className=\"cedros-deposit-flow-summary\">\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Transaction</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-tx\">\n <a\n href={`https://orbmarkets.io/tx/${result.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {result.txSignature.slice(0, 8)}...{result.txSignature.slice(-8)}\n </a>\n <a\n className=\"cedros-deposit-flow-tx-action\"\n href={`https://orbmarkets.io/tx/${result.txSignature}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"View transaction on Orb Markets\"\n title=\"View transaction\"\n >\n ↗\n </a>\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Deposit Amount</span>\n <span className=\"cedros-deposit-flow-summary-value\">${amountUsd.toFixed(2)}</span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Total Fees</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-fee\">\n -${totalFeeDisplay.toFixed(2)}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Credits Added</span>\n <span className=\"cedros-deposit-flow-summary-value cedros-deposit-flow-credit\">\n +${creditsUsd.toFixed(2)}\n </span>\n </div>\n <div className=\"cedros-deposit-flow-summary-row\">\n <span className=\"cedros-deposit-flow-summary-label\">Available</span>\n <span className=\"cedros-deposit-flow-summary-value\">Immediately</span>\n </div>\n </div>\n\n <div className=\"cedros-deposit-flow-actions\">\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onNewDeposit}\n >\n Make Another Deposit\n </button>\n </div>\n </div>\n );\n}\n\ninterface ErrorStepProps {\n error: string;\n onRetry: () => void;\n onCancel?: () => void;\n}\n\nfunction ErrorStep({ error, onRetry, onCancel }: ErrorStepProps) {\n return (\n <div className=\"cedros-deposit-flow-step cedros-deposit-flow-step-centered\">\n <div className=\"cedros-deposit-flow-error-icon\">✕</div>\n <h4 className=\"cedros-deposit-flow-step-title\">Deposit Failed</h4>\n <p className=\"cedros-deposit-flow-error-message\">{error}</p>\n\n <div className=\"cedros-deposit-flow-actions\">\n {onCancel && (\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-secondary\"\n onClick={onCancel}\n >\n Cancel\n </button>\n )}\n <button\n type=\"button\"\n className=\"cedros-deposit-flow-button cedros-deposit-flow-button-primary\"\n onClick={onRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n}\n","export default \"data:image/webp;base64,UklGRmIEAABXRUJQVlA4WAoAAAAIAAAAOwAAOwAAVlA4IIIDAADwDwCdASo8ADwAPm0qkUWkIqGWDVeYQAbEtgBOmZMBu+H816ov3b8R8R2g2FXtxdyh5s3+A60v0APLi9ktgGB/LZjWNAXqgpE6jfW0NF+P4xEhH2L7M+26iGwrTjjcQegyCZqxs+ifvZANjWd279diqZNKUrgOTVtjJGtW4IVtRhMECd5aWVgAAP7nDv3UY/8f1l//xTP/FM/8NU8c9g//sC3+bX/1HZXsNsM57VKG2LVf1a0KdncWO8uPo/Oh79m9ZqjJZwXfPXuvwkK+WDOl6+N8C2Ux6no/V/zkoucKK/JZek7MR5sS8TknXB+6BuVDXou9Rx4aUea2q2IzvLvFIujjKsVYLMab7j9zo48fhgm9YOtjmWuS0WZ4c+6ta0mr3xF4fcdAIFf6oXRSlqovOX0HUiMV//hXwSX1cfP5cLj8c7OTyT/4ce4olJARV95GoY8oF+2uU0blGul3ItlG7c2Hl2/uC6s2WZc7Zukwojx6ed8t97bZ68N1uzCLzPlG7BuYS17F19e0wXnc6vEl3q7ft0K7OEl7r8mY6Kh+Nt/5V/Lp68mFBjLem1JjvC371+lKwez4KCdXwNo2Z04FqyzGpFutY6YQ/r5Tfu7Oi+oNfN0R/W+D4aj1nqHhlqYJzpx2NK4mj0gJIXmX8EArelSQI8mV4Ux9MRPwC2PuZhLTjQZv+Vl4p0D8bSB+Z0rek3hS6G1r80fW3cn767Pz/bXanjVmm34wt1nQPqdJObrZ7vv2NWcEuQKj9d+V6DzeDrq0CtGNcanEB5MY9agi1E6BprEScTdfPXjBeMnPbpD+QO6P7IW4UZ9etCCHtX++S/fl5Iz5RzUr10ojRMw//35C0yTjSEhbe884dPwor64n//KByjUFEGsCPAAXPJp1+O+SiKfUaODq6ncjKayTHXjoXgM7XP1z4sBhIKJZJRiM7vGC/+v/Sk8/jbgZLZDAVz1vLou93y7Yd8hxcWM/BesxgWgeKvl8fjE/Ud8tQKp4425hWh66lzzwxa4J3ctA4/E50wX/eoBOgq0B7+7S6FK4wvPHSNgfh+vwSWIJsJLt/3yjBeb41RRyMDMZqFQTZPEdFpXp48ExEyDayZ6objbjTHoS5WQDnDQpRyqMNKfvd41nhEPdb/hxpzXeTIjWmfHHCT+CQYWXDqLehCh1cRyeYOBwsSlSw5PiquAbsgAARVhJRroAAABFeGlmAABJSSoACAAAAAYAEgEDAAEAAAABAAAAGgEFAAEAAABWAAAAGwEFAAEAAABeAAAAKAEDAAEAAAACAAAAEwIDAAEAAAABAAAAaYcEAAEAAABmAAAAAAAAAEgAAAABAAAASAAAAAEAAAAGAACQBwAEAAAAMDIxMAGRBwAEAAAAAQIDAACgBwAEAAAAMDEwMAGgAwABAAAA//8AAAKgBAABAAAAPAAAAAOgBAABAAAAPAAAAAAAAAA=\"","export default \"data:image/webp;base64,UklGRtgCAABXRUJQVlA4WAoAAAAIAAAAOwAAOwAAVlA4IPgBAABQCwCdASo8ADwAPm0wk0ekIqGhKBQMqIANiWkADPF3uV2D8VcQGk1mg+P36i9SLnZvYAQxszEWYzEwX1RVkqG/4BGbJgMSHqhKDFsjWsGfPPrvfef11goNmCDDlBJHVVD+8gAA/vu4q03kl+E7FpjtZ2gc8pQ619Hjv9NywoRZ6az43C1wcrRr/lWzJlJhLWMHN0MkVl1ueAf6Hn8StVzeUfMBXOKkgfe2msx7QWR5PnHW/5c6/35yrtWnrURc2q6UYlGin+v8C2dQqexkW6rX2EEijTI9eEQ46PWH3/59fM2AlMvvR2abaRk5XX7V1triQncRxvMfz5YmYDN+PY/ikcZUNaiFucKoUq5riv0eKCezuFNHecE11ojwJqWRSTWpalkz5autXp6vFS+FT1tWUsB/fs1CCOZxaA1vR1grOEaiuKe1RYm7e05psWtqbXLVmm1bA8Ly9PFkVdCbc6hR3UuBBsFGnVeGOUeMn2onnfvYhBMcM9YPxGdQkwZLXOk1VuQSTk01Shf3fZrFyRlFauftFdPYhKXwqrr+meav1P+KLKBVosqmHnFFfgExsQ/rOf3TSd+mOqQfJA+cF+HojNU7nmM3uDkoCBi+//Gqp+gPNNW8M4LFrol8rxE+7WsjqMgfwv1f+Nr25RtG1Wa/KkniRCAAAABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,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\"","export default \"data:image/webp;base64,UklGRo4EAABXRUJQVlA4WAoAAAAYAAAAOwAAOwAAQUxQSA4CAAABkGXb2to2V9/v6D1Jmd5CQ5GXPYXAJMrtPOJMoMzMzDgIPYY5+vVds6T/m0BEOGzAtm1IBlR2d8kXUMyaADjeuHr9V7qj3E5/XrvaOA5AHCqzFgHTFz9tUTmEyq1PF6cBqVWDOLjkwS6VPsu8KqnaewRU7j5KIjipgFiQfCf1IGch8wMlv9QhcWk4nLlL9Z4l6b3y7hmUvGQkmF1nnrMC85zrc5CozDUQtwamisNSDCmxjL5jpqxMzfhutFCCY3+5110CaI9/jhVIcPg/DxiIB/x/eKgijLxkRobTyxFEw7zVm0NqcYg5LNAzKD3n4QbmyRVqWCiXJyD9uN7z0Ha9Dw4N5gzOnHU4IMJ7egt8HuYWasIJnlg46fkYgul9qgWU+9PA2Z7b2FngnR3e49Qm1QbKzVPNnltZ8wozK2S8et0SN34wt0LOnynVCsp02xI7tKSqqXYsV7ZtD/lpeaEfNyw/k9evWuKK7XfQ9ruP9/RW/s74t872N1bw2MY8n0Acmlb/KQ04AJ8t5PkeEbpDnbmR2/5392FiOfRFlCuTkIGsMh/aPBeGZFLBYuiM1IIUZLOD0NnMNBMWZdE/4bLo32MQ0wxcJnsvhcnerRhSLvPPhcj8s5DIsmtU6Tj1L1U6zvcEElfrVlHyqGy3epC4om5Vsg3OlO50UQ2V6Qa65LWf6TZ1J/11faBLlpgAVlA4IJgBAADwCQCdASo8ADwAPm0ylEckIyIhKAoAgA2JaQATzh4OcBkEByVmbl5z9gD9U/+J2APQgLaX4twLu19/UVxAWN1IKXE4cIqJBhoyQ0yDYn61m3zk6T7FMg0AAP78+EMvGgC8jLXmcbbmqvufKjG8Tv1M9Krl47vOW74O/Rapv2DgXbg9iK6PrRQG/9d9+rF/ESxzbszVFn3GThrMBmsklj/LPWDQ0pKzG7EyjQL6p6gfUwMze+wPhzJpn8tMqlUVgq6/QSUVcgG+ztsi73rA3vl3n4baeF1INsbuosTXtnsotVYuTii6rscx9OUTvevYcPNvcL9MPhyWeCQw0qynnGtzCIw+oFRN0+TN1mqXkFyk/rFBcH+FHiI6s9XX5EWCKn5vTRt/0RbS687PiXPFC5Zk/Gk4+538IYi+HZDjvlQQWOH/vddfYTerQ5QqWJt1YuaZNThQ2u+/DtXfZPRy1iWWLR9SKFFtlGrqBKWF5nPRPWWMNA3OssvUtvCNBLBA4cn1whzy+SpbgLvnaepxiykjKsU/MhzgAABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,UklGRqwEAABXRUJQVlA4WAoAAAAYAAAAOwAAOwAAQUxQSL8BAAABkGvbtmlLc5997yvbmW19gBnbDm2kjF5UmW3bthXZVZFdZ+81r+87Z1XlEaHIbSNlMstwos4XUBSTLAFQo/u01Zdf/yLDDze3zB/YwADJEoOoJAKg7oTdH4SF+XxiZlMgSESzwAJdVn2iUJzzOUMiLhQKf+/va2FtBLMBuu1zpHcsincUXhtoTKLsCTVX/KF3wrLhPLm/OWzZtjQWfZ7RhYyAC/lxMowpSzJYJAyFkZDQc21FBMUT7BqGjpHxf3m+XlEPUHE/f3vGgPzmw4awRUaTexkyJhwfNShctVgZXyJDXq4CUyjNy6Y4fVOBIkAPR2GcOE7Jm2NQ/RE9YzXht3a5VYvlOX0xF0fy+tp/ozBuQg6DzZYb6Bi7ed4rB5Mp/1Co4cNhLUo1StLxDIDqrynUoRswiF6nFnIxsDpnZ5WBW0GFZ1qZ8HfLDk5txHHsGDpSa6B0cXZEa+DsTr1M+P4qPdXwjynU4+1/a7oN3Sm6G+meSd27oHsHde++7puj+tYpv7G6b7vun6L7l6n+oZp/t7JmUNUqqhpJV5upakJVLaqqgVW1t6rmV401NGMc1djqH4rpIseSfyPFkgAAVlA4IAQCAABQDACdASo8ADwAPm0yk0akIyGhJgzogA2JaQAThroHvLxu+aPf5G2BYxv+B6XHzx6GPon/o+qz/tOAA/TM82gR0vnExWoiQRM36jlg2UIvwCSqySErzuguz9EP2x/7hsNazr91aIworWI7AAD+/TZ+6Ipl444OdT+2wU0Ov+T8oJuVP/vUbT/w1Jsv6Awnl6rvF/xetfOPt3gTQZZi0Y/AOx563J7CJkqTR/fc/n34zyeKzR80fhfv4ef+Hjhz/CX5aQo+58zg/FdE+7bLoophGfG0szI513EH+q+Gc73H1PFdJYf7CF8v5dhr3tMwEVX5Ji2ZxejK8xrf/E6nVXqlA4DrYNRP09InHc+fEqO/fH8xr+rMf4y1F9TOnwVffZblLoTP6lot0m/sh7sTiDQr0mIA8TiHoOffGDG6KzV+B3239udfhzD740gkRi/m53abX0Ku3vAgadgFFqL0vk8M/4aI+cI+0fbLW17mWGeMu21wSRRQiv5iNgGKR3vEGXAItcLDft1uUzWAfbe1X3zK/ymT7bA/76PB6UUknm+Y5MM4osurUXU/k7P38pN/3slnGfpFzjl4c3USY4mH9ZCJYUuC/kGEnq/yRPalPdODNFvW6s8MiQeQejYNRY0LsJ0WXkK8vXiDmihCivYAOPoSovesL7on+WAArDNM/BcQSQvCYABFWElGugAAAEV4aWYAAElJKgAIAAAABgASAQMAAQAAAAEAAAAaAQUAAQAAAFYAAAAbAQUAAQAAAF4AAAAoAQMAAQAAAAIAAAATAgMAAQAAAAEAAABphwQAAQAAAGYAAAAAAAAASAAAAAEAAABIAAAAAQAAAAYAAJAHAAQAAAAwMjEwAZEHAAQAAAABAgMAAKAHAAQAAAAwMTAwAaADAAEAAAD//wAAAqAEAAEAAAA8AAAAA6AEAAEAAAA8AAAAAAAAAA==\"","export default \"data:image/webp;base64,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\"","export default \"data:image/svg+xml,%3csvg%20width='88'%20height='88'%20viewBox='0%200%2088%2088'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='88'%20height='88'%20fill='url(%23paint0_linear_170_79)'/%3e%3crect%20x='25.6665'%20y='25.6667'%20width='11'%20height='36.6667'%20rx='1.83333'%20fill='white'/%3e%3crect%20x='51.3335'%20y='25.6667'%20width='11'%20height='36.6667'%20rx='1.83333'%20fill='white'/%3e%3crect%20x='29.3335'%20y='40.3333'%20width='29.3333'%20height='7.33333'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_170_79'%20x1='-75.3077'%20y1='-55'%20x2='146.302'%20y2='148.167'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FF00FF'/%3e%3cstop%20offset='0.531673'%20stop-color='%237A84FF'/%3e%3cstop%20offset='1'%20stop-color='%2305FAFF'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/webp;base64,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\"","export default \"data:image/svg+xml,%3csvg%20width='868'%20height='868'%20viewBox='0%200%20868%20868'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='434'%20cy='434'%20r='434'%20fill='%231B262D'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M234.563%20184H640.697C650.387%20184%20659.339%20189.164%20664.172%20197.542L782.495%20402.657C788.631%20413.294%20786.808%20426.72%20778.056%20435.346L452.368%20756.327C441.818%20766.724%20424.846%20766.724%20414.296%20756.327L89.0484%20435.78C80.0927%20426.954%2078.4157%20413.136%2085.0013%20402.433L211.48%20196.884C216.405%20188.879%20225.146%20184%20234.563%20184ZM588.257%20275.577V333.129H472.567V373.032C553.82%20377.296%20614.782%20394.81%20615.234%20415.802L615.231%20459.563C614.779%20480.556%20553.82%20498.069%20472.567%20502.333V600.259H395.746V502.333C314.492%20498.069%20253.531%20480.555%20253.078%20459.563L253.081%20415.802C253.533%20394.81%20314.492%20377.296%20395.746%20373.032V333.129H280.055V275.577H588.257ZM434.156%20472.268C520.868%20472.268%20593.345%20457.459%20611.082%20437.683C596.041%20420.912%20541.636%20407.713%20472.567%20404.089V445.867C460.187%20446.516%20447.336%20446.858%20434.156%20446.858C420.976%20446.858%20408.125%20446.516%20395.746%20445.867V404.089C326.676%20407.713%20272.271%20420.912%20257.23%20437.683C274.968%20457.459%20347.444%20472.268%20434.156%20472.268Z'%20fill='%23009393'/%3e%3c/svg%3e\"","/**\n * Token types and constants for deposit currency selection\n */\n\nimport bonkLogo from '../../assets/tokens/bonk.webp';\nimport cashLogo from '../../assets/tokens/cash.webp';\nimport eurcLogo from '../../assets/tokens/eurc.webp';\nimport oreLogo from '../../assets/tokens/ore.webp';\nimport pyusdLogo from '../../assets/tokens/pyusd.webp';\nimport solLogo from '../../assets/tokens/sol.webp';\nimport usdcLogo from '../../assets/tokens/usdc.webp';\nimport usdhLogo from '../../assets/tokens/usdh.svg';\nimport usd1Logo from '../../assets/tokens/usd1.webp';\nimport usdtLogo from '../../assets/tokens/usdt.svg';\n\nexport interface Token {\n /** Token mint address */\n mint: string;\n /** Token symbol (e.g., SOL, USDC) */\n symbol: string;\n /** Token name (e.g., Solana, USD Coin) */\n name: string;\n /** Token decimals */\n decimals: number;\n /** Token logo URL */\n logoUrl?: string;\n}\n\n/**\n * Supported stablecoins for deposits\n */\nexport const SUPPORTED_TOKENS: Token[] = [\n {\n mint: 'So11111111111111111111111111111111111111112',\n symbol: 'SOL',\n name: 'Solana',\n decimals: 9,\n logoUrl: solLogo,\n },\n {\n mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n symbol: 'USDC',\n name: 'Circle USD',\n decimals: 6,\n logoUrl: usdcLogo,\n },\n {\n mint: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 6,\n logoUrl: usdtLogo,\n },\n {\n mint: 'HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr',\n symbol: 'EURC',\n name: 'Circle Euro',\n decimals: 6,\n logoUrl: eurcLogo,\n },\n {\n mint: 'USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB',\n symbol: 'USD1',\n name: 'WLFI USD',\n decimals: 6,\n logoUrl: usd1Logo,\n },\n {\n mint: '2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo',\n symbol: 'PYUSD',\n name: 'PayPal USD',\n decimals: 6,\n logoUrl: pyusdLogo,\n },\n {\n mint: 'USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX',\n symbol: 'USDH',\n name: 'Hubble USD',\n decimals: 6,\n logoUrl: usdhLogo,\n },\n {\n mint: 'CASHVDm2wsJXfhj6VWxb7GiMdoLc17Du7paH4bNr5woT',\n symbol: 'CASH',\n name: 'Stripe USD',\n decimals: 6,\n logoUrl: cashLogo,\n },\n {\n mint: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263',\n symbol: 'BONK',\n name: 'Bonk',\n decimals: 5,\n logoUrl: bonkLogo,\n },\n {\n mint: 'oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp',\n symbol: 'ORE',\n name: 'Ore',\n decimals: 11,\n logoUrl: oreLogo,\n },\n];\n","/**\n * Hook for credit balance and transaction history\n *\n * Provides access to the user's credit balance and transaction history.\n * Credits are earned through Privacy Cash deposits.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseCreditsReturn,\n CreditBalanceResponse,\n CreditHistoryResponse,\n BalancesResponse,\n} from '../types/deposit';\n\nexport type { UseCreditsReturn } from '../types/deposit';\n\n/**\n * Hook for credit balance and transaction history\n *\n * Credits represent the user's balance from Privacy Cash deposits.\n * The balance can be used for services within the application.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useCredits(): UseCreditsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const getBalance = useCallback(async (): Promise<CreditBalanceResponse> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<CreditBalanceResponse>('/credits/balance/sol');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch credit balance');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getAllBalances = useCallback(async (): Promise<CreditBalanceResponse[]> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<BalancesResponse>('/credits/balance');\n return data.balances;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch credit balances');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getHistory = useCallback(\n async (options?: {\n currency?: string;\n limit?: number;\n offset?: number;\n }): Promise<CreditHistoryResponse> => {\n if (!apiClient) {\n throw new Error('useCredits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.currency) params.set('currency', options.currency);\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n\n const queryString = params.toString();\n const url = queryString ? `/credits/history?${queryString}` : '/credits/history';\n\n const data = await apiClient.get<CreditHistoryResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch transaction history');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n return {\n getBalance,\n getAllBalances,\n getHistory,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Credit balance display component\n *\n * Shows the user's current credit balance from Privacy Cash deposits.\n * Can display single currency or all currencies.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { CreditBalanceResponse } from '../../types/deposit';\n\nexport interface CreditBalanceProps {\n /** Show only SOL balance (default) or all currencies */\n showAllCurrencies?: boolean;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Compact display mode */\n compact?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Callback when balance is loaded */\n onLoad?: (balance: CreditBalanceResponse[]) => void;\n}\n\n/**\n * Credit balance display\n *\n * Shows the user's credit balance. Supports auto-refresh.\n */\nexport function CreditBalance({\n showAllCurrencies = false,\n refreshInterval = 0,\n compact = false,\n className = '',\n onLoad,\n}: CreditBalanceProps) {\n const { getBalance, getAllBalances, isLoading, error, clearError } = useCredits();\n\n const [balances, setBalances] = useState<CreditBalanceResponse[]>([]);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const fetchBalance = useCallback(async () => {\n try {\n if (showAllCurrencies) {\n const result = await getAllBalances();\n setBalances(result);\n onLoad?.(result);\n } else {\n const result = await getBalance();\n setBalances([result]);\n onLoad?.([result]);\n }\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load balance');\n }\n }, [showAllCurrencies, getBalance, getAllBalances, onLoad]);\n\n // Initial load\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n\n const interval = setInterval(fetchBalance, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchBalance]);\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-error ${className}`}>\n <p className=\"cedros-credit-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-credit-retry\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchBalance();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state\n if (isLoading && balances.length === 0) {\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-loading ${className}`}>\n <span className=\"cedros-credit-loading-indicator\" />\n <span className=\"cedros-credit-loading-text\">Loading balance...</span>\n </div>\n );\n }\n\n // Compact display\n if (compact) {\n const primaryBalance = balances[0];\n return (\n <div className={`cedros-credit-balance cedros-credit-balance-compact ${className}`}>\n {primaryBalance ? (\n <span\n className=\"cedros-credit-value\"\n title={`${primaryBalance.balanceLamports} lamports`}\n >\n {primaryBalance.display}\n </span>\n ) : (\n <span className=\"cedros-credit-value cedros-credit-value-zero\">0.0000 SOL</span>\n )}\n {isLoading && <span className=\"cedros-credit-refresh-indicator\" title=\"Refreshing...\" />}\n </div>\n );\n }\n\n // Full display\n return (\n <div className={`cedros-credit-balance ${className}`}>\n <div className=\"cedros-credit-header\">\n <h4 className=\"cedros-credit-title\">Credit Balance</h4>\n <button\n type=\"button\"\n className=\"cedros-credit-refresh\"\n onClick={fetchBalance}\n disabled={isLoading}\n title=\"Refresh balance\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {balances.length === 0 ? (\n <div className=\"cedros-credit-empty\">\n <p className=\"cedros-credit-empty-message\">No credit balance yet.</p>\n <p className=\"cedros-credit-empty-hint\">Make a deposit to get started.</p>\n </div>\n ) : (\n <div className=\"cedros-credit-list\">\n {balances.map((balance) => (\n <div key={balance.currency} className=\"cedros-credit-item\">\n <span className=\"cedros-credit-currency\">{balance.currency}</span>\n <span className=\"cedros-credit-amount\">{balance.display}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * History component\n *\n * Shows all account activity in a tabbed interface:\n * - All: Everything in chronological order\n * - Deposits: Incoming deposits with status tracking\n * - Usage: Service charges and spending\n * - Adjustments: Refunds, bonuses, and admin adjustments\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useCredits } from '../../hooks/useCredits';\nimport type { CreditTransactionResponse, CreditHistoryResponse } from '../../types/deposit';\n\n/** History tab category for filtering */\nexport type HistoryCategory = 'all' | 'deposits' | 'usage' | 'adjustments';\n\n/** Tab configuration */\ninterface TabConfig {\n key: HistoryCategory;\n label: string;\n txTypes: string[] | null; // null means show all\n}\n\nconst TABS: TabConfig[] = [\n { key: 'all', label: 'All', txTypes: null },\n { key: 'deposits', label: 'Deposits', txTypes: ['deposit'] },\n { key: 'usage', label: 'Usage', txTypes: ['spend', 'usage', 'charge'] },\n {\n key: 'adjustments',\n label: 'Adjustments',\n txTypes: ['refund', 'adjustment', 'bonus', 'credit'],\n },\n];\n\nexport interface HistoryProps {\n /** Initially selected tab (default: 'all') */\n defaultTab?: HistoryCategory;\n /** Number of items per page (default: 10) */\n pageSize?: number;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Additional CSS classes */\n className?: string;\n /** Callback when history is loaded */\n onLoad?: (history: CreditHistoryResponse) => void;\n /** Callback when a transaction is clicked */\n onTransactionClick?: (transaction: CreditTransactionResponse) => void;\n}\n\n/**\n * Format amount for display\n */\nfunction formatAmount(lamports: number, currency: string): string {\n const isNegative = lamports < 0;\n const absLamports = Math.abs(lamports);\n\n // For stablecoins (6 decimals), show as dollars\n // For SOL (9 decimals), show as SOL\n const isSol = currency.toUpperCase() === 'SOL';\n const decimals = isSol ? 9 : 6;\n const amount = absLamports / Math.pow(10, decimals);\n\n const prefix = isNegative ? '-' : '+';\n if (isSol) {\n return `${prefix}${amount.toFixed(4)} SOL`;\n }\n return `${prefix}$${amount.toFixed(2)}`;\n}\n\n/**\n * Format date for display\n */\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n // Show relative time for recent transactions\n if (diffDays === 0) {\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n if (diffHours === 0) {\n const diffMins = Math.floor(diffMs / (1000 * 60));\n if (diffMins < 1) return 'Just now';\n return `${diffMins}m ago`;\n }\n return `${diffHours}h ago`;\n }\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays}d ago`;\n\n // Show full date for older transactions\n return date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined,\n });\n}\n\n/**\n * Get display label for transaction type\n */\nfunction getTypeLabel(txType: string | undefined): string {\n if (!txType) return 'Transaction';\n const labels: Record<string, string> = {\n deposit: 'Deposit',\n spend: 'Usage',\n usage: 'Usage',\n charge: 'Charge',\n refund: 'Refund',\n adjustment: 'Adjustment',\n bonus: 'Bonus',\n credit: 'Credit',\n };\n return labels[txType.toLowerCase()] || txType;\n}\n\n/**\n * Get icon for transaction type\n */\nfunction getTypeIcon(txType: string | undefined, isPositive: boolean): string {\n const type = (txType || '').toLowerCase();\n if (type === 'deposit') return '↓';\n if (type === 'spend' || type === 'usage' || type === 'charge') return '↑';\n if (type === 'refund') return '←';\n if (type === 'bonus' || type === 'credit') return '★';\n if (type === 'adjustment') return isPositive ? '+' : '−';\n return isPositive ? '+' : '−';\n}\n\n/**\n * History component with tabs\n */\nexport function History({\n defaultTab = 'all',\n pageSize = 10,\n refreshInterval = 0,\n className = '',\n onLoad,\n onTransactionClick,\n}: HistoryProps) {\n const { getHistory, isLoading, error, clearError } = useCredits();\n\n const [activeTab, setActiveTab] = useState<HistoryCategory>(defaultTab);\n const [transactions, setTransactions] = useState<CreditTransactionResponse[]>([]);\n const [total, setTotal] = useState(0);\n const [offset, setOffset] = useState(0);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.key === activeTab) || TABS[0];\n\n // Filter transactions based on active tab (useMemo to avoid extra renders)\n const filteredTransactions = useMemo(() => {\n if (currentTab.txTypes === null) {\n return transactions;\n }\n return transactions.filter((tx) => {\n const txType = tx.txType || '';\n return currentTab.txTypes!.some((type) => txType.toLowerCase().includes(type.toLowerCase()));\n });\n }, [transactions, currentTab.txTypes]);\n\n const fetchHistory = useCallback(async () => {\n try {\n // Fetch more than pageSize to allow client-side filtering\n const result = await getHistory({ limit: pageSize * 3, offset });\n setTransactions(result.transactions);\n setTotal(result.total);\n onLoad?.(result);\n setLoadError(null);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : 'Failed to load history');\n }\n }, [pageSize, offset, getHistory, onLoad]);\n\n // Reset offset when tab changes\n useEffect(() => {\n setOffset(0);\n }, [activeTab]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchHistory();\n }, [fetchHistory]);\n\n // Auto-refresh\n useEffect(() => {\n if (refreshInterval <= 0) return;\n const interval = setInterval(fetchHistory, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchHistory]);\n\n const totalPages = Math.ceil(total / pageSize);\n const currentPage = Math.floor(offset / pageSize) + 1;\n\n const goToPage = (page: number) => {\n const newOffset = (page - 1) * pageSize;\n setOffset(Math.max(0, Math.min(newOffset, Math.max(0, total - 1))));\n };\n\n // Handle tab change\n const handleTabChange = (tab: HistoryCategory) => {\n setActiveTab(tab);\n };\n\n // Error state\n if (loadError || error) {\n return (\n <div className={`cedros-tx-history cedros-tx-history-error ${className}`}>\n <p className=\"cedros-tx-error\">{loadError || error}</p>\n <button\n type=\"button\"\n className=\"cedros-tx-retry\"\n onClick={() => {\n clearError();\n setLoadError(null);\n fetchHistory();\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Loading state (initial load only)\n if (isLoading && transactions.length === 0) {\n return (\n <div className={`cedros-tx-history cedros-tx-history-loading ${className}`}>\n <span className=\"cedros-tx-loading-indicator\" />\n <span className=\"cedros-tx-loading-text\">Loading transactions...</span>\n </div>\n );\n }\n\n // Get count for each tab\n const getTabCount = (tab: TabConfig): number => {\n if (tab.txTypes === null) return transactions.length;\n return transactions.filter((tx) => {\n const txType = tx.txType || '';\n return tab.txTypes!.some((type) => txType.toLowerCase().includes(type.toLowerCase()));\n }).length;\n };\n\n return (\n <div className={`cedros-tx-history ${className}`}>\n {/* Header */}\n <div className=\"cedros-tx-header\">\n <h4 className=\"cedros-tx-title\">Transaction History</h4>\n <button\n type=\"button\"\n className=\"cedros-tx-refresh\"\n onClick={fetchHistory}\n disabled={isLoading}\n title=\"Refresh\"\n >\n {isLoading ? '...' : '↻'}\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-tx-tabs\">\n {TABS.map((tab) => {\n const count = getTabCount(tab);\n const isActive = activeTab === tab.key;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={`cedros-tx-tab ${isActive ? 'cedros-tx-tab-active' : ''}`}\n onClick={() => handleTabChange(tab.key)}\n >\n {tab.label}\n {count > 0 && <span className=\"cedros-tx-tab-count\">{count}</span>}\n </button>\n );\n })}\n </div>\n\n {/* Transaction List */}\n {filteredTransactions.length === 0 ? (\n <div className=\"cedros-tx-empty\">\n <p className=\"cedros-tx-empty-message\">\n {activeTab === 'all'\n ? 'No transactions yet.'\n : `No ${currentTab.label.toLowerCase()} found.`}\n </p>\n {activeTab === 'all' && (\n <p className=\"cedros-tx-empty-hint\">Make a deposit to get started.</p>\n )}\n </div>\n ) : (\n <>\n <div className=\"cedros-tx-list\">\n {filteredTransactions.slice(0, pageSize).map((tx) => {\n const isPositive = tx.amountLamports >= 0;\n return (\n <div\n key={tx.id}\n className={`cedros-tx-item ${isPositive ? 'cedros-tx-item-positive' : 'cedros-tx-item-negative'}`}\n onClick={() => onTransactionClick?.(tx)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onTransactionClick?.(tx);\n }\n }}\n role={onTransactionClick ? 'button' : undefined}\n tabIndex={onTransactionClick ? 0 : undefined}\n >\n {/* Icon */}\n <div\n className={`cedros-tx-icon ${isPositive ? 'cedros-tx-icon-positive' : 'cedros-tx-icon-negative'}`}\n >\n {getTypeIcon(tx.txType, isPositive)}\n </div>\n\n {/* Main content */}\n <div className=\"cedros-tx-content\">\n <div className=\"cedros-tx-row-main\">\n <span className=\"cedros-tx-type\">{getTypeLabel(tx.txType)}</span>\n <span\n className={`cedros-tx-amount ${isPositive ? 'cedros-tx-amount-positive' : 'cedros-tx-amount-negative'}`}\n >\n {formatAmount(tx.amountLamports, tx.currency)}\n </span>\n </div>\n <div className=\"cedros-tx-row-details\">\n <span className=\"cedros-tx-description\">{tx.description}</span>\n <span className=\"cedros-tx-date\">{formatDate(tx.createdAt)}</span>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"cedros-tx-pagination\">\n <button\n type=\"button\"\n className=\"cedros-tx-page-btn\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <span className=\"cedros-tx-page-info\">\n Page {currentPage} of {totalPages}\n </span>\n <button\n type=\"button\"\n className=\"cedros-tx-page-btn\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LoginForm } from '../LoginForm';\n\nexport interface FullPageLayoutProps {\n /** Brand logo element (e.g., an img or svg) */\n brandLogo?: ReactNode;\n /** Brand name displayed next to the logo */\n brandName?: string;\n /** Title displayed above the form. @default \"Welcome back\" */\n title?: string;\n /** Subtitle displayed below the title. @default \"Login with your Apple or Google account\" */\n subtitle?: string;\n /** Terms/legal text displayed below the card */\n termsText?: ReactNode;\n /** Called when login/register succeeds */\n onSuccess?: () => void;\n /** Default tab for the form. @default \"login\" */\n defaultTab?: 'login' | 'register';\n /** Custom content to render instead of LoginForm */\n children?: ReactNode;\n /** Additional CSS class for the outer container */\n className?: string;\n}\n\n/**\n * Full page login layout with centered card on gradient background.\n * Follows shadcn/ui login block pattern.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <FullPageLayout onSuccess={() => navigate('/dashboard')} />\n *\n * // With branding and terms\n * <FullPageLayout\n * brandLogo={<img src=\"/logo.svg\" alt=\"\" />}\n * brandName=\"Acme Inc.\"\n * termsText={<>By clicking continue, you agree to our <a href=\"/terms\">Terms</a>.</>}\n * onSuccess={handleSuccess}\n * />\n * ```\n */\nexport function FullPageLayout({\n brandLogo,\n brandName,\n title = 'Welcome back',\n subtitle = 'Login with your Apple or Google account',\n termsText,\n onSuccess,\n defaultTab = 'login',\n children,\n className = '',\n}: FullPageLayoutProps) {\n return (\n <div className={`cedros-full-page-layout ${className}`}>\n {/* Brand header */}\n {(brandLogo || brandName) && (\n <div className=\"cedros-brand-header\">\n {brandLogo}\n {brandName && <span className=\"cedros-brand-name\">{brandName}</span>}\n </div>\n )}\n\n <div className=\"cedros-full-page-card\">\n <div className=\"cedros-full-page-header\">\n <h1 className=\"cedros-full-page-title\">{title}</h1>\n {subtitle && <p className=\"cedros-full-page-subtitle\">{subtitle}</p>}\n </div>\n {children ?? <LoginForm defaultTab={defaultTab} onSuccess={onSuccess} />}\n </div>\n\n {/* Terms footer */}\n {termsText && <p className=\"cedros-terms-footer\">{termsText}</p>}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LoginForm } from '../LoginForm';\n\nexport interface SplitPageLayoutProps {\n /** Brand name or logo text displayed on the left panel */\n brandName?: string;\n /** Brand logo element (replaces default logo) */\n brandLogo?: ReactNode;\n /** Tagline displayed below the brand name */\n tagline?: string;\n /** Title displayed above the form. @default \"Sign in\" */\n title?: string;\n /** Subtitle displayed below the title */\n subtitle?: string;\n /** Called when login/register succeeds */\n onSuccess?: () => void;\n /** Default tab for the form. @default \"login\" */\n defaultTab?: 'login' | 'register';\n /** Custom content to render instead of LoginForm */\n children?: ReactNode;\n /** Additional CSS class for the outer container */\n className?: string;\n}\n\n/**\n * Split page login layout with branding on the left and form on the right.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SplitPageLayout\n * brandName=\"MyApp\"\n * tagline=\"The best app for everything\"\n * onSuccess={() => navigate('/dashboard')}\n * />\n *\n * // With custom logo\n * <SplitPageLayout\n * brandLogo={<img src=\"/logo.svg\" alt=\"MyApp\" />}\n * brandName=\"MyApp\"\n * tagline=\"Enterprise-grade solutions\"\n * title=\"Welcome back\"\n * subtitle=\"Sign in to continue\"\n * />\n * ```\n */\nexport function SplitPageLayout({\n brandName = 'Your Brand',\n brandLogo,\n tagline = 'Your tagline goes here. Make it compelling.',\n title = 'Sign in',\n subtitle = 'Enter your credentials to access your account',\n onSuccess,\n defaultTab = 'login',\n children,\n className = '',\n}: SplitPageLayoutProps) {\n return (\n <div className={`cedros-split-page-layout ${className}`}>\n {/* Left side - Branding */}\n <div className=\"cedros-split-page-brand\">\n <div className=\"cedros-split-page-brand-content\">\n {brandLogo ?? (\n <div className=\"cedros-split-page-logo\">{brandName.charAt(0).toUpperCase()}</div>\n )}\n <h1 className=\"cedros-split-page-brand-name\">{brandName}</h1>\n {tagline && <p className=\"cedros-split-page-tagline\">{tagline}</p>}\n </div>\n </div>\n\n {/* Right side - Login form */}\n <div className=\"cedros-split-page-form\">\n <div className=\"cedros-split-page-form-content\">\n <h2 className=\"cedros-split-page-title\">{title}</h2>\n {subtitle && <p className=\"cedros-split-page-subtitle\">{subtitle}</p>}\n {children ?? <LoginForm defaultTab={defaultTab} onSuccess={onSuccess} />}\n </div>\n </div>\n </div>\n );\n}\n","import type { Session, ListSessionsResponse, RevokeAllSessionsResponse } from '../types';\nimport { ApiClient, handleApiError } from './apiClient';\n\n/**\n * API client for session management operations\n */\nexport class SessionApiClient {\n private client: ApiClient;\n\n constructor(\n baseUrl: string,\n timeoutMs?: number,\n retryAttempts?: number,\n getAccessToken?: () => string | null\n ) {\n this.client = new ApiClient({ baseUrl, timeoutMs, retryAttempts, getAccessToken });\n }\n\n /**\n * List all active sessions for the current user\n */\n async listSessions(): Promise<Session[]> {\n try {\n const response = await this.client.get<ListSessionsResponse>('/sessions');\n return response.sessions;\n } catch (error) {\n throw handleApiError(error, 'Failed to list sessions');\n }\n }\n\n /**\n * Revoke all sessions (logout from all devices)\n */\n async revokeAllSessions(): Promise<RevokeAllSessionsResponse> {\n try {\n return await this.client.delete<RevokeAllSessionsResponse>('/sessions');\n } catch (error) {\n throw handleApiError(error, 'Failed to revoke sessions');\n }\n }\n}\n","import { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { Session, AuthError, RevokeAllSessionsResponse } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { SessionApiClient } from '../utils/sessionApi';\n\nexport interface UseSessionsReturn {\n /** List of active sessions */\n sessions: Session[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: AuthError | null;\n /** Fetch/refresh sessions list */\n fetchSessions: () => Promise<void>;\n /** Revoke all sessions (logout everywhere) */\n revokeAllSessions: () => Promise<RevokeAllSessionsResponse>;\n /** Number of other active sessions (excluding current) */\n otherSessionCount: number;\n}\n\n/**\n * Hook for managing user sessions across devices.\n *\n * @example\n * ```tsx\n * function SessionManager() {\n * const { sessions, isLoading, revokeAllSessions, otherSessionCount } = useSessions();\n *\n * return (\n * <div>\n * <h3>Active Sessions ({sessions.length})</h3>\n * <ul>\n * {sessions.map(session => (\n * <li key={session.id}>\n * {session.userAgent}\n * {session.isCurrent && ' (current)'}\n * </li>\n * ))}\n * </ul>\n * {otherSessionCount > 0 && (\n * <button onClick={revokeAllSessions}>\n * Sign out of {otherSessionCount} other device(s)\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSessions(): UseSessionsReturn {\n const { config, authState, _internal } = useCedrosLogin();\n\n const [sessions, setSessions] = useState<Session[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new SessionApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const fetchSessions = useCallback(async () => {\n if (authState !== 'authenticated') {\n setSessions([]);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const fetchedSessions = await apiClient.listSessions();\n setSessions(fetchedSessions);\n } catch (err) {\n setError(err as AuthError);\n } finally {\n setIsLoading(false);\n }\n }, [authState, apiClient]);\n\n // Auto-fetch when authenticated\n useEffect(() => {\n if (authState === 'authenticated') {\n fetchSessions();\n } else {\n setSessions([]);\n }\n }, [authState, fetchSessions]);\n\n const revokeAllSessions = useCallback(async (): Promise<RevokeAllSessionsResponse> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiClient.revokeAllSessions();\n // Refresh sessions list after revoking\n await fetchSessions();\n return result;\n } catch (err) {\n setError(err as AuthError);\n throw err;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient, fetchSessions]);\n\n const otherSessionCount = useMemo(() => {\n return sessions.filter((s) => !s.isCurrent).length;\n }, [sessions]);\n\n return {\n sessions,\n isLoading,\n error,\n fetchSessions,\n revokeAllSessions,\n otherSessionCount,\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { AuthorizeRequest, AuthError } from '../types';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { OrgApiClient } from '../utils/orgApi';\n\nexport interface AuthorizationCheck {\n allowed: boolean;\n reason?: string;\n isLoading: boolean;\n error: AuthError | null;\n}\n\nexport interface UseAuthorizeReturn {\n /**\n * Check if an action is authorized server-side.\n * Use this for dynamic authorization checks.\n */\n authorize: (request: AuthorizeRequest) => Promise<boolean>;\n /**\n * Authorization state for the last check\n */\n lastCheck: AuthorizationCheck;\n /**\n * Clear the last authorization check\n */\n clearCheck: () => void;\n /**\n * Check authorization and return detailed result\n */\n checkAuthorization: (request: AuthorizeRequest) => Promise<AuthorizationCheck>;\n}\n\n/**\n * Hook for server-side authorization checks.\n *\n * This hook allows you to check if a specific action is authorized\n * by making a request to the server's /authorize endpoint.\n *\n * For simple permission checks based on the user's role, use `useOrgs().hasPermission()` instead.\n *\n * @example\n * ```tsx\n * function DeleteButton({ resourceId }: { resourceId: string }) {\n * const { authorize, lastCheck } = useAuthorize();\n * const { activeOrg } = useOrgs();\n *\n * const handleDelete = async () => {\n * const allowed = await authorize({\n * orgId: activeOrg?.id!,\n * action: 'delete',\n * resource: 'document',\n * resourceId,\n * });\n *\n * if (allowed) {\n * // Proceed with delete\n * }\n * };\n *\n * return (\n * <button onClick={handleDelete} disabled={lastCheck.isLoading}>\n * Delete\n * </button>\n * );\n * }\n * ```\n */\nexport function useAuthorize(): UseAuthorizeReturn {\n const { config, _internal } = useCedrosLogin();\n\n const [lastCheck, setLastCheck] = useState<AuthorizationCheck>({\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: null,\n });\n\n const apiClient = useMemo(\n () =>\n new OrgApiClient(\n config.serverUrl,\n config.requestTimeout,\n config.retryAttempts,\n _internal?.getAccessToken\n ),\n [config.serverUrl, config.requestTimeout, config.retryAttempts, _internal]\n );\n\n const checkAuthorization = useCallback(\n async (request: AuthorizeRequest): Promise<AuthorizationCheck> => {\n setLastCheck((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const response = await apiClient.authorize(request);\n const result: AuthorizationCheck = {\n allowed: response.allowed,\n reason: response.reason,\n isLoading: false,\n error: null,\n };\n setLastCheck(result);\n return result;\n } catch (err) {\n const result: AuthorizationCheck = {\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: err as AuthError,\n };\n setLastCheck(result);\n return result;\n }\n },\n [apiClient]\n );\n\n const authorize = useCallback(\n async (request: AuthorizeRequest): Promise<boolean> => {\n const result = await checkAuthorization(request);\n return result.allowed;\n },\n [checkAuthorization]\n );\n\n const clearCheck = useCallback(() => {\n setLastCheck({\n allowed: false,\n reason: undefined,\n isLoading: false,\n error: null,\n });\n }, []);\n\n return {\n authorize,\n lastCheck,\n clearCheck,\n checkAuthorization,\n };\n}\n","/**\n * Hook for pending wallet recovery management\n *\n * After wallet enrollment, if recovery mode is enabled, the server stores\n * recovery data temporarily. This hook fetches that data and allows the\n * user to acknowledge receipt (after which the data is deleted from server).\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n PendingWalletRecoveryResponse,\n AcknowledgeRecoveryRequest,\n MessageResponse,\n} from '../types/wallet';\n\nexport interface UsePendingRecoveryReturn {\n /** Whether there is pending recovery data */\n hasPendingRecovery: boolean;\n /** Recovery type: 'share_c' or 'full_seed' */\n recoveryType: string | null;\n /** Recovery phrase (base64-encoded seed) */\n recoveryPhrase: string | null;\n /** When the recovery data expires */\n expiresAt: Date | null;\n /** Fetch pending recovery data from server */\n fetchPendingRecovery: () => Promise<void>;\n /** Acknowledge that user has saved the recovery phrase (deletes from server) */\n acknowledgeRecovery: () => Promise<void>;\n /** Whether request is in progress */\n isLoading: boolean;\n /** Error from last request */\n error: string | null;\n /** Clear error */\n clearError: () => void;\n}\n\n/**\n * Hook for managing pending wallet recovery data\n *\n * Use this after wallet enrollment to show the user their recovery phrase\n * and allow them to acknowledge receipt.\n */\nexport function usePendingRecovery(): UsePendingRecoveryReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [pendingData, setPendingData] = useState<PendingWalletRecoveryResponse | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const fetchPendingRecovery = useCallback(async (): Promise<void> => {\n if (!apiClient) {\n throw new Error('usePendingRecovery must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PendingWalletRecoveryResponse>('/wallet/pending-recovery');\n setPendingData(data);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch pending recovery');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const acknowledgeRecovery = useCallback(async (): Promise<void> => {\n if (!apiClient) {\n throw new Error('usePendingRecovery must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const request: AcknowledgeRecoveryRequest = { confirmed: true };\n await apiClient.post<MessageResponse>('/wallet/acknowledge-recovery', request);\n // Clear pending data after successful acknowledgment\n setPendingData(null);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to acknowledge recovery');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const clearError = useCallback(() => setError(null), []);\n\n // Auto-fetch on mount if authenticated\n useEffect(() => {\n if (apiClient && context?.authState === 'authenticated') {\n fetchPendingRecovery().catch(() => {\n // Silently ignore errors on auto-fetch\n });\n }\n }, [apiClient, context?.authState, fetchPendingRecovery]);\n\n return {\n hasPendingRecovery: pendingData?.hasPendingRecovery ?? false,\n recoveryType: pendingData?.recoveryType ?? null,\n recoveryPhrase: pendingData?.recoveryPhrase ?? null,\n expiresAt: pendingData?.expiresAt ? new Date(pendingData.expiresAt) : null,\n fetchPendingRecovery,\n acknowledgeRecovery,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Unified transaction signing hook\n *\n * Handles signing for both wallet types:\n * - External Solana wallet: Delegates to wallet adapter (app-provided callback)\n * - SSS embedded wallet: Uses server-side signing\n *\n * Usage:\n * ```tsx\n * const { signTransaction, signingMethod, canSign } = useTransactionSigning({\n * // For external wallet users, provide your wallet adapter's signTransaction\n * onExternalSign: async (tx) => walletAdapter.signTransaction(tx),\n * });\n *\n * // Sign a transaction (automatically routes to correct method)\n * const signature = await signTransaction(txBytes, credential);\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useWallet } from './useWallet';\nimport { useWalletSigning } from './useWalletSigning';\nimport type { UnlockCredential } from '../types/wallet';\n\n/** Signing method in use */\nexport type SigningMethod = 'external' | 'sss' | 'none';\n\n/** Options for external wallet signing */\nexport interface ExternalSignOptions {\n /**\n * Callback to sign transaction with external wallet adapter.\n * Only called when user has external Solana wallet.\n *\n * @param transaction - Transaction bytes to sign\n * @returns Signature bytes (64 bytes Ed25519)\n */\n onExternalSign?: (transaction: Uint8Array) => Promise<Uint8Array>;\n}\n\n/** Return type for useTransactionSigning hook */\nexport interface UseTransactionSigningReturn {\n /** Sign a transaction (routes to appropriate method) */\n signTransaction: (transaction: Uint8Array, credential?: UnlockCredential) => Promise<Uint8Array>;\n /** Which signing method is available */\n signingMethod: SigningMethod;\n /** Whether user can sign transactions */\n canSign: boolean;\n /** Whether signing is in progress */\n isSigning: boolean;\n /** Solana public key (from either wallet type) */\n publicKey: string | null;\n /** Whether user has external Solana wallet */\n hasExternalWallet: boolean;\n /** Whether SSS wallet is enrolled */\n hasSssWallet: boolean;\n /** Whether SSS wallet is unlocked (for session-based signing) */\n isSssUnlocked: boolean;\n /** Error from last signing attempt */\n error: string | null;\n /** Clear error */\n clearError: () => void;\n}\n\n/**\n * Unified transaction signing hook\n *\n * Automatically routes signing requests to the appropriate method:\n * - External wallet: Uses provided callback\n * - SSS wallet: Uses server-side signing\n */\nexport function useTransactionSigning(\n options: ExternalSignOptions = {}\n): UseTransactionSigningReturn {\n const { onExternalSign } = options;\n\n const { solanaPubkey, hasExternalWallet, status, isUnlocked: isSssUnlocked } = useWallet();\n\n const {\n signTransaction: sssSignTransaction,\n isSigning: isSssSigning,\n error: sssError,\n clearError: clearSssError,\n } = useWalletSigning();\n\n // Determine which signing method is available\n const signingMethod = useMemo((): SigningMethod => {\n if (hasExternalWallet && onExternalSign) {\n return 'external';\n }\n if (status === 'enrolled_locked' || status === 'enrolled_unlocked') {\n return 'sss';\n }\n return 'none';\n }, [hasExternalWallet, onExternalSign, status]);\n\n // Whether user can sign\n const canSign = signingMethod !== 'none';\n const hasSssWallet = status === 'enrolled_locked' || status === 'enrolled_unlocked';\n\n // Unified sign function\n const signTransaction = useCallback(\n async (transaction: Uint8Array, credential?: UnlockCredential): Promise<Uint8Array> => {\n if (signingMethod === 'external') {\n if (!onExternalSign) {\n throw new Error('External wallet signing callback not provided');\n }\n return onExternalSign(transaction);\n }\n\n if (signingMethod === 'sss') {\n if (!credential && !isSssUnlocked) {\n throw new Error(\n 'Credential required for signing. Unlock wallet first or provide credential.'\n );\n }\n if (credential) {\n return sssSignTransaction(transaction, credential);\n }\n // If unlocked, credential is optional (server uses cached key)\n return sssSignTransaction(transaction);\n }\n\n throw new Error('No signing method available. Enroll a wallet first.');\n },\n [signingMethod, onExternalSign, isSssUnlocked, sssSignTransaction]\n );\n\n return {\n signTransaction,\n signingMethod,\n canSign,\n isSigning: isSssSigning,\n publicKey: solanaPubkey,\n hasExternalWallet,\n hasSssWallet,\n isSssUnlocked,\n error: sssError,\n clearError: clearSssError,\n };\n}\n","import { createContext } from 'react';\nimport type { Translations } from './translations';\n\nexport interface I18nContextValue {\n t: Translations;\n locale: string;\n}\n\nexport const I18nContext = createContext<I18nContextValue | null>(null);\n","//! Default English translations for the Cedros Login UI\n\nexport interface Translations {\n // Auth forms\n auth: {\n email: string;\n password: string;\n confirmPassword: string;\n name: string;\n optional: string;\n createPassword: string;\n confirmYourPassword: string;\n emailPlaceholder: string;\n namePlaceholder: string;\n };\n // Buttons\n buttons: {\n signIn: string;\n signUp: string;\n signOut: string;\n createAccount: string;\n continueWithGoogle: string;\n continueWithSolana: string;\n forgotPassword: string;\n resetPassword: string;\n sendVerification: string;\n };\n // Messages\n messages: {\n signingIn: string;\n signingUp: string;\n creatingAccount: string;\n connectingWallet: string;\n verifyingSignature: string;\n passwordsDoNotMatch: string;\n alreadyHaveAccount: string;\n dontHaveAccount: string;\n orContinueWith: string;\n };\n // Errors\n errors: {\n invalidCredentials: string;\n emailExists: string;\n invalidEmail: string;\n weakPassword: string;\n networkError: string;\n unknownError: string;\n walletNotFound: string;\n signatureRejected: string;\n challengeExpired: string;\n };\n // Password validation\n passwordValidation: {\n minLength: string;\n uppercase: string;\n lowercase: string;\n number: string;\n special: string;\n weak: string;\n fair: string;\n good: string;\n strong: string;\n };\n}\n\nexport const defaultTranslations: Translations = {\n auth: {\n email: 'Email',\n password: 'Password',\n confirmPassword: 'Confirm Password',\n name: 'Name',\n optional: '(optional)',\n createPassword: 'Create a password',\n confirmYourPassword: 'Confirm your password',\n emailPlaceholder: 'you@example.com',\n namePlaceholder: 'Your name',\n },\n buttons: {\n signIn: 'Sign in',\n signUp: 'Sign up',\n signOut: 'Sign out',\n createAccount: 'Create account',\n continueWithGoogle: 'Continue with Google',\n continueWithSolana: 'Connect Wallet',\n forgotPassword: 'Forgot password?',\n resetPassword: 'Reset password',\n sendVerification: 'Send verification email',\n },\n messages: {\n signingIn: 'Signing in...',\n signingUp: 'Signing up...',\n creatingAccount: 'Creating account...',\n connectingWallet: 'Connecting wallet...',\n verifyingSignature: 'Verifying signature...',\n passwordsDoNotMatch: 'Passwords do not match',\n alreadyHaveAccount: 'Already have an account?',\n dontHaveAccount: \"Don't have an account?\",\n orContinueWith: 'Or continue with',\n },\n errors: {\n invalidCredentials: 'Invalid email or password',\n emailExists: 'An account with this email already exists',\n invalidEmail: 'Please enter a valid email address',\n weakPassword: 'Password does not meet requirements',\n networkError: 'Network error. Please try again.',\n unknownError: 'An error occurred. Please try again.',\n walletNotFound: 'No wallet found. Please install a Solana wallet.',\n signatureRejected: 'Signature request was rejected',\n challengeExpired: 'Challenge expired. Please try again.',\n },\n passwordValidation: {\n minLength: 'At least 10 characters',\n uppercase: 'At least 1 uppercase letter',\n lowercase: 'At least 1 lowercase letter',\n number: 'At least 1 number',\n special: 'At least 1 special character',\n weak: 'Weak',\n fair: 'Fair',\n good: 'Good',\n strong: 'Strong',\n },\n};\n\n/**\n * Deep merge translations, allowing partial overrides\n */\nexport function mergeTranslations(\n base: Translations,\n overrides: DeepPartial<Translations>\n): Translations {\n return deepMerge(base, overrides) as Translations;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T extends object>(base: T, overrides: DeepPartial<T>): T {\n const result = { ...base };\n\n for (const key in overrides) {\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const baseValue = base[key as keyof T];\n const overrideValue = overrides[key as keyof typeof overrides];\n\n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n typeof overrideValue === 'object' &&\n overrideValue !== null\n ) {\n (result as Record<string, unknown>)[key] = deepMerge(\n baseValue as object,\n overrideValue as DeepPartial<object>\n );\n } else if (overrideValue !== undefined) {\n (result as Record<string, unknown>)[key] = overrideValue;\n }\n }\n }\n\n return result;\n}\n","import { useMemo, type ReactNode } from 'react';\nimport { I18nContext } from './context';\nimport { defaultTranslations, mergeTranslations, type Translations } from './translations';\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport interface I18nProviderProps {\n children: ReactNode;\n locale?: string;\n translations?: DeepPartial<Translations>;\n}\n\n/**\n * Provider for internationalization support.\n * Allows overriding default English translations with custom strings.\n */\nexport function I18nProvider({\n children,\n locale = 'en',\n translations: customTranslations,\n}: I18nProviderProps) {\n const value = useMemo(() => {\n const t = customTranslations\n ? mergeTranslations(defaultTranslations, customTranslations)\n : defaultTranslations;\n\n return { t, locale };\n }, [customTranslations, locale]);\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { I18nContext } from './context';\nimport { defaultTranslations, type Translations } from './translations';\n\n/**\n * Hook to access translations\n */\nexport function useTranslations(): Translations {\n const context = useContext(I18nContext);\n return context?.t ?? defaultTranslations;\n}\n\n/**\n * Hook to access current locale\n */\nexport function useLocale(): string {\n const context = useContext(I18nContext);\n return context?.locale ?? 'en';\n}\n"],"names":["isBytes","a","isArrayOf","isString","arr","item","afn","input","astr","label","anumber","n","aArr","astrArr","anumArr","chain","args","id","wrap","b","c","encode","x","decode","alphabet","letters","lettersA","len","indexes","l","i","digits","letter","join","separator","from","to","padding","bits","chr","data","end","convertRadix","pos","res","d","dlen","carry","done","digit","fromCarry","digitBase","div","rounded","gcd","radix2carry","powers","convertRadix2","max","mask","pow","radix","num","_256","bytes","radix2","revPadding","checksum","fn","sum","payload","oldChecksum","newChecksum","utils","isJapanese","wordlist","nfkd","str","normalize","norm","words","aentropy","ent","abytes","calcChecksum","entropy","bitsLeft","sha256","getCoder","baseUtils","mnemonicToEntropy","mnemonic","entropyToMnemonic","validateMnemonic","MNEMONIC_WORD_COUNT","shareToMnemonic","share","mnemonicToShare","toShamirShare","seedToMnemonic","seed","mnemonicToSeed","toSeed","isValidMnemonic","isValidWord","word","getWordSuggestions","prefix","limit","normalizedPrefix","formatMnemonicForDisplay","groups","parseMnemonicInput","w","LoginButton","className","variant","size","children","menuItems","hideSignOut","user","isAuthenticated","isLoading","openLoginModal","logout","useAuth","isMenuOpen","setIsMenuOpen","useState","focusedIndex","setFocusedIndex","menuRef","useRef","buttonRef","allMenuItems","useMemo","useEffect","handleClickOutside","e","handleEscape","handleMenuKeyDown","useCallback","toggleMenu","open","sizeClasses","variantClasses","jsx","LoadingSpinner","displayName","sanitizedPicture","sanitizeImageUrl","jsxs","index","usePasswordReset","config","useCedrosLogin","setIsLoading","isSuccess","setIsSuccess","error","setError","apiClient","ApiClient","checkLimit","getRemainingAttempts","useRateLimiter","forgotPassword","email","validateEmail","validationError","err","rateLimitError","authError","handleApiError","resetPassword","token","newPassword","clearError","reset","ForgotPasswordForm","onSuccess","onCancel","setEmail","emailId","useId","handleSubmit","ErrorMessage","Fragment","scriptLoader","resolve","reject","existingScript","cb","script","useAppleAuth","_internal","isInitialized","setIsInitialized","configRef","isMounted","initializeAppleSignIn","signIn","response","idToken","userName","isAppleDevice","userAgent","platform","AppleLoginButton","onError","disabled","hideOnNonApple","isApple","handleClick","assert","condition","message","normalizeBase64Url","base64UrlToArrayBuffer","b64url","base64","padded","binary","arrayBufferToBase64Url","buffer","mapCredentialDescriptor","desc","parseCreationOptionsFromServer","options","publicKey","rp","exclude","pubKeyCredParams","p","parseRequestOptionsFromServer","allow","credentialToServerJson","cred","rawId","responseJson","att","asr","isWebAuthnAvailable","hostname","isLocalhost","mapWebAuthnDomError","name","useWebAuthn","isSupported","authenticatePasskey","params","optionsResponse","assertion","registerPasskey","created","result","PasskeyLoginButton","isDisabled","PasskeyIcon","TABS","LoginForm","defaultTab","activeTab","setActiveTab","viewState","setViewState","hasWallets","setHasWallets","detectSolanaWallets","updateWallets","forgotPasswordMode","handleTabKeyDown","currentIndex","newIndex","newTab","features","showEmail","showGoogle","showApple","showSolana","showPasskey","showDivider","GoogleLoginButton","SolanaLoginButton","EmailLoginForm","EmailRegisterForm","ErrorBoundary","Component","props","errorInfo","hasError","fallback","showDetails","LoginModal","title","isModalOpen","closeModal","modalRef","previousActiveElement","closeModalRef","handleKeyDown","focusableElements","firstElement","lastElement","previousOverflow","handleBackdropClick","ResetPasswordForm","onLoginClick","password","setPassword","confirmPassword","setConfirmPassword","validation","setValidation","passwordsMatch","isValid","PasswordInput","validatePassword","OrgAvatar","org","sanitizedLogoUrl","sizeClass","imageClassName","placeholderClassName","OrgSelector","orgs","activeOrg","onSelect","onCreateClick","placeholder","isOpen","setIsOpen","dropdownRef","event","handleSelect","orgId","handleCreateClick","toggleDropdown","prev","RoleBadge","ChevronIcon","CheckIcon","PlusIcon","role","CloseIcon","OrgListView","CreateOrgForm","onSubmit","setName","slug","setSlug","formError","setFormError","handleNameChange","value","generatedSlug","OrgSwitcher","onClose","onCreate","OrgSwitcherModal","viewMode","setViewMode","previousFocusRef","handleCreate","ROLE_OPTIONS","MemberList","members","currentUserId","canManage","canChangeRoles","onUpdateRole","onRemove","sortField","setSortField","sortOrder","setSortOrder","toggleSort","field","sortedMembers","roleOrder","aVal","bVal","member","MemberRow","isCurrentUser","isUpdating","setIsUpdating","selectedRole","setSelectedRole","handleRoleChange","newRole","handleRemove","isOwner","canModify","MemberAvatar","formatDate","initial","dateString","DEFAULT_ROLES","InviteForm","availableRoles","defaultRole","setRole","success","setSuccess","successTimerRef","isMountedRef","trimmedEmail","r","InviteList","invites","onResend","invite","InviteItem","resendSuccess","setResendSuccess","resendTimerRef","isExpired","handleCancel","handleResend","formatRelativeTime","date","now","diffMs","diffDays","SessionList","sessions","onRevokeAll","isRevoking","setIsRevoking","revokeSuccess","setRevokeSuccess","revokeTimerRef","otherSessionCount","s","handleRevokeAll","currentOtherCount","session","SessionItem","browserInfo","parseUserAgent","isExpiringSoon","isSessionExpiringSoon","DeviceIcon","browser","os","diffMins","diffHours","expiresAt","expires","hourInMs","RecoveryPhraseDisplay","onConfirm","copied","setCopied","confirmed","setConfirmed","copyTimerRef","wordGroups","handleCopy","handleConfirm","group","groupIndex","wordIndex","number","RecoveryPhraseInput","isSubmitting","setWords","activeIndex","setActiveIndex","suggestions","setSuggestions","setValidationError","inputId","suggestionsTimerRef","handleWordChange","newWords","newSuggestions","handleWordFocus","handleWordBlur","handleSuggestionClick","suggestion","handlePaste","pastedText","parsedWords","invalidWords","displayError","_","CapabilityWarning","capabilities","getMissingCapabilitiesMessage","getBrowserSupportInfo","VALID_RECOVERY_MODES","normalizeRecoveryMode","mode","DEFAULT_RETURN","useWalletDiscovery","context","useCedrosLoginOptional","walletConfig","setWalletConfig","fetchConfig","useWalletEnrollment","enroll","useWalletMaterial","recoveryMode","state","setState","isEnrolling","setIsEnrolling","sensitiveData","cleanup","wipeAll","doEnrollment","authMethod","encryptionKey","kdfSalt","prfSalt","generateSeed","shareA","shareB","shareC","splitSecret","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","DEFAULT_KDF_PARAMS","recoveryPhrase","startEnrollmentWithPassword","salt","generateArgon2Salt","key","argon2DeriveInWorker","startEnrollmentWithPasskey","generatePrfSalt","prfSaltBase64","prfOutput","userIdBytes","registerPasskeyWithPrf","authenticateWithDiscoverablePrf","deriveKeyFromPrf","confirmRecoveryPhrase","cancel","WalletEnrollment","onComplete","forceAuthMethod","getDefaultAuthMethod","setAuthMethod","passwordError","setPasswordError","handlePasswordSubmit","handlePasskeySubmit","handleRecoveryConfirm","useWalletSigning","apiSignTransaction","isSigning","setIsSigning","signTransaction","transaction","credential","msg","toCredentialRequest","base64ToUint8Array","usePasskeySigning","getMaterial","isAuthenticating","setIsAuthenticating","getPasskeyCredential","material","PasskeyPrompt","onPrompt","onRetry","description","handlePrompt","handleRetry","defaultTitle","defaultDescription","ErrorIcon","WalletUnlock","onUnlock","showCancel","propAuthMethod","unlock","phase","setPhase","setCredential","isPasswordAuth","isPasskeyAuth","startUnlock","unlockCredential","handlePasskeyUnlock","passkeyCredential","isProcessing","renderContent","LockIcon","SuccessIcon","useWalletRecovery","recover","getShareBForRecovery","isRecovering","setIsRecovering","startRecovery","method","shareCBase64","combineShares","prfResult","WalletRecovery","defaultAuthMethod","phraseValidated","setPhraseValidated","confirmCredential","setConfirmCredential","credentialError","setCredentialError","handlePhraseSubmit","submittedWords","handleCredentialSubmit","handleBack","handleComplete","WalletAddressRow","address","showCopy","showExplorerLink","allowReveal","copyError","setCopyError","revealFull","setRevealFull","network","explorerHref","base","isTruncatable","displayAddress","v","WalletStatus","controlledStatus","controlledPubkey","_onLock","onEnroll","onRecover","showActions","compact","isControlled","wallet","useWallet","status","refresh","statusConfig","getStatusConfig","truncatePubkey","StatusIcon","pubkey","WalletManager","view","setView","header","handleBackToStatus","handleEnrollComplete","handleUnlockComplete","handleRecoverComplete","SystemSettingsApiClient","baseUrl","timeoutMs","retryAttempts","getAccessToken","settings","useSystemSettings","authState","setSettings","requestIdRef","apiClientRef","fetchSettings","requestId","updateSettings","updates","getValue","categorySettings","found","secondsToDuration","totalSeconds","days","hours","minutes","seconds","formatDuration","parts","SETTING_METADATA","CATEGORY_METADATA","SystemSettings","showDescriptions","onSave","edits","setEdits","saveError","setSaveError","saveSuccess","setSaveSuccess","timer","handleChange","handleSave","handleReset","hasChanges","changeCount","categories","category","SettingsSection","showDescription","onChange","meta","setting","SettingRow","editValue","currentValue","hasChange","warning","numValue","above","below","DurationInput","PercentageInput","SelectInput","NumberInput","TokenListInput","BooleanInput","SecretInput","TokenSymbolListInput","presets","min","displayValue","handlePresetChange","handleCustomChange","newValue","preset","step","handleSliderChange","handlePresetClick","presetValue","unit","isCustomValue","handleSelectChange","isEnabled","handleToggle","multiline","isEditing","setIsEditing","showValue","setShowValue","hasValue","handleEdit","handleDone","PRESET_TOKEN_SYMBOLS","tokens","updateTokens","updated","addToken","updateToken","val","removeToken","symbol","symbols","addSymbol","removeSymbol","isSelected","SetupApiClient","useSetup","setStatus","isCreating","setIsCreating","checkStatus","createAdmin","EMAIL_REGEX","MIN_PASSWORD_LENGTH","validateForm","form","errors","SetupWizard","setForm","validationErrors","setValidationErrors","DEBOUNCE_MS","SAVED_DISPLAY_MS","useSettingsAutosave","autosaveStatus","setAutosaveStatus","autosaveError","setAutosaveError","debounceTimerRef","savedTimerRef","pendingEditsRef","performSave","editsToSave","next","getEffectiveValue","externalWarnings","externalWarning","isBoolean","SettingInput","AutosaveStatus","SettingsPageLayout","relevantCategories","cat","useSsoProviders","serverUrl","getAccessTokenRef","providers","setProviders","total","setTotal","getHeaders","fetchProviders","offset","createProvider","provider","updateProvider","deleteProvider","toggleProvider","enabled","OrgApiClient","ACTIVE_ORG_KEY","safeGetItem","safeSetItem","useOrgs","hasStorage","setOrgs","setActiveOrg","permissions","setPermissions","loadPermissions","fetchOrgs","fetchedOrgs","savedOrgId","selectedOrg","switchOrg","o","createOrg","newOrg","updateOrg","updatedOrg","deleteOrg","hasPermission","permission","SsoProvidersSettings","editingProvider","setEditingProvider","handleAdd","handleDelete","SsoProviderForm","SsoProviderCard","onEdit","onDelete","onToggle","issuerUrl","setIssuerUrl","clientId","setClientId","clientSecret","setClientSecret","emailDomain","setEmailDomain","allowRegistration","setAllowRegistration","setEnabled","AuthenticationSettings","currentTab","t","allTabSettings","allSettings","currentSettings","tab","SETTINGS_KEYS","EmbeddedWalletSettings","walletEnabled","handleWalletToggle","CATEGORIES","SecuritySettings","EmailSettings","WebhookSettings","PROVIDER_SMTP_HOSTS","SIMPLIFIED_EMAIL_FIELDS","ALL_EMAIL_FIELDS","MessagingSettings","currentCategory","isCustomProvider","fieldsToShow","handleProviderAwareChange","smtpHost","CreditSystemSettings","feePolicy","filtered","privacyFeeKeys","swapFeeKeys","companyFeeKeys","getSectionSettings","keys","warnings","minUsd","microEnabled","creditsEnabled","handleCreditsToggle","section","sectionSettings","ServerSettings","MemberApiClient","userId","useMembers","setMembers","fetchedOrgIdRef","fetchMembers","updateMemberRole","removeMember","InviteApiClient","inviteId","useInvites","setInvites","fetchInvites","createInvite","cancelInvite","resendInvite","acceptInvite","DEFAULT_FEATURES","useServerFeatures","hasFetched","setHasFetched","parseBoolean","refetch","feature","AdminUserApiClient","query","queryString","url","isAdmin","useAdminUsers","users","setUsers","lastParams","setLastParams","listUsers","getUser","setSystemAdmin","updateUser","deleteUser","forcePasswordReset","adjustCredits","amount","reason","getUserDeposits","getUserCredits","getUserWithdrawalHistory","getUserChats","getStats","LOGIN_DASHBOARD_SECTIONS","PAY_DASHBOARD_SECTIONS","DASHBOARD_SECTION_LABELS","DEFAULT_DASHBOARD_PERMISSIONS","useDashboardPermissions","fetchPermissions","updatePermissions","newPermissions","canAccess","useAdminDeposits","listDeposits","apiError","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats","Icons","StatsBar","stats","onRefresh","stat","AdminDepositStats","refreshInterval","onLoad","setStats","loadError","setLoadError","fetchStats","interval","errorMessage","AdminWithdrawalStats","getStatusLabel","getStatusClass","formatAmount","lamports","truncateId","AdminDepositList","statusFilter","pageSize","onDepositClick","deposits","setDeposits","setOffset","sortedDeposits","fetchDeposits","totalPages","currentPage","goToPage","page","newOffset","deposit","getTimeElapsed","isWithinPrivacyPeriod","withdrawalAvailableAt","AdminWithdrawalQueue","onItemClick","onWithdrawalProcessed","onAllProcessed","items","setItems","sortedItems","processingId","setProcessingId","processingAll","setProcessingAll","processResult","setProcessResult","earlyWithdrawalItem","setEarlyWithdrawalItem","fetchItems","handleProcessSingle","force","handleProcessAll","withinPrivacyPeriod","getTimeRemaining","remainingHours","remainingMins","AdminPrivacyPeriodDeposits","truncateSignature","sig","AdminWithdrawalHistory","formatBalance","AdminUserList","onUserClick","sortedUsers","fetchUsers","formatDateTime","formatSol","formatCredits","formatTxType","txType","formatTxDescription","referenceType","AdminUserDetail","onBack","onEditUser","onAdjustCredits","cedrosPayEnabled","setUser","credits","setCredits","chats","setChats","userError","setUserError","creditsError","setCreditsError","depositsError","setDepositsError","chatsError","setChatsError","actionInProgress","setActionInProgress","depositsOffset","setDepositsOffset","transactionsOffset","setTransactionsOffset","chatsOffset","setChatsOffset","fetchUser","userData","depositsData","fetchCredits","creditsData","fetchChats","chatsData","handlePasswordReset","depositsTotalPages","depositsCurrentPage","transactionsTotalPages","transactionsCurrentPage","goToDepositsPage","goToTransactionsPage","chatsTotalPages","chatsCurrentPage","goToChatsPage","DepositsTab","TransactionsTab","ChatsTab","onPageChange","Pagination","transactions","tx","PermissionToggle","checked","PermissionsSection","userRole","featuresLoading","debounceRef","pendingPermissions","debouncedSave","ProfileDropdown","picture","onSettings","onLogout","handleSettings","handleLogout","ALL_SECTIONS","CedrosAdminDashboard","sections","defaultSection","onSectionChange","onSettingsClick","onLogoutClick","activeSection","setActiveSection","configExpanded","setConfigExpanded","orgsLoading","setupLoading","handleSectionChange","enabledSections","currentSection","activeSectionDisabled","UsersSection","TeamSection","DepositsSection","WithdrawalsSection","selectedUser","setSelectedUser","statsLoading","setStatsLoading","statsError","setStatsError","settingsFetched","setSettingsFetched","isSettingEnabled","fetchUserStats","statsItems","showPasskeys","showSso","membersLoading","membersError","invitesLoading","invitesError","canInvite","canCancel","pendingCount","roleCounts","acc","ownerCount","adminCount","memberCount","setStatusFilter","PluginRegistryImpl","plugin","pluginId","listener","plugins","AdminShellContext","createContext","useAdminShell","ctx","useContext","buildGroupOrder","order","AdminShell","initialPlugins","hostContext","logo","sidebarFooter","registry","reg","registeredPlugins","setRegisteredPlugins","allSections","setActiveSectionInternal","collapsedGroups","setCollapsedGroups","toggleGroup","groupName","getPluginContext","groupedSections","groupOrder","existing","orderA","orderB","sectionId","pluginContext","contextValue","cedrosLoginContextValue","cl","CedrosLoginContext","isCollapsible","isCollapsed","Suspense","LoadingFallback","iconProps","lazy","PERMISSION_MAP","SECTIONS","cedrosLoginPlugin","cedrosLogin","requiredPerms","canPromise","toSJISFunction","CODEWORDS_COUNT","version","f","kanji","exports","fromString","string","level","defaultValue","BitBuffer","bufIndex","length","bit","bitBuffer","BitMatrix","row","col","reserved","bitMatrix","getSymbolSize","require$$0","posCount","intervals","positions","coords","posLength","j","FINDER_PATTERN_SIZE","finderPattern","PenaltyScores","points","sameCountCol","sameCountRow","lastCol","lastRow","module","last","bitsCol","bitsRow","darkCount","modulesCount","getMaskAt","maskPattern","pattern","setupFormatFunc","numPatterns","bestPattern","lowerPenalty","penalty","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","errorCorrectionCode","errorCorrectionLevel","EXP_TABLE","LOG_TABLE","galoisField","y","GF","p1","p2","coeff","divident","divisor","degree","poly","Polynomial","ReedSolomonEncoder","paddedData","remainder","start","buff","reedSolomonEncoder","versionCheck","numeric","alphanumeric","byte","regex","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","VersionCheck","Regex","require$$1","dataStr","Utils","ECCode","require$$2","Mode","require$$3","require$$4","G18","G18_BCH","getBestVersionForDataLength","currentVersion","getReservedBitsCount","getTotalBitsFromDataArray","segments","totalBits","reservedBits","getBestVersionForMixedData","totalCodewords","ecTotalCodewords","dataTotalCodewordsBits","usableBits","seg","ecl","G15","G15_MASK","G15_BCH","formatInfo","NumericData","remainingNum","numericData","ALPHA_NUM_CHARS","AlphanumericData","alphanumericData","ByteData","byteData","KanjiData","kanjiData","dijkstra","graph","predecessors","costs","closest","cost_of_s_to_u","adjacent_nodes","cost_of_e","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","first_visit","nodes","u","opts","T","cost","require$$5","require$$6","require$$7","getStringByteLength","getSegments","getSegmentsFromString","numSegs","alphaNumSegs","byteSegs","kanjiSegs","s1","s2","obj","getSegmentBitsLength","mergeSegments","segs","curr","prevSeg","buildNodes","buildGraph","table","prevNodeIds","nodeGroup","currentNodeIds","node","prevNodeId","buildSingleSegment","modesHint","bestMode","array","path","optimizedSegs","AlignmentPattern","FinderPattern","MaskPattern","require$$8","Version","require$$9","FormatInfo","require$$10","require$$11","Segments","require$$12","setupFinderPattern","matrix","setupTimingPattern","setupAlignmentPattern","setupVersionInfo","mod","setupFormatInfo","setupData","inc","bitIndex","byteIndex","dark","createData","remainingByte","createCodewords","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","dcData","ecData","maxDataSize","dataSize","createSymbol","estimatedVersion","rawSegments","bestVersion","dataBits","moduleCount","modules","qrcode","hex2rgba","hex","hexCode","hexValue","margin","width","scale","qrSize","imgData","qr","symbolSize","scaledMargin","palette","posDst","pxColor","iSrc","jSrc","clearCanvas","canvas","getCanvasElement","qrData","canvasEl","image","type","rendererOpts","getColorAttrib","color","attrib","alpha","svgCmd","cmd","qrToPath","moveBy","newRow","lineLength","svgTag","qrcodesize","bg","viewBox","QRCode","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","text","argsNum","isLastArgCb","QrCode","alt","canvasRef","useTotp","setupState","setSetupState","setSetupData","getStatus","beginSetup","enableTotp","code","disableTotp","regenerateBackupCodes","TotpSetup","setStep","verifyCode","setVerifyCode","copiedSecret","setCopiedSecret","savedBackupCodes","setSavedBackupCodes","handleCopySecret","handleCopyBackupCodes","codes","handleVerify","OtpInput","TotpSettings","onStatusChange","disablePassword","setDisablePassword","regenerateCode","setRegenerateCode","newRecoveryCodes","setNewRecoveryCodes","actionLoading","setActionLoading","actionError","setActionError","handleSetupComplete","handleDisable","handleRegenerate","ProfileApiClient","useProfile","updateProfile","changePassword","UserProfileSettings","onPasswordChange","currentPassword","setCurrentPassword","setNewPassword","successMessage","setSuccessMessage","passwordValidation","canSubmitPassword","handlePasswordChange","handleCancelPasswordChange","getInitials","useDeposit","amountLamports","getConfig","getQuote","queryParams","publicDeposit","microDeposit","TokenSelector","selectedToken","openSignal","searchable","search","setSearch","containerRef","searchInputRef","filteredTokens","searchLower","getTierForAmount","usd","solLogo","DEFAULT_MAX_USD","SLIDER_STEPS","CURVE_POWER","formatUsd","getTierInfo","tier","clamp","usdToSlider","maxUsd","normalized","sliderToUsd","position","getUsdStep","getStepDecimals","roundUsd","decimals","TieredAmountSlider","valueUsd","normalizedValue","tierInfo","sliderValue","sliderPercent","hasUserFee","getEffectiveFeePercent","isPrivate","isMicro","privacyFeePercent","swapFeePercent","companyFeePercent","userFee","LAMPORTS_PER_SOL","SOL_TOKEN","OTHER_TOKEN","MAX_DEPOSIT_USD","calculateFeeLines","amountUsd","lines","privacyActive","swapActive","companyActive","solAmount","percent","fixedUsd","percentUsd","formatFeeTooltip","totalFeeUsd","feeLines","feeTotalDisplay","totalSol","line","totalPercent","COL","formatLine","sol","pct","divider","totalUsdStr","totalLine","formatExplainerFeeSummary","feeLabels","hasPrivacyFee","hasSwapFee","hasCompanyFee","getTotalFeeUsd","feePercent","userFixedLamports","fixedFeeUsd","percentFeeUsd","getPurchaseCurrencyLabel","currencyMode","supported","normalizeTokenSymbols","USD_STABLE_TOKENS","getTokenUsdPrice","priceOverrides","serverPrice","override","formatTokenAmount","DepositFlow","depositMethodProp","defaultToken","minAmount","maxAmount","onUnlockRequired","onAuthorize","showStepIndicator","pollInterval","demoMode","demoAutoConfirmMs","tokenPriceUsd","showExplainer","siteName","explainerConfig","depositError","quickActionSymbols","customTokenSymbols","mergedTokens","customDefs","seen","merged","def","customListTokens","canUseSignMode","depositMethod","firstQuickActionToken","effectiveToken","candidate","getFirstStep","setSelectedToken","setAmount","setResult","flowError","setFlowError","setSessionId","depositAddress","setDepositAddress","isAuthorizing","setIsAuthorizing","receiveAmountUsd","setReceiveAmountUsd","effectiveMin","effectiveMax","parsedAmount","isEnrolled","walletReady","needsUnlock","steps","currentStepIndex","handleTokenSelect","handleAuthorize","handleDeposit","depositAmount","depositToken","finalAmount","finalToken","smallestUnit","flowResult","handleSentDeposit","handleCopyAddress","textArea","cancelled","pollCount","maxPolls","poll","detectedAmount","timeout","tokenAmount","idx","isActive","isCurrent","ExplainerStep","UnlockStep","ConfirmStep","amt","tkn","SigningStep","ShowAddressStep","WaitingStep","SuccessStep","ErrorStep","depositConfig","onContinue","exchangeName","exchangeUrl","sanitizeExternalUrl","showExchange","purchaseCurrencyLabel","defaultBody","body","showUserFee","feeDescription","isListening","onCopy","onTokenSelect","setAmountUsd","showCustomToken","setShowCustomToken","feeTooltipOpen","setFeeTooltipOpen","customOpenSignal","setCustomOpenSignal","preMicroToken","setPreMicroToken","isMicroTier","isOtherToken","customTokens","baseTokens","resolved","feeLine","feeTooltip","tokenUsdPrice","sendAmountLabel","feesExceedAmount","isValidAmount","solToken","quickToken","current","onAmountChange","onSent","canSubmit","onNewDeposit","creditsUsd","totalFeeDisplay","bonkLogo","cashLogo","eurcLogo","oreLogo","pyusdLogo","usdcLogo","usdhLogo","usd1Logo","usdtLogo","SUPPORTED_TOKENS","useCredits","getBalance","getAllBalances","getHistory","CreditBalance","showAllCurrencies","balances","setBalances","fetchBalance","primaryBalance","balance","currency","isNegative","absLamports","isSol","getTypeLabel","getTypeIcon","isPositive","History","onTransactionClick","setTransactions","filteredTransactions","fetchHistory","handleTabChange","getTabCount","count","FullPageLayout","brandLogo","brandName","subtitle","termsText","SplitPageLayout","tagline","SessionApiClient","useSessions","setSessions","fetchSessions","fetchedSessions","revokeAllSessions","useAuthorize","lastCheck","setLastCheck","checkAuthorization","authorize","clearCheck","usePendingRecovery","pendingData","setPendingData","fetchPendingRecovery","acknowledgeRecovery","useTransactionSigning","onExternalSign","hasExternalWallet","isSssUnlocked","sssSignTransaction","isSssSigning","sssError","clearSssError","signingMethod","canSign","hasSssWallet","I18nContext","defaultTranslations","mergeTranslations","overrides","deepMerge","baseValue","overrideValue","I18nProvider","locale","customTranslations","useTranslations","useLocale"],"mappings":"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AAA;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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CT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IACV;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IACV;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IACV;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,KAGRC,IAAqB;AAAA;AAAA,IAEzB;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IACb;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IACb;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA,IACjB;AAAA,IAAK;AAAA,IAAM;AAAA,IAAM;AAAA;AAWnB,SAAAC,GAAA,iBAAyB,SAAyBnD,GAASoD,GAAsB;AAC/E,YAAQA,GAAoB;AAAA,MAC1B,KAAKJ,EAAQ;AACX,eAAOC,GAAiBjD,IAAU,KAAK,IAAI,CAAC;AAAA,MAC9C,KAAKgD,EAAQ;AACX,eAAOC,GAAiBjD,IAAU,KAAK,IAAI,CAAC;AAAA,MAC9C,KAAKgD,EAAQ;AACX,eAAOC,GAAiBjD,IAAU,KAAK,IAAI,CAAC;AAAA,MAC9C,KAAKgD,EAAQ;AACX,eAAOC,GAAiBjD,IAAU,KAAK,IAAI,CAAC;AAAA,MAC9C;AACE;AAAA;EAEN,GAUAmD,GAAA,yBAAiC,SAAiCnD,GAASoD,GAAsB;AAC/F,YAAQA,GAAoB;AAAA,MAC1B,KAAKJ,EAAQ;AACX,eAAOE,GAAoBlD,IAAU,KAAK,IAAI,CAAC;AAAA,MACjD,KAAKgD,EAAQ;AACX,eAAOE,GAAoBlD,IAAU,KAAK,IAAI,CAAC;AAAA,MACjD,KAAKgD,EAAQ;AACX,eAAOE,GAAoBlD,IAAU,KAAK,IAAI,CAAC;AAAA,MACjD,KAAKgD,EAAQ;AACX,eAAOE,GAAoBlD,IAAU,KAAK,IAAI,CAAC;AAAA,MACjD;AACE;AAAA;EAEN;;;;;;ACtIA,QAAMqD,IAAY,IAAI,WAAW,GAAG,GAC9BC,IAAY,IAAI,WAAW,GAAG;AASnC,UAAC,WAAuB;AACvB,QAAIhuC,IAAI;AACR,aAASQ,IAAI,GAAGA,IAAI,KAAKA;AACvB,MAAAutC,EAAUvtC,CAAC,IAAIR,GACfguC,EAAUhuC,CAAC,IAAIQ,GAEfR,MAAM,GAIFA,IAAI,QACNA,KAAK;AAQT,aAASQ,IAAI,KAAKA,IAAI,KAAKA;AACzB,MAAAutC,EAAUvtC,CAAC,IAAIutC,EAAUvtC,IAAI,GAAG;AAAA,EAEpC,GAAC,GAQDytC,GAAA,MAAc,SAAc5uC,GAAG;AAC7B,QAAIA,IAAI,EAAG,OAAM,IAAI,MAAM,SAASA,IAAI,GAAG;AAC3C,WAAO2uC,EAAU3uC,CAAC;AAAA,EACpB,GAQA4uC,GAAA,MAAc,SAAc5uC,GAAG;AAC7B,WAAO0uC,EAAU1uC,CAAC;AAAA,EACpB,GASA4uC,GAAA,MAAc,SAAcjuC,GAAGkuC,GAAG;AAChC,WAAIluC,MAAM,KAAKkuC,MAAM,IAAU,IAIxBH,EAAUC,EAAUhuC,CAAC,IAAIguC,EAAUE,CAAC,CAAC;AAAA,EAC9C;;;;;ACpEA,UAAMC,IAAKtC,GAAA;AASXhB,IAAAA,EAAA,MAAc,SAAcuD,GAAIC,GAAI;AAClC,YAAMC,IAAQ,IAAI,WAAWF,EAAG,SAASC,EAAG,SAAS,CAAC;AAEtD,eAAS7tC,IAAI,GAAGA,IAAI4tC,EAAG,QAAQ5tC;AAC7B,iBAAS2rC,IAAI,GAAGA,IAAIkC,EAAG,QAAQlC;AAC7B,UAAAmC,EAAM9tC,IAAI2rC,CAAC,KAAKgC,EAAG,IAAIC,EAAG5tC,CAAC,GAAG6tC,EAAGlC,CAAC,CAAC;AAIvC,aAAOmC;AAAA,IACT,GASAzD,EAAA,MAAc,SAAc0D,GAAUC,GAAS;AAC7C,UAAI9/B,IAAS,IAAI,WAAW6/B,CAAQ;AAEpC,aAAQ7/B,EAAO,SAAS8/B,EAAQ,UAAW,KAAG;AAC5C,cAAMF,IAAQ5/B,EAAO,CAAC;AAEtB,iBAASlO,IAAI,GAAGA,IAAIguC,EAAQ,QAAQhuC;AAClC,UAAAkO,EAAOlO,CAAC,KAAK2tC,EAAG,IAAIK,EAAQhuC,CAAC,GAAG8tC,CAAK;AAIvC,YAAI5c,IAAS;AACb,eAAOA,IAAShjB,EAAO,UAAUA,EAAOgjB,CAAM,MAAM,IAAG,CAAAA;AACvD,QAAAhjB,IAASA,EAAO,MAAMgjB,CAAM;AAAA,MAChC;AAEE,aAAOhjB;AAAA,IACT,GASAm8B,EAAA,uBAA+B,SAA+B4D,GAAQ;AACpE,UAAIC,IAAO,IAAI,WAAW,CAAC,CAAC,CAAC;AAC7B,eAASluC,IAAI,GAAGA,IAAIiuC,GAAQjuC;AAC1B,QAAAkuC,IAAO7D,EAAQ,IAAI6D,GAAM,IAAI,WAAW,CAAC,GAAGP,EAAG,IAAI3tC,CAAC,CAAC,CAAC,CAAC;AAGzD,aAAOkuC;AAAA,IACT;AAAA;;;;;;AC7DA,QAAMC,IAAa9C,GAAA;AAEnB,WAAS+C,EAAoBH,GAAQ;AACnC,SAAK,UAAU,QACf,KAAK,SAASA,GAEV,KAAK,UAAQ,KAAK,WAAW,KAAK,MAAM;AAAA,EAC9C;AAQA,SAAAG,EAAmB,UAAU,aAAa,SAAqBH,GAAQ;AAErE,SAAK,SAASA,GACd,KAAK,UAAUE,EAAW,qBAAqB,KAAK,MAAM;AAAA,EAC5D,GAQAC,EAAmB,UAAU,SAAS,SAAiB1tC,GAAM;AAC3D,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,yBAAyB;AAK3C,UAAM2tC,IAAa,IAAI,WAAW3tC,EAAK,SAAS,KAAK,MAAM;AAC3D,IAAA2tC,EAAW,IAAI3tC,CAAI;AAInB,UAAM4tC,IAAYH,EAAW,IAAIE,GAAY,KAAK,OAAO,GAKnDE,IAAQ,KAAK,SAASD,EAAU;AACtC,QAAIC,IAAQ,GAAG;AACb,YAAMC,IAAO,IAAI,WAAW,KAAK,MAAM;AACvC,aAAAA,EAAK,IAAIF,GAAWC,CAAK,GAElBC;AAAA,IACX;AAEE,WAAOF;AAAA,EACT,GAEAG,KAAiBL;;;;wBCjDjBM,GAAA,UAAkB,SAAkBxE,GAAS;AAC3C,WAAO,CAAC,MAAMA,CAAO,KAAKA,KAAW,KAAKA,KAAW;AAAA,EACvD;;;;;;ACRA,QAAMyE,IAAU,UACVC,IAAe;AACrB,MAAIxE,IAAQ;AAIZ,EAAAA,IAAQA,EAAM,QAAQ,MAAM,KAAK;AAEjC,QAAMyE,IAAO,+BAA+BzE,IAAQ;AAAA;AAEpD,EAAA0E,GAAA,QAAgB,IAAI,OAAO1E,GAAO,GAAG,GACrC0E,GAAA,aAAqB,IAAI,OAAO,yBAAyB,GAAG,GAC5DA,GAAA,OAAe,IAAI,OAAOD,GAAM,GAAG,GACnCC,GAAA,UAAkB,IAAI,OAAOH,GAAS,GAAG,GACzCG,GAAA,eAAuB,IAAI,OAAOF,GAAc,GAAG;AAEnD,QAAMG,IAAa,IAAI,OAAO,MAAM3E,IAAQ,GAAG,GACzC4E,IAAe,IAAI,OAAO,MAAML,IAAU,GAAG,GAC7CM,IAAoB,IAAI,OAAO,wBAAwB;AAE7D,SAAAH,GAAA,YAAoB,SAAoB/rC,GAAK;AAC3C,WAAOgsC,EAAW,KAAKhsC,CAAG;AAAA,EAC5B,GAEA+rC,GAAA,cAAsB,SAAsB/rC,GAAK;AAC/C,WAAOisC,EAAa,KAAKjsC,CAAG;AAAA,EAC9B,GAEA+rC,GAAA,mBAA2B,SAA2B/rC,GAAK;AACzD,WAAOksC,EAAkB,KAAKlsC,CAAG;AAAA,EACnC;;;;;AC9BA,UAAMmsC,IAAe7D,GAAA,GACf8D,IAAQC,GAAA;AASd/E,IAAAA,EAAA,UAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ,CAAC,IAAI,IAAI,EAAE;AAAA,IACrB,GAWAA,EAAA,eAAuB;AAAA,MACrB,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,IACpB,GAOAA,EAAA,OAAe;AAAA,MACb,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,IACpB,GAWAA,EAAA,QAAgB;AAAA,MACd,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,IACpB,GAQAA,EAAA,QAAgB;AAAA,MACd,KAAK;AAAA,IACP,GAUAA,EAAA,wBAAgC,SAAgCptB,GAAMitB,GAAS;AAC7E,UAAI,CAACjtB,EAAK,OAAQ,OAAM,IAAI,MAAM,mBAAmBA,CAAI;AAEzD,UAAI,CAACiyB,EAAa,QAAQhF,CAAO;AAC/B,cAAM,IAAI,MAAM,sBAAsBA,CAAO;AAG/C,aAAIA,KAAW,KAAKA,IAAU,KAAWjtB,EAAK,OAAO,CAAC,IAC7CitB,IAAU,KAAWjtB,EAAK,OAAO,CAAC,IACpCA,EAAK,OAAO,CAAC;AAAA,IACtB,GAQAotB,EAAA,qBAA6B,SAA6BgF,GAAS;AACjE,aAAIF,EAAM,YAAYE,CAAO,IAAUhF,EAAQ,UACtC8E,EAAM,iBAAiBE,CAAO,IAAUhF,EAAQ,eAChD8E,EAAM,UAAUE,CAAO,IAAUhF,EAAQ,QACtCA,EAAQ;AAAA,IACtB,GAQAA,EAAA,WAAmB,SAAmBptB,GAAM;AAC1C,UAAIA,KAAQA,EAAK,GAAI,QAAOA,EAAK;AACjC,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC,GAQAotB,EAAA,UAAkB,SAAkBptB,GAAM;AACxC,aAAOA,KAAQA,EAAK,OAAOA,EAAK;AAAA,IAClC;AAQA,aAASqtB,EAAYC,GAAQ;AAC3B,UAAI,OAAOA,KAAW;AACpB,cAAM,IAAI,MAAM,uBAAuB;AAKzC,cAFcA,EAAO,YAAW,GAEnB;AAAA,QACX,KAAK;AACH,iBAAOF,EAAQ;AAAA,QACjB,KAAK;AACH,iBAAOA,EAAQ;AAAA,QACjB,KAAK;AACH,iBAAOA,EAAQ;AAAA,QACjB,KAAK;AACH,iBAAOA,EAAQ;AAAA,QACjB;AACE,gBAAM,IAAI,MAAM,mBAAmBE,CAAM;AAAA,MAC/C;AAAA,IACA;AAUAF,IAAAA,EAAA,OAAe,SAAeh2B,GAAOo2B,GAAc;AACjD,UAAIJ,EAAQ,QAAQh2B,CAAK;AACvB,eAAOA;AAGT,UAAI;AACF,eAAOi2B,EAAWj2B,CAAK;AAAA,MAC3B,QAAc;AACV,eAAOo2B;AAAA,MACX;AAAA,IACA;AAAA;;;;;ACtKA,UAAM6E,IAAQjE,GAAA,GACRkE,IAASH,GAAA,GACTlC,IAAUsC,GAAA,GACVC,IAAOC,GAAA,GACPR,IAAeS,GAAA,GAGfC,IAAO,MACPC,IAAUP,EAAM,YAAYM,CAAG;AAErC,aAASE,EAA6B7yB,GAAM2tB,GAAQ0C,GAAsB;AACxE,eAASyC,IAAiB,GAAGA,KAAkB,IAAIA;AACjD,YAAInF,KAAUP,EAAQ,YAAY0F,GAAgBzC,GAAsBrwB,CAAI;AAC1E,iBAAO8yB;AAAA,IAKb;AAEA,aAASC,EAAsB/yB,GAAMitB,GAAS;AAE5C,aAAOuF,EAAK,sBAAsBxyB,GAAMitB,CAAO,IAAI;AAAA,IACrD;AAEA,aAAS+F,EAA2BC,GAAUhG,GAAS;AACrD,UAAIiG,IAAY;AAEhB,aAAAD,EAAS,QAAQ,SAAUxvC,GAAM;AAC/B,cAAM0vC,IAAeJ,EAAqBtvC,EAAK,MAAMwpC,CAAO;AAC5D,QAAAiG,KAAaC,IAAe1vC,EAAK,cAAa;AAAA,MAClD,CAAG,GAEMyvC;AAAA,IACT;AAEA,aAASE,EAA4BH,GAAU5C,GAAsB;AACnE,eAASyC,IAAiB,GAAGA,KAAkB,IAAIA;AAEjD,YADeE,EAA0BC,GAAUH,CAAc,KACnD1F,EAAQ,YAAY0F,GAAgBzC,GAAsBmC,EAAK,KAAK;AAChF,iBAAOM;AAAA,IAKb;AAUA1F,IAAAA,EAAA,OAAe,SAAeh2B,GAAOo2B,GAAc;AACjD,aAAIyE,EAAa,QAAQ76B,CAAK,IACrB,SAASA,GAAO,EAAE,IAGpBo2B;AAAA,IACT,GAWAJ,EAAA,cAAsB,SAAsBH,GAASoD,GAAsBrwB,GAAM;AAC/E,UAAI,CAACiyB,EAAa,QAAQhF,CAAO;AAC/B,cAAM,IAAI,MAAM,yBAAyB;AAI3C,MAAI,OAAOjtB,IAAS,QAAaA,IAAOwyB,EAAK;AAG7C,YAAMa,IAAiBhB,EAAM,wBAAwBpF,CAAO,GAGtDqG,IAAmBhB,EAAO,uBAAuBrF,GAASoD,CAAoB,GAG9EkD,KAA0BF,IAAiBC,KAAoB;AAErE,UAAItzB,MAASwyB,EAAK,MAAO,QAAOe;AAEhC,YAAMC,IAAaD,IAAyBR,EAAqB/yB,GAAMitB,CAAO;AAG9E,cAAQjtB,GAAI;AAAA,QACV,KAAKwyB,EAAK;AACR,iBAAO,KAAK,MAAOgB,IAAa,KAAM,CAAC;AAAA,QAEzC,KAAKhB,EAAK;AACR,iBAAO,KAAK,MAAOgB,IAAa,KAAM,CAAC;AAAA,QAEzC,KAAKhB,EAAK;AACR,iBAAO,KAAK,MAAMgB,IAAa,EAAE;AAAA,QAEnC,KAAKhB,EAAK;AAAA,QACV;AACE,iBAAO,KAAK,MAAMgB,IAAa,CAAC;AAAA,MACtC;AAAA,IACA,GAUApG,EAAA,wBAAgC,SAAgC3pC,GAAM4sC,GAAsB;AAC1F,UAAIoD;AAEJ,YAAMC,IAAMzD,EAAQ,KAAKI,GAAsBJ,EAAQ,CAAC;AAExD,UAAI,MAAM,QAAQxsC,CAAI,GAAG;AACvB,YAAIA,EAAK,SAAS;AAChB,iBAAO2vC,EAA2B3vC,GAAMiwC,CAAG;AAG7C,YAAIjwC,EAAK,WAAW;AAClB,iBAAO;AAGT,QAAAgwC,IAAMhwC,EAAK,CAAC;AAAA,MAChB;AACI,QAAAgwC,IAAMhwC;AAGR,aAAOovC,EAA4BY,EAAI,MAAMA,EAAI,UAAS,GAAIC,CAAG;AAAA,IACnE,GAYAtG,EAAA,iBAAyB,SAAyBH,GAAS;AACzD,UAAI,CAACgF,EAAa,QAAQhF,CAAO,KAAKA,IAAU;AAC9C,cAAM,IAAI,MAAM,yBAAyB;AAG3C,UAAInpC,IAAImpC,KAAW;AAEnB,aAAOoF,EAAM,YAAYvuC,CAAC,IAAI8uC,KAAW;AACvC,QAAA9uC,KAAM6uC,KAAQN,EAAM,YAAYvuC,CAAC,IAAI8uC;AAGvC,aAAQ3F,KAAW,KAAMnpC;AAAA,IAC3B;AAAA;;;;;;AClKA,QAAMuuC,IAAQjE,GAAA,GAERuF,IAAO,MACPC,IAAY,OACZC,IAAUxB,EAAM,YAAYsB,CAAG;AAYrC,SAAAG,GAAA,iBAAyB,SAAyBzD,GAAsBzrC,GAAM;AAC5E,UAAMnB,IAAS4sC,EAAqB,OAAO,IAAKzrC;AAChD,QAAI,IAAInB,KAAQ;AAEhB,WAAO4uC,EAAM,YAAY,CAAC,IAAIwB,KAAW;AACvC,WAAMF,KAAQtB,EAAM,YAAY,CAAC,IAAIwB;AAMvC,YAASpwC,KAAQ,KAAM,KAAKmwC;AAAA,EAC9B;;;;;;AC5BA,QAAMpB,IAAOpE,GAAA;AAEb,WAAS2F,EAAatwC,GAAM;AAC1B,SAAK,OAAO+uC,EAAK,SACjB,KAAK,OAAO/uC,EAAK,SAAQ;AAAA,EAC3B;AAEA,SAAAswC,EAAY,gBAAgB,SAAwBpG,GAAQ;AAC1D,WAAO,KAAK,KAAK,MAAMA,IAAS,CAAC,KAAMA,IAAS,IAAOA,IAAS,IAAK,IAAI,IAAK;AAAA,EAChF,GAEAoG,EAAY,UAAU,YAAY,WAAsB;AACtD,WAAO,KAAK,KAAK;AAAA,EACnB,GAEAA,EAAY,UAAU,gBAAgB,WAA0B;AAC9D,WAAOA,EAAY,cAAc,KAAK,KAAK,MAAM;AAAA,EACnD,GAEAA,EAAY,UAAU,QAAQ,SAAgBlG,GAAW;AACvD,QAAI9qC,GAAGgb,GAAO3G;AAId,SAAKrU,IAAI,GAAGA,IAAI,KAAK,KAAK,KAAK,QAAQA,KAAK;AAC1C,MAAAgb,IAAQ,KAAK,KAAK,OAAOhb,GAAG,CAAC,GAC7BqU,IAAQ,SAAS2G,GAAO,EAAE,GAE1B8vB,EAAU,IAAIz2B,GAAO,EAAE;AAKzB,UAAM48B,IAAe,KAAK,KAAK,SAASjxC;AACxC,IAAIixC,IAAe,MACjBj2B,IAAQ,KAAK,KAAK,OAAOhb,CAAC,GAC1BqU,IAAQ,SAAS2G,GAAO,EAAE,GAE1B8vB,EAAU,IAAIz2B,GAAO48B,IAAe,IAAI,CAAC;AAAA,EAE7C,GAEAC,KAAiBF;;;;;;AC1CjB,QAAMvB,IAAOpE,GAAA,GAWP8F,IAAkB;AAAA,IACtB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAC7C;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAC5D;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAC5D;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,EAC1C;AAEA,WAASC,EAAkB1wC,GAAM;AAC/B,SAAK,OAAO+uC,EAAK,cACjB,KAAK,OAAO/uC;AAAA,EACd;AAEA,SAAA0wC,EAAiB,gBAAgB,SAAwBxG,GAAQ;AAC/D,WAAO,KAAK,KAAK,MAAMA,IAAS,CAAC,IAAI,KAAKA,IAAS;AAAA,EACrD,GAEAwG,EAAiB,UAAU,YAAY,WAAsB;AAC3D,WAAO,KAAK,KAAK;AAAA,EACnB,GAEAA,EAAiB,UAAU,gBAAgB,WAA0B;AACnE,WAAOA,EAAiB,cAAc,KAAK,KAAK,MAAM;AAAA,EACxD,GAEAA,EAAiB,UAAU,QAAQ,SAAgBtG,GAAW;AAC5D,QAAI9qC;AAIJ,SAAKA,IAAI,GAAGA,IAAI,KAAK,KAAK,KAAK,QAAQA,KAAK,GAAG;AAE7C,UAAIqU,IAAQ88B,EAAgB,QAAQ,KAAK,KAAKnxC,CAAC,CAAC,IAAI;AAGpD,MAAAqU,KAAS88B,EAAgB,QAAQ,KAAK,KAAKnxC,IAAI,CAAC,CAAC,GAGjD8qC,EAAU,IAAIz2B,GAAO,EAAE;AAAA,IAC3B;AAIE,IAAI,KAAK,KAAK,SAAS,KACrBy2B,EAAU,IAAIqG,EAAgB,QAAQ,KAAK,KAAKnxC,CAAC,CAAC,GAAG,CAAC;AAAA,EAE1D,GAEAqxC,KAAiBD;;;;;;AC1DjB,QAAM3B,IAAOpE,GAAA;AAEb,WAASiG,EAAU5wC,GAAM;AACvB,SAAK,OAAO+uC,EAAK,MACb,OAAQ/uC,KAAU,WACpB,KAAK,OAAO,IAAI,YAAW,EAAG,OAAOA,CAAI,IAEzC,KAAK,OAAO,IAAI,WAAWA,CAAI;AAAA,EAEnC;AAEA,SAAA4wC,EAAS,gBAAgB,SAAwB1G,GAAQ;AACvD,WAAOA,IAAS;AAAA,EAClB,GAEA0G,EAAS,UAAU,YAAY,WAAsB;AACnD,WAAO,KAAK,KAAK;AAAA,EACnB,GAEAA,EAAS,UAAU,gBAAgB,WAA0B;AAC3D,WAAOA,EAAS,cAAc,KAAK,KAAK,MAAM;AAAA,EAChD,GAEAA,EAAS,UAAU,QAAQ,SAAUxG,GAAW;AAC9C,aAAS9qC,IAAI,GAAGD,IAAI,KAAK,KAAK,QAAQC,IAAID,GAAGC;AAC3C,MAAA8qC,EAAU,IAAI,KAAK,KAAK9qC,CAAC,GAAG,CAAC;AAAA,EAEjC,GAEAuxC,KAAiBD;;;;;;AC7BjB,QAAM7B,IAAOpE,GAAA,GACPiE,IAAQF,GAAA;AAEd,WAASoC,EAAW9wC,GAAM;AACxB,SAAK,OAAO+uC,EAAK,OACjB,KAAK,OAAO/uC;AAAA,EACd;AAEA,SAAA8wC,EAAU,gBAAgB,SAAwB5G,GAAQ;AACxD,WAAOA,IAAS;AAAA,EAClB,GAEA4G,EAAU,UAAU,YAAY,WAAsB;AACpD,WAAO,KAAK,KAAK;AAAA,EACnB,GAEAA,EAAU,UAAU,gBAAgB,WAA0B;AAC5D,WAAOA,EAAU,cAAc,KAAK,KAAK,MAAM;AAAA,EACjD,GAEAA,EAAU,UAAU,QAAQ,SAAU1G,GAAW;AAC/C,QAAI9qC;AAKJ,SAAKA,IAAI,GAAGA,IAAI,KAAK,KAAK,QAAQA,KAAK;AACrC,UAAIqU,IAAQi7B,EAAM,OAAO,KAAK,KAAKtvC,CAAC,CAAC;AAGrC,UAAIqU,KAAS,SAAUA,KAAS;AAE9B,QAAAA,KAAS;AAAA,eAGAA,KAAS,SAAUA,KAAS;AAErC,QAAAA,KAAS;AAAA;AAET,cAAM,IAAI;AAAA,UACR,6BAA6B,KAAK,KAAKrU,CAAC,IAAI;AAAA;AAAA,QACX;AAKrC,MAAAqU,KAAWA,MAAU,IAAK,OAAQ,OAASA,IAAQ,MAGnDy2B,EAAU,IAAIz2B,GAAO,EAAE;AAAA,IAC3B;AAAA,EACA,GAEAo9B,KAAiBD;;;;;AC9BjB,QAAIE,IAAW;AAAA,MACb,8BAA8B,SAASC,GAAOt4B,GAAGtY,GAAG;AAGlD,YAAI6wC,IAAe,CAAA,GAIfC,IAAQ,CAAA;AACZ,QAAAA,EAAMx4B,CAAC,IAAI;AAMX,YAAInS,IAAOwqC,EAAS,cAAc,KAAI;AACtC,QAAAxqC,EAAK,KAAKmS,GAAG,CAAC;AAUd,iBARIy4B,GACA,GAAG7rB,GACH8rB,GACAC,GACAC,GACAC,GACAC,GACAC,GACG,CAAClrC,EAAK,WAAS;AAGpB,UAAA4qC,IAAU5qC,EAAK,IAAG,GAClB,IAAI4qC,EAAQ,OACZC,IAAiBD,EAAQ,MAGzBE,IAAiBL,EAAM,CAAC,KAAK,CAAA;AAK7B,eAAK1rB,KAAK+rB;AACR,YAAIA,EAAe,eAAe/rB,CAAC,MAEjCgsB,IAAYD,EAAe/rB,CAAC,GAK5BisB,IAAgCH,IAAiBE,GAMjDE,IAAiBN,EAAM5rB,CAAC,GACxBmsB,IAAe,OAAOP,EAAM5rB,CAAC,IAAM,MAC/BmsB,KAAeD,IAAiBD,OAClCL,EAAM5rB,CAAC,IAAIisB,GACXhrC,EAAK,KAAK+e,GAAGisB,CAA6B,GAC1CN,EAAa3rB,CAAC,IAAI;AAAA,QAI9B;AAEI,YAAI,OAAOllB,IAAM,OAAe,OAAO8wC,EAAM9wC,CAAC,IAAM,KAAa;AAC/D,cAAIygB,IAAM,CAAC,+BAA+BnI,GAAG,QAAQtY,GAAG,GAAG,EAAE,KAAK,EAAE;AACpE,gBAAM,IAAI,MAAMygB,CAAG;AAAA,QACzB;AAEI,eAAOowB;AAAA,MACX;AAAA,MAEE,6CAA6C,SAASA,GAAc7wC,GAAG;AAIrE,iBAHIsxC,IAAQ,CAAA,GACRC,IAAIvxC,GAEDuxC;AACL,UAAAD,EAAM,KAAKC,CAAC,GACEV,EAAaU,CAAC,GAC5BA,IAAIV,EAAaU,CAAC;AAEpB,eAAAD,EAAM,QAAO,GACNA;AAAA,MACX;AAAA,MAEE,WAAW,SAASV,GAAOt4B,GAAGtY,GAAG;AAC/B,YAAI6wC,IAAeF,EAAS,6BAA6BC,GAAOt4B,GAAGtY,CAAC;AACpE,eAAO2wC,EAAS;AAAA,UACdE;AAAA,UAAc7wC;AAAA,QAAC;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKE,eAAe;AAAA,QACb,MAAM,SAAUwxC,GAAM;AACpB,cAAIC,IAAId,EAAS,eACbld,IAAI,CAAA,GACJ7U;AACJ,UAAA4yB,IAAOA,KAAQ,CAAA;AACf,eAAK5yB,KAAO6yB;AACV,YAAIA,EAAE,eAAe7yB,CAAG,MACtB6U,EAAE7U,CAAG,IAAI6yB,EAAE7yB,CAAG;AAGlB,iBAAA6U,EAAE,QAAQ,CAAA,GACVA,EAAE,SAAS+d,EAAK,UAAUC,EAAE,gBACrBhe;AAAA,QACb;AAAA,QAEI,gBAAgB,SAAUr2B,GAAGkB,GAAG;AAC9B,iBAAOlB,EAAE,OAAOkB,EAAE;AAAA,QACxB;AAAA;AAAA;AAAA;AAAA;AAAA,QAMI,MAAM,SAAUgV,GAAOo+B,GAAM;AAC3B,cAAIl0C,IAAO,EAAC,OAAO8V,GAAO,MAAMo+B,EAAI;AACpC,eAAK,MAAM,KAAKl0C,CAAI,GACpB,KAAK,MAAM,KAAK,KAAK,MAAM;AAAA,QACjC;AAAA;AAAA;AAAA;AAAA,QAKI,KAAK,WAAY;AACf,iBAAO,KAAK,MAAM,MAAK;AAAA,QAC7B;AAAA,QAEI,OAAO,WAAY;AACjB,iBAAO,KAAK,MAAM,WAAW;AAAA,QACnC;AAAA,MACA;AAAA;AAME,IAAA6tC,YAAiBsF;AAAA;;;;;ACnKnB,UAAMjC,IAAOpE,GAAA,GACP2F,IAAc5B,GAAA,GACdgC,IAAmB5B,GAAA,GACnB8B,IAAW5B,GAAA,GACX8B,IAAY7B,GAAA,GACZR,IAAQuD,GAAA,GACRpD,IAAQqD,GAAA,GACRjB,IAAWkB,GAAA;AAQjB,aAASC,EAAqB9vC,GAAK;AACjC,aAAO,SAAS,mBAAmBA,CAAG,CAAC,EAAE;AAAA,IAC3C;AAUA,aAAS+vC,EAAahE,GAAO7xB,GAAMla,GAAK;AACtC,YAAMmtC,IAAW,CAAA;AACjB,UAAIhiC;AAEJ,cAAQA,IAAS4gC,EAAM,KAAK/rC,CAAG,OAAO;AACpC,QAAAmtC,EAAS,KAAK;AAAA,UACZ,MAAMhiC,EAAO,CAAC;AAAA,UACd,OAAOA,EAAO;AAAA,UACd,MAAM+O;AAAA,UACN,QAAQ/O,EAAO,CAAC,EAAE;AAAA,SACnB;AAGH,aAAOgiC;AAAA,IACT;AASA,aAAS6C,EAAuB1D,GAAS;AACvC,YAAM2D,IAAUF,EAAY3D,EAAM,SAASM,EAAK,SAASJ,CAAO,GAC1D4D,IAAeH,EAAY3D,EAAM,cAAcM,EAAK,cAAcJ,CAAO;AAC/E,UAAI6D,GACAC;AAEJ,aAAI7D,EAAM,wBACR4D,IAAWJ,EAAY3D,EAAM,MAAMM,EAAK,MAAMJ,CAAO,GACrD8D,IAAYL,EAAY3D,EAAM,OAAOM,EAAK,OAAOJ,CAAO,MAExD6D,IAAWJ,EAAY3D,EAAM,YAAYM,EAAK,MAAMJ,CAAO,GAC3D8D,IAAY,CAAA,IAGDH,EAAQ,OAAOC,GAAcC,GAAUC,CAAS,EAG1D,KAAK,SAAUC,GAAIC,GAAI;AACtB,eAAOD,EAAG,QAAQC,EAAG;AAAA,MAC3B,CAAK,EACA,IAAI,SAAUC,GAAK;AAClB,eAAO;AAAA,UACL,MAAMA,EAAI;AAAA,UACV,MAAMA,EAAI;AAAA,UACV,QAAQA,EAAI;AAAA,QACpB;AAAA,MACA,CAAK;AAAA,IACL;AAUA,aAASC,EAAsB3I,GAAQ3tB,GAAM;AAC3C,cAAQA,GAAI;AAAA,QACV,KAAKwyB,EAAK;AACR,iBAAOuB,EAAY,cAAcpG,CAAM;AAAA,QACzC,KAAK6E,EAAK;AACR,iBAAO2B,EAAiB,cAAcxG,CAAM;AAAA,QAC9C,KAAK6E,EAAK;AACR,iBAAO+B,EAAU,cAAc5G,CAAM;AAAA,QACvC,KAAK6E,EAAK;AACR,iBAAO6B,EAAS,cAAc1G,CAAM;AAAA,MAC1C;AAAA,IACA;AAQA,aAAS4I,EAAeC,GAAM;AAC5B,aAAOA,EAAK,OAAO,SAAUjN,GAAKkN,GAAM;AACtC,cAAMC,IAAUnN,EAAI,SAAS,KAAK,IAAIA,EAAIA,EAAI,SAAS,CAAC,IAAI;AAC5D,eAAImN,KAAWA,EAAQ,SAASD,EAAK,QACnClN,EAAIA,EAAI,SAAS,CAAC,EAAE,QAAQkN,EAAK,MAC1BlN,MAGTA,EAAI,KAAKkN,CAAI,GACNlN;AAAA,MACX,GAAK,CAAA,CAAE;AAAA,IACP;AAkBA,aAASoN,EAAYH,GAAM;AACzB,YAAMpB,IAAQ,CAAA;AACd,eAASryC,IAAI,GAAGA,IAAIyzC,EAAK,QAAQzzC,KAAK;AACpC,cAAM0wC,IAAM+C,EAAKzzC,CAAC;AAElB,gBAAQ0wC,EAAI,MAAI;AAAA,UACd,KAAKjB,EAAK;AACR,YAAA4C,EAAM,KAAK;AAAA,cAAC3B;AAAA,cACV,EAAE,MAAMA,EAAI,MAAM,MAAMjB,EAAK,cAAc,QAAQiB,EAAI,OAAM;AAAA,cAC7D,EAAE,MAAMA,EAAI,MAAM,MAAMjB,EAAK,MAAM,QAAQiB,EAAI,OAAM;AAAA,aACtD;AACD;AAAA,UACF,KAAKjB,EAAK;AACR,YAAA4C,EAAM,KAAK;AAAA,cAAC3B;AAAA,cACV,EAAE,MAAMA,EAAI,MAAM,MAAMjB,EAAK,MAAM,QAAQiB,EAAI,OAAM;AAAA,aACtD;AACD;AAAA,UACF,KAAKjB,EAAK;AACR,YAAA4C,EAAM,KAAK;AAAA,cAAC3B;AAAA,cACV,EAAE,MAAMA,EAAI,MAAM,MAAMjB,EAAK,MAAM,QAAQoD,EAAoBnC,EAAI,IAAI,EAAC;AAAA,aACzE;AACD;AAAA,UACF,KAAKjB,EAAK;AACR,YAAA4C,EAAM,KAAK;AAAA,cACT,EAAE,MAAM3B,EAAI,MAAM,MAAMjB,EAAK,MAAM,QAAQoD,EAAoBnC,EAAI,IAAI,EAAC;AAAA,aACzE;AAAA,QACT;AAAA,MACA;AAEE,aAAO2B;AAAA,IACT;AAcA,aAASwB,EAAYxB,GAAOnI,GAAS;AACnC,YAAM4J,IAAQ,CAAA,GACRnC,IAAQ,EAAE,OAAO,CAAA,EAAE;AACzB,UAAIoC,IAAc,CAAC,OAAO;AAE1B,eAAS/zC,IAAI,GAAGA,IAAIqyC,EAAM,QAAQryC,KAAK;AACrC,cAAMg0C,IAAY3B,EAAMryC,CAAC,GACnBi0C,IAAiB,CAAA;AAEvB,iBAAStI,IAAI,GAAGA,IAAIqI,EAAU,QAAQrI,KAAK;AACzC,gBAAMuI,IAAOF,EAAUrI,CAAC,GAClBhsB,IAAM,KAAK3f,IAAI2rC;AAErB,UAAAsI,EAAe,KAAKt0B,CAAG,GACvBm0B,EAAMn0B,CAAG,IAAI,EAAE,MAAMu0B,GAAM,WAAW,EAAC,GACvCvC,EAAMhyB,CAAG,IAAI,CAAA;AAEb,mBAAS9gB,IAAI,GAAGA,IAAIk1C,EAAY,QAAQl1C,KAAK;AAC3C,kBAAMs1C,IAAaJ,EAAYl1C,CAAC;AAEhC,YAAIi1C,EAAMK,CAAU,KAAKL,EAAMK,CAAU,EAAE,KAAK,SAASD,EAAK,QAC5DvC,EAAMwC,CAAU,EAAEx0B,CAAG,IACnB4zB,EAAqBO,EAAMK,CAAU,EAAE,YAAYD,EAAK,QAAQA,EAAK,IAAI,IACzEX,EAAqBO,EAAMK,CAAU,EAAE,WAAWD,EAAK,IAAI,GAE7DJ,EAAMK,CAAU,EAAE,aAAaD,EAAK,WAEhCJ,EAAMK,CAAU,MAAGL,EAAMK,CAAU,EAAE,YAAYD,EAAK,SAE1DvC,EAAMwC,CAAU,EAAEx0B,CAAG,IAAI4zB,EAAqBW,EAAK,QAAQA,EAAK,IAAI,IAClE,IAAIzE,EAAK,sBAAsByE,EAAK,MAAMhK,CAAO;AAAA,UAE7D;AAAA,QACA;AAEI,QAAA6J,IAAcE;AAAA,MAClB;AAEE,eAASp1C,IAAI,GAAGA,IAAIk1C,EAAY,QAAQl1C;AACtC,QAAA8yC,EAAMoC,EAAYl1C,CAAC,CAAC,EAAE,MAAM;AAG9B,aAAO,EAAE,KAAK8yC,GAAO,OAAOmC,EAAK;AAAA,IACnC;AAUA,aAASM,EAAoB1zC,GAAM2zC,GAAW;AAC5C,UAAIp3B;AACJ,YAAMq3B,IAAW7E,EAAK,mBAAmB/uC,CAAI;AAK7C,UAHAuc,IAAOwyB,EAAK,KAAK4E,GAAWC,CAAQ,GAGhCr3B,MAASwyB,EAAK,QAAQxyB,EAAK,MAAMq3B,EAAS;AAC5C,cAAM,IAAI,MAAM,MAAM5zC,IAAO,mCACO+uC,EAAK,SAASxyB,CAAI,IACpD;AAAA,wBAA4BwyB,EAAK,SAAS6E,CAAQ,CAAC;AAQvD,cAJIr3B,MAASwyB,EAAK,SAAS,CAACH,EAAM,mBAAkB,MAClDryB,IAAOwyB,EAAK,OAGNxyB,GAAI;AAAA,QACV,KAAKwyB,EAAK;AACR,iBAAO,IAAIuB,EAAYtwC,CAAI;AAAA,QAE7B,KAAK+uC,EAAK;AACR,iBAAO,IAAI2B,EAAiB1wC,CAAI;AAAA,QAElC,KAAK+uC,EAAK;AACR,iBAAO,IAAI+B,EAAU9wC,CAAI;AAAA,QAE3B,KAAK+uC,EAAK;AACR,iBAAO,IAAI6B,EAAS5wC,CAAI;AAAA,MAC9B;AAAA,IACA;AAiBA2pC,IAAAA,EAAA,YAAoB,SAAoBkK,GAAO;AAC7C,aAAOA,EAAM,OAAO,SAAU/N,GAAKkK,GAAK;AACtC,eAAI,OAAOA,KAAQ,WACjBlK,EAAI,KAAK4N,EAAmB1D,GAAK,IAAI,CAAC,IAC7BA,EAAI,QACblK,EAAI,KAAK4N,EAAmB1D,EAAI,MAAMA,EAAI,IAAI,CAAC,GAG1ClK;AAAA,MACX,GAAK,CAAA,CAAE;AAAA,IACP,GAUA6D,EAAA,aAAqB,SAAqB3pC,GAAMwpC,GAAS;AACvD,YAAMuJ,IAAOV,EAAsBryC,GAAM4uC,EAAM,mBAAkB,CAAE,GAE7D+C,IAAQuB,EAAWH,CAAI,GACvB9B,IAAQkC,EAAWxB,GAAOnI,CAAO,GACjCsK,IAAO9C,EAAS,UAAUC,EAAM,KAAK,SAAS,KAAK,GAEnD8C,IAAgB,CAAA;AACtB,eAASz0C,IAAI,GAAGA,IAAIw0C,EAAK,SAAS,GAAGx0C;AACnC,QAAAy0C,EAAc,KAAK9C,EAAM,MAAM6C,EAAKx0C,CAAC,CAAC,EAAE,IAAI;AAG9C,aAAOqqC,EAAQ,UAAUmJ,EAAciB,CAAa,CAAC;AAAA,IACvD,GAYApK,EAAA,WAAmB,SAAmB3pC,GAAM;AAC1C,aAAO2pC,EAAQ;AAAA,QACb0I,EAAsBryC,GAAM4uC,EAAM,mBAAkB,CAAE;AAAA,MAC1D;AAAA,IACA;AAAA;;;;;;ACzUA,QAAMA,IAAQjE,GAAA,GACR6B,IAAUkC,GAAA,GACV1E,IAAY8E,GAAA,GACZzE,IAAY2E,GAAA,GACZgF,IAAmB/E,GAAA,GACnBgF,IAAgBjC,GAAA,GAChBkC,IAAcjC,GAAA,GACdpD,IAASqD,GAAA,GACTxE,IAAqByG,GAAA,GACrBC,IAAUC,GAAA,GACVC,IAAaC,GAAA,GACbxF,IAAOyF,GAAA,GACPC,IAAWC,GAAA;AAkCjB,WAASC,EAAoBC,GAAQpL,GAAS;AAC5C,UAAM3kC,IAAO+vC,EAAO,MACdz0C,IAAM8zC,EAAc,aAAazK,CAAO;AAE9C,aAASlqC,IAAI,GAAGA,IAAIa,EAAI,QAAQb,KAAK;AACnC,YAAMgrC,IAAMnqC,EAAIb,CAAC,EAAE,CAAC,GACdirC,IAAMpqC,EAAIb,CAAC,EAAE,CAAC;AAEpB,eAAS2X,IAAI,IAAIA,KAAK,GAAGA;AACvB,YAAI,EAAAqzB,IAAMrzB,KAAK,MAAMpS,KAAQylC,IAAMrzB;AAEnC,mBAASrY,IAAI,IAAIA,KAAK,GAAGA;AACvB,YAAI2rC,IAAM3rC,KAAK,MAAMiG,KAAQ0lC,IAAM3rC,MAE9BqY,KAAK,KAAKA,KAAK,MAAMrY,MAAM,KAAKA,MAAM,MACxCA,KAAK,KAAKA,KAAK,MAAMqY,MAAM,KAAKA,MAAM,MACtCA,KAAK,KAAKA,KAAK,KAAKrY,KAAK,KAAKA,KAAK,IACpCg2C,EAAO,IAAItK,IAAMrzB,GAAGszB,IAAM3rC,GAAG,IAAM,EAAI,IAEvCg2C,EAAO,IAAItK,IAAMrzB,GAAGszB,IAAM3rC,GAAG,IAAO,EAAI;AAAA,IAIlD;AAAA,EACA;AASA,WAASi2C,EAAoBD,GAAQ;AACnC,UAAM/vC,IAAO+vC,EAAO;AAEpB,aAAS39B,IAAI,GAAGA,IAAIpS,IAAO,GAAGoS,KAAK;AACjC,YAAMtD,IAAQsD,IAAI,MAAM;AACxB,MAAA29B,EAAO,IAAI39B,GAAG,GAAGtD,GAAO,EAAI,GAC5BihC,EAAO,IAAI,GAAG39B,GAAGtD,GAAO,EAAI;AAAA,IAChC;AAAA,EACA;AAUA,WAASmhC,EAAuBF,GAAQpL,GAAS;AAC/C,UAAMrpC,IAAM6zC,EAAiB,aAAaxK,CAAO;AAEjD,aAASlqC,IAAI,GAAGA,IAAIa,EAAI,QAAQb,KAAK;AACnC,YAAMgrC,IAAMnqC,EAAIb,CAAC,EAAE,CAAC,GACdirC,IAAMpqC,EAAIb,CAAC,EAAE,CAAC;AAEpB,eAAS2X,IAAI,IAAIA,KAAK,GAAGA;AACvB,iBAASrY,IAAI,IAAIA,KAAK,GAAGA;AACvB,UAAIqY,MAAM,MAAMA,MAAM,KAAKrY,MAAM,MAAMA,MAAM,KAC1CqY,MAAM,KAAKrY,MAAM,IAClBg2C,EAAO,IAAItK,IAAMrzB,GAAGszB,IAAM3rC,GAAG,IAAM,EAAI,IAEvCg2C,EAAO,IAAItK,IAAMrzB,GAAGszB,IAAM3rC,GAAG,IAAO,EAAI;AAAA,IAIlD;AAAA,EACA;AAQA,WAASm2C,EAAkBH,GAAQpL,GAAS;AAC1C,UAAM3kC,IAAO+vC,EAAO,MACd90C,IAAOs0C,EAAQ,eAAe5K,CAAO;AAC3C,QAAIc,GAAKC,GAAKyK;AAEd,aAAS11C,IAAI,GAAGA,IAAI,IAAIA;AACtB,MAAAgrC,IAAM,KAAK,MAAMhrC,IAAI,CAAC,GACtBirC,IAAMjrC,IAAI,IAAIuF,IAAO,IAAI,GACzBmwC,KAAQl1C,KAAQR,IAAK,OAAO,GAE5Bs1C,EAAO,IAAItK,GAAKC,GAAKyK,GAAK,EAAI,GAC9BJ,EAAO,IAAIrK,GAAKD,GAAK0K,GAAK,EAAI;AAAA,EAElC;AASA,WAASC,EAAiBL,GAAQhI,GAAsBX,GAAa;AACnE,UAAMpnC,IAAO+vC,EAAO,MACd90C,IAAOw0C,EAAW,eAAe1H,GAAsBX,CAAW;AACxE,QAAI3sC,GAAG01C;AAEP,SAAK11C,IAAI,GAAGA,IAAI,IAAIA;AAClB,MAAA01C,KAAQl1C,KAAQR,IAAK,OAAO,GAGxBA,IAAI,IACNs1C,EAAO,IAAIt1C,GAAG,GAAG01C,GAAK,EAAI,IACjB11C,IAAI,IACbs1C,EAAO,IAAIt1C,IAAI,GAAG,GAAG01C,GAAK,EAAI,IAE9BJ,EAAO,IAAI/vC,IAAO,KAAKvF,GAAG,GAAG01C,GAAK,EAAI,GAIpC11C,IAAI,IACNs1C,EAAO,IAAI,GAAG/vC,IAAOvF,IAAI,GAAG01C,GAAK,EAAI,IAC5B11C,IAAI,IACbs1C,EAAO,IAAI,GAAG,KAAKt1C,IAAI,IAAI,GAAG01C,GAAK,EAAI,IAEvCJ,EAAO,IAAI,GAAG,KAAKt1C,IAAI,GAAG01C,GAAK,EAAI;AAKvC,IAAAJ,EAAO,IAAI/vC,IAAO,GAAG,GAAG,GAAG,EAAI;AAAA,EACjC;AAQA,WAASqwC,EAAWN,GAAQ50C,GAAM;AAChC,UAAM6E,IAAO+vC,EAAO;AACpB,QAAIO,IAAM,IACN7K,IAAMzlC,IAAO,GACbuwC,IAAW,GACXC,IAAY;AAEhB,aAAS9K,IAAM1lC,IAAO,GAAG0lC,IAAM,GAAGA,KAAO;AAGvC,WAFIA,MAAQ,KAAGA,SAEF;AACX,iBAAS3rC,IAAI,GAAGA,IAAI,GAAGA;AACrB,cAAI,CAACg2C,EAAO,WAAWtK,GAAKC,IAAM3rC,CAAC,GAAG;AACpC,gBAAI02C,IAAO;AAEX,YAAID,IAAYr1C,EAAK,WACnBs1C,KAAUt1C,EAAKq1C,CAAS,MAAMD,IAAY,OAAO,IAGnDR,EAAO,IAAItK,GAAKC,IAAM3rC,GAAG02C,CAAI,GAC7BF,KAEIA,MAAa,OACfC,KACAD,IAAW;AAAA,UAEvB;AAKM,YAFA9K,KAAO6K,GAEH7K,IAAM,KAAKzlC,KAAQylC,GAAK;AAC1B,UAAAA,KAAO6K,GACPA,IAAM,CAACA;AACP;AAAA,QACR;AAAA,MACA;AAAA,EAEA;AAUA,WAASI,EAAY/L,GAASoD,GAAsB4C,GAAU;AAE5D,UAAM/jC,IAAS,IAAIu+B,EAAS;AAE5B,IAAAwF,EAAS,QAAQ,SAAUxvC,GAAM;AAE/B,MAAAyL,EAAO,IAAIzL,EAAK,KAAK,KAAK,CAAC,GAS3ByL,EAAO,IAAIzL,EAAK,UAAS,GAAI+uC,EAAK,sBAAsB/uC,EAAK,MAAMwpC,CAAO,CAAC,GAG3ExpC,EAAK,MAAMyL,CAAM;AAAA,IACrB,CAAG;AAGD,UAAMmkC,IAAiBhB,EAAM,wBAAwBpF,CAAO,GACtDqG,IAAmBhB,EAAO,uBAAuBrF,GAASoD,CAAoB,GAC9EkD,KAA0BF,IAAiBC,KAAoB;AAgBrE,SATIpkC,EAAO,oBAAoB,KAAKqkC,KAClCrkC,EAAO,IAAI,GAAG,CAAC,GAQVA,EAAO,oBAAoB,MAAM;AACtC,MAAAA,EAAO,OAAO,CAAC;AAOjB,UAAM+pC,KAAiB1F,IAAyBrkC,EAAO,gBAAe,KAAM;AAC5E,aAASnM,IAAI,GAAGA,IAAIk2C,GAAel2C;AACjC,MAAAmM,EAAO,IAAInM,IAAI,IAAI,KAAO,KAAM,CAAC;AAGnC,WAAOm2C,EAAgBhqC,GAAQ+9B,GAASoD,CAAoB;AAAA,EAC9D;AAWA,WAAS6I,EAAiBrL,GAAWZ,GAASoD,GAAsB;AAElE,UAAMgD,IAAiBhB,EAAM,wBAAwBpF,CAAO,GAGtDqG,IAAmBhB,EAAO,uBAAuBrF,GAASoD,CAAoB,GAG9E8I,IAAqB9F,IAAiBC,GAGtC8F,IAAgB9G,EAAO,eAAerF,GAASoD,CAAoB,GAGnEgJ,IAAiBhG,IAAiB+F,GAClCE,IAAiBF,IAAgBC,GAEjCE,IAAyB,KAAK,MAAMlG,IAAiB+F,CAAa,GAElEI,IAAwB,KAAK,MAAML,IAAqBC,CAAa,GACrEK,KAAwBD,IAAwB,GAGhDE,KAAUH,IAAyBC,GAGnCG,IAAK,IAAIxI,EAAmBuI,EAAO;AAEzC,QAAIzlB,IAAS;AACb,UAAM2lB,IAAS,IAAI,MAAMR,CAAa,GAChCS,IAAS,IAAI,MAAMT,CAAa;AACtC,QAAIU,KAAc;AAClB,UAAM5qC,KAAS,IAAI,WAAW2+B,EAAU,MAAM;AAG9C,aAASzrC,IAAI,GAAGA,IAAIg3C,GAAeh3C,KAAK;AACtC,YAAM23C,KAAW33C,IAAIk3C,IAAiBE,IAAwBC;AAG9D,MAAAG,EAAOx3C,CAAC,IAAI8M,GAAO,MAAM+kB,GAAQA,IAAS8lB,EAAQ,GAGlDF,EAAOz3C,CAAC,IAAIu3C,EAAG,OAAOC,EAAOx3C,CAAC,CAAC,GAE/B6xB,KAAU8lB,IACVD,KAAc,KAAK,IAAIA,IAAaC,EAAQ;AAAA,IAChD;AAIE,UAAMt2C,KAAO,IAAI,WAAW4vC,CAAc;AAC1C,QAAI3oC,IAAQ,GACR3H,GAAG2X;AAGP,SAAK3X,IAAI,GAAGA,IAAI+2C,IAAa/2C;AAC3B,WAAK2X,IAAI,GAAGA,IAAI0+B,GAAe1+B;AAC7B,QAAI3X,IAAI62C,EAAOl/B,CAAC,EAAE,WAChBjX,GAAKiH,GAAO,IAAIkvC,EAAOl/B,CAAC,EAAE3X,CAAC;AAMjC,SAAKA,IAAI,GAAGA,IAAI22C,IAAS32C;AACvB,WAAK2X,IAAI,GAAGA,IAAI0+B,GAAe1+B;AAC7B,QAAAjX,GAAKiH,GAAO,IAAImvC,EAAOn/B,CAAC,EAAE3X,CAAC;AAI/B,WAAOU;AAAA,EACT;AAWA,WAASu2C,EAAcv2C,GAAMwpC,GAASoD,GAAsBX,GAAa;AACvE,QAAIuD;AAEJ,QAAI,MAAM,QAAQxvC,CAAI;AACpB,MAAAwvC,IAAWiF,EAAS,UAAUz0C,CAAI;AAAA,aACzB,OAAOA,KAAS,UAAU;AACnC,UAAIw2C,IAAmBhN;AAEvB,UAAI,CAACgN,GAAkB;AACrB,cAAMC,IAAchC,EAAS,SAASz0C,CAAI;AAG1C,QAAAw2C,IAAmBpC,EAAQ,sBAAsBqC,GAAa7J,CAAoB;AAAA,MACxF;AAII,MAAA4C,IAAWiF,EAAS,WAAWz0C,GAAMw2C,KAAoB,EAAE;AAAA,IAC/D;AACI,YAAM,IAAI,MAAM,cAAc;AAIhC,UAAME,IAActC,EAAQ,sBAAsB5E,GAAU5C,CAAoB;AAGhF,QAAI,CAAC8J;AACH,YAAM,IAAI,MAAM,yDAAyD;AAI3E,QAAI,CAAClN;AACH,MAAAA,IAAUkN;AAAA,aAGDlN,IAAUkN;AACnB,YAAM,IAAI;AAAA,QAAM;AAAA;AAAA,uDAE0CA,IAAc;AAAA;AAAA,MAC5E;AAGE,UAAMC,IAAWpB,EAAW/L,GAASoD,GAAsB4C,CAAQ,GAG7DoH,IAAchI,EAAM,cAAcpF,CAAO,GACzCqN,IAAU,IAAIxM,EAAUuM,CAAW;AAGzC,WAAAjC,EAAmBkC,GAASrN,CAAO,GACnCqL,EAAmBgC,CAAO,GAC1B/B,EAAsB+B,GAASrN,CAAO,GAMtCyL,EAAgB4B,GAASjK,GAAsB,CAAC,GAE5CpD,KAAW,KACbuL,EAAiB8B,GAASrN,CAAO,GAInC0L,EAAU2B,GAASF,CAAQ,GAEvB,MAAM1K,CAAW,MAEnBA,IAAciI,EAAY;AAAA,MAAY2C;AAAA,MACpC5B,EAAgB,KAAK,MAAM4B,GAASjK,CAAoB;AAAA,IAAC,IAI7DsH,EAAY,UAAUjI,GAAa4K,CAAO,GAG1C5B,EAAgB4B,GAASjK,GAAsBX,CAAW,GAEnD;AAAA,MACL,SAAS4K;AAAA,MACT,SAASrN;AAAA,MACT,sBAAsBoD;AAAA,MACtB,aAAaX;AAAA,MACb,UAAUuD;AAAA,IACd;AAAA,EACA;AAWA,SAAAsH,GAAA,SAAiB,SAAiB92C,GAAM6L,GAAS;AAC/C,QAAI,OAAO7L,IAAS,OAAeA,MAAS;AAC1C,YAAM,IAAI,MAAM,eAAe;AAGjC,QAAI4sC,IAAuBJ,EAAQ,GAC/BhD,GACAroC;AAEJ,WAAI,OAAO0K,IAAY,QAErB+gC,IAAuBJ,EAAQ,KAAK3gC,EAAQ,sBAAsB2gC,EAAQ,CAAC,GAC3EhD,IAAU4K,EAAQ,KAAKvoC,EAAQ,OAAO,GACtC1K,IAAO+yC,EAAY,KAAKroC,EAAQ,WAAW,GAEvCA,EAAQ,cACV+iC,EAAM,kBAAkB/iC,EAAQ,UAAU,IAIvC0qC,EAAav2C,GAAMwpC,GAASoD,GAAsBzrC,CAAI;AAAA,EAC/D;;;;;AC9eA,aAAS41C,EAAUC,GAAK;AAKtB,UAJI,OAAOA,KAAQ,aACjBA,IAAMA,EAAI,SAAQ,IAGhB,OAAOA,KAAQ;AACjB,cAAM,IAAI,MAAM,uCAAuC;AAGzD,UAAIC,IAAUD,EAAI,MAAK,EAAG,QAAQ,KAAK,EAAE,EAAE,MAAM,EAAE;AACnD,UAAIC,EAAQ,SAAS,KAAKA,EAAQ,WAAW,KAAKA,EAAQ,SAAS;AACjE,cAAM,IAAI,MAAM,wBAAwBD,CAAG;AAI7C,OAAIC,EAAQ,WAAW,KAAKA,EAAQ,WAAW,OAC7CA,IAAU,MAAM,UAAU,OAAO,MAAM,CAAA,GAAIA,EAAQ,IAAI,SAAUr4C,GAAG;AAClE,eAAO,CAACA,GAAGA,CAAC;AAAA,MAClB,CAAK,CAAC,IAIAq4C,EAAQ,WAAW,KAAGA,EAAQ,KAAK,KAAK,GAAG;AAE/C,YAAMC,IAAW,SAASD,EAAQ,KAAK,EAAE,GAAG,EAAE;AAE9C,aAAO;AAAA,QACL,GAAIC,KAAY,KAAM;AAAA,QACtB,GAAIA,KAAY,KAAM;AAAA,QACtB,GAAIA,KAAY,IAAK;AAAA,QACrB,GAAGA,IAAW;AAAA,QACd,KAAK,MAAMD,EAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,MAC1C;AAAA,IACA;AAEAtN,IAAAA,EAAA,aAAqB,SAAqB99B,GAAS;AACjD,MAAKA,MAASA,IAAU,CAAA,IACnBA,EAAQ,UAAOA,EAAQ,QAAQ,CAAA;AAEpC,YAAMsrC,IAAS,OAAOtrC,EAAQ,SAAW,OACvCA,EAAQ,WAAW,QACnBA,EAAQ,SAAS,IACf,IACAA,EAAQ,QAENurC,IAAQvrC,EAAQ,SAASA,EAAQ,SAAS,KAAKA,EAAQ,QAAQ,QAC/DwrC,IAAQxrC,EAAQ,SAAS;AAE/B,aAAO;AAAA,QACL,OAAOurC;AAAA,QACP,OAAOA,IAAQ,IAAIC;AAAA,QACnB,QAAQF;AAAA,QACR,OAAO;AAAA,UACL,MAAMJ,EAASlrC,EAAQ,MAAM,QAAQ,WAAW;AAAA,UAChD,OAAOkrC,EAASlrC,EAAQ,MAAM,SAAS,WAAW;AAAA;QAEpD,MAAMA,EAAQ;AAAA,QACd,cAAcA,EAAQ,gBAAgB,CAAA;AAAA,MAC1C;AAAA,IACA,GAEA89B,EAAA,WAAmB,SAAmB2N,GAAQzF,GAAM;AAClD,aAAOA,EAAK,SAASA,EAAK,SAASyF,IAASzF,EAAK,SAAS,IACtDA,EAAK,SAASyF,IAASzF,EAAK,SAAS,KACrCA,EAAK;AAAA,IACX,GAEAlI,EAAA,gBAAwB,SAAwB2N,GAAQzF,GAAM;AAC5D,YAAMwF,IAAQ1N,EAAQ,SAAS2N,GAAQzF,CAAI;AAC3C,aAAO,KAAK,OAAOyF,IAASzF,EAAK,SAAS,KAAKwF,CAAK;AAAA,IACtD,GAEA1N,EAAA,gBAAwB,SAAwB4N,GAASC,GAAI3F,GAAM;AACjE,YAAMhtC,IAAO2yC,EAAG,QAAQ,MAClBx3C,IAAOw3C,EAAG,QAAQ,MAClBH,IAAQ1N,EAAQ,SAAS9kC,GAAMgtC,CAAI,GACnC4F,IAAa,KAAK,OAAO5yC,IAAOgtC,EAAK,SAAS,KAAKwF,CAAK,GACxDK,IAAe7F,EAAK,SAASwF,GAC7BM,IAAU,CAAC9F,EAAK,MAAM,OAAOA,EAAK,MAAM,IAAI;AAElD,eAASvyC,IAAI,GAAGA,IAAIm4C,GAAYn4C;AAC9B,iBAAS2rC,IAAI,GAAGA,IAAIwM,GAAYxM,KAAK;AACnC,cAAI2M,KAAUt4C,IAAIm4C,IAAaxM,KAAK,GAChC4M,IAAUhG,EAAK,MAAM;AAEzB,cAAIvyC,KAAKo4C,KAAgBzM,KAAKyM,KAC5Bp4C,IAAIm4C,IAAaC,KAAgBzM,IAAIwM,IAAaC,GAAc;AAChE,kBAAMI,IAAO,KAAK,OAAOx4C,IAAIo4C,KAAgBL,CAAK,GAC5CU,IAAO,KAAK,OAAO9M,IAAIyM,KAAgBL,CAAK;AAClD,YAAAQ,IAAUF,EAAQ33C,EAAK83C,IAAOjzC,IAAOkzC,CAAI,IAAI,IAAI,CAAC;AAAA,UAC1D;AAEM,UAAAR,EAAQK,GAAQ,IAAIC,EAAQ,GAC5BN,EAAQK,GAAQ,IAAIC,EAAQ,GAC5BN,EAAQK,GAAQ,IAAIC,EAAQ,GAC5BN,EAAQK,CAAM,IAAIC,EAAQ;AAAA,QAChC;AAAA,IAEA;AAAA;;;;;AClGA,UAAMjJ,IAAQjE,GAAA;AAEd,aAASqN,EAAarR,GAAKsR,GAAQpzC,GAAM;AACvC,MAAA8hC,EAAI,UAAU,GAAG,GAAGsR,EAAO,OAAOA,EAAO,MAAM,GAE1CA,EAAO,UAAOA,EAAO,QAAQ,CAAA,IAClCA,EAAO,SAASpzC,GAChBozC,EAAO,QAAQpzC,GACfozC,EAAO,MAAM,SAASpzC,IAAO,MAC7BozC,EAAO,MAAM,QAAQpzC,IAAO;AAAA,IAC9B;AAEA,aAASqzC,IAAoB;AAC3B,UAAI;AACF,eAAO,SAAS,cAAc,QAAQ;AAAA,MAC1C,QAAc;AACV,cAAM,IAAI,MAAM,sCAAsC;AAAA,MAC1D;AAAA,IACA;AAEAvO,IAAAA,EAAA,SAAiB,SAAiBwO,GAAQF,GAAQpsC,GAAS;AACzD,UAAIgmC,IAAOhmC,GACPusC,IAAWH;AAEf,MAAI,OAAOpG,IAAS,QAAgB,CAACoG,KAAU,CAACA,EAAO,gBACrDpG,IAAOoG,GACPA,IAAS,SAGNA,MACHG,IAAWF,EAAgB,IAG7BrG,IAAOjD,EAAM,WAAWiD,CAAI;AAC5B,YAAMhtC,IAAO+pC,EAAM,cAAcuJ,EAAO,QAAQ,MAAMtG,CAAI,GAEpDlL,IAAMyR,EAAS,WAAW,IAAI,GAC9BC,IAAQ1R,EAAI,gBAAgB9hC,GAAMA,CAAI;AAC5C,aAAA+pC,EAAM,cAAcyJ,EAAM,MAAMF,GAAQtG,CAAI,GAE5CmG,EAAYrR,GAAKyR,GAAUvzC,CAAI,GAC/B8hC,EAAI,aAAa0R,GAAO,GAAG,CAAC,GAErBD;AAAA,IACT,GAEAzO,EAAA,kBAA0B,SAA0BwO,GAAQF,GAAQpsC,GAAS;AAC3E,UAAIgmC,IAAOhmC;AAEX,MAAI,OAAOgmC,IAAS,QAAgB,CAACoG,KAAU,CAACA,EAAO,gBACrDpG,IAAOoG,GACPA,IAAS,SAGNpG,MAAMA,IAAO,CAAA;AAElB,YAAMuG,IAAWzO,EAAQ,OAAOwO,GAAQF,GAAQpG,CAAI,GAE9CyG,IAAOzG,EAAK,QAAQ,aACpB0G,IAAe1G,EAAK,gBAAgB,CAAA;AAE1C,aAAOuG,EAAS,UAAUE,GAAMC,EAAa,OAAO;AAAA,IACtD;AAAA;;;;;;AC9DA,QAAM3J,IAAQjE,GAAA;AAEd,WAAS6N,EAAgBC,GAAOC,GAAQ;AACtC,UAAMC,IAAQF,EAAM,IAAI,KAClBp2C,IAAMq2C,IAAS,OAAOD,EAAM,MAAM;AAExC,WAAOE,IAAQ,IACXt2C,IAAM,MAAMq2C,IAAS,eAAeC,EAAM,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,MAChEt2C;AAAA,EACN;AAEA,WAASu2C,EAAQC,GAAK/5C,GAAGkuC,GAAG;AAC1B,QAAI3qC,IAAMw2C,IAAM/5C;AAChB,WAAI,OAAOkuC,IAAM,QAAa3qC,KAAO,MAAM2qC,IAEpC3qC;AAAA,EACT;AAEA,WAASy2C,EAAU94C,GAAM6E,GAAMsyC,GAAQ;AACrC,QAAIrD,IAAO,IACPiF,IAAS,GACTC,IAAS,IACTC,IAAa;AAEjB,aAAS35C,IAAI,GAAGA,IAAIU,EAAK,QAAQV,KAAK;AACpC,YAAMirC,IAAM,KAAK,MAAMjrC,IAAIuF,CAAI,GACzBylC,IAAM,KAAK,MAAMhrC,IAAIuF,CAAI;AAE/B,MAAI,CAAC0lC,KAAO,CAACyO,MAAQA,IAAS,KAE1Bh5C,EAAKV,CAAC,KACR25C,KAEM35C,IAAI,KAAKirC,IAAM,KAAKvqC,EAAKV,IAAI,CAAC,MAClCw0C,KAAQkF,IACJJ,EAAO,KAAKrO,IAAM4M,GAAQ,MAAM7M,IAAM6M,CAAM,IAC5CyB,EAAO,KAAKG,GAAQ,CAAC,GAEzBA,IAAS,GACTC,IAAS,KAGLzO,IAAM,IAAI1lC,KAAQ7E,EAAKV,IAAI,CAAC,MAChCw0C,KAAQ8E,EAAO,KAAKK,CAAU,GAC9BA,IAAa,MAGfF;AAAA,IAEN;AAEE,WAAOjF;AAAA,EACT;AAEA,SAAAoF,GAAA,SAAiB,SAAiBf,GAAQtsC,GAASpC,GAAI;AACrD,UAAMooC,IAAOjD,EAAM,WAAW/iC,CAAO,GAC/BhH,IAAOszC,EAAO,QAAQ,MACtBn4C,IAAOm4C,EAAO,QAAQ,MACtBgB,IAAat0C,IAAOgtC,EAAK,SAAS,GAElCuH,IAAMvH,EAAK,MAAM,MAAM,IAEzB,WAAW2G,EAAe3G,EAAK,MAAM,OAAO,MAAM,IAClD,cAAcsH,IAAa,MAAMA,IAAa,WAF9C,IAIErF,IACJ,WAAW0E,EAAe3G,EAAK,MAAM,MAAM,QAAQ,IACnD,SAASiH,EAAS94C,GAAM6E,GAAMgtC,EAAK,MAAM,IAAI,OAEzCwH,IAAU,kBAAuBF,IAAa,MAAMA,IAAa,KAIjED,IAAS,8CAFArH,EAAK,QAAa,YAAYA,EAAK,QAAQ,eAAeA,EAAK,QAAQ,OAA1D,MAEwCwH,IAAU,mCAAmCD,IAAKtF,IAAO;AAAA;AAE7H,WAAI,OAAOrqC,KAAO,cAChBA,EAAG,MAAMyvC,CAAM,GAGVA;AAAA,EACT;;;;;;AC/EA,QAAM7P,IAAasB,GAAA,GAEb2O,IAAS5K,GAAA,GACT6K,IAAiBzK,GAAA,GACjB0K,IAAcxK,GAAA;AAEpB,WAASyK,EAAcC,GAAYzB,GAAQ0B,GAAM9H,GAAMpoC,GAAI;AACzD,UAAMjL,IAAO,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC,GACjCo7C,IAAUp7C,EAAK,QACfq7C,IAAc,OAAOr7C,EAAKo7C,IAAU,CAAC,KAAM;AAEjD,QAAI,CAACC,KAAe,CAACxQ;AACnB,YAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAIwQ,GAAa;AACf,UAAID,IAAU;AACZ,cAAM,IAAI,MAAM,4BAA4B;AAG9C,MAAIA,MAAY,KACdnwC,IAAKkwC,GACLA,IAAO1B,GACPA,IAASpG,IAAO,UACP+H,MAAY,MACjB3B,EAAO,cAAc,OAAOxuC,IAAO,OACrCA,IAAKooC,GACLA,IAAO,WAEPpoC,IAAKooC,GACLA,IAAO8H,GACPA,IAAO1B,GACPA,IAAS;AAAA,IAGjB,OAAS;AACL,UAAI2B,IAAU;AACZ,cAAM,IAAI,MAAM,4BAA4B;AAG9C,aAAIA,MAAY,KACdD,IAAO1B,GACPA,IAASpG,IAAO,UACP+H,MAAY,KAAK,CAAC3B,EAAO,eAClCpG,IAAO8H,GACPA,IAAO1B,GACPA,IAAS,SAGJ,IAAI,QAAQ,SAAU3uC,GAASC,GAAQ;AAC5C,YAAI;AACF,gBAAMvJ,IAAOs5C,EAAO,OAAOK,GAAM9H,CAAI;AACrC,UAAAvoC,EAAQowC,EAAW15C,GAAMi4C,GAAQpG,CAAI,CAAC;AAAA,QAC9C,SAAe1rC,GAAG;AACV,UAAAoD,EAAOpD,CAAC;AAAA,QAChB;AAAA,MACA,CAAK;AAAA,IACL;AAEE,QAAI;AACF,YAAMnG,IAAOs5C,EAAO,OAAOK,GAAM9H,CAAI;AACrC,MAAApoC,EAAG,MAAMiwC,EAAW15C,GAAMi4C,GAAQpG,CAAI,CAAC;AAAA,IAC3C,SAAW1rC,GAAG;AACV,MAAAsD,EAAGtD,CAAC;AAAA,IACR;AAAA,EACA;AAEA,SAAAkT,GAAA,SAAiBigC,EAAO,QACxBjgC,GAAA,WAAmBogC,EAAa,KAAK,MAAMF,EAAe,MAAM,GAChElgC,GAAA,YAAoBogC,EAAa,KAAK,MAAMF,EAAe,eAAe,GAG1ElgC,GAAA,WAAmBogC,EAAa,KAAK,MAAM,SAAUz5C,GAAMgc,GAAG61B,GAAM;AAClE,WAAO2H,EAAY,OAAOx5C,GAAM6xC,CAAI;AAAA,EACtC,CAAC;;;;AClDM,SAASiI,GAAO,EAAE,OAAAnmC,GAAO,MAAA9O,IAAO,KAAK,KAAAk1C,IAAM,WAAW,WAAAp1C,IAAY,MAAmB;AAC1F,QAAMq1C,IAAYn0C,EAA0B,IAAI,GAC1C,CAAC2B,GAAOC,CAAQ,IAAIhC,EAAwB,IAAI;AAuBtD,SArBAQ,EAAU,MAAM;AACd,IAAI,CAAC+zC,EAAU,WAAW,CAACrmC,KAE3B2lC,GAAO,SAASU,EAAU,SAASrmC,GAAO;AAAA,MACxC,OAAO9O;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,sBAAsB;AAAA,IAAA,CACvB,EACE,KAAK,MAAM;AAEV,MAAA4C,EAAS,IAAI;AAAA,IACf,CAAC,EACA,MAAM,CAACU,MAAQ;AACd,MAAAV,EAASU,aAAe,QAAQA,EAAI,UAAU,4BAA4B;AAAA,IAC5E,CAAC;AAAA,EACL,GAAG,CAACwL,GAAO9O,CAAI,CAAC,GAEZ2C,IAEA,gBAAAb;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,mBAAmBhC,CAAS;AAAA,MACvC,OAAO,EAAE,OAAOE,GAAM,QAAQA,EAAA;AAAA,MAC9B,MAAK;AAAA,MACL,cAAYk1C;AAAA,MAEZ,UAAA,gBAAApzC,EAAC,OAAE,UAAA,6BAAA,CAA0B;AAAA,IAAA;AAAA,EAAA,IAMjC,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKqzC;AAAA,MACL,WAAW,wBAAwBr1C,CAAS;AAAA,MAC5C,MAAK;AAAA,MACL,cAAYo1C;AAAA,MACZ,OAAO,EAAE,cAAc,SAAA;AAAA,IAAS;AAAA,EAAA;AAGtC;ACVO,SAASE,KAAyB;AACvC,QAAM,EAAE,QAAA9yC,GAAQ,WAAAyC,EAAA,IAAcxC,GAAA,GACxB,CAAC+e,GAAQwH,CAAS,IAAIloB,EAA4B,IAAI,GACtD,CAACy0C,GAAYC,CAAa,IAAI10C,EAAyB,MAAM,GAC7D,CAACyvC,GAAWkF,CAAY,IAAI30C,EAAmC,IAAI,GACnE,CAACN,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAA2B,IAAI,GAEnDiC,IAAY1B;AAAA,IAChB,MACE,IAAI2B,GAAU;AAAA,MACZ,SAASR,EAAO;AAAA,MAChB,WAAWA,EAAO;AAAA,MAClB,eAAeA,EAAO;AAAA,MACtB,gBAAgByC,GAAW;AAAA,IAAA,CAC5B;AAAA,IACH,CAACzC,EAAO,WAAWA,EAAO,gBAAgBA,EAAO,eAAeyC,CAAS;AAAA,EAAA,GAGrEywC,IAAY/zC,EAAY,YAAiC;AAC7D,IAAAe,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AACF,YAAM+F,IAAS,MAAM9F,EAAU,IAAgB,aAAa;AAC5D,aAAAimB,EAAUngB,CAAM,GACTA;AAAA,IACT,SAASrF,GAAK;AACZ,YAAME,IAAYC,EAAeH,GAAK,2BAA2B;AACjE,YAAAV,EAASY,CAAS,GACZA;AAAA,IACR,UAAA;AACE,MAAAhB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAER4yC,IAAah0C,EAAY,YAAwC;AACrE,IAAAe,EAAa,EAAI,GACjBI,EAAS,IAAI,GACb0yC,EAAc,SAAS;AAEvB,QAAI;AACF,YAAM3sC,IAAS,MAAM9F,EAAU,KAAwB,cAAc,CAAA,CAAE;AACvE,aAAA0yC,EAAa5sC,CAAM,GACnB2sC,EAAc,OAAO,GACd3sC;AAAA,IACT,SAASrF,GAAK;AACZ,YAAME,IAAYC,EAAeH,GAAK,4BAA4B;AAClE,YAAAV,EAASY,CAAS,GAClB8xC,EAAc,OAAO,GACf9xC;AAAA,IACR,UAAA;AACE,MAAAhB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAER6yC,IAAaj0C;AAAA,IACjB,OAAOk0C,MAAgC;AACrC,UAAI,CAAC,UAAU,KAAKA,CAAI,GAAG;AACzB,cAAMtyC,IAA6B;AAAA,UACjC,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAEX,cAAAT,EAASS,CAAe,GAClBA;AAAA,MACR;AAEA,MAAAb,EAAa,EAAI,GACjBI,EAAS,IAAI,GACb0yC,EAAc,WAAW;AAEzB,UAAI;AACF,cAAMzyC,EAAU,KAAK,eAAe,EAAE,MAAA8yC,GAAM,GAC5CL,EAAc,SAAS,GACvBxsB,EAAU,EAAE,SAAS,IAAM,wBAAwBunB,GAAW,cAAc,UAAU,GAAG;AAAA,MAC3F,SAAS/sC,GAAK;AACZ,cAAME,IAAYC,EAAeH,GAAK,2BAA2B;AACjE,cAAAV,EAASY,CAAS,GAClB8xC,EAAc,OAAO,GACf9xC;AAAA,MACR,UAAA;AACE,QAAAhB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,GAAWwtC,CAAS;AAAA,EAAA,GAGjBuF,IAAcn0C;AAAA,IAClB,OAAOuK,MAAoC;AACzC,UAAI,CAACA,GAAU;AACb,cAAM3I,IAA6B;AAAA,UACjC,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAEX,cAAAT,EAASS,CAAe,GAClBA;AAAA,MACR;AAEA,MAAAb,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AACF,cAAMC,EAAU,KAAK,gBAAgB,EAAE,UAAAmJ,GAAU,GACjD8c,EAAU,EAAE,SAAS,IAAO,wBAAwB,GAAG,GACvDysB,EAAa,IAAI,GACjBD,EAAc,MAAM;AAAA,MACtB,SAAShyC,GAAK;AACZ,cAAME,IAAYC,EAAeH,GAAK,wBAAwB;AAC9D,cAAAV,EAASY,CAAS,GACZA;AAAA,MACR,UAAA;AACE,QAAAhB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGNgzC,IAAwBp0C;AAAA,IAC5B,OAAOk0C,MAAmD;AACxD,UAAI,CAAC,UAAU,KAAKA,CAAI,GAAG;AACzB,cAAMtyC,IAA6B;AAAA,UACjC,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAEX,cAAAT,EAASS,CAAe,GAClBA;AAAA,MACR;AAEA,MAAAb,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAKF,eAJe,MAAMC,EAAU;AAAA,UAC7B;AAAA,UACA,EAAE,MAAA8yC,EAAA;AAAA,QAAK;AAAA,MAGX,SAASryC,GAAK;AACZ,cAAME,IAAYC,EAAeH,GAAK,qCAAqC;AAC3E,cAAAV,EAASY,CAAS,GACZA;AAAA,MACR,UAAA;AACE,QAAAhB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGNgB,IAAapC,EAAY,MAAMmB,EAAS,IAAI,GAAG,CAAA,CAAE,GAEjDkB,IAAQrC,EAAY,MAAM;AAC9B,IAAAmB,EAAS,IAAI,GACb2yC,EAAa,IAAI,GACjBD,EAAc,MAAM,GACpB9yC,EAAa,EAAK;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,QAAA8e;AAAA,IACA,YAAA+zB;AAAA,IACA,WAAAhF;AAAA,IACA,WAAA/vC;AAAA,IACA,OAAAqC;AAAA,IACA,WAAA6yC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAE;AAAA,IACA,uBAAAC;AAAA,IACA,YAAAhyC;AAAA,IACA,OAAAC;AAAA,EAAA;AAEJ;AC1MO,SAASgyC,GAAU,EAAE,WAAA9xC,GAAW,UAAAC,GAAU,WAAAnE,IAAY,MAAsB;AACjF,QAAM,EAAE,YAAAu1C,GAAY,WAAAhF,GAAW,WAAA/vC,GAAW,OAAAqC,GAAO,YAAA8yC,GAAY,YAAAC,GAAY,YAAA7xC,GAAY,OAAAC,EAAA,IACnFsxC,GAAA,GAEI,CAACtuB,GAAMivB,CAAO,IAAIn1C,EAAqC,IAAI,GAC3D,CAACo1C,GAAYC,CAAa,IAAIr1C,EAAS,EAAE,GACzC,CAACs1C,GAAcC,CAAe,IAAIv1C,EAAS,EAAK,GAChD,CAACw1C,GAAkBC,CAAmB,IAAIz1C,EAAS,EAAK,GACxDyU,IAAerU,EAAsB,IAAI;AAG/C,EAAAI,EAAU,MAAM;AACd,IAAIi0C,MAAe,UACjBI,EAAA,EAAa,MAAM,MAAM;AAAA,IAEzB,CAAC;AAAA,EAEL,GAAG,CAACJ,GAAYI,CAAU,CAAC,GAG3Br0C,EAAU,MAAM;AACd,IAAIi0C,MAAe,aACjBrxC,IAAA;AAAA,EAEJ,GAAG,CAACqxC,GAAYrxC,CAAS,CAAC;AAE1B,QAAMsyC,IAAmB,YAAY;AACnC,IAAIjG,GAAW,WACb,MAAM,UAAU,UAAU,UAAUA,EAAU,MAAM,GACpD8F,EAAgB,EAAI,GAChB9gC,EAAa,YAAY,QAC3B,OAAO,aAAaA,EAAa,OAAO,GAE1CA,EAAa,UAAU,OAAO,WAAW,MAAM8gC,EAAgB,EAAK,GAAG,GAAI;AAAA,EAE/E,GAEMI,IAAwB,YAAY;AACxC,QAAIlG,GAAW,eAAe;AAC5B,YAAMmG,IAAQnG,EAAU,cAAc,KAAK;AAAA,CAAI;AAC/C,YAAM,UAAU,UAAU,UAAUmG,CAAK;AAAA,IAC3C;AAAA,EACF,GAEMC,IAAe,YAAY;AAC/B,QAAI;AACF,YAAMf,EAAWM,CAAU;AAAA,IAC7B,QAAQ;AAEN,MAAAC,EAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAEMnjC,IAAe,MAAM;AACzB,IAAAhP,EAAA,GACAG,IAAA;AAAA,EACF;AAYA,SAVA7C,EAAU,MACD,MAAM;AACX,IAAIiU,EAAa,YAAY,SAC3B,OAAO,aAAaA,EAAa,OAAO,GACxCA,EAAa,UAAU;AAAA,EAE3B,GACC,CAAA,CAAE,GAGDggC,MAAe,aAAcA,MAAe,UAAU/0C,sBAErD,OAAA,EAAI,WAAW,qBAAqBR,CAAS,IAC5C,UAAA,gBAAAgC,EAAC,OAAA,EAAI,WAAU,uBACb,4BAACC,GAAA,EAAe,MAAK,MAAK,OAAM,wCAAuC,GACzE,EAAA,CACF,IAKAszC,MAAe,WAAW,CAAChF,IAE3B,gBAAAluC,EAAC,OAAA,EAAI,WAAW,qBAAqBrC,CAAS,IAC5C,UAAA;AAAA,IAAA,gBAAAgC,EAACwC,IAAA,EAAa,OAAA3B,GAAc,WAAWkB,EAAA,CAAY;AAAA,IACnD,gBAAA1B,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASgR;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAhR;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM2zC,EAAA;AAAA,UAChB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,GACF,IAKAJ,MAAe,YAEf,gBAAAvzC,EAAC,SAAI,WAAW,qBAAqBhC,CAAS,IAC5C,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,eAAY;AAAA,QAEZ,UAAA;AAAA,UAAA,gBAAAL,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,yBAAwB,aAAY,IAAA,CAAI;AAAA,UAC9E,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA,YAAA;AAAA,UAAA;AAAA,QACjB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAA,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,qCAAiC;AAAA,IACnE,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,sEAAA,CAEvC;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAICuuC,IAGH,gBAAAluC,EAAC,OAAA,EAAI,WAAW,qBAAqBrC,CAAS,IAE3C,UAAA;AAAA,IAAAgnB,MAAS,QACR,gBAAA3kB,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,gBAAY;AAAA,MAC9C,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,oDAEvC;AAAA,MAEA,gBAAAA,EAAC,OAAA,EAAI,WAAU,kBAEb,UAAA,gBAAAA,EAACmzC,IAAA,EAAO,OAAO5E,EAAU,YAAY,MAAM,KAAK,KAAI,iCAAgC,GACtF;AAAA,MAEA,gBAAAluC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,gCAA4B;AAAA,QACpE,gBAAAK,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAuuC,EAAU,QAAO;AAAA,UAC5D,gBAAAvuC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAASw0C;AAAA,cACT,cAAW;AAAA,cAEV,cAAe,YAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QAC9B,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAn0C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAASgR;AAAA,YACV,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAhR;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMi0C,EAAQ,QAAQ;AAAA,YAChC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAIDjvB,MAAS,YACR,gBAAA3kB,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,uBAAmB;AAAA,MACrD,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,sHAGvC;AAAA,wBAEC,OAAA,EAAI,WAAU,4BACZ,UAAAuuC,EAAU,cAAc,IAAI,CAACsF,GAAMvzC,wBACjC,QAAA,EAAiB,WAAU,2BACzB,UAAAuzC,EAAA,GADQvzC,CAEX,CACD,GACH;AAAA,MAEA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASy0C;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAID,gBAAAp0C,EAAC,SAAA,EAAM,WAAU,6CACf,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAASs0C;AAAA,YACT,UAAU,CAAC90C,MAAM+0C,EAAoB/0C,EAAE,OAAO,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAEvD,gBAAAQ,EAAC,QAAA,EAAK,WAAU,wBAAuB,UAAA,oCAAA,CAAiC;AAAA,MAAA,GAC1E;AAAA,MAEA,gBAAAK,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMi0C,EAAQ,IAAI;AAAA,YAC5B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAj0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMi0C,EAAQ,QAAQ;AAAA,YAC/B,UAAU,CAACK;AAAA,YACZ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAIDtvB,MAAS,YACR,gBAAA3kB,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,gBAAY;AAAA,MAC9C,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,yEAEvC;AAAA,MAEA,gBAAAA;AAAA,QAAC40C;AAAA,QAAA;AAAA,UACC,OAAOV;AAAA,UACP,UAAUC;AAAA,UACV,YAAYQ;AAAA,UACZ,UAAUn2C;AAAA,UACV,OAAOqC,GAAO;AAAA,UACd,WAAS;AAAA,QAAA;AAAA,MAAA;AAAA,MAGX,gBAAAR,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMi0C,EAAQ,QAAQ;AAAA,YAC/B,UAAUz1C;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAwB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS20C;AAAA,YACT,UAAUn2C,KAAa01C,EAAW,WAAW;AAAA,YAE5C,cACC,gBAAA7zC,EAAAoC,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAzC,EAACC,GAAA,EAAe,MAAK,KAAA,CAAK;AAAA,cAC1B,gBAAAD,EAAC,UAAK,UAAA,eAAA,CAAY;AAAA,YAAA,EAAA,CACpB,IAEA;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ,IAtJqB;AAwJzB;AC5QO,SAAS60C,GAAa,EAAE,gBAAAC,GAAgB,WAAA92C,IAAY,MAAyB;AAClF,QAAM,EAAE,QAAAwhB,GAAQ,WAAAhhB,GAAW,OAAAqC,GAAO,WAAA6yC,GAAW,aAAAI,GAAa,uBAAAC,GAAuB,YAAAhyC,EAAA,IAC/EuxC,GAAA,GAEI,CAACtzB,GAAMC,CAAO,IAAInhB,EAAuB,QAAQ,GACjD,CAACi2C,GAAiBC,CAAkB,IAAIl2C,EAAS,EAAE,GACnD,CAACm2C,GAAgBC,CAAiB,IAAIp2C,EAAS,EAAE,GACjD,CAACq2C,GAAkBC,CAAmB,IAAIt2C,EAA0B,IAAI,GACxE,CAACu2C,GAAeC,CAAgB,IAAIx2C,EAAS,EAAK,GAClD,CAACy2C,GAAaC,CAAc,IAAI12C,EAAwB,IAAI;AAGlE,EAAAQ,EAAU,MAAM;AACd,IAAAo0C,EAAA,EAAY,MAAM,MAAM;AAAA,IAExB,CAAC;AAAA,EACH,GAAG,CAACA,CAAS,CAAC;AAEd,QAAM+B,IAAsB91C,EAAY,MAAM;AAC5C,IAAAsgB,EAAQ,QAAQ,GAChB60B,IAAiB,EAAI;AAAA,EACvB,GAAG,CAACA,CAAc,CAAC,GAEbY,IAAgB,YAAY;AAChC,IAAAJ,EAAiB,EAAI,GACrBE,EAAe,IAAI;AACnB,QAAI;AACF,YAAM1B,EAAYiB,CAAe,GACjC90B,EAAQ,QAAQ,GAChB+0B,EAAmB,EAAE,GACrBF,IAAiB,EAAK;AAAA,IACxB,SAAStzC,GAAK;AACZ,MAAAg0C,EAAeh0C,aAAe,QAAQA,EAAI,UAAU,uBAAuB,GAC3EwzC,EAAmB,EAAE;AAAA,IACvB,UAAA;AACE,MAAAM,EAAiB,EAAK;AAAA,IACxB;AAAA,EACF,GAEMK,IAAmB,YAAY;AACnC,IAAAL,EAAiB,EAAI,GACrBE,EAAe,IAAI;AACnB,QAAI;AACF,YAAM3uC,IAAS,MAAMktC,EAAsBkB,CAAc;AACzD,MAAAG,EAAoBvuC,EAAO,aAAa,GACxCquC,EAAkB,EAAE;AAAA,IACtB,SAAS1zC,GAAK;AACZ,MAAAg0C,EAAeh0C,aAAe,QAAQA,EAAI,UAAU,4BAA4B,GAChF0zC,EAAkB,EAAE;AAAA,IACtB,UAAA;AACE,MAAAI,EAAiB,EAAK;AAAA,IACxB;AAAA,EACF,GAEMb,IAAwB,YAAY;AACxC,IAAIU,KACF,MAAM,UAAU,UAAU,UAAUA,EAAiB,KAAK;AAAA,CAAI,CAAC;AAAA,EAEnE;AAGA,SAAI32C,KAAa,CAACghB,sBAEb,OAAA,EAAI,WAAW,wBAAwBxhB,CAAS,IAC/C,UAAA,gBAAAgC,EAAC,OAAA,EAAI,WAAU,uBACb,4BAACC,GAAA,EAAe,MAAK,MAAK,OAAM,6BAA4B,GAC9D,EAAA,CACF,IAKAY,KAAS,CAAC2e,IAEV,gBAAAnf,EAAC,OAAA,EAAI,WAAW,wBAAwBrC,CAAS,IAC/C,UAAA;AAAA,IAAA,gBAAAgC,EAACwC,IAAA,EAAa,OAAA3B,GAAc,WAAWkB,EAAA,CAAY;AAAA,IACnD,gBAAA/B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM0zC,EAAA;AAAA,QAChB,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF,IAKA1zB,MAAS,UAET,gBAAAhgB,EAAC,OAAA,EAAI,WAAW,wBAAwBhC,CAAS,IAC/C,UAAA,gBAAAgC,EAACg0C,IAAA,EAAU,WAAWyB,GAAqB,UAAU,MAAMx1B,EAAQ,QAAQ,GAAG,GAChF,IAKAD,MAAS,YAET,gBAAAhgB,EAAC,SAAI,WAAW,wBAAwBhC,CAAS,IAC/C,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,qCAAiC;AAAA,IACnE,gBAAAA,EAAC,KAAA,EAAE,WAAU,+CAA8C,UAAA,4EAE3D;AAAA,IAECu1C,KACC,gBAAAv1C,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA;AAAA,MAACwC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,MAAM,iBAAiB,SAAS+yC,EAAA;AAAA,QACzC,WAAW,MAAMC,EAAe,IAAI;AAAA,MAAA;AAAA,IAAA,GAExC;AAAA,IAGF,gBAAAx1C,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAA;AAAA,MAAC0K;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,OAAOqqC;AAAA,QACP,UAAU,CAACv1C,MAAMw1C,EAAmBx1C,EAAE,OAAO,KAAK;AAAA,QAClD,UAAU61C;AAAA,QACV,WAAS;AAAA,MAAA;AAAA,IAAA,GAEb;AAAA,IAEA,gBAAAh1C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAAigB,EAAQ,QAAQ,GAChB+0B,EAAmB,EAAE,GACrBQ,EAAe,IAAI;AAAA,UACrB;AAAA,UACA,UAAUH;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAr1C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS01C;AAAA,UACT,UAAUL,KAAiBN,EAAgB,WAAW;AAAA,UAErD,cACC,gBAAA10C,EAAAoC,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAzC,EAACC,GAAA,EAAe,MAAK,KAAA,CAAK;AAAA,YAC1B,gBAAAD,EAAC,UAAK,UAAA,eAAA,CAAY;AAAA,UAAA,EAAA,CACpB,IAEA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAKAggB,MAAS,eAEPm1B,IAEA,gBAAAn1C,EAAC,SAAI,WAAW,wBAAwBhC,CAAS,IAC/C,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,sBAAkB;AAAA,IACpD,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,2EAEvC;AAAA,sBAEC,OAAA,EAAI,WAAU,4BACZ,UAAAm1C,EAAiB,IAAI,CAACtB,GAAMvzC,MAC3B,gBAAAN,EAAC,UAAiB,WAAU,2BACzB,UAAA6zC,EAAA,GADQvzC,CAEX,CACD,GACH;AAAA,IAEA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAASy0C;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAID,gBAAAz0C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,UAAAigB,EAAQ,QAAQ,GAChBm1B,EAAoB,IAAI;AAAA,QAC1B;AAAA,QACD,UAAA;AAAA,MAAA;AAAA,IAAA,EAED,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAMF,gBAAAp1C,EAAC,SAAI,WAAW,wBAAwBhC,CAAS,IAC/C,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,6BAAyB;AAAA,IAC3D,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,+FAGvC;AAAA,IAECu1C,KACC,gBAAAv1C,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAA;AAAA,MAACwC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,MAAM,iBAAiB,SAAS+yC,EAAA;AAAA,QACzC,WAAW,MAAMC,EAAe,IAAI;AAAA,MAAA;AAAA,IAAA,GAExC;AAAA,IAGF,gBAAAx1C,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAA;AAAA,MAAC40C;AAAA,MAAA;AAAA,QACC,OAAOK;AAAA,QACP,UAAUC;AAAA,QACV,YAAYS;AAAA,QACZ,UAAUN;AAAA,QACV,WAAS;AAAA,MAAA;AAAA,IAAA,GAEb;AAAA,IAEA,gBAAAh1C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAAigB,EAAQ,QAAQ,GAChBi1B,EAAkB,EAAE,GACpBM,EAAe,IAAI;AAAA,UACrB;AAAA,UACA,UAAUH;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAr1C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS21C;AAAA,UACT,UAAUN,KAAiBJ,EAAe,WAAW;AAAA,UAEpD,cACC,gBAAA50C,EAAAoC,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAzC,EAACC,GAAA,EAAe,MAAK,KAAA,CAAK;AAAA,YAC1B,gBAAAD,EAAC,UAAK,UAAA,kBAAA,CAAe;AAAA,UAAA,EAAA,CACvB,IAEA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAMF,gBAAAA,EAAC,SAAI,WAAW,wBAAwBhC,CAAS,IAC/C,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,qBAAoB,UAAA,6BAAyB;AAAA,QAC3D,gBAAAA,EAAC,KAAA,EAAE,WAAU,2BAA0B,UAAA,+HAAA,CAGvC;AAAA,MAAA,GACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,qBAAqBwf,GAAQ,UAAU,8BAA8B,4BAA4B;AAAA,UAE3G,UAAAA,GAAQ,UAAU,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACjC,GACF;AAAA,IAECA,GAAQ,UACP,gBAAAnf,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,WAAW,aAAa,UAAA;AAAA,QAAA;AAAA,QAC9C,gBAAAL,EAAC,UAAA,EAAQ,UAAAwf,EAAO,uBAAA,CAAuB;AAAA,MAAA,GACnE;AAAA,MACA,gBAAAxf;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAMigB,EAAQ,YAAY;AAAA,UACpC,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAjgB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAMigB,EAAQ,SAAS;AAAA,UACjC,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF,IAEA,gBAAAjgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAMigB,EAAQ,OAAO;AAAA,QAC/B,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,EAAA,CAEJ,EAAA,CACF;AAEJ;ACjWO,MAAM21B,GAAiB;AAAA,EACpB;AAAA,EAER,YACEp1B,GACAC,GACAC,GACAC,GACA;AACA,SAAK,SAAS,IAAI3f,GAAU,EAAE,SAAAwf,GAAS,WAAAC,GAAW,eAAAC,GAAe,gBAAAC,GAAgB;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAetnB,GAA8D;AACjF,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,KAA6B,yBAAyBA,CAAI;AAAA,IACrF,SAASwH,GAAO;AACd,YAAMc,EAAed,GAAO,2BAA2B;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAcxH,GAA4D;AAC9E,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,MAA6B,YAAYA,CAAI;AAAA,IACxE,SAASwH,GAAO;AACd,YAAMc,EAAed,GAAO,0BAA0B;AAAA,IACxD;AAAA,EACF;AACF;ACXO,SAASg1C,KAA+B;AAC7C,QAAM,EAAE,QAAAr1C,GAAQ,WAAAsgB,GAAW,WAAA7d,EAAA,IAAcxC,GAAA,GAEnC,CAACjC,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAAuB,IAAI,GAE/CiC,IAAY1B;AAAA,IAChB,MACE,IAAIu2C;AAAA,MACFp1C,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPyC,GAAW;AAAA,IAAA;AAAA,IAEf,CAACzC,EAAO,WAAWA,EAAO,gBAAgBA,EAAO,eAAeyC,CAAS;AAAA,EAAA,GAGrElB,IAAapC,EAAY,MAAM;AACnC,IAAAmB,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAOCg1C,IAAgBn2C;AAAA,IACpB,OAAOtG,MAA+D;AACpE,UAAIynB,MAAc;AAChB,cAAM,IAAI,MAAM,yCAAyC;AAG3D,MAAApgB,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAEF,eADiB,MAAMC,EAAU,cAAc1H,CAAI;AAAA,MAErD,SAASmI,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,0BAA0B;AAC/E,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAH,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACogB,GAAW/f,CAAS;AAAA,EAAA,GAUjBg1C,IAAiBp2C;AAAA,IACrB,OAAOtG,MAA+C;AACpD,UAAIynB,MAAc;AAChB,cAAM,IAAI,MAAM,0CAA0C;AAG5D,MAAApgB,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AACF,cAAMC,EAAU,eAAe1H,CAAI;AAAA,MACrC,SAASmI,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,2BAA2B;AAChF,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAH,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACogB,GAAW/f,CAAS;AAAA,EAAA;AAGvB,SAAO;AAAA,IACL,WAAAvC;AAAA,IACA,OAAAqC;AAAA,IACA,eAAAi1C;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAh0C;AAAA,EAAA;AAEJ;AClFO,SAASi0C,GAAoB;AAAA,EAClC,kBAAAC;AAAA,EACA,SAAA9oC;AAAA,EACA,WAAAnP,IAAY;AACd,GAA6B;AAC3B,QAAM,EAAE,MAAAM,EAAA,IAASK,GAAA,GACX,EAAE,WAAAH,GAAW,OAAAqC,GAAO,gBAAAk1C,GAAgB,YAAAh0C,EAAA,IAAe8zC,GAAA,GAEnD,CAAC71B,GAAMC,CAAO,IAAInhB,EAAuB,MAAM,GAC/C,CAACo3C,GAAiBC,CAAkB,IAAIr3C,EAAS,EAAE,GACnD,CAACgD,GAAas0C,CAAc,IAAIt3C,EAAS,EAAE,GAC3C,CAACsL,GAAiBC,CAAkB,IAAIvL,EAAS,EAAE,GACnD,CAACy2C,GAAaC,CAAc,IAAI12C,EAAwB,IAAI,GAC5D,CAACu3C,GAAgBC,CAAiB,IAAIx3C,EAAwB,IAAI,GAGlEy3C,IAAqB5rC,GAAiB7I,CAAW,GACjD0I,IAAiB1I,MAAgBsI,GACjCosC,IACJN,EAAgB,SAAS,KACzBp0C,EAAY,SAAS,KACrBsI,EAAgB,SAAS,KACzBmsC,EAAmB,WACnB/rC,GAEIisC,IAAuB92C,EAAY,YAAY;AACnD,QAAK62C,GAEL;AAAA,MAAAhB,EAAe,IAAI,GACnBc,EAAkB,IAAI;AAEtB,UAAI;AACF,cAAMP,EAAe;AAAA,UACnB,iBAAAG;AAAA,UACA,aAAAp0C;AAAA,QAAA,CACD,GAGDq0C,EAAmB,EAAE,GACrBC,EAAe,EAAE,GACjB/rC,EAAmB,EAAE,GACrBisC,EAAkB,qEAAqE,GACvFL,IAAA,GAGA,WAAW,MAAM;AACf,UAAAh2B,EAAQ,MAAM,GACdq2B,EAAkB,IAAI;AAAA,QACxB,GAAG,GAAI;AAAA,MACT,SAAS90C,GAAK;AACZ,QAAAg0C,EAAeh0C,aAAe,QAAQA,EAAI,UAAU,2BAA2B;AAAA,MACjF;AAAA;AAAA,EACF,GAAG,CAACg1C,GAAmBN,GAAiBp0C,GAAai0C,GAAgBE,CAAgB,CAAC,GAEhFS,IAA6B/2C,EAAY,MAAM;AACnD,IAAAsgB,EAAQ,MAAM,GACdk2B,EAAmB,EAAE,GACrBC,EAAe,EAAE,GACjB/rC,EAAmB,EAAE,GACrBmrC,EAAe,IAAI,GACnBzzC,EAAA;AAAA,EACF,GAAG,CAACA,CAAU,CAAC,GAGT40C,IAAc,MACdr4C,GAAM,OACDA,EAAK,KACT,MAAM,GAAG,EACT,IAAI,CAAC9G,MAAMA,EAAE,CAAC,CAAC,EACf,KAAK,EAAE,EACP,cACA,MAAM,GAAG,CAAC,IAEX8G,GAAM,QACDA,EAAK,MAAM,CAAC,EAAE,YAAA,IAEhB;AAIT,SAAI0hB,MAAS,oBAET,gBAAAhgB,EAAC,SAAI,WAAW,2BAA2BhC,CAAS,IAClD,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,wBAAuB,UAAA,mBAAe;AAAA,IACpD,gBAAAA,EAAC,KAAA,EAAE,WAAU,8BAA6B,UAAA,6FAG1C;AAAA,KAEEu1C,KAAe10C,MACf,gBAAAb,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAA;AAAA,MAACwC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,MAAM,iBAAiB,SAAS+yC,KAAe10C,GAAO,WAAW,GAAA;AAAA,QAC1E,WAAW,MAAM;AACf,UAAA20C,EAAe,IAAI,GACnBzzC,EAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,IAGDs0C,KACC,gBAAAh2C,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAA8B,UAAA,KAAQ;AAAA,MACrDq2C;AAAA,IAAA,GACH;AAAA,IAGF,gBAAAh2C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAA;AAAA,QAAC0K;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,OAAOwrC;AAAA,UACP,UAAU,CAAC12C,MAAM22C,EAAmB32C,EAAE,OAAO,KAAK;AAAA,UAClD,UAAUhB;AAAA,UACV,WAAS;AAAA,QAAA;AAAA,MAAA,GAEb;AAAA,MAEA,gBAAAwB,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAA;AAAA,QAAC0K;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,OAAO5I;AAAA,UACP,UAAU,CAACtC,MAAM42C,EAAe52C,EAAE,OAAO,KAAK;AAAA,UAC9C,UAAUhB;AAAA,UACV,mBAAiB;AAAA,QAAA;AAAA,MAAA,GAErB;AAAA,MAEA,gBAAAwB,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAA;AAAA,QAAC0K;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,OAAON;AAAA,UACP,UAAU,CAAC5K,MAAM6K,EAAmB7K,EAAE,OAAO,KAAK;AAAA,UAClD,UAAUhB;AAAA,UACV,OACE4L,EAAgB,SAAS,KAAK,CAACI,IAC3B,2BACA;AAAA,QAAA;AAAA,MAAA,EAER,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAnK,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS02C;AAAA,UACT,UAAUl4C;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAwB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASy2C;AAAA,UACT,UAAUj4C,KAAa,CAACg4C;AAAA,UAEvB,cACC,gBAAAn2C,EAAAoC,GAAA,EACE,UAAA;AAAA,YAAA,gBAAAzC,EAACC,GAAA,EAAe,MAAK,KAAA,CAAK;AAAA,YAC1B,gBAAAD,EAAC,UAAK,UAAA,cAAA,CAAW;AAAA,UAAA,EAAA,CACnB,IAEA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IAMF,gBAAAA,EAAC,SAAI,WAAW,2BAA2BhC,CAAS,IAClD,UAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,mCACZ,UAAA1B,GAAM,UACL,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK1B,EAAK;AAAA,UACV,KAAKA,EAAK,QAAQ;AAAA,UAClB,WAAU;AAAA,QAAA;AAAA,MAAA,IAGZ,gBAAA0B,EAAC,OAAA,EAAI,WAAU,wDACZ,UAAA22C,KACH,GAEJ;AAAA,MACA,gBAAAt2C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,uBAAuB,UAAA1B,GAAM,QAAQ,QAAO;AAAA,QAC1D,gBAAA0B,EAAC,KAAA,EAAE,WAAU,wBAAwB,aAAM,MAAA,CAAM;AAAA,MAAA,EAAA,CACnD;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAK,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,gCAA+B,UAAA,WAAO;AAAA,wBAEnD,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,SAAK;AAAA,0BAC/C,QAAA,EAAK,WAAU,4BAA4B,UAAA1B,GAAM,SAAS,UAAA,CAAU;AAAA,MAAA,EAAA,CACvE,EAAA,CACF;AAAA,MAEA,gBAAA+B,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,YAAQ;AAAA,UACnD,gBAAAA,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAA,WAAA,CAAQ;AAAA,QAAA,GACrD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAMigB,EAAQ,iBAAiB;AAAA,YACzC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEC9S,KACC,gBAAAnN,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAASmN;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA,EAED,CACF;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF;AAEJ;ACxPO,SAASypC,KAA+B;AAC7C,QAAM7gC,IAAUC,GAAA,GACV,CAACxX,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAAwB,IAAI,GAEhDiC,IAAY1B,EAAQ,MACnB0W,IACE,IAAI/U,GAAU;AAAA,IACnB,SAAS+U,EAAQ,OAAO;AAAA,IACxB,WAAWA,EAAQ,OAAO;AAAA,IAC1B,eAAeA,EAAQ,OAAO;AAAA,IAC9B,gBAAgBA,EAAQ,WAAW;AAAA,EAAA,CACpC,IANoB,MAOpB,CAACA,CAAO,CAAC,GAENhU,IAAapC,EAAY,MAAM;AACnC,IAAAmB,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECg1B,IAAUn2B;AAAA,IACd,OAAOk3C,MAAqD;AAC1D,UAAI,CAAC91C;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAIF,eAHa,MAAMC,EAAU,KAAsB,YAAY;AAAA,UAC7D,iBAAiB81C;AAAA,QAAA,CAClB;AAAA,MAEH,SAASr1C,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,2BAA2B;AAChE,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGN2yC,IAAY/zC;AAAA,IAChB,OAAO6zB,MAAsD;AAC3D,UAAI,CAACzyB;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAEF,eADa,MAAMC,EAAU,IAA2B,mBAAmByyB,CAAS,EAAE;AAAA,MAExF,SAAShyB,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,8BAA8B;AACnE,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGN+1C,IAAYn3C,EAAY,YAA4C;AACxE,QAAI,CAACoB;AACH,YAAM,IAAI,MAAM,sDAAsD;AAExE,IAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AAEF,aADa,MAAMC,EAAU,IAA2B,iBAAiB;AAAA,IAE3E,SAASS,GAAK;AACZ,YAAM4xB,IAAWzxB,EAAeH,GAAK,8BAA8B;AACnE,YAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAA1yB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAERoyB,IAAexzB;AAAA,IACnB,OAAOuF,MAAgF;AACrF,UAAI,CAACnE;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AACF,cAAM0F,IAAS,IAAI,gBAAA;AACnB,QAAItB,GAAS,UAAU,UAAWsB,EAAO,IAAI,SAAS,OAAOtB,EAAQ,KAAK,CAAC,GACvEA,GAAS,WAAW,UAAWsB,EAAO,IAAI,UAAU,OAAOtB,EAAQ,MAAM,CAAC;AAC9E,cAAMgsB,IAAQ1qB,EAAO,SAAA,GACf4qB,IAAMF,IAAQ,aAAaA,CAAK,KAAK;AAE3C,eADa,MAAMnwB,EAAU,IAAyBqwB,CAAG;AAAA,MAE3D,SAAS5vB,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,yBAAyB;AAC9D,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGNg2C,IAAWp3C;AAAA,IACf,OAAO6G,MAI8B;AACnC,UAAI,CAACzF;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AACF,cAAMk2C,IAAc,IAAI,gBAAgB;AAAA,UACtC,YAAYxwC,EAAO;AAAA,UACnB,QAAQ,OAAOA,EAAO,MAAM;AAAA,UAC5B,OAAOA,EAAO;AAAA,QAAA,CACf;AAED,eADa,MAAMzF,EAAU,IAA0B,kBAAkBi2C,CAAW,EAAE;AAAA,MAExF,SAASx1C,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,6BAA6B;AAClE,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGNk2C,IAAgBt3C;AAAA,IACpB,OAAOoY,MAAkE;AACvE,UAAI,CAAChX;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAEF,eADa,MAAMC,EAAU,KAA4B,mBAAmBgX,CAAO;AAAA,MAErF,SAASvW,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,kCAAkC;AACvE,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA,GAGNm2C,IAAev3C;AAAA,IACnB,OAAOoY,MAAiE;AACtE,UAAI,CAAChX;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AAEF,eADa,MAAMC,EAAU,KAA4B,kBAAkBgX,CAAO;AAAA,MAEpF,SAASvW,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,iCAAiC;AACtE,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA;AAGZ,SAAO;AAAA,IACL,SAAA+0B;AAAA,IACA,UAAAihB;AAAA,IACA,eAAAE;AAAA,IACA,cAAAC;AAAA,IACA,WAAAxD;AAAA,IACA,WAAAoD;AAAA,IACA,cAAA3jB;AAAA,IACA,WAAA30B;AAAA,IACA,OAAAqC;AAAA,IACA,YAAAkB;AAAA,EAAA;AAEJ;AC7MO,SAASo1C,GAAc;AAAA,EAC5B,QAAAjxB;AAAA,EACA,eAAAkxB;AAAA,EACA,UAAA/rC;AAAA,EACA,YAAAgsC;AAAA,EACA,aAAA9rC,IAAc;AAAA,EACd,UAAAvH,IAAW;AAAA,EACX,WAAAhG,IAAY;AAAA,EACZ,YAAAs5C,IAAa;AACf,GAAuB;AACrB,QAAM,CAAC9rC,GAAQC,CAAS,IAAI3M,EAAS,EAAK,GACpC,CAACy4C,GAAQC,CAAS,IAAI14C,EAAS,EAAE,GACjC24C,IAAev4C,EAAuB,IAAI,GAC1Cw4C,IAAiBx4C,EAAyB,IAAI,GAG9Cy4C,IAAiBt4C,EAAQ,MAAM;AACnC,QAAI,CAACk4C,EAAO,KAAA,EAAQ,QAAOrxB;AAC3B,UAAM0xB,IAAcL,EAAO,YAAA;AAC3B,WAAOrxB,EAAO;AAAA,MACZ,CAACrkB,MACCA,EAAM,OAAO,cAAc,SAAS+1C,CAAW,KAC/C/1C,EAAM,KAAK,cAAc,SAAS+1C,CAAW,KAC7C/1C,EAAM,KAAK,YAAA,EAAc,SAAS+1C,CAAW;AAAA,IAAA;AAAA,EAEnD,GAAG,CAAC1xB,GAAQqxB,CAAM,CAAC;AAGnB,EAAAj4C,EAAU,MAAM;AACd,UAAMC,IAAqB,CAACoM,MAAsB;AAChD,MAAI8rC,EAAa,WAAW,CAACA,EAAa,QAAQ,SAAS9rC,EAAM,MAAc,MAC7EF,EAAU,EAAK,GACf+rC,EAAU,EAAE;AAAA,IAEhB;AAEA,QAAIhsC;AACF,sBAAS,iBAAiB,aAAajM,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAE7E,GAAG,CAACiM,CAAM,CAAC,GAGXlM,EAAU,MAAM;AACd,IAAIkM,KAAU8rC,KAAcI,EAAe,WACzCA,EAAe,QAAQ,MAAA;AAAA,EAE3B,GAAG,CAAClsC,GAAQ8rC,CAAU,CAAC,GAEvBh4C,EAAU,MAAM;AACd,IAAI+3C,MAAe,UAAarzC,MAChCyH,EAAU,EAAI,GACd+rC,EAAU,EAAE;AAAA,EACd,GAAG,CAACH,GAAYrzC,CAAQ,CAAC;AAEzB,QAAMwhB,IAAe7lB,EAAY,MAAM;AACrC,IAAKqE,MACHyH,EAAU,CAACO,MAAS,CAACA,CAAI,GACrBR,KACFgsC,EAAU,EAAE;AAAA,EAGlB,GAAG,CAACxzC,GAAUwH,CAAM,CAAC,GAEfI,IAAejM;AAAA,IACnB,CAACkC,MAAiB;AAChB,MAAAwJ,EAASxJ,CAAK,GACd4J,EAAU,EAAK,GACf+rC,EAAU,EAAE;AAAA,IACd;AAAA,IACA,CAACnsC,CAAQ;AAAA,EAAA,GAGL3B,IAAgB/J;AAAA,IACpB,CAACgM,MAA+B;AAC9B,MAAIA,EAAM,QAAQ,YAChBF,EAAU,EAAK,GACf+rC,EAAU,EAAE,KACH7rC,EAAM,QAAQ,WAAWgsC,EAAe,WAAW,KAC5D/rC,EAAa+rC,EAAe,CAAC,CAAC;AAAA,IAElC;AAAA,IACA,CAACA,GAAgB/rC,CAAY;AAAA,EAAA;AAG/B,SACE,gBAAAvL;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKo3C;AAAA,MACL,WAAW,yBAAyBjsC,IAAS,+BAA+B,EAAE,IAAIxH,IAAW,mCAAmC,EAAE,IAAIhG,CAAS;AAAA,MAC/I,WAAW0L;AAAA,MAGX,UAAA;AAAA,QAAA,gBAAArJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAASmlB;AAAA,YACT,UAAAxhB;AAAA,YACA,iBAAc;AAAA,YACd,iBAAewH;AAAA,YAEd,UAAA;AAAA,cAAA4rC,IACC,gBAAA/2C,EAAC,QAAA,EAAK,WAAU,kCACb,UAAA;AAAA,gBAAA+2C,EAAc,WACb,gBAAAp3C;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKo3C,EAAc;AAAA,oBACnB,KAAKA,EAAc;AAAA,oBACnB,WAAU;AAAA,oBACV,SAAS,CAAC53C,MAAM;AACb,sBAAAA,EAAE,OAA4B,MAAM,UAAU;AAAA,oBACjD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGJ,gBAAAQ,EAAC,QAAA,EAAK,WAAU,uBAAuB,YAAc,OAAA,CAAO;AAAA,cAAA,GAC9D,IAEA,gBAAAA,EAAC,QAAA,EAAK,WAAU,qCAAqC,UAAAuL,GAAY;AAAA,gCAElE,QAAA,EAAK,WAAU,+BAA+B,UAAAC,IAAS,MAAM,IAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAInEA,KACC,gBAAAnL,EAAC,OAAA,EAAI,WAAU,kCAAiC,MAAK,WAElD,UAAA;AAAA,UAAAi3C,KACC,gBAAAt3C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK03C;AAAA,cACL,MAAK;AAAA,cACL,OAAOH;AAAA,cACP,UAAU,CAAC/3C,MAAMg4C,EAAUh4C,EAAE,OAAO,KAAK;AAAA,cACzC,aAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA,GAEd;AAAA,4BAID,OAAA,EAAI,WAAU,qBACZ,UAAAm4C,EAAe,WAAW,IACzB,gBAAA33C,EAAC,OAAA,EAAI,WAAU,sBAAqB,UAAA,mBAAe,2BAGhD,UAAA23C,EAAe,IAAI,CAAC91C,MACnB,gBAAAxB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,uBAAuB+2C,GAAe,SAASv1C,EAAM,OAAO,iCAAiC,EAAE;AAAA,cAC1G,SAAS,MAAM+J,EAAa/J,CAAK;AAAA,cACjC,MAAK;AAAA,cACL,iBAAeu1C,GAAe,SAASv1C,EAAM;AAAA,cAE5C,UAAA;AAAA,gBAAAA,EAAM,WACL,gBAAA7B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAK6B,EAAM;AAAA,oBACX,KAAKA,EAAM;AAAA,oBACX,WAAU;AAAA,oBACV,SAAS,CAACrC,MAAM;AACb,sBAAAA,EAAE,OAA4B,MAAM,UAAU;AAAA,oBACjD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGJ,gBAAAa,EAAC,QAAA,EAAK,WAAU,qBACd,UAAA;AAAA,kBAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,uBAAuB,UAAA6B,EAAM,QAAO;AAAA,kBACpD,gBAAA7B,EAAC,QAAA,EAAK,WAAU,qBAAqB,YAAM,KAAA,CAAK;AAAA,gBAAA,GAClD;AAAA,gBACCo3C,GAAe,SAASv1C,EAAM,0BAC5B,QAAA,EAAK,WAAU,sBAAqB,UAAA,IAAA,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,YAtBnCA,EAAM;AAAA,UAAA,CAyBd,GACH,EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AC1MO,SAASg2C,GAAiBC,GAAat3C,GAA4C;AAExF,SAAIA,EAAO,0BAA0Bs3C,KAAOt3C,EAAO,gBAAsB,YACrEs3C,KAAOt3C,EAAO,eAAqB,WAChC;AACT;ACbA,MAAAu3C,KAAe,uyBC4BTC,KAAkB,KAClBC,KAAe,KACfC,KAAc;AAEpB,SAASC,GAAUnrC,GAAuB;AACxC,SAAK,OAAO,SAASA,CAAK,IACnB,IAAI,KAAK,MAAMA,CAAK,CAAC,KADQ;AAEtC;AAEA,SAASorC,GAAYC,GAAmB73C,GAA+B;AACrE,UAAQ63C,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,IAEV,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,kBAAkBF,GAAU33C,EAAO,cAAc,CAAC;AAAA,QAC1D,MAAM;AAAA,MAAA;AAAA,EACR;AAEN;AAEA,SAAS83C,GAAMtrC,GAAe0X,GAAanqB,GAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,IAAIyS,GAAO0X,CAAG,GAAGnqB,CAAG;AAC3C;AAEA,SAASg+C,GAAYT,GAAaU,GAAwB;AACxD,MAAIA,KAAU,EAAG,QAAO;AACxB,QAAMC,IAAaH,GAAMR,IAAMU,GAAQ,GAAG,CAAC;AAC3C,SAAO,KAAK,MAAM,KAAK,IAAIC,GAAY,IAAIP,EAAW,IAAID,EAAY;AACxE;AAEA,SAASS,GAAYC,GAAkBH,GAAwB;AAC7D,QAAMC,IAAaH,GAAMK,IAAWV,IAAc,GAAG,CAAC;AACtD,SAAOO,IAAS,KAAK,IAAIC,GAAYP,EAAW;AAClD;AAEA,SAASU,GAAW5rC,GAAuB;AACzC,SAAIA,IAAQ,KAAW,OACnBA,IAAQ,MAAY,IACpBA,IAAQ,MAAY,IACpBA,IAAQ,MAAa,KACrBA,IAAQ,MAAa,KAClB;AACT;AAEA,SAAS6rC,GAAgB7zB,GAAsB;AAC7C,SAAIA,IAAO,IAAU,IACd;AACT;AAEA,SAAS8zB,GAAS9rC,GAAuB;AACvC,QAAMgY,IAAO4zB,GAAW5rC,CAAK,GACvB9S,IAAU,KAAK,MAAM8S,IAAQgY,CAAI,IAAIA,GACrC+zB,IAAWF,GAAgB7zB,CAAI;AACrC,SAAO,OAAO9qB,EAAQ,QAAQ6+C,CAAQ,CAAC;AACzC;AAKO,SAASC,GAAmB;AAAA,EACjC,QAAAx4C;AAAA,EACA,UAAAy4C;AAAA,EACA,UAAA31B;AAAA,EACA,QAAAk1B,IAASR;AAAA,EACT,UAAAh0C,IAAW;AAAA,EACX,WAAAhG,IAAY;AACd,GAA4B;AAC1B,QAAMk7C,IAAkBZ,GAAM,OAAO,SAASW,CAAQ,IAAIA,IAAW,GAAG,GAAGT,CAAM,GAC3EH,IAAOh5C,EAAQ,MAAMw4C,GAAiBqB,GAAiB14C,CAAM,GAAG,CAAC04C,GAAiB14C,CAAM,CAAC,GACzF24C,IAAWf,GAAYC,GAAM73C,CAAM,GACnC44C,IAAcb,GAAYW,GAAiBV,CAAM,GACjDa,IAAiBD,IAAcnB,KAAgB;AAErD,SACE,gBAAA53C,EAAC,OAAA,EAAI,WAAW,wBAAwBrC,CAAS,IAC/C,UAAA;AAAA,IAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,KAAC;AAAA,QACjD,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAOk5C,KAAmB;AAAA,YAC1B,UAAU,CAAC15C,MAAM8jB,EAASw1B,GAAS,WAAWt5C,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,YACnE,aAAY;AAAA,YACZ,UAAAwE;AAAA,YACA,KAAK;AAAA,YACL,MAAM40C,GAAWM,CAAe;AAAA,YAChC,WAAU;AAAA,YACV,cAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MACb,GACF;AAAA,MACA,gBAAA74C,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,QAAA,EAAK,WAAW,yDAAyDg4C,CAAI,IAC3E,UAAA;AAAA,UAAAA,MAAS,iCACP,OAAA,EAAI,KAAKN,IAAS,KAAI,OAAM,WAAU,kCAAA,CAAkC;AAAA,UAE1EoB,EAAS;AAAA,QAAA,GACZ;AAAA,QACA,gBAAAn5C,EAAC,QAAA,EAAK,WAAU,oCAAoC,YAAS,OAAA,CAAO;AAAA,MAAA,EAAA,CACtE;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAKi4C;AAAA,QACL,MAAM;AAAA,QACN,OAAOmB;AAAA,QACP,UAAU,CAAC55C,MAAM8jB,EAASw1B,GAASJ,GAAY,WAAWl5C,EAAE,OAAO,KAAK,GAAGg5C,CAAM,CAAC,CAAC;AAAA,QACnF,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY,6EAA6Ea,CAAa,2BAA2BA,CAAa;AAAA,QAAA;AAAA,QAEhJ,UAAAr1C;AAAA,QACA,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAGZm1C,EAAS,QAAQ,gBAAAn5C,EAAC,SAAI,WAAU,6BAA6B,YAAS,KAAA,CAAK;AAAA,EAAA,GAC9E;AAEJ;AC1IA,SAASs5C,GAAW94C,GAAwC;AAC1D,SACEA,EAAO,oBAAoB,KAC3BA,EAAO,cAAc,mBACrBA,EAAO,cAAc,oBACrBA,EAAO,cAAc;AAEzB;AAGA,SAAS+4C,GACP/4C,GACAg5C,GACAC,GACQ;AACR,QAAM,EAAE,WAAA/qB,GAAW,mBAAAgrB,GAAmB,gBAAAC,GAAgB,mBAAAC,MAAsBp5C;AAC5E,MAAIq5C,IAAUD;AACd,SAAIH,MACA/qB,MAAc,mBAChBmrB,KAAWF,GACPH,MACFK,KAAWH,MAEJhrB,MAAc,uBAAuB8qB,IAC9CK,KAAWH,IACFhrB,MAAc,qBACvBmrB,KAAWF,KAENE;AACT;AAiIA,MAAMC,KAAmB,KAKnBC,KAAmB;AAAA,EACvB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAShC;AACX,GAEMiC,KAAqB;AAAA,EACzB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ,GAEMC,KAAkB;AASxB,SAASC,GAAkB15C,GAA+B25C,GAAkC;AAC1F,QAAMV,IAAUU,IAAY35C,EAAO,cAC7Bg5C,IAAYW,KAAa35C,EAAO,eAChC45C,IAAuB,CAAA,GAEvBC,IACJ,CAACZ,KACDD,MACCh5C,EAAO,cAAc,mBAAmBA,EAAO,cAAc,yBAC7DA,EAAO,0BAA0B,KAAKA,EAAO,oBAAoB,IAC9D85C,IACJ,CAACb,MACAj5C,EAAO,cAAc,mBAAmBA,EAAO,cAAc,sBAC7DA,EAAO,uBAAuB,KAAKA,EAAO,iBAAiB,IACxD+5C,IAAgB/5C,EAAO,0BAA0B,KAAKA,EAAO,oBAAoB;AAEvF,MAAI65C,GAAe;AACjB,UAAMG,IAAYh6C,EAAO,0BAA0Bs5C,IAC7CW,IAAUj6C,EAAO,mBACjBk6C,IAAWF,IAAYh6C,EAAO,aAC9Bm6C,IAAaR,KAAaM,IAAU;AAC1C,IAAAL,EAAM,KAAK,EAAE,OAAO,WAAW,WAAAI,GAAW,SAAAC,GAAS,WAAWC,IAAWC,GAAY;AAAA,EACvF;AACA,MAAIL,GAAY;AACd,UAAME,IAAYh6C,EAAO,uBAAuBs5C,IAC1CW,IAAUj6C,EAAO,gBACjBk6C,IAAWF,IAAYh6C,EAAO,aAC9Bm6C,IAAaR,KAAaM,IAAU;AAC1C,IAAAL,EAAM,KAAK,EAAE,OAAO,QAAQ,WAAAI,GAAW,SAAAC,GAAS,WAAWC,IAAWC,GAAY;AAAA,EACpF;AACA,MAAIJ,GAAe;AACjB,UAAMC,IAAYh6C,EAAO,0BAA0Bs5C,IAC7CW,IAAUj6C,EAAO,mBACjBk6C,IAAWF,IAAYh6C,EAAO,aAC9Bm6C,IAAaR,KAAaM,IAAU;AAC1C,IAAAL,EAAM,KAAK,EAAE,OAAO,WAAW,WAAAI,GAAW,SAAAC,GAAS,WAAWC,IAAWC,GAAY;AAAA,EACvF;AAEA,SAAOP;AACT;AAEA,SAASQ,GACPp6C,GACA25C,GACAU,GACQ;AACR,QAAMC,IAAWZ,GAAkB15C,GAAQ25C,CAAS,GAC9CY,IAAkBF,IAAc,OAAO,OAAOA;AAEpD,MAAIC,EAAS,WAAW;AACtB,WAAO,WAAWC,EAAgB,QAAQ,CAAC,CAAC;AAI9C,QAAMC,IAAWF,EAAS,OAAO,CAAC5/C,GAAK+/C,MAAS//C,IAAM+/C,EAAK,WAAW,CAAC,GACjEC,IAAeJ,EAAS,OAAO,CAAC5/C,GAAK+/C,MAAS//C,IAAM+/C,EAAK,SAAS,CAAC,GAInEE,IAAM,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,EAAA,GAEtCC,IAAa,CAAClkD,MAA8B;AAChD,UAAMI,IAAQJ,EAAK,MAAM,OAAOikD,EAAI,GAAG,GACjCE,IAAMnkD,EAAK,UAAU,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,OAAOikD,EAAI,GAAG,GAC1DG,KAAOpkD,EAAK,QAAQ,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,OAAOikD,EAAI,IAAI,GACjErD,KAAO,MAAM,KAAK,IAAI5gD,EAAK,WAAW,IAAI,EAAE,QAAQ,CAAC,GAAG,OAAOikD,EAAI,GAAG;AAC5E,WAAO,GAAG7jD,CAAK,MAAM+jD,CAAG,MAAMC,CAAG,MAAMxD,CAAG;AAAA,EAC5C,GAEM53B,IAAS,GAAG,MAAM,OAAOi7B,EAAI,GAAG,CAAC,MAAM,MAAM,OAAOA,EAAI,GAAG,CAAC,MAAM,SAAS,OAAOA,EAAI,IAAI,CAAC,MAAM,UAAU,OAAOA,EAAI,GAAG,CAAC,IAC1HI,IAAU,GAAG,IAAI,OAAOJ,EAAI,GAAG,CAAC,MAAM,IAAI,OAAOA,EAAI,GAAG,CAAC,MAAM,IAAI,OAAOA,EAAI,IAAI,CAAC,MAAM,IAAI,OAAOA,EAAI,GAAG,CAAC,IAE5GK,KAAe,MAAMT,EAAgB,QAAQ,CAAC,GAAG,OAAOI,EAAI,GAAG,GAC/DM,IAAY,GAAG,QAAQ,OAAON,EAAI,GAAG,CAAC,MAAMH,EAAS,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,OAAOG,EAAI,GAAG,CAAC,OAAOD,EAAa,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,OAAOC,EAAI,IAAI,CAAC,MAAMK,CAAW;AAGpL,SADc,CAACt7B,GAAQq7B,GAAS,GAAGT,EAAS,IAAIM,CAAU,GAAGG,GAASE,CAAS,EAClE,KAAK;AAAA,CAAI;AACxB;AAEA,SAASC,GAA0Bl7C,GAAuC;AACxE,QAAMm7C,IAAsB,CAAA,GACtBC,IAAgBp7C,EAAO,0BAA0B,KAAKA,EAAO,oBAAoB,GACjFq7C,IAAar7C,EAAO,uBAAuB,KAAKA,EAAO,iBAAiB,GACxEs7C,IAAgBt7C,EAAO,0BAA0B,KAAKA,EAAO,oBAAoB;AAMvF,SAJIo7C,KAAeD,EAAU,KAAK,kBAAkB,GAChDE,KAAYF,EAAU,KAAK,UAAU,GACrCG,KAAeH,EAAU,KAAK,qBAAqB,GAEnDA,EAAU,WAAW,IAChB,0CAGF;AACT;AAEA,SAASI,GAAev7C,GAA+B25C,GAA2B;AAChF,MAAIA,KAAa,EAAG,QAAO;AAC3B,QAAMV,IAAUU,IAAY35C,EAAO,cAC7Bg5C,IAAYW,KAAa35C,EAAO,eAChCw7C,IAAazC,GAAuB/4C,GAAQg5C,GAAWC,CAAO;AACpE,MAAIwC,IAAoBz7C,EAAO;AAC/B,EAAKi5C,MAEDD,MACCh5C,EAAO,cAAc,mBAAmBA,EAAO,cAAc,yBAE9Dy7C,KAAqBz7C,EAAO,2BAE1BA,EAAO,cAAc,mBAAmBA,EAAO,cAAc,sBAC/Dy7C,KAAqBz7C,EAAO;AAGhC,QAAM07C,IAAeD,IAAoBnC,KAAoBt5C,EAAO,aAC9D27C,IAAgBhC,KAAa6B,IAAa;AAChD,SAAOE,IAAcC;AACvB;AAEA,SAASC,GACPC,GACAx6C,GACAqkB,GACQ;AACR,SAAIm2B,MAAiB,QACZ,QAELA,MAAiB,iBACZx6C,EAAM,SAECqkB,EAAO,KAAK,CAACo2B,MAAcA,EAAU,WAAW,MAAM,IACrD,gBAAgB;AACnC;AAEA,SAASC,GAAsB71B,GAA6B;AAC1D,SAAOA,EAAQ,IAAI,CAACD,MAAWA,EAAO,KAAA,CAAM,EAAE,OAAO,OAAO;AAC9D;AAEA,MAAM+1B,KAAoB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,MAAM,CAAC;AAEnF,SAASC,GACP56C,GACArB,GACAk8C,GACe;AAEf,MAAIF,GAAkB,IAAI36C,EAAM,MAAM,EAAG,QAAO;AAGhD,QAAM86C,IAAcn8C,EAAO,cAAcqB,EAAM,MAAM;AACrD,MAAI86C,KAAeA,IAAc,EAAG,QAAOA;AAG3C,MAAI96C,EAAM,WAAW,MAAO,QAAOrB,EAAO,eAAe;AAGzD,QAAMo8C,IAAWF,IAAiB76C,EAAM,MAAM;AAC9C,SAAI+6C,KAAYA,IAAW,IAAUA,IAE9B;AACT;AAEA,SAASC,GAAkB3qB,GAAgBzL,GAAwB;AACjE,QAAMsyB,IAAWyD,GAAkB,IAAI/1B,CAAM,IAAI,IAAI;AACrD,SAAOyL,EAAO,QAAQ6mB,CAAQ;AAChC;AAKO,SAAS+D,GAAY;AAAA,EAC1B,QAAAt8C;AAAA,EACA,cAAA67C;AAAA,EACA,eAAeU;AAAA,EACf,QAAA72B,IAAS,CAAA;AAAA,EACT,cAAA82B;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAh7C;AAAA,EACA,SAAA6B;AAAA,EACA,UAAA5B;AAAA,EACA,kBAAAg7C;AAAA,EACA,aAAAC;AAAA,EACA,WAAAp/C,IAAY;AAAA,EACZ,mBAAAq/C,IAAoB;AAAA,EACpB,cAAAC,IAAe;AAAA,EACf,UAAAC,IAAW;AAAA,EACX,mBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,UAAAC;AAAA,EACA,iBAAAC;AACF,GAAqB;AACnB,QAAM,EAAE,SAAA9nB,GAAS,WAAA4d,GAAW,OAAOmK,GAAc,YAAA97C,EAAA,IAAe60C,GAAA,GAC1Dt3B,IAASC,GAAA,GACTu+B,IAAqBvB,GAAsB/7C,EAAO,iBAAiB,GACnEu9C,IAAqBxB,GAAsB/7C,EAAO,kBAAkB,GAEpEw9C,IAAe3+C,EAAQ,MAAM;AACjC,UAAM4+C,IAAaz9C,EAAO,gBAAgB,CAAA;AAC1C,QAAIy9C,EAAW,WAAW,EAAG,QAAO/3B;AAGpC,UAAMg4B,IAAO,IAAI,IAAIh4B,EAAO,IAAI,CAACiH,OAAMA,GAAE,MAAM,CAAC,GAC1CgxB,KAAS,CAAC,GAAGj4B,CAAM;AAGzB,eAAWk4B,MAAOH;AAChB,MAAKC,EAAK,IAAIE,GAAI,MAAM,MACtBD,GAAO,KAAK;AAAA,QACV,MAAMC,GAAI;AAAA,QACV,QAAQA,GAAI;AAAA,QACZ,MAAMA,GAAI;AAAA;AAAA,QACV,UAAUA,GAAI;AAAA,QACd,SAASA,GAAI;AAAA,MAAA,CACd,GACDF,EAAK,IAAIE,GAAI,MAAM;AAGvB,WAAOD;AAAA,EACT,GAAG,CAACj4B,GAAQ1lB,EAAO,YAAY,CAAC,GAG1B69C,IAAmBh/C,EAAQ,MAAM;AACrC,QAAI0+C,EAAmB,WAAW,EAAG,QAAOC;AAC5C,UAAMrvB,IAAWqvB,EAAa,OAAO,CAACn8C,MAAUk8C,EAAmB,SAASl8C,EAAM,MAAM,CAAC;AACzF,WAAO8sB,EAAS,SAAS,IAAIA,IAAWqvB;AAAA,EAC1C,GAAG,CAACA,GAAcD,CAAkB,CAAC,GAO/BO,IAAiB99C,EAAO,wBACxB+9C,IAA+BxB,IACjCA,MAAsB,UAAU,CAACuB,IAC/B,YACAvB,IACFuB,KAAkBh/B,EAAO,oBACvB,SACA,WAIAk/B,IAAwBV,EAAmB,CAAC,IAC9CE,EAAa,KAAK,CAAC7wB,MAAMA,EAAE,WAAW2wB,EAAmB,CAAC,CAAC,IAC3D,QACEW,KACJpC,MAAiB,QACbtC,KACAsC,MAAiB,iBACdmC,KACDR,EAAa,KAAK,CAAC7wB,MAAMA,EAAE,WAAW,MAAM,KAC5C6wB,EAAa,CAAC,KACdjE,KACCiD,KACDwB,KACAR,EAAa,KAAK,CAACU,MAAcA,EAAU,WAAW,MAAM,KAC5DV,EAAa,KAAK,CAACU,MAAcA,EAAU,WAAW,KAAK,KAC3DV,EAAa,CAAC,KACdjE,IAGF4E,KAAeh/C,EAAY,MAC3B+9C,IAAsB,cACnB,UACN,CAACA,CAAa,CAAC,GAGZ,CAAC14B,GAAMivB,CAAO,IAAIn1C,EAA0B6/C,EAAY,GACxD,CAACvH,GAAewH,CAAgB,IAAI9/C,EAAgB2/C,EAAc,GAClE,CAACvsB,IAAQ2sB,EAAS,IAAI//C,EAAiB,EAAE,GACzC,CAAC+H,IAAQi4C,CAAS,IAAIhgD,EAAmC,IAAI,GAC7D,CAACigD,GAAWC,CAAY,IAAIlgD,EAAwB,IAAI,GACxD,CAAC00B,GAAWyrB,EAAY,IAAIngD,EAAwB,IAAI,GACxD,CAACogD,IAAgBC,EAAiB,IAAIrgD,EAAwB,IAAI,GAClE,CAACqU,IAAQC,EAAS,IAAItU,EAAS,EAAK,GACpC,CAACsgD,IAAeC,EAAgB,IAAIvgD,EAAS,EAAK,GAClD,CAACwgD,IAAkBC,EAAmB,IAAIzgD,EAAwB,IAAI;AAG5E,EAAAQ,EAAU,MAAM;AACd,IAAA20C,EAAQ0K,IAAc,GACtBC,EAAiBH,EAAc,GAC/BI,GAAU,EAAE,GACZC,EAAU,IAAI,GACdE,EAAa,IAAI,GACjBC,GAAa,IAAI,GACjBE,GAAkB,IAAI,GACtB/rC,GAAU,EAAK,GACfisC,GAAiB,EAAK,GACtBE,GAAoB,IAAI,GACxBx9C,EAAA;AAAA,EACF,GAAG,CAACs6C,GAAckC,GAAeE,IAAgB18C,GAAY48C,EAAY,CAAC;AAE1E,QAAMa,KAAevC,KAAaz8C,EAAO,eACnCi/C,KAAevC,GAGfwC,KAAe,WAAWxtB,EAAM,GAGhCytB,IACJrgC,EAAO,WAAW,qBAClBA,EAAO,WAAW,uBAClBA,EAAO,WAAW,YACdsgC,KAAcD,KAAcrgC,EAAO,YACnCugC,KAAcF,KAAc,CAACrgC,EAAO,YA8BpCwgC,KA3BWngD,EAAY,MAAiD;AAiB5E,QAAImgD,KACFvB,MAAkB,SAhBF;AAAA,MAChB,EAAE,KAAK,UAAmB,OAAO,YAAA;AAAA,MACjC,EAAE,KAAK,WAAoB,OAAO,OAAA;AAAA,MAClC,EAAE,KAAK,WAAoB,OAAO,UAAA;AAAA,MAClC,EAAE,KAAK,WAAoB,OAAO,WAAA;AAAA,IAAW,IAI1B;AAAA,MACnB,EAAE,KAAK,UAAmB,OAAO,YAAA;AAAA,MACjC,EAAE,KAAK,gBAAyB,OAAO,OAAA;AAAA,MACvC,EAAE,KAAK,WAAoB,OAAO,aAAA;AAAA,MAClC,EAAE,KAAK,WAAoB,OAAO,WAAA;AAAA,IAAW;AAM/C,WAAIb,MACFoC,KAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,OAAA,GAAU,GAAGA,EAAK,IAGjDA;AAAAA,EACT,GAAG,CAACvB,GAAeb,CAAa,CAAC,EAEnB,GACRqC,KAAmBD,GAAM,UAAU,CAAC9tC,MAAMA,EAAE,QAAQgT,CAAI,GAGxDg7B,KAAoBrgD,EAAY,CAACkC,MAAiB;AACtD,IAAA+8C,EAAiB/8C,CAAK;AAAA,EACxB,GAAG,CAAA,CAAE,GAGCo+C,KAAkBtgD;AAAA,IACtB,OAAOuK,MAAqB;AAC1B,UAAI,CAACkzC,GAAa;AAEhB,QAAAnJ,EAAQsK,MAAkB,SAAS,YAAY,cAAc;AAC7D;AAAA,MACF;AAEA,MAAAc,GAAiB,EAAI,GACrBL,EAAa,IAAI;AAEjB,UAAI;AAGF,cAAMn4C,KAAS,MAAMu2C,EAAYlzC,GADTq0C,MAAkB,SAASmB,KAAe,MACNtI,CAAa;AACzE,QAAA6H,GAAap4C,GAAO,SAAS,GAC7Bs4C,GAAkBt4C,GAAO,cAAc,GACvCotC,EAAQsK,MAAkB,SAAS,YAAY,cAAc;AAAA,MAC/D,SAAS/8C,GAAK;AACZ,cAAMX,KAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,sBAAsB;AAC3E,QAAAw9C,EAAan+C,GAAM,OAAO;AAAA,MAC5B,UAAA;AACE,QAAAw+C,GAAiB,EAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAACjC,GAAamB,GAAemB,IAActI,CAAa;AAAA,EAAA,GAIpD8I,KAAgBvgD;AAAA,IACpB,OAAOwgD,GAAwBC,MAAyB;AACtD,MAAAr+C,EAAA,GACAi9C,EAAa,IAAI,GACjB/K,EAAQ,SAAS;AAEjB,YAAMoM,KAAcF,KAAiBT,IAC/BY,KAAaF,KAAgBhJ;AAGnC,UAAI,CAACmG,GAAU;AACb,YAAIsC,MAAe1C,GAAkB;AACnC,UAAAA,EAAA,GACAlJ,EAAQ,SAAS;AACjB;AAAA,QACF;AAEA,YAAI,CAAC2L,IAAa;AAChB,UAAAZ,EAAa,kBAAkB,GAC/B/K,EAAQ,OAAO;AACf;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAMsM,KAAe,KAAK,MAAMF,KAAc,KAAK,IAAI,IAAIC,GAAW,QAAQ,CAAC;AAG/E,YAAI/C,GAAU;AACZ,gBAAM,IAAI,QAAQ,CAAC56C,OAAY,WAAWA,IAAS,IAAI,CAAC;AACxD,gBAAM69C,KAAgC;AAAA,YACpC,OAAOnE,MAAiB,QAAQ,OAAOiE;AAAA,YACvC,QAAQD;AAAA,YACR,oBAAoBE;AAAA,YACpB,aAAa,WAAW,KAAK,IAAA,CAAK;AAAA,YAClC,WAAW/sB,KAAa,gBAAgB,KAAK,KAAK;AAAA,YAClD,UAAU;AAAA,cACR,WAAWA,KAAa,gBAAgB,KAAK,KAAK;AAAA,cAClD,aAAa,WAAW,KAAK,IAAA,CAAK;AAAA,cAClC,gBAAgB+sB;AAAA,cAChB,SAAS;AAAA,cACT,uBAAuB,IAAI,KAAK,KAAK,IAAA,IAAQ,OAAU,KAAK,GAAI,EAAE,YAAA;AAAA,YAAY;AAAA,YAEhF,QAAQ;AAAA,UAAA;AAEV,UAAAzB,EAAU0B,EAAU,GACpBvM,EAAQ,SAAS,GACjB/xC,IAAYs+C,EAAU;AACtB;AAAA,QACF;AAIA,cAAMh9C,KAAW,MAAMsyB,EAAQyqB,EAAY,GAErCC,KAAgC;AAAA,UACpC,OAAOnE,MAAiB,QAAQ,OAAOiE;AAAA,UACvC,QAAQD;AAAA,UACR,oBAAoBE;AAAA,UACpB,aAAa/8C,GAAS;AAAA,UACtB,WAAWA,GAAS;AAAA,UACpB,UAAAA;AAAA,UACA,QAAQ;AAAA,QAAA;AAGV,QAAAs7C,EAAU0B,EAAU,GACpBvM,EAAQ,SAAS,GACjB/xC,IAAYs+C,EAAU;AAAA,MACxB,SAASh/C,IAAK;AACZ,cAAMX,KAAQW,cAAe,QAAQA,KAAM,IAAI,MAAM,gBAAgB;AACrE,QAAAw9C,EAAan+C,GAAM,OAAO,GAC1BozC,EAAQ,OAAO,GACflwC,IAAUlD,EAAK;AAAA,MACjB;AAAA,IACF;AAAA,IACA;AAAA,MACEi1B;AAAA,MACA4pB;AAAA,MACAtI;AAAA,MACAiF;AAAA,MACAkB;AAAA,MACA/pB;AAAA,MACAosB;AAAA,MACAC;AAAA,MACA1C;AAAA,MACAj7C;AAAA,MACA6B;AAAA,MACAhC;AAAA,IAAA;AAAA,EACF,GAII0+C,KAAoB9gD,EAAY,MAAM;AAC1C,IAAAs0C,EAAQ,SAAS;AAAA,EACnB,GAAG,CAAA,CAAE,GAGCyM,KAAoB/gD,EAAY,YAAY;AAChD,UAAMoe,IAAUmhC,MAAkB5/B,EAAO;AACzC,QAAIvB;AACF,UAAI;AACF,cAAM,UAAU,UAAU,UAAUA,CAAO,GAC3C3K,GAAU,EAAI,GACd,WAAW,MAAMA,GAAU,EAAK,GAAG,GAAI;AAAA,MACzC,QAAQ;AAEN,cAAMutC,IAAW,SAAS,cAAc,UAAU;AAClD,QAAAA,EAAS,QAAQ5iC,GACjB,SAAS,KAAK,YAAY4iC,CAAQ,GAClCA,EAAS,OAAA,GACT,SAAS,YAAY,MAAM,GAC3B,SAAS,KAAK,YAAYA,CAAQ,GAClCvtC,GAAU,EAAI,GACd,WAAW,MAAMA,GAAU,EAAK,GAAG,GAAI;AAAA,MACzC;AAAA,EAEJ,GAAG,CAAC8rC,IAAgB5/B,EAAO,YAAY,CAAC;AAIxC,EAAAhgB,EAAU,MAAM;AAId,QAAI,EADoB0lB,MAAS,aAAaA,MAAS,kBAAkBA,MAAS,cAC1D,CAACwO,KAAa+pB,EAAU;AAEhD,QAAIqD,IAAY,IACZC,KAAY;AAChB,UAAMC,KAAW,KAEXC,KAAO,YAAY;AACvB,UAAI,EAAAH,KAAaC,MAAaC,KAC9B;AAAA,QAAAD;AAEA,YAAI;AAGF,gBAAMrhC,KAAS,MAAMk0B,EAAUlgB,CAAS;AAExC,cAAIhU,GAAO,WAAW,eAAeA,GAAO,WAAW,YAAY;AAEjE,kBAAMwhC,KAAiBxhC,GAAO,iBAC1BA,GAAO,iBAAiB,KAAK,IAAI,IAAI43B,EAAc,QAAQ,IAC3D,GACEmJ,KAAe/gC,GAAO,kBAAkB,GAExCghC,KAAgC;AAAA,cACpC,OAAOnE,MAAiB,QAAQ,OAAOjF;AAAA,cACvC,QAAQ4J;AAAA,cACR,oBAAoBT;AAAA,cACpB,aAAa/gC,GAAO,eAAe;AAAA,cACnC,WAAAgU;AAAA,cACA,UAAUhU;AAAA,cACV,QAAQ;AAAA,cACR,gBAAgBF,EAAO,gBAAgB;AAAA,YAAA;AAGzC,YAAAw/B,EAAU0B,EAAU,GACpBvM,EAAQ,SAAS,GACjB/xC,IAAYs+C,EAAU;AACtB;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,QAAKI,KACH,WAAWG,IAAMzD,CAAY;AAAA;AAAA,IAEjC;AAEA,WAAAyD,GAAA,GAEO,MAAM;AACX,MAAAH,IAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD57B;AAAA,IACAwO;AAAA,IACA+pB;AAAA,IACA7J;AAAA,IACA0D;AAAA,IACAiF;AAAA,IACA/8B,EAAO;AAAA,IACPpd;AAAA,IACAo7C;AAAA,EAAA,CACD,GAEDh+C,EAAU,MAAM;AAGd,QAFI,CAACi+C,KAAY,CAACC,KAAqBx4B,MAAS,aAAau5B,MAAkB,aAE3E,CAACW,GAAgB;AAErB,UAAM+B,IAAU,OAAO,WAAW,MAAM;AACtC,YAAM9G,IAAYmF,MAAoB9+C,EAAO,eACvC0gD,KACJ9J,EAAc,WAAW,SAAS52C,EAAO,cAAc,IACnD25C,IAAY35C,EAAO,cACnB25C,GACAoG,KAAe,KAAK,MAAMW,KAAc,KAAK,IAAI,IAAI9J,EAAc,QAAQ,CAAC,GAC5EoJ,KAAgC;AAAA,QACpC,OAAOnE,MAAiB,QAAQ,OAAOjF;AAAA,QACvC,QAAQ8J;AAAA,QACR,oBAAoBX;AAAA,QACpB,aAAa,WAAW,KAAK,IAAA,CAAK;AAAA,QAClC,WAAW/sB,KAAa,gBAAgB,KAAK,KAAK;AAAA,QAClD,UAAU;AAAA,UACR,WAAWA,KAAa,gBAAgB,KAAK,KAAK;AAAA,UAClD,aAAa,WAAW,KAAK,IAAA,CAAK;AAAA,UAClC,gBAAgB+sB;AAAA,UAChB,SAAS;AAAA,UACT,uBAAuB,IAAI,KAAK,KAAK,IAAA,IAAQ,OAAU,KAAK,GAAI,EAAE,YAAA;AAAA,QAAY;AAAA,QAEhF,QAAQ;AAAA,QACR,gBAAgBrB,MAAkB;AAAA,MAAA;AAEpC,MAAAJ,EAAU0B,EAAU,GACpBvM,EAAQ,SAAS,GACjB/xC,IAAYs+C,EAAU;AAAA,IACxB,GAAGhD,CAAiB;AAEpB,WAAO,MAAM,OAAO,aAAayD,CAAO;AAAA,EAC1C,GAAG;AAAA,IACD1D;AAAA,IACAC;AAAA,IACAx4B;AAAA,IACAu5B;AAAA,IACAW;AAAA,IACAI;AAAA,IACA9+C;AAAA,IACA42C;AAAA,IACAiF;AAAA,IACA7oB;AAAA,IACAtxB;AAAA,EAAA,CACD;AAGD,QAAM6gB,KAAcpjB,EAAY,MAAM;AACpC,IAAAs0C,EAAQ0K,IAAc,GACtBE,GAAU,EAAE,GACZC,EAAU,IAAI,GACdE,EAAa,IAAI,GACjBj9C,EAAA;AAAA,EACF,GAAG,CAAC48C,IAAc58C,CAAU,CAAC;AAG7B,SAAKvB,EAAO,UASV,gBAAAH,EAAC,OAAA,EAAI,WAAW,uBAAuBrC,CAAS,IAE7C,UAAA;AAAA,IAAAq/C,KAAqBr4B,MAAS,WAC7B,gBAAAhlB,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA8/C,GAAM,IAAI,CAAC9tC,GAAGmvC,MAAQ;AACrB,YAAMC,KAAWrB,MAAoBoB,GAC/BE,KAAYrvC,EAAE,QAAQgT;AAC5B,aACE,gBAAA3kB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,iCAAiC+gD,KAAW,gBAAgB,EAAE;AAAA,UAEzE,UAAA;AAAA,YAAA,gBAAAphD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,mCAAmCohD,KAAW,WAAW,EAAE,IAAIC,KAAY,YAAY,EAAE;AAAA,gBAEnG,UAAAF,IAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAET,gBAAAnhD,EAAC,UAAK,WAAW,kCAAkCohD,KAAW,WAAW,EAAE,IACxE,UAAApvC,EAAE,MAAA,CACL;AAAA,UAAA;AAAA,QAAA;AAAA,QAVKA,EAAE;AAAA,MAAA;AAAA,IAab,CAAC,EAAA,CACH;AAAA,IAIF,gBAAA3R,EAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,MAAA2kB,MAAS,eACR,gBAAAhlB;AAAA,QAACshD;AAAA,QAAA;AAAA,UACC,UAAA3D;AAAA,UACA,QAAQC;AAAA,UACR,eAAep9C;AAAA,UACf,cAAA67C;AAAA,UACA,OAAOjF;AAAA,UACP,QAAQiH;AAAA,UACR,YAAY,MAAMpK,EAAQ,QAAQ;AAAA,UAClC,UAAA9xC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH6iB,MAAS,YACR,gBAAAhlB;AAAA,QAACuhD;AAAA,QAAA;AAAA,UACC,OAAOnK;AAAA,UACP,QAAQiH;AAAA,UACR,cAAAhC;AAAA,UACA,eAAAkC;AAAA,UACA,eAAAa;AAAA,UACA,OAAOL;AAAA,UACP,aAAakB;AAAA,UACb,QAAQvC,IAAgB,MAAMzJ,EAAQ,WAAW,IAAI;AAAA,UACrD,UAAA9xC;AAAA,QAAA;AAAA,MAAA;AAAA,MAKH6iB,MAAS,aAAau5B,MAAkB,UACvC,gBAAAv+C;AAAA,QAACwhD;AAAA,QAAA;AAAA,UACC,OAAOpK;AAAA,UACP,QAAQ4G;AAAA,UACR,oBAAAF;AAAA,UACA,oBAAAC;AAAA,UACA,cAAA1B;AAAA,UACA,WAAWmD;AAAA,UACX,WAAWC;AAAA,UACX,gBAAgBP,MAAkB5/B,EAAO;AAAA,UACzC,aAAasgC,MAAerC;AAAA,UAC5B,aAAasC,MAAe,CAACtC;AAAA,UAC7B,QAAApqC;AAAA,UACA,aAAa,CAAC,CAACqgB,KAAa,CAAC+pB;AAAA,UAC7B,QAAA/8C;AAAA,UACA,QAAQkgD;AAAA,UACR,eAAeV;AAAA,UACf,kBAAA7C;AAAA,UACA,WAAW,CAACsE,GAAKC,MAAQxB,GAAcuB,GAAKC,CAAG;AAAA,UAC/C,QAAQ,MAAMzN,EAAQ,QAAQ;AAAA,UAC9B,UAAA9xC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH6iB,MAAS,aAAa,gBAAAhlB,EAAC2hD,IAAA,EAAY,gBAAgBriC,EAAO,cAAc;AAAA,MAGxE0F,MAAS,kBACR,gBAAAhlB;AAAA,QAAC4hD;AAAA,QAAA;AAAA,UACC,OAAOxK;AAAA,UACP,QAAQ4G;AAAA,UACR,oBAAAF;AAAA,UACA,oBAAAC;AAAA,UACA,eAAAN;AAAA,UACA,cAAApB;AAAA,UACA,gBAAgB6C,MAAkB5/B,EAAO;AAAA,UACzC,QAAAnM;AAAA,UACA,aAAa,CAAC,CAACqgB,KAAa,CAAC+pB;AAAA,UAC7B,QAAA/8C;AAAA,UACA,QAAQkgD;AAAA,UACR,eAAeV;AAAA,UACf,gBAAgBT;AAAA,UAChB,QAAQkB;AAAA,UACR,QAAQ,MAAMxM,EAAQ,QAAQ;AAAA,UAC9B,UAAA9xC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH6iB,MAAS,aACR,gBAAAhlB;AAAA,QAAC6hD;AAAA,QAAA;AAAA,UACC,OAAOzK;AAAA,UACP,gBAAgB8H,MAAkB5/B,EAAO;AAAA,UACzC,QAAAnM;AAAA,UACA,SACEmsC,KACI,UAAU,KAAK,IAAIvD,GAAev7C,GAAQ8+C,EAAgB,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,WAC7E;AAAA,UAEN,QAAQoB;AAAA,QAAA;AAAA,MAAA;AAAA,MAIX17B,MAAS,aAAane,MACrB,gBAAA7G,EAAC8hD,MAAY,QAAAj7C,IAAgB,QAAArG,GAAgB,cAAcuiB,IAAa;AAAA,MAGzEiC,MAAS,WACR,gBAAAhlB;AAAA,QAAC+hD;AAAA,QAAA;AAAA,UACC,OAAOhD,KAAalB,KAAgB;AAAA,UACpC,SAAS,MAAM5J,EAAQ,SAAS;AAAA,UAChC,UAAA9xC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CAEJ;AAAA,EAAA,GACF,IAzIE,gBAAAnC,EAAC,SAAI,WAAW,oDAAoDhC,CAAS,IAC3E,UAAA,gBAAAgC,EAAC,KAAA,EAAE,UAAA,wCAAA,CAAqC,EAAA,CAC1C;AAyIN;AAiBA,SAASshD,GAAc;AAAA,EACrB,UAAA3D;AAAA,EACA,QAAAn9C;AAAA,EACA,eAAAwhD;AAAA,EACA,cAAA3F;AAAA,EACA,OAAAx6C;AAAA,EACA,QAAAqkB;AAAA,EACA,YAAA+7B;AAAA,EACA,UAAA9/C;AACF,GAAuB;AACrB,QAAMiH,IAAQ5I,GAAQ,SAAS,qBACzB0hD,IAAe1hD,GAAQ,gBAAgB,YACvC2hD,IAAcC,GAAoB5hD,GAAQ,WAAW,KAAK,4BAC1D6hD,IAAe7hD,GAAQ,2BAA2B,IAClD8hD,IAAwBlG,GAAyBC,GAAcx6C,GAAOqkB,CAAM,GAE5Eq8B,IAAc5E,IAChB,GAAGA,CAAQ,qEACX,6EAEE6E,IAAOhiD,GAAQ,QAAQ+hD,GAGvBE,IAAcnJ,GAAW0I,CAAa,GACtCU,IAAiBhH,GAA0BsG,CAAa;AAE9D,SACE,gBAAA3hD,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,kCAAkC,UAAAoJ,GAAM;AAAA,IACtD,gBAAApJ,EAAC,KAAA,EAAE,WAAU,iCAAiC,UAAAwiD,GAAK;AAAA,IAEnD,gBAAAniD,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qEAAA,CAAqE;AAAA,0BACpF,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,YAAO,UAAA,mBAAA,CAAgB;AAAA,UACxB,gBAAAA,EAAC,OAAE,UAAA,mEAAA,CAAgE;AAAA,QAAA,EAAA,CACrE;AAAA,MAAA,GACF;AAAA,MACA,gBAAAK,EAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,mEAAA,CAAmE;AAAA,0BAClF,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,YAAO,UAAA,oBAAA,CAAiB;AAAA,UACzB,gBAAAA,EAAC,OAAE,UAAA,uDAAA,CAAoD;AAAA,QAAA,EAAA,CACzD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAK,EAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,mEAAA,CAAmE;AAAA,0BAClF,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,UAAA,EAAQ,UAAAyiD,IAAc,qBAAqB,YAAW;AAAA,UACvD,gBAAAziD,EAAC,OAAG,UAAA0iD,EAAA,CAAe;AAAA,QAAA,EAAA,CACrB;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAECL,uBACE,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAhiD,EAAC,KAAA,EAAE,WAAU,+CACX,UAAA;AAAA,MAAA,gBAAAL,EAAC,YAAO,UAAA,iBAAA,CAAc;AAAA,MAAS;AAAA,MAAmBsiD;AAAA,MAAsB;AAAA,MACzD;AAAA,MACf,gBAAAtiD,EAAC,OAAE,MAAMmiD,GAAa,QAAO,UAAS,KAAI,uBACvC,UAAAD,EAAA,CACH;AAAA,MAAI;AAAA,IAAA,EAAA,CAEN,EAAA,CACF;AAAA,IAGF,gBAAA7hD,EAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,MAAA8B,KACC,gBAAAnC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASmC;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH,gBAAAnC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASiiD;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAcA,SAASV,GAAW;AAAA,EAClB,OAAA1/C;AAAA,EACA,QAAAqkB;AAAA,EACA,cAAAm2B;AAAA,EACA,eAAAkC;AAAA,EACA,eAAAa;AAAA,EACA,OAAAv+C;AAAA,EACA,aAAAu8C;AAAA,EACA,QAAA1kB;AACF,GAAoB;AAClB,QAAM,CAACxuB,GAAUC,CAAW,IAAIrL,EAAS,EAAE,GACrCwjD,IAAwBlG,GAAyBC,GAAcx6C,GAAOqkB,CAAM,GAE5E3jB,IAAe,CAAC/C,MAAuB;AAC3C,IAAAA,EAAE,eAAA,GACE0K,EAAS,UACXkzC,EAAYlzC,CAAQ;AAAA,EAExB;AAEA,SACE,gBAAA7J,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,qBAAiB;AAAA,sBAC/D,KAAA,EAAE,WAAU,iCACV,UAAAu+C,MAAkB,SACflC,MAAiB,gBACf,wHACA,sCAAsCiG,CAAqB,sFAC7DjG,MAAiB,gBACf,gIACA,wDAAwDiG,CAAqB,2DACrF;AAAA,IAEA,gBAAAjiD,EAAC,QAAA,EAAK,UAAUkC,GACd,UAAA;AAAA,MAAA,gBAAAlC,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BAA4B,SAAQ,oBAAmB,UAAA,YAExE;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,OAAOkK;AAAA,YACP,UAAU,CAAC1K,MAAM2K,EAAY3K,EAAE,OAAO,KAAK;AAAA,YAC3C,WAAU;AAAA,YACV,aAAY;AAAA,YACZ,UAAU4/C;AAAA,YACV,cAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MACf,GACF;AAAA,MAECv+C,KAAS,gBAAAb,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAAa,GAAM;AAAA,MAE1D,gBAAAR,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS04B;AAAA,YACT,UAAU0mB;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAp/C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU,CAACkK,EAAS,KAAA,KAAUk1C;AAAA,YAE7B,cAAgB,mBAAmB;AAAA,UAAA;AAAA,QAAA;AAAA,MACtC,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAwBA,SAASoC,GAAY;AAAA,EACnB,OAAA3/C;AAAA,EACA,QAAAqkB;AAAA,EACA,oBAAA43B;AAAA,EACA,oBAAAC;AAAA,EACA,cAAA1B;AAAA,EACA,WAAAY;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAgC;AAAA,EACA,aAAAU;AAAA,EACA,aAAAC;AAAA,EACA,QAAA1sC;AAAA,EACA,aAAAwvC;AAAA,EACA,QAAAniD;AAAA,EACA,QAAAoiD;AAAA,EACA,eAAAC;AAAA,EACA,kBAAA1F;AAAA,EACA,WAAAjqC;AAAA,EACA,QAAAwlB;AACF,GAAqB;AACnB,QAAM,CAACyhB,GAAW2I,CAAY,IAAIhkD,EAAS0B,EAAO,aAAa,GACzD,CAACuiD,GAAiBC,CAAkB,IAAIlkD,EAAS,EAAK,GACtD,CAACmkD,GAAgBC,CAAiB,IAAIpkD,EAAS,EAAK,GACpD,CAACqkD,GAAkBC,CAAmB,IAAItkD,EAAS,CAAC,GAEpD,CAACukD,GAAeC,CAAgB,IAAIxkD,EAAuB,IAAI,GAE/DykD,IADO1L,GAAiBsC,GAAW35C,CAAM,MAClB,aACvBgjD,IAAe3hD,EAAM,WAAWm4C,GAAY,QAC5CyJ,IAAepkD,EAAQ,MAAM;AACjC,UAAMqkD,IACJ3F,EAAmB,WAAW,IAC1B73B,IACAA,EAAO,OAAO,CAACw4B,OAAcX,EAAmB,SAASW,GAAU,MAAM,CAAC,GAC1EiF,IAAWD,EAAW,SAAS,IAAIA,IAAax9B;AAEtD,WADiBy9B,EAAS,KAAK,CAACjF,OAAcA,GAAU,WAAW1E,GAAY,MAAM,IACnE2J,IAAW,CAAC,GAAGA,GAAU3J,EAAW;AAAA,EACxD,GAAG,CAAC9zB,GAAQ63B,CAAkB,CAAC,GACzBlD,IAAckB,GAAev7C,GAAQ25C,CAAS,GAC9CY,KAAkBF,IAAc,OAAO,OAAOA,GAC9C+I,KAAUJ,IACZ,mCACA,UAAUzI,GAAgB,QAAQ,CAAC,CAAC,UAClC8I,IAAaL,IAAe,KAAK5I,GAAiBp6C,GAAQ25C,GAAWU,CAAW,GAEhFiJ,IAAgBrH,GAAiB8G,IAAcxJ,KAAYl4C,GAAOrB,CAAM,GACxE0gD,IAAc4C,IAChB3J,IAAY2J,IACZjiD,EAAM,WAAW,SAASrB,EAAO,cAAc,IAC7C25C,IAAY35C,EAAO,cACnB25C,GACA4J,IAAkB7C,IACpBrE,GAAkBqE,GAAaqC,IAAc,QAAQ1hD,EAAM,MAAM,IACjE,MAIEmiD,KADe7J,IAAYU,KACQ,KAAKV,IAAY,GAEpD8J,KACJ,CAACT,KACDrJ,IAAY,KACZ,CAAC6J,MACD9C,KAAejE,KACfiE,KAAehE;AAGjB,EAAA59C,EAAU,MAAM;AACd,QAAI+8C,MAAiB;AAErB,UAAIkH,KAAe1hD,EAAM,WAAW,OAAO;AAEzC,QAAAyhD,EAAiBzhD,CAAK;AACtB,cAAMqiD,IAAWh+B,EAAO,KAAK,CAACiH,MAAMA,EAAE,WAAW,KAAK;AACtD,QAAI+2B,OAAwBA,CAAQ;AAAA,MACtC,OAAW,CAACX,KAAeF,KAAiBxhD,EAAM,WAAW,UAE3DghD,EAAcQ,CAAa,GAC3BC,EAAiB,IAAI;AAAA,EAEzB,GAAG,CAACC,GAAa1hD,EAAM,QAAQw6C,GAAcn2B,GAAQ28B,GAAeQ,GAAexhD,CAAK,CAAC;AAEzF,QAAM6R,IAAgB,MAAM;AAC1B,IAAIuwC,MACF/wC,EAAUguC,GAAar/C,CAAK;AAAA,EAEhC;AAEA,SACE,gBAAAxB,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,iBAAa;AAAA,IAC5D,gBAAAA,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,kEAE7C;AAAA,IAGCq8C,MAAiB,iBAAiB,CAACkH,KAClC,gBAAAljD,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BAA4B,UAAA,SAAK;AAAA,MAClD,gBAAAK,EAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,QAAAy9C,EAAmB,IAAI,CAACr3B,MAAW;AAClC,gBAAM09B,IAAaj+B,EAAO,KAAK,CAACw4B,OAAcA,GAAU,WAAWj4B,CAAM,GACnE26B,IAAWv/C,EAAM,WAAW4kB;AAClC,iBACE,gBAAApmB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,uCAAuC+gD,IAAW,cAAc,EAAE;AAAA,cAC7E,SAAS,MAAM;AACb,gBAAI+C,MACFnB,EAAmB,EAAK,GACxBH,EAAcsB,CAAU;AAAA,cAE5B;AAAA,cACA,UAAU,CAACA;AAAA,cAEV,UAAA;AAAA,gBAAAA,GAAY,WACX,gBAAAnkD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAKmkD,EAAW;AAAA,oBAChB,KAAK,GAAG19B,CAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGjBA;AAAA,cAAA;AAAA,YAAA;AAAA,YAlBIA;AAAA,UAAA;AAAA,QAqBX,CAAC;AAAA,QACD,gBAAAzmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,uCAAuC+iD,IAAkB,cAAc,EAAE;AAAA,YACpF,SAAS,MAAM;AACb,cAAAC,EAAmB,EAAI,GACvBI,EAAoB,CAACgB,MAAYA,IAAU,CAAC;AAAA,YAC9C;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MACCrB,KACC,gBAAA/iD,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA,gBAAAA;AAAA,QAACm3C;AAAA,QAAA;AAAA,UACC,QAAQsM;AAAA,UACR,eAAe5hD;AAAA,UACf,UAAUghD;AAAA,UACV,YAAYM;AAAA,QAAA;AAAA,MAAA,EACd,CACF;AAAA,IAAA,GAEJ;AAAA,IAIF,gBAAAnjD,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAA;AAAA,MAACg5C;AAAA,MAAA;AAAA,QACC,QAAAx4C;AAAA,QACA,UAAU25C;AAAA,QACV,UAAU2I;AAAA,QACV,QAAQ7I;AAAA,MAAA;AAAA,IAAA,GAEZ;AAAA,IAGA,gBAAA55C,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BACd,UAAAwjD,IACG,wCACA,gBAAgBO,KAAmB,IAAI,IAAIR,IAAc,QAAQ1hD,EAAM,MAAM,oBACnF;AAAA,MACA,gBAAAxB,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAA+B,UAAAk/C,KAAkB,cAAa;AAAA,QAC9E,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,UAAA,gBAAAL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS4iD;AAAA,cACT,OAAM;AAAA,cACN,UAAU,CAAC1D;AAAA,cAEV,cAAS,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAEjBA,KACC,gBAAAl/C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM,iCAAiCk/C,CAAc;AAAA,cACrD,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,OAAM;AAAA,cACP,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MACC/rC,KAAU,gBAAAnT,EAAC,KAAA,EAAE,WAAU,kCAAiC,UAAA,UAAA,CAAO;AAAA,IAAA,GAClE;AAAA,IAGCgkD,wBACE,OAAA,EAAI,WAAU,+BACb,UAAA,gBAAAhkD,EAAC,KAAA,EAAE,mFAAqE,EAAA,CAC1E;AAAA,IAGF,gBAAAK,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,QAC/C,gBAAAA,EAAC,UAAK,UAAA,mCAAA,CAAgC;AAAA,MAAA,GACxC;AAAA,MACA,gBAAAK,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,0BAC9C,QAAA,EACE,UAAA;AAAA,UAAA4jD;AAAA,UACD,gBAAA5jD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,gCAAgCijD,IAAiB,YAAY,EAAE;AAAA,cAC1E,gBAAcY;AAAA,cACd,cAAY,kBAAkBA,EAAW,WAAW;AAAA,GAAM,IAAI,CAAC;AAAA,cAC/D,iBAAeZ;AAAA,cACf,SAAS,CAACt3C,MAAU;AAClB,gBAAAA,EAAM,gBAAA,GACNu3C,EAAkB,CAACkB,MAAY,CAACA,CAAO;AAAA,cACzC;AAAA,cACA,QAAQ,MAAMlB,EAAkB,EAAK;AAAA,cACrC,WAAW,CAACv3C,MAAU;AACpB,gBAAIA,EAAM,QAAQ,YAChBu3C,EAAkB,EAAK;AAAA,cAE3B;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,gBAAA7iD,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,QAC/C,gBAAAA,EAAC,UAAK,UAAA,6CAAA,CAA0C;AAAA,MAAA,EAAA,CAClD;AAAA,IAAA,GACF;AAAA,IAEC2iD,KACC,gBAAA3iD,EAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,oEAEjD;AAAA,IAGD6/C,KACC,gBAAAx/C,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,OAAE,UAAA,gDAAA,CAA6C;AAAA,MAC/Cm9C,KACC,gBAAAn9C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASm9C;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GAEJ;AAAA,IAGF,gBAAA98C,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS04B;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAA14B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS0T;AAAA,UACT,UAAU,CAACuwC,MAAiB,CAACrE,KAAe,CAACV;AAAA,UAC9C,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAMA,SAASyC,GAAY,EAAE,gBAAAzC,KAAoC;AACzD,SACE,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,8BAAA,CAA8B;AAAA,IAC7C,gBAAAA,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,oBAAgB;AAAA,IAC/D,gBAAAA,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,oDAE7C;AAAA,IACCk/C,KACC,gBAAA7+C,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA;AAAA,MAAA;AAAA,MAClC;AAAA,wBACX,QAAA,EACE,UAAA;AAAA,QAAA6+C,EAAe,MAAM,GAAG,CAAC;AAAA,QAAE;AAAA,QAAIA,EAAe,MAAM,EAAE;AAAA,MAAA,EAAA,CACzD;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAyBA,SAAS0C,GAAgB;AAAA,EACvB,OAAA//C;AAAA,EACA,QAAAqkB;AAAA,EACA,oBAAA43B;AAAA,EACA,oBAAAC;AAAA,EACA,eAAAN;AAAA,EACA,cAAApB;AAAA,EACA,gBAAA6C;AAAA,EACA,QAAA/rC;AAAA,EACA,aAAAwvC;AAAA,EACA,QAAAniD;AAAA,EACA,QAAAoiD;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAwB;AAAA,EACA,QAAAC;AAAA,EACA,QAAA5rB;AACF,GAAyB;AACvB,QAAM,CAACyhB,GAAW2I,CAAY,IAAIhkD,EAAS0B,EAAO,aAAa,GACzD,CAACuiD,GAAiBC,CAAkB,IAAIlkD,EAAS,EAAK,GACtD,CAACmkD,GAAgBC,CAAiB,IAAIpkD,EAAS,EAAK,GACpD,CAACqkD,GAAkBC,CAAmB,IAAItkD,EAAS,CAAC,GAEpD,CAACukD,GAAeC,CAAgB,IAAIxkD,EAAuB,IAAI,GAE/DykD,IADO1L,GAAiBsC,GAAW35C,CAAM,MAClB,aACvBgjD,IAAe3hD,EAAM,WAAWm4C,GAAY,QAC5CyJ,IAAepkD,EAAQ,MAAM;AACjC,UAAMqkD,IACJ3F,EAAmB,WAAW,IAC1B73B,IACAA,EAAO,OAAO,CAACw4B,OAAcX,EAAmB,SAASW,GAAU,MAAM,CAAC,GAC1EiF,IAAWD,EAAW,SAAS,IAAIA,IAAax9B;AAEtD,WADiBy9B,EAAS,KAAK,CAACjF,OAAcA,GAAU,WAAW1E,GAAY,MAAM,IACnE2J,IAAW,CAAC,GAAGA,GAAU3J,EAAW;AAAA,EACxD,GAAG,CAAC9zB,GAAQ63B,CAAkB,CAAC,GACzBlD,IAAckB,GAAev7C,GAAQ25C,CAAS,GAC9CY,IAAkBF,IAAc,OAAO,OAAOA,GAC9C+I,IAAUJ,IACZ,mCACA,UAAUzI,EAAgB,QAAQ,CAAC,CAAC,UAClC8I,IAAaL,IAAe,KAAK5I,GAAiBp6C,GAAQ25C,GAAWU,CAAW,GAChF0J,KAAYf,KAAgBrJ,IAAY,GACxC2J,KAAgBrH,GAAiB8G,IAAcxJ,KAAYl4C,GAAOrB,GAAQi9C,CAAa,GACvFyD,IAAc4C,KAAgB3J,IAAY2J,KAAgB,MAC1DC,IAAkB7C,IAAcrE,GAAkBqE,GAAar/C,EAAM,MAAM,IAAI;AAsBrF,SAnBAvC,EAAU,MAAM;AACd,QAAI+8C,MAAiB;AAErB,UAAIkH,KAAe1hD,EAAM,WAAW,OAAO;AAEzC,QAAAyhD,EAAiBzhD,CAAK;AACtB,cAAMqiD,IAAWh+B,EAAO,KAAK,CAACiH,MAAMA,EAAE,WAAW,KAAK;AACtD,QAAI+2B,OAAwBA,CAAQ;AAAA,MACtC,OAAW,CAACX,KAAeF,KAAiBxhD,EAAM,WAAW,UAE3DghD,EAAcQ,CAAa,GAC3BC,EAAiB,IAAI;AAAA,EAEzB,GAAG,CAACC,GAAa1hD,EAAM,QAAQw6C,GAAcn2B,GAAQ28B,GAAeQ,GAAexhD,CAAK,CAAC,GAEzFvC,EAAU,MAAM;AACd,IAAA+kD,EAAelK,CAAS;AAAA,EAC1B,GAAG,CAACA,GAAWkK,CAAc,CAAC,GAEzBnF,IAaH,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,gBAAY;AAAA,IAC3D,gBAAAA,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,oEAE7C;AAAA,IAGCq8C,MAAiB,iBAAiB,CAACkH,KAClC,gBAAAljD,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BAA4B,UAAA,SAAK;AAAA,MAClD,gBAAAK,EAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,QAAAy9C,EAAmB,IAAI,CAACr3B,MAAW;AAClC,gBAAM09B,IAAaj+B,EAAO,KAAK,CAACw4B,OAAcA,GAAU,WAAWj4B,CAAM,GACnE26B,KAAWv/C,EAAM,WAAW4kB;AAClC,iBACE,gBAAApmB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,uCAAuC+gD,KAAW,cAAc,EAAE;AAAA,cAC7E,SAAS,MAAM;AACb,gBAAI+C,MACFnB,EAAmB,EAAK,GACxBH,EAAcsB,CAAU;AAAA,cAE5B;AAAA,cACA,UAAU,CAACA;AAAA,cAEV,UAAA;AAAA,gBAAAA,GAAY,WACX,gBAAAnkD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAKmkD,EAAW;AAAA,oBAChB,KAAK,GAAG19B,CAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGjBA;AAAA,cAAA;AAAA,YAAA;AAAA,YAlBIA;AAAA,UAAA;AAAA,QAqBX,CAAC;AAAA,QACD,gBAAAzmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,uCAAuC+iD,IAAkB,cAAc,EAAE;AAAA,YACpF,SAAS,MAAM;AACb,cAAAC,EAAmB,EAAI,GACvBI,EAAoB,CAACgB,MAAYA,IAAU,CAAC;AAAA,YAC9C;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,GACF;AAAA,MACCrB,KACC,gBAAA/iD,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA,gBAAAA;AAAA,QAACm3C;AAAA,QAAA;AAAA,UACC,QAAQsM;AAAA,UACR,eAAe5hD;AAAA,UACf,UAAUghD;AAAA,UACV,YAAYM;AAAA,QAAA;AAAA,MAAA,EACd,CACF;AAAA,IAAA,GAEJ;AAAA,IAID,CAACK,KACA,gBAAAnjD,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BAA4B,UAAA,kBAAc;AAAA,MAC3D,gBAAAA;AAAA,QAACg5C;AAAA,QAAA;AAAA,UACC,QAAAx4C;AAAA,UACA,UAAU25C;AAAA,UACV,UAAU2I;AAAA,UACV,QAAQ7I;AAAA,QAAA;AAAA,MAAA;AAAA,IACV,GACF;AAAA,IAGDuJ,KACC,gBAAAxjD,EAAC,OAAA,EAAI,WAAU,4BAA2B,UAAA,sGAG1C;AAAA,IAIF,gBAAAK,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BACd,UAAAwjD,IACG,mCACA,QAAQO,KAAmB,IAAI,IAAIR,IAAc,QAAQ1hD,EAAM,MAAM,oBAC3E;AAAA,MACA,gBAAAxB,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAA+B,UAAAk/C,GAAe;AAAA,QAC9D,gBAAAl/C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS4iD;AAAA,YACT,OAAM;AAAA,YAEL,cAAS,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAClB,GACF;AAAA,MACCzvC,KAAU,gBAAAnT,EAAC,KAAA,EAAE,WAAU,kCAAiC,UAAA,UAAA,CAAO;AAAA,IAAA,GAClE;AAAA,IAEA,gBAAAK,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,QAC/C,gBAAAA,EAAC,UAAK,UAAA,mCAAA,CAAgC;AAAA,MAAA,GACxC;AAAA,MACA,gBAAAK,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,0BAC9C,QAAA,EACE,UAAA;AAAA,UAAA4jD;AAAA,UACA,CAACJ,KACA,gBAAAxjD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,gCAAgCijD,IAAiB,YAAY,EAAE;AAAA,cAC1E,gBAAcY;AAAA,cACd,cAAY,kBAAkBA,EAAW,WAAW;AAAA,GAAM,IAAI,CAAC;AAAA,cAC/D,iBAAeZ;AAAA,cACf,SAAS,CAACt3C,MAAU;AAClB,gBAAAA,EAAM,gBAAA,GACNu3C,EAAkB,CAACkB,MAAY,CAACA,CAAO;AAAA,cACzC;AAAA,cACA,QAAQ,MAAMlB,EAAkB,EAAK;AAAA,cACrC,WAAW,CAACv3C,MAAU;AACpB,gBAAIA,EAAM,QAAQ,YAChBu3C,EAAkB,EAAK;AAAA,cAE3B;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MACA,gBAAA7iD,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,QAC/C,gBAAAA,EAAC,UAAK,UAAA,sDAAA,CAAmD;AAAA,MAAA,EAAA,CAC3D;AAAA,IAAA,GACF;AAAA,IAEC2iD,KACC,gBAAA3iD,EAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,iEAEjD;AAAA,IAGF,gBAAAK,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS04B;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAA14B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASskD;AAAA,UACT,UAAU,CAACC;AAAA,UACZ,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,GACF,IA/KE,gBAAAlkD,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,KAAC;AAAA,IACjD,gBAAAA,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,oBAAgB;AAAA,IAC/D,gBAAAA,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,+EAAA,CAE7C;AAAA,EAAA,GACF;AA2KN;AAUA,SAAS6hD,GAAY,EAAE,OAAAhgD,GAAO,gBAAAq9C,GAAgB,QAAA/rC,GAAQ,SAAAywC,GAAS,QAAAhB,KAA4B;AACzF,SACE,gBAAAviD,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,8BAAA,CAA8B;AAAA,IAC7C,gBAAAA,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,uBAAmB;AAAA,IAClE,gBAAAK,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA;AAAA,MAAA;AAAA,MACtB,gBAAAL,EAAC,UAAA,EAAQ,UAAA6B,EAAM,OAAA,CAAO;AAAA,MAAS;AAAA,IAAA,GACtD;AAAA,IAEA,gBAAAxB,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA,4IAGhD;AAAA,MACCk/C,KACC,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,SAAA,EAAM,WAAU,6BAA4B,UAAA,mBAAe;AAAA,QAC5D,gBAAAK,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,+BACb,UAAA;AAAA,YAAA6+C,EAAe,MAAM,GAAG,CAAC;AAAA,YAAE;AAAA,YAAIA,EAAe,MAAM,EAAE;AAAA,UAAA,GACzD;AAAA,UACA,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,YAAA,gBAAAL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS4iD;AAAA,gBACT,OAAM;AAAA,gBAEL,cAAS,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAElB,gBAAA5iD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAM,iCAAiCk/C,CAAc;AAAA,gBACrD,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,OAAM;AAAA,gBACP,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEF,gBAAA7+C,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,UAC/C,gBAAAA,EAAC,UAAK,UAAA,mCAAA,CAAgC;AAAA,QAAA,GACxC;AAAA,QACA,gBAAAK,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,+BAAA,CAA+B;AAAA,UAC/C,gBAAAA,EAAC,UAAM,UAAA4jD,EAAA,CAAQ;AAAA,QAAA,EAAA,CACjB;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAQA,SAAS9B,GAAY,EAAE,QAAAj7C,GAAQ,QAAArG,GAAQ,cAAAgkD,KAAkC;AACvE,QAAM3iD,IAAQgF,EAAO,SAASkzC,IACxBI,IACJt4C,EAAM,WAAW,SAASrB,EAAO,cAAc,IAC3CqG,EAAO,SAASrG,EAAO,cACvBqG,EAAO,QACPg0C,IAAckB,GAAev7C,GAAQ25C,CAAS,GAC9CsK,IAAa,KAAK,IAAItK,IAAYU,GAAa,CAAC,GAChD6J,IAAkB7J,IAAc,OAAO,OAAOA;AAEpD,SACE,gBAAAx6C,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,KAAC;AAAA,IACnD,gBAAAA,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,uBAAmB;AAAA,IAClE,gBAAAK,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA;AAAA,MAAA;AAAA,MAC1BwG,EAAO,OAAO,eAAA;AAAA,MAAiB;AAAA,MAAEhF,EAAM;AAAA,MAAO;AAAA,IAAA,GACjE;AAAA,IAEA,gBAAAxB,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,eAAW;AAAA,QAC/D,gBAAAK,EAAC,QAAA,EAAK,WAAU,4DACd,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,4BAA4BwG,EAAO,WAAW;AAAA,cACpD,QAAO;AAAA,cACP,KAAI;AAAA,cAEH,UAAA;AAAA,gBAAAA,EAAO,YAAY,MAAM,GAAG,CAAC;AAAA,gBAAE;AAAA,gBAAIA,EAAO,YAAY,MAAM,EAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEjE,gBAAA7G;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM,4BAA4B6G,EAAO,WAAW;AAAA,cACpD,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,cAAW;AAAA,cACX,OAAM;AAAA,cACP,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,gBAAAxG,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,kBAAc;AAAA,QAClE,gBAAAK,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA;AAAA,UAAA;AAAA,UAAE85C,EAAU,QAAQ,CAAC;AAAA,QAAA,EAAA,CAAE;AAAA,MAAA,GAC7E;AAAA,MACA,gBAAA95C,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,cAAU;AAAA,QAC9D,gBAAAK,EAAC,QAAA,EAAK,WAAU,6DAA4D,UAAA;AAAA,UAAA;AAAA,UACvEqkD,EAAgB,QAAQ,CAAC;AAAA,QAAA,EAAA,CAC9B;AAAA,MAAA,GACF;AAAA,MACA,gBAAArkD,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,iBAAa;AAAA,QACjE,gBAAAK,EAAC,QAAA,EAAK,WAAU,gEAA+D,UAAA;AAAA,UAAA;AAAA,UAC1EokD,EAAW,QAAQ,CAAC;AAAA,QAAA,EAAA,CACzB;AAAA,MAAA,GACF;AAAA,MACA,gBAAApkD,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,aAAS;AAAA,QAC7D,gBAAAA,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,cAAA,CAAW;AAAA,MAAA,EAAA,CACjE;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAASwkD;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA,EAED,CACF;AAAA,EAAA,GACF;AAEJ;AAQA,SAASzC,GAAU,EAAE,OAAAlhD,GAAO,SAAAia,GAAS,UAAA3Y,KAA4B;AAC/D,SACE,gBAAA9B,EAAC,OAAA,EAAI,WAAU,8DACb,UAAA;AAAA,IAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,KAAC;AAAA,IACjD,gBAAAA,EAAC,MAAA,EAAG,WAAU,kCAAiC,UAAA,kBAAc;AAAA,IAC7D,gBAAAA,EAAC,KAAA,EAAE,WAAU,qCAAqC,UAAAa,GAAM;AAAA,IAExD,gBAAAR,EAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,MAAA8B,KACC,gBAAAnC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASmC;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH,gBAAAnC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS8a;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACt5DA,MAAA6pC,KAAe,+/CCAfC,KAAe,m/BCAfC,KAAe,mkGCAfC,KAAe,2jDCAfC,KAAe,mmDCAfC,KAAe,22FCAfC,KAAe,s0BCAfC,KAAe,m6ECAfC,KAAe,o4CC+BFC,KAA4B;AAAA,EACvC;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASrN;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASiN;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASG;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASN;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASK;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASH;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASE;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASL;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASD;AAAA,EAAA;AAAA,EAEX;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAASG;AAAA,EAAA;AAEb;ACzEO,SAASO,KAA+B;AAC7C,QAAMtvC,IAAUC,GAAA,GACV,CAACxX,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAAwB,IAAI,GAEhDiC,IAAY1B,EAAQ,MACnB0W,IACE,IAAI/U,GAAU;AAAA,IACnB,SAAS+U,EAAQ,OAAO;AAAA,IACxB,WAAWA,EAAQ,OAAO;AAAA,IAC1B,eAAeA,EAAQ,OAAO;AAAA,IAC9B,gBAAgBA,EAAQ,WAAW;AAAA,EAAA,CACpC,IANoB,MAOpB,CAACA,CAAO,CAAC,GAENhU,IAAapC,EAAY,MAAM;AACnC,IAAAmB,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECwkD,IAAa3lD,EAAY,YAA4C;AACzE,QAAI,CAACoB;AACH,YAAM,IAAI,MAAM,sDAAsD;AAExE,IAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AAEF,aADa,MAAMC,EAAU,IAA2B,sBAAsB;AAAA,IAEhF,SAASS,GAAK;AACZ,YAAM4xB,IAAWzxB,EAAeH,GAAK,gCAAgC;AACrE,YAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAA1yB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAERwkD,IAAiB5lD,EAAY,YAA8C;AAC/E,QAAI,CAACoB;AACH,YAAM,IAAI,MAAM,sDAAsD;AAExE,IAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AAEF,cADa,MAAMC,EAAU,IAAsB,kBAAkB,GACzD;AAAA,IACd,SAASS,GAAK;AACZ,YAAM4xB,IAAWzxB,EAAeH,GAAK,iCAAiC;AACtE,YAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAA1yB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAERykD,IAAa7lD;AAAA,IACjB,OAAOuF,MAI+B;AACpC,UAAI,CAACnE;AACH,cAAM,IAAI,MAAM,sDAAsD;AAExE,MAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,UAAI;AACF,cAAM0F,IAAS,IAAI,gBAAA;AACnB,QAAItB,GAAS,YAAUsB,EAAO,IAAI,YAAYtB,EAAQ,QAAQ,GAC1DA,GAAS,SAAOsB,EAAO,IAAI,SAAStB,EAAQ,MAAM,UAAU,GAC5DA,GAAS,UAAQsB,EAAO,IAAI,UAAUtB,EAAQ,OAAO,UAAU;AAEnE,cAAMisB,IAAc3qB,EAAO,SAAA,GACrB4qB,IAAMD,IAAc,oBAAoBA,CAAW,KAAK;AAG9D,eADa,MAAMpwB,EAAU,IAA2BqwB,CAAG;AAAA,MAE7D,SAAS5vB,GAAK;AACZ,cAAM4xB,IAAWzxB,EAAeH,GAAK,qCAAqC;AAC1E,cAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAA1yB,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACK,CAAS;AAAA,EAAA;AAGZ,SAAO;AAAA,IACL,YAAAukD;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAhnD;AAAA,IACA,OAAAqC;AAAA,IACA,YAAAkB;AAAA,EAAA;AAEJ;ACnGO,SAAS0jD,GAAc;AAAA,EAC5B,mBAAAC,IAAoB;AAAA,EACpB,iBAAAxxB,IAAkB;AAAA,EAClB,SAAA9U,IAAU;AAAA,EACV,WAAAphB,IAAY;AAAA,EACZ,QAAAm2B;AACF,GAAuB;AACrB,QAAM,EAAE,YAAAmxB,GAAY,gBAAAC,GAAgB,WAAA/mD,GAAW,OAAAqC,GAAO,YAAAkB,EAAA,IAAesjD,GAAA,GAE/D,CAACM,GAAUC,CAAW,IAAI9mD,EAAkC,CAAA,CAAE,GAC9D,CAACu1B,GAAWC,CAAY,IAAIx1B,EAAwB,IAAI,GAExD+mD,IAAelmD,EAAY,YAAY;AAC3C,QAAI;AACF,UAAI+lD,GAAmB;AACrB,cAAM7+C,IAAS,MAAM0+C,EAAA;AACrB,QAAAK,EAAY/+C,CAAM,GAClBstB,IAASttB,CAAM;AAAA,MACjB,OAAO;AACL,cAAMA,IAAS,MAAMy+C,EAAA;AACrB,QAAAM,EAAY,CAAC/+C,CAAM,CAAC,GACpBstB,IAAS,CAACttB,CAAM,CAAC;AAAA,MACnB;AACA,MAAAytB,EAAa,IAAI;AAAA,IACnB,SAAS9yB,GAAK;AACZ,MAAA8yB,EAAa9yB,aAAe,QAAQA,EAAI,UAAU,wBAAwB;AAAA,IAC5E;AAAA,EACF,GAAG,CAACkkD,GAAmBJ,GAAYC,GAAgBpxB,CAAM,CAAC;AAgB1D,MAbA70B,EAAU,MAAM;AACd,IAAAumD,EAAA;AAAA,EACF,GAAG,CAACA,CAAY,CAAC,GAGjBvmD,EAAU,MAAM;AACd,QAAI40B,KAAmB,EAAG;AAE1B,UAAMM,IAAW,YAAYqxB,GAAc3xB,CAAe;AAC1D,WAAO,MAAM,cAAcM,CAAQ;AAAA,EACrC,GAAG,CAACN,GAAiB2xB,CAAY,CAAC,GAG9BxxB,KAAaxzB;AACf,WACE,gBAAAR,EAAC,OAAA,EAAI,WAAW,qDAAqDrC,CAAS,IAC5E,UAAA;AAAA,MAAA,gBAAAgC,EAAC,KAAA,EAAE,WAAU,uBAAuB,UAAAq0B,KAAaxzB,GAAM;AAAA,MACvD,gBAAAb;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAA+B,EAAA,GACAuyB,EAAa,IAAI,GACjBuxB,EAAA;AAAA,UACF;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAKJ,MAAIrnD,KAAamnD,EAAS,WAAW;AACnC,WACE,gBAAAtlD,EAAC,OAAA,EAAI,WAAW,uDAAuDrC,CAAS,IAC9E,UAAA;AAAA,MAAA,gBAAAgC,EAAC,QAAA,EAAK,WAAU,kCAAA,CAAkC;AAAA,MAClD,gBAAAA,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA,qBAAA,CAAkB;AAAA,IAAA,GACjE;AAKJ,MAAIof,GAAS;AACX,UAAM0mC,IAAiBH,EAAS,CAAC;AACjC,WACE,gBAAAtlD,EAAC,OAAA,EAAI,WAAW,uDAAuDrC,CAAS,IAC7E,UAAA;AAAA,MAAA8nD,IACC,gBAAA9lD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,GAAG8lD,EAAe,eAAe;AAAA,UAEvC,UAAAA,EAAe;AAAA,QAAA;AAAA,MAAA,IAGlB,gBAAA9lD,EAAC,QAAA,EAAK,WAAU,gDAA+C,UAAA,cAAU;AAAA,MAE1ExB,KAAa,gBAAAwB,EAAC,QAAA,EAAK,WAAU,mCAAkC,OAAM,gBAAA,CAAgB;AAAA,IAAA,GACxF;AAAA,EAEJ;AAGA,SACE,gBAAAK,EAAC,OAAA,EAAI,WAAW,yBAAyBrC,CAAS,IAChD,UAAA;AAAA,IAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,uBAAsB,UAAA,kBAAc;AAAA,MAClD,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS6lD;AAAA,UACT,UAAUrnD;AAAA,UACV,OAAM;AAAA,UAEL,cAAY,QAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IACvB,GACF;AAAA,IAECmnD,EAAS,WAAW,IACnB,gBAAAtlD,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,KAAA,EAAE,WAAU,+BAA8B,UAAA,0BAAsB;AAAA,MACjE,gBAAAA,EAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,iCAAA,CAA8B;AAAA,IAAA,EAAA,CACxE,IAEA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sBACZ,UAAA2lD,EAAS,IAAI,CAACI,MACb,gBAAA1lD,EAAC,OAAA,EAA2B,WAAU,sBACpC,UAAA;AAAA,MAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAA+lD,EAAQ,UAAS;AAAA,MAC3D,gBAAA/lD,EAAC,QAAA,EAAK,WAAU,wBAAwB,YAAQ,QAAA,CAAQ;AAAA,IAAA,KAFhD+lD,EAAQ,QAGlB,CACD,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AClIA,MAAM9+C,KAAoB;AAAA,EACxB,EAAE,KAAK,OAAO,OAAO,OAAO,SAAS,KAAA;AAAA,EACrC,EAAE,KAAK,YAAY,OAAO,YAAY,SAAS,CAAC,SAAS,EAAA;AAAA,EACzD,EAAE,KAAK,SAAS,OAAO,SAAS,SAAS,CAAC,SAAS,SAAS,QAAQ,EAAA;AAAA,EACpE;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,SAAS,CAAC,UAAU,cAAc,SAAS,QAAQ;AAAA,EAAA;AAEvD;AAoBA,SAAS4tB,GAAaC,GAAkBkxB,GAA0B;AAChE,QAAMC,IAAanxB,IAAW,GACxBoxB,IAAc,KAAK,IAAIpxB,CAAQ,GAI/BqxB,IAAQH,EAAS,YAAA,MAAkB,OAEnC9zB,IAASg0B,IAAc,KAAK,IAAI,IADrBC,IAAQ,IAAI,CACqB,GAE5C3oD,IAASyoD,IAAa,MAAM;AAClC,SAAIE,IACK,GAAG3oD,CAAM,GAAG00B,EAAO,QAAQ,CAAC,CAAC,SAE/B,GAAG10B,CAAM,IAAI00B,EAAO,QAAQ,CAAC,CAAC;AACvC;AAKA,SAASziB,GAAWE,GAA4B;AAC9C,QAAMwB,IAAO,IAAI,KAAKxB,CAAU,GAC1ByB,wBAAU,KAAA,GACVC,IAASD,EAAI,QAAA,IAAYD,EAAK,QAAA,GAC9BG,IAAW,KAAK,MAAMD,KAAU,MAAO,KAAK,KAAK,GAAG;AAG1D,MAAIC,MAAa,GAAG;AAClB,UAAMuB,IAAY,KAAK,MAAMxB,IAAU,IAAe;AACtD,QAAIwB,MAAc,GAAG;AACnB,YAAMD,IAAW,KAAK,MAAMvB,IAAU,GAAU;AAChD,aAAIuB,IAAW,IAAU,aAClB,GAAGA,CAAQ;AAAA,IACpB;AACA,WAAO,GAAGC,CAAS;AAAA,EACrB;AACA,SAAIvB,MAAa,IAAU,cACvBA,IAAW,IAAU,GAAGA,CAAQ,UAG7BH,EAAK,mBAAmB,QAAW;AAAA,IACxC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAMA,EAAK,YAAA,MAAkBC,EAAI,YAAA,IAAgB,YAAY;AAAA,EAAA,CAC9D;AACH;AAKA,SAASg1C,GAAa9tB,GAAoC;AACxD,SAAKA,IACkC;AAAA,IACrC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA,EAEIA,EAAO,YAAA,CAAa,KAAKA,IAXnB;AAYtB;AAKA,SAAS+tB,GAAY/tB,GAA4BguB,GAA6B;AAC5E,QAAM3U,KAAQrZ,KAAU,IAAI,YAAA;AAC5B,SAAIqZ,MAAS,YAAkB,MAC3BA,MAAS,WAAWA,MAAS,WAAWA,MAAS,WAAiB,MAClEA,MAAS,WAAiB,MAC1BA,MAAS,WAAWA,MAAS,WAAiB,MAChB2U,IAAa,MAAM;AAEvD;AAKO,SAASC,GAAQ;AAAA,EACtB,YAAAp/C,IAAa;AAAA,EACb,UAAA+tB,IAAW;AAAA,EACX,iBAAAhB,IAAkB;AAAA,EAClB,WAAAl2B,IAAY;AAAA,EACZ,QAAAm2B;AAAA,EACA,oBAAAqyB;AACF,GAAiB;AACf,QAAM,EAAE,YAAAhB,GAAY,WAAAhnD,GAAW,OAAAqC,GAAO,YAAAkB,EAAA,IAAesjD,GAAA,GAE/C,CAACj+C,GAAWC,CAAY,IAAIvI,EAA0BqI,CAAU,GAChE,CAACs0B,GAAcgrB,CAAe,IAAI3nD,EAAsC,CAAA,CAAE,GAC1E,CAAC2qB,GAAOC,CAAQ,IAAI5qB,EAAS,CAAC,GAC9B,CAAC+qB,GAAQyL,CAAS,IAAIx2B,EAAS,CAAC,GAChC,CAACu1B,GAAWC,CAAY,IAAIx1B,EAAwB,IAAI,GAGxDouB,IAAajmB,GAAK,KAAK,CAACkmB,MAAMA,EAAE,QAAQ/lB,CAAS,KAAKH,GAAK,CAAC,GAG5Dy/C,IAAuBrnD,EAAQ,MAC/B6tB,EAAW,YAAY,OAClBuO,IAEFA,EAAa,OAAO,CAACC,MAAO;AACjC,UAAMpD,IAASoD,EAAG,UAAU;AAC5B,WAAOxO,EAAW,QAAS,KAAK,CAACykB,MAASrZ,EAAO,YAAA,EAAc,SAASqZ,EAAK,YAAA,CAAa,CAAC;AAAA,EAC7F,CAAC,GACA,CAAClW,GAAcvO,EAAW,OAAO,CAAC,GAE/By5B,IAAehnD,EAAY,YAAY;AAC3C,QAAI;AAEF,YAAMkH,IAAS,MAAM2+C,EAAW,EAAE,OAAOtwB,IAAW,GAAG,QAAArL,GAAQ;AAC/D,MAAA48B,EAAgB5/C,EAAO,YAAY,GACnC6iB,EAAS7iB,EAAO,KAAK,GACrBstB,IAASttB,CAAM,GACfytB,EAAa,IAAI;AAAA,IACnB,SAAS9yB,GAAK;AACZ,MAAA8yB,EAAa9yB,aAAe,QAAQA,EAAI,UAAU,wBAAwB;AAAA,IAC5E;AAAA,EACF,GAAG,CAAC0zB,GAAUrL,GAAQ27B,GAAYrxB,CAAM,CAAC;AAGzC,EAAA70B,EAAU,MAAM;AACd,IAAAg2B,EAAU,CAAC;AAAA,EACb,GAAG,CAACluB,CAAS,CAAC,GAGd9H,EAAU,MAAM;AACd,IAAAqnD,EAAA;AAAA,EACF,GAAG,CAACA,CAAY,CAAC,GAGjBrnD,EAAU,MAAM;AACd,QAAI40B,KAAmB,EAAG;AAC1B,UAAMM,IAAW,YAAYmyB,GAAczyB,CAAe;AAC1D,WAAO,MAAM,cAAcM,CAAQ;AAAA,EACrC,GAAG,CAACN,GAAiByyB,CAAY,CAAC;AAElC,QAAMlxB,IAAa,KAAK,KAAKhM,IAAQyL,CAAQ,GACvCQ,IAAc,KAAK,MAAM7L,IAASqL,CAAQ,IAAI,GAE9CS,IAAW,CAACC,MAAiB;AACjC,UAAMC,KAAaD,IAAO,KAAKV;AAC/B,IAAAI,EAAU,KAAK,IAAI,GAAG,KAAK,IAAIO,GAAW,KAAK,IAAI,GAAGpM,IAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,EACpE,GAGMm9B,IAAkB,CAACr5B,MAAyB;AAChD,IAAAlmB,EAAakmB,CAAG;AAAA,EAClB;AAGA,MAAI8G,KAAaxzB;AACf,WACE,gBAAAR,EAAC,OAAA,EAAI,WAAW,6CAA6CrC,CAAS,IACpE,UAAA;AAAA,MAAA,gBAAAgC,EAAC,KAAA,EAAE,WAAU,mBAAmB,UAAAq0B,KAAaxzB,GAAM;AAAA,MACnD,gBAAAb;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAA+B,EAAA,GACAuyB,EAAa,IAAI,GACjBqyB,EAAA;AAAA,UACF;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAKJ,MAAInoD,KAAai9B,EAAa,WAAW;AACvC,WACE,gBAAAp7B,EAAC,OAAA,EAAI,WAAW,+CAA+CrC,CAAS,IACtE,UAAA;AAAA,MAAA,gBAAAgC,EAAC,QAAA,EAAK,WAAU,8BAAA,CAA8B;AAAA,MAC9C,gBAAAA,EAAC,QAAA,EAAK,WAAU,0BAAyB,UAAA,0BAAA,CAAuB;AAAA,IAAA,GAClE;AAKJ,QAAM6mD,IAAc,CAACt5B,MACfA,EAAI,YAAY,OAAakO,EAAa,SACvCA,EAAa,OAAO,CAACC,MAAO;AACjC,UAAMpD,IAASoD,EAAG,UAAU;AAC5B,WAAOnO,EAAI,QAAS,KAAK,CAACokB,MAASrZ,EAAO,YAAA,EAAc,SAASqZ,EAAK,YAAA,CAAa,CAAC;AAAA,EACtF,CAAC,EAAE;AAGL,SACE,gBAAAtxC,EAAC,OAAA,EAAI,WAAW,qBAAqBrC,CAAS,IAE5C,UAAA;AAAA,IAAA,gBAAAqC,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,mBAAkB,UAAA,uBAAmB;AAAA,MACnD,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS2mD;AAAA,UACT,UAAUnoD;AAAA,UACV,OAAM;AAAA,UAEL,cAAY,QAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IACvB,GACF;AAAA,sBAGC,OAAA,EAAI,WAAU,kBACZ,UAAAyI,GAAK,IAAI,CAACsmB,MAAQ;AACjB,YAAMu5B,IAAQD,EAAYt5B,CAAG,GACvB6zB,IAAWh6C,MAAcmmB,EAAI;AACnC,aACE,gBAAAltB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,iBAAiB+gD,IAAW,yBAAyB,EAAE;AAAA,UAClE,SAAS,MAAMwF,EAAgBr5B,EAAI,GAAG;AAAA,UAErC,UAAA;AAAA,YAAAA,EAAI;AAAA,YACJu5B,IAAQ,KAAK,gBAAA9mD,EAAC,QAAA,EAAK,WAAU,uBAAuB,UAAA8mD,EAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QANtDv5B,EAAI;AAAA,MAAA;AAAA,IASf,CAAC,EAAA,CACH;AAAA,IAGCm5B,EAAqB,WAAW,IAC/B,gBAAArmD,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,KAAA,EAAE,WAAU,2BACV,UAAAoH,MAAc,QACX,yBACA,MAAM8lB,EAAW,MAAM,YAAA,CAAa,WAC1C;AAAA,MACC9lB,MAAc,SACb,gBAAApH,EAAC,KAAA,EAAE,WAAU,wBAAuB,UAAA,iCAAA,CAA8B;AAAA,IAAA,EAAA,CAEtE,IAEA,gBAAAK,EAAAoC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAzC,EAAC,OAAA,EAAI,WAAU,kBACZ,UAAA0mD,EAAqB,MAAM,GAAGxxB,CAAQ,EAAE,IAAI,CAACwG,MAAO;AACnD,cAAM4qB,IAAa5qB,EAAG,kBAAkB;AACxC,eACE,gBAAAr7B;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,kBAAkBimD,IAAa,4BAA4B,yBAAyB;AAAA,YAC/F,SAAS,MAAME,IAAqB9qB,CAAE;AAAA,YACtC,WAAW,CAACl8B,MAAM;AAChB,eAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFgnD,IAAqB9qB,CAAE;AAAA,YAE3B;AAAA,YACA,MAAM8qB,IAAqB,WAAW;AAAA,YACtC,UAAUA,IAAqB,IAAI;AAAA,YAGnC,UAAA;AAAA,cAAA,gBAAAxmD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,kBAAkBsmD,IAAa,4BAA4B,yBAAyB;AAAA,kBAE9F,UAAAD,GAAY3qB,EAAG,QAAQ4qB,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIpC,gBAAAjmD,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,kBAAA,gBAAAL,EAAC,UAAK,WAAU,kBAAkB,UAAAomD,GAAa1qB,EAAG,MAAM,GAAE;AAAA,kBAC1D,gBAAA17B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,oBAAoBsmD,IAAa,8BAA8B,2BAA2B;AAAA,sBAEpG,UAAAzxB,GAAa6G,EAAG,gBAAgBA,EAAG,QAAQ;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC9C,GACF;AAAA,gBACA,gBAAAr7B,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,kBAAA,gBAAAL,EAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA07B,EAAG,aAAY;AAAA,oCACvD,QAAA,EAAK,WAAU,kBAAkB,UAAAjsB,GAAWisB,EAAG,SAAS,EAAA,CAAE;AAAA,gBAAA,EAAA,CAC7D;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAjCKA,EAAG;AAAA,QAAA;AAAA,MAoCd,CAAC,EAAA,CACH;AAAA,MAGCjG,IAAa,KACZ,gBAAAp1B,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,QAAA,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM21B,EAASD,IAAc,CAAC;AAAA,YACvC,UAAUA,KAAe;AAAA,YAC1B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAr1B,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA;AAAA,UAAA;AAAA,UAC9Bq1B;AAAA,UAAY;AAAA,UAAKD;AAAA,QAAA,GACzB;AAAA,QACA,gBAAAz1B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM21B,EAASD,IAAc,CAAC;AAAA,YACvC,UAAUA,KAAeD;AAAA,YAC1B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;ACrUO,SAASsxB,GAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAA79C,IAAQ;AAAA,EACR,UAAA89C,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,WAAAjlD;AAAA,EACA,YAAAiF,IAAa;AAAA,EACb,UAAAhJ;AAAA,EACA,WAAAH,IAAY;AACd,GAAwB;AACtB,SACE,gBAAAqC,EAAC,OAAA,EAAI,WAAW,2BAA2BrC,CAAS,IAEhD,UAAA;AAAA,KAAAgpD,KAAaC,MACb,gBAAA5mD,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAA;AAAA,MAAA2mD;AAAA,MACAC,KAAa,gBAAAjnD,EAAC,QAAA,EAAK,WAAU,qBAAqB,UAAAinD,EAAA,CAAU;AAAA,IAAA,GAC/D;AAAA,IAGF,gBAAA5mD,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,0BAA0B,UAAAoJ,GAAM;AAAA,QAC7C89C,KAAY,gBAAAlnD,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAAknD,EAAA,CAAS;AAAA,MAAA,GAClE;AAAA,MACC/oD,KAAY,gBAAA6B,EAACkH,IAAA,EAAU,YAAAC,GAAwB,WAAAjF,EAAA,CAAsB;AAAA,IAAA,GACxE;AAAA,IAGCilD,KAAa,gBAAAnnD,EAAC,KAAA,EAAE,WAAU,uBAAuB,UAAAmnD,EAAA,CAAU;AAAA,EAAA,GAC9D;AAEJ;AC7BO,SAASC,GAAgB;AAAA,EAC9B,WAAAH,IAAY;AAAA,EACZ,WAAAD;AAAA,EACA,SAAAK,IAAU;AAAA,EACV,OAAAj+C,IAAQ;AAAA,EACR,UAAA89C,IAAW;AAAA,EACX,WAAAhlD;AAAA,EACA,YAAAiF,IAAa;AAAA,EACb,UAAAhJ;AAAA,EACA,WAAAH,IAAY;AACd,GAAyB;AACvB,SACE,gBAAAqC,EAAC,OAAA,EAAI,WAAW,4BAA4BrC,CAAS,IAEnD,UAAA;AAAA,IAAA,gBAAAgC,EAAC,SAAI,WAAU,2BACb,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,MAAA2mD,KACC,gBAAAhnD,EAAC,SAAI,WAAU,0BAA0B,YAAU,OAAO,CAAC,EAAE,YAAA,EAAY,CAAE;AAAA,MAE7E,gBAAAA,EAAC,MAAA,EAAG,WAAU,gCAAgC,UAAAinD,GAAU;AAAA,MACvDI,KAAW,gBAAArnD,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAAqnD,EAAA,CAAQ;AAAA,IAAA,EAAA,CAChE,EAAA,CACF;AAAA,sBAGC,OAAA,EAAI,WAAU,0BACb,UAAA,gBAAAhnD,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,MAAA,gBAAAL,EAAC,MAAA,EAAG,WAAU,2BAA2B,UAAAoJ,GAAM;AAAA,MAC9C89C,KAAY,gBAAAlnD,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAAknD,GAAS;AAAA,MAChE/oD,KAAY,gBAAA6B,EAACkH,IAAA,EAAU,YAAAC,GAAwB,WAAAjF,EAAA,CAAsB;AAAA,IAAA,EAAA,CACxE,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AC1EO,MAAMolD,GAAiB;AAAA,EACpB;AAAA,EAER,YACE9mC,GACAC,GACAC,GACAC,GACA;AACA,SAAK,SAAS,IAAI3f,GAAU,EAAE,SAAAwf,GAAS,WAAAC,GAAW,eAAAC,GAAe,gBAAAC,GAAgB;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAmC;AACvC,QAAI;AAEF,cADiB,MAAM,KAAK,OAAO,IAA0B,WAAW,GACxD;AAAA,IAClB,SAAS9f,GAAO;AACd,YAAMc,EAAed,GAAO,yBAAyB;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAwD;AAC5D,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,OAAkC,WAAW;AAAA,IACxE,SAASA,GAAO;AACd,YAAMc,EAAed,GAAO,2BAA2B;AAAA,IACzD;AAAA,EACF;AACF;ACSO,SAAS0mD,KAAiC;AAC/C,QAAM,EAAE,QAAA/mD,GAAQ,WAAAsgB,GAAW,WAAA7d,EAAA,IAAcxC,GAAA,GAEnC,CAAC+Q,GAAUg2C,CAAW,IAAI1oD,EAAoB,CAAA,CAAE,GAChD,CAACN,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAA2B,IAAI,GAEnDiC,IAAY1B;AAAA,IAChB,MACE,IAAIioD;AAAA,MACF9mD,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPyC,GAAW;AAAA,IAAA;AAAA,IAEf,CAACzC,EAAO,WAAWA,EAAO,gBAAgBA,EAAO,eAAeyC,CAAS;AAAA,EAAA,GAGrEwkD,IAAgB9nD,EAAY,YAAY;AAC5C,QAAImhB,MAAc,iBAAiB;AACjC,MAAA0mC,EAAY,CAAA,CAAE;AACd;AAAA,IACF;AAEA,IAAA9mD,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AACF,YAAM4mD,IAAkB,MAAM3mD,EAAU,aAAA;AACxC,MAAAymD,EAAYE,CAAe;AAAA,IAC7B,SAASlmD,GAAK;AACZ,MAAAV,EAASU,CAAgB;AAAA,IAC3B,UAAA;AACE,MAAAd,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACogB,GAAW/f,CAAS,CAAC;AAGzB,EAAAzB,EAAU,MAAM;AACd,IAAIwhB,MAAc,kBAChB2mC,EAAA,IAEAD,EAAY,CAAA,CAAE;AAAA,EAElB,GAAG,CAAC1mC,GAAW2mC,CAAa,CAAC;AAE7B,QAAME,IAAoBhoD,EAAY,YAAgD;AACpF,IAAAe,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AACF,YAAM+F,IAAS,MAAM9F,EAAU,kBAAA;AAE/B,mBAAM0mD,EAAA,GACC5gD;AAAA,IACT,SAASrF,GAAK;AACZ,YAAAV,EAASU,CAAgB,GACnBA;AAAA,IACR,UAAA;AACE,MAAAd,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,GAAW0mD,CAAa,CAAC,GAEvB11C,IAAoB1S,EAAQ,MACzBmS,EAAS,OAAO,CAACQ,MAAM,CAACA,EAAE,SAAS,EAAE,QAC3C,CAACR,CAAQ,CAAC;AAEb,SAAO;AAAA,IACL,UAAAA;AAAA,IACA,WAAAhT;AAAA,IACA,OAAAqC;AAAA,IACA,eAAA4mD;AAAA,IACA,mBAAAE;AAAA,IACA,mBAAA51C;AAAA,EAAA;AAEJ;ACzDO,SAAS61C,KAAmC;AACjD,QAAM,EAAE,QAAApnD,GAAQ,WAAAyC,EAAA,IAAcxC,GAAA,GAExB,CAAConD,GAAWC,CAAY,IAAIhpD,EAA6B;AAAA,IAC7D,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR,GAEKiC,IAAY1B;AAAA,IAChB,MACE,IAAI+qB;AAAA,MACF5pB,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPyC,GAAW;AAAA,IAAA;AAAA,IAEf,CAACzC,EAAO,WAAWA,EAAO,gBAAgBA,EAAO,eAAeyC,CAAS;AAAA,EAAA,GAGrE8kD,IAAqBpoD;AAAA,IACzB,OAAOoY,MAA2D;AAChE,MAAA+vC,EAAa,CAAC97C,OAAU,EAAE,GAAGA,GAAM,WAAW,IAAM,OAAO,KAAA,EAAO;AAElE,UAAI;AACF,cAAMxI,IAAW,MAAMzC,EAAU,UAAUgX,CAAO,GAC5ClR,IAA6B;AAAA,UACjC,SAASrD,EAAS;AAAA,UAClB,QAAQA,EAAS;AAAA,UACjB,WAAW;AAAA,UACX,OAAO;AAAA,QAAA;AAET,eAAAskD,EAAajhD,CAAM,GACZA;AAAA,MACT,SAASrF,GAAK;AACZ,cAAMqF,IAA6B;AAAA,UACjC,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,OAAOrF;AAAA,QAAA;AAET,eAAAsmD,EAAajhD,CAAM,GACZA;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC9F,CAAS;AAAA,EAAA,GAGNinD,IAAYroD;AAAA,IAChB,OAAOoY,OACU,MAAMgwC,EAAmBhwC,CAAO,GACjC;AAAA,IAEhB,CAACgwC,CAAkB;AAAA,EAAA,GAGfE,IAAatoD,EAAY,MAAM;AACnC,IAAAmoD,EAAa;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,IAAA,CACR;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,WAAAE;AAAA,IACA,WAAAH;AAAA,IACA,YAAAI;AAAA,IACA,oBAAAF;AAAA,EAAA;AAEJ;AC/FO,SAASG,KAA+C;AAC7D,QAAMnyC,IAAUC,GAAA,GACV,CAACxX,GAAWkC,CAAY,IAAI5B,EAAS,EAAK,GAC1C,CAAC+B,GAAOC,CAAQ,IAAIhC,EAAwB,IAAI,GAChD,CAACqpD,GAAaC,CAAc,IAAItpD,EAA+C,IAAI,GAEnFiC,IAAY1B,EAAQ,MACnB0W,IACE,IAAI/U,GAAU;AAAA,IACnB,SAAS+U,EAAQ,OAAO;AAAA,IACxB,WAAWA,EAAQ,OAAO;AAAA,IAC1B,eAAeA,EAAQ,OAAO;AAAA,IAC9B,gBAAgBA,EAAQ,WAAW;AAAA,EAAA,CACpC,IANoB,MAOpB,CAACA,CAAO,CAAC,GAENsyC,IAAuB1oD,EAAY,YAA2B;AAClE,QAAI,CAACoB;AACH,YAAM,IAAI,MAAM,8DAA8D;AAEhF,IAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AACF,YAAMzH,IAAO,MAAM0H,EAAU,IAAmC,0BAA0B;AAC1F,MAAAqnD,EAAe/uD,CAAI;AAAA,IACrB,SAASmI,GAAK;AACZ,YAAM4xB,IAAWzxB,EAAeH,GAAK,kCAAkC;AACvE,YAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAA1yB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAERunD,IAAsB3oD,EAAY,YAA2B;AACjE,QAAI,CAACoB;AACH,YAAM,IAAI,MAAM,8DAA8D;AAEhF,IAAAL,EAAa,EAAI,GACjBI,EAAS,IAAI;AAEb,QAAI;AACF,YAAMiX,IAAsC,EAAE,WAAW,GAAA;AACzD,YAAMhX,EAAU,KAAsB,gCAAgCgX,CAAO,GAE7EqwC,EAAe,IAAI;AAAA,IACrB,SAAS5mD,GAAK;AACZ,YAAM4xB,IAAWzxB,EAAeH,GAAK,gCAAgC;AACrE,YAAAV,EAASsyB,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAA1yB,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACK,CAAS,CAAC,GAERgB,IAAapC,EAAY,MAAMmB,EAAS,IAAI,GAAG,CAAA,CAAE;AAGvD,SAAAxB,EAAU,MAAM;AACd,IAAIyB,KAAagV,GAAS,cAAc,mBACtCsyC,EAAA,EAAuB,MAAM,MAAM;AAAA,IAEnC,CAAC;AAAA,EAEL,GAAG,CAACtnD,GAAWgV,GAAS,WAAWsyC,CAAoB,CAAC,GAEjD;AAAA,IACL,oBAAoBF,GAAa,sBAAsB;AAAA,IACvD,cAAcA,GAAa,gBAAgB;AAAA,IAC3C,gBAAgBA,GAAa,kBAAkB;AAAA,IAC/C,WAAWA,GAAa,YAAY,IAAI,KAAKA,EAAY,SAAS,IAAI;AAAA,IACtE,sBAAAE;AAAA,IACA,qBAAAC;AAAA,IACA,WAAA9pD;AAAA,IACA,OAAAqC;AAAA,IACA,YAAAkB;AAAA,EAAA;AAEJ;ACpDO,SAASwmD,GACdrjD,IAA+B,IACF;AAC7B,QAAM,EAAE,gBAAAsjD,MAAmBtjD,GAErB,EAAE,cAAA2S,GAAc,mBAAA4wC,GAAmB,QAAAjpC,GAAQ,YAAYkpC,EAAA,IAAkBnpC,GAAA,GAEzE;AAAA,IACJ,iBAAiBopC;AAAA,IACjB,WAAWC;AAAA,IACX,OAAOC;AAAA,IACP,YAAYC;AAAA,EAAA,IACVlvC,GAAA,GAGEmvC,IAAgB1pD,EAAQ,MACxBopD,KAAqBD,IAChB,aAELhpC,MAAW,qBAAqBA,MAAW,sBACtC,QAEF,QACN,CAACipC,GAAmBD,GAAgBhpC,CAAM,CAAC,GAGxCwpC,IAAUD,MAAkB,QAC5BE,IAAezpC,MAAW,qBAAqBA,MAAW;AA8BhE,SAAO;AAAA,IACL,iBA5BsB7f;AAAA,MACtB,OAAOsa,GAAyBC,MAAuD;AACrF,YAAI6uC,MAAkB,YAAY;AAChC,cAAI,CAACP;AACH,kBAAM,IAAI,MAAM,+CAA+C;AAEjE,iBAAOA,EAAevuC,CAAW;AAAA,QACnC;AAEA,YAAI8uC,MAAkB,OAAO;AAC3B,cAAI,CAAC7uC,KAAc,CAACwuC;AAClB,kBAAM,IAAI;AAAA,cACR;AAAA,YAAA;AAGJ,iBAAIxuC,IACKyuC,EAAmB1uC,GAAaC,CAAU,IAG5CyuC,EAAmB1uC,CAAW;AAAA,QACvC;AAEA,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AAAA,MACA,CAAC8uC,GAAeP,GAAgBE,GAAeC,CAAkB;AAAA,IAAA;AAAA,IAKjE,eAAAI;AAAA,IACA,SAAAC;AAAA,IACA,WAAWJ;AAAA,IACX,WAAW/wC;AAAA,IACX,mBAAA4wC;AAAA,IACA,cAAAQ;AAAA,IACA,eAAAP;AAAA,IACA,OAAOG;AAAA,IACP,YAAYC;AAAA,EAAA;AAEhB;ACnIO,MAAMI,KAAcppB,GAAuC,IAAI,GCyDzDqpB,KAAoC;AAAA,EAC/C,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EAAA;AAAA,EAEnB,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,kBAAkB;AAAA,EAAA;AAAA,EAEpB,UAAU;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAAA;AAAA,EAElB,QAAQ;AAAA,IACN,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EAAA;AAAA,EAEpB,oBAAoB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA;AAEZ;AAKO,SAASC,GACd3qC,GACA4qC,GACc;AACd,SAAOC,GAAU7qC,GAAM4qC,CAAS;AAClC;AAMA,SAASC,GAA4B7qC,GAAS4qC,GAA8B;AAC1E,QAAMxiD,IAAS,EAAE,GAAG4X,EAAA;AAEpB,aAAWnG,KAAO+wC;AAChB,QAAI,OAAO,UAAU,eAAe,KAAKA,GAAW/wC,CAAG,GAAG;AACxD,YAAMixC,IAAY9qC,EAAKnG,CAAc,GAC/BkxC,IAAgBH,EAAU/wC,CAA6B;AAE7D,MACE,OAAOixC,KAAc,YACrBA,MAAc,QACd,OAAOC,KAAkB,YACzBA,MAAkB,OAEjB3iD,EAAmCyR,CAAG,IAAIgxC;AAAA,QACzCC;AAAA,QACAC;AAAA,MAAA,IAEOA,MAAkB,WAC1B3iD,EAAmCyR,CAAG,IAAIkxC;AAAA,IAE/C;AAGF,SAAO3iD;AACT;AChJO,SAAS4iD,GAAa;AAAA,EAC3B,UAAAtrD;AAAA,EACA,QAAAurD,IAAS;AAAA,EACT,cAAcC;AAChB,GAAsB;AACpB,QAAM38C,IAAQ3N,EAAQ,OAKb,EAAE,GAJCsqD,IACNP,GAAkBD,IAAqBQ,CAAkB,IACzDR,IAEQ,QAAAO,EAAA,IACX,CAACC,GAAoBD,CAAM,CAAC;AAE/B,SAAO,gBAAA1pD,EAACkpD,GAAY,UAAZ,EAAqB,OAAAl8C,GAAe,UAAA7O,EAAA,CAAS;AACvD;ACzBO,SAASyrD,KAAgC;AAE9C,SADgB3pB,GAAWipB,EAAW,GACtB,KAAKC;AACvB;AAKO,SAASU,KAAoB;AAElC,SADgB5pB,GAAWipB,EAAW,GACtB,UAAU;AAC5B;","x_google_ignoreList":[0,1,2,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116]}
|