@usehall/bot-gate
Version:
React/Vue/Svelte components for conditionally rendering content based on bot detection with IP validation
1 lines • 15.8 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/core/utils.js","../../../src/core/detector.js","../../../src/core/validator.js","../../../src/core/shared-validation.js","../../../src/components/react/index.js"],"sourcesContent":["export function isServerSide() {\n return typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node;\n}\n\nexport function warnIfClientSide() {\n if (!isServerSide()) {\n console.warn('bot-gate: This library is designed for server-side use only. Bot detection requires access to request headers and IP addresses that are not available in the browser.');\n }\n}\n\nexport function sanitizeIpAddress(ipAddress) {\n if (!ipAddress || typeof ipAddress !== 'string') return null;\n \n return ipAddress.trim()\n .split(',')[0]\n .trim()\n .replace(/^::ffff:/, '');\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nlet userAgentPatterns = null;\n\nfunction loadUserAgentPatterns() {\n if (!userAgentPatterns) {\n try {\n const dataPath = path.join(__dirname, '../../data/user-agents.json');\n const data = fs.readFileSync(dataPath, 'utf8');\n userAgentPatterns = JSON.parse(data);\n } catch (error) {\n console.warn('Failed to load user agent patterns:', error.message);\n userAgentPatterns = { bots: [] };\n }\n }\n return userAgentPatterns;\n}\n\nexport function detectBot(userAgent) {\n if (!userAgent || typeof userAgent !== 'string') {\n return null;\n }\n\n const patterns = loadUserAgentPatterns();\n const normalizedUA = userAgent.toLowerCase();\n\n for (const bot of patterns.bots) {\n for (const pattern of bot.patterns) {\n const regex = new RegExp(pattern.toLowerCase(), 'i');\n if (regex.test(normalizedUA)) {\n return {\n name: bot.name,\n type: bot.type,\n detected: true,\n pattern: pattern\n };\n }\n }\n }\n\n return null;\n}\n\nexport function getSupportedBots() {\n const patterns = loadUserAgentPatterns();\n return patterns.bots.map(bot => ({\n name: bot.name,\n type: bot.type\n }));\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { detectBot } from './detector.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst ipRangeCache = new Map();\n\nfunction loadBotIpRanges(botName) {\n if (!ipRangeCache.has(botName)) {\n try {\n // Handle applebot-extended using the same IP ranges as applebot\n let actualBotName = botName.toLowerCase();\n if (actualBotName === 'applebot-extended') {\n actualBotName = 'applebot';\n }\n \n const dataPath = path.join(__dirname, `../../data/bots/${actualBotName}.json`);\n const data = fs.readFileSync(dataPath, 'utf8');\n const rawData = JSON.parse(data);\n \n // Official API format: { creationTime, prefixes: [{ ipv4Prefix: \"...\" }] }\n const ranges = rawData.prefixes \n ? rawData.prefixes.map(prefix => prefix.ipv4Prefix || prefix.ipv6Prefix).filter(Boolean)\n : [];\n \n ipRangeCache.set(botName, { ranges });\n } catch (error) {\n console.warn(`Failed to load IP ranges for ${botName}:`, error.message);\n ipRangeCache.set(botName, { ranges: [] });\n }\n }\n return ipRangeCache.get(botName);\n}\n\nfunction ipToInt(ip) {\n return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;\n}\n\nfunction cidrToRange(cidr) {\n const [ip, prefixLength] = cidr.split('/');\n const ipInt = ipToInt(ip);\n const mask = (-1 << (32 - parseInt(prefixLength, 10))) >>> 0;\n const networkInt = ipInt & mask;\n const broadcastInt = networkInt | (~mask >>> 0);\n \n return {\n start: networkInt,\n end: broadcastInt\n };\n}\n\nfunction isIpInRange(ip, range) {\n const ipInt = ipToInt(ip);\n \n if (range.includes('/')) {\n const { start, end } = cidrToRange(range);\n return ipInt >= start && ipInt <= end;\n }\n \n if (range.includes('-')) {\n const [startIp, endIp] = range.split('-');\n const startInt = ipToInt(startIp.trim());\n const endInt = ipToInt(endIp.trim());\n return ipInt >= startInt && ipInt <= endInt;\n }\n \n return ipInt === ipToInt(range);\n}\n\nfunction isValidIpAddress(ip) {\n const ipv4Regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n return ipv4Regex.test(ip);\n}\n\nfunction validateBotByName(botName, ipAddress) {\n if (!botName || !ipAddress) {\n return false;\n }\n\n if (!isValidIpAddress(ipAddress)) {\n return false;\n }\n\n const botData = loadBotIpRanges(botName);\n \n if (!botData.ranges || botData.ranges.length === 0) {\n return false;\n }\n\n return botData.ranges.some(range => isIpInRange(ipAddress, range));\n}\n\nexport function validateBot(userAgent, ipAddress) {\n if (!userAgent || !ipAddress) {\n return false;\n }\n\n const botInfo = detectBot(userAgent);\n \n if (!botInfo) {\n return false;\n }\n\n return validateBotByName(botInfo.name, ipAddress);\n}","import { detectBot } from './detector.js';\nimport { validateBot } from './validator.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nexport function validateBotGateProps(userAgent, ipAddress, display, role) {\n if (!userAgent || !ipAddress) {\n console.warn('BotGate: userAgent and ipAddress are required props');\n return { isValid: false, error: 'missing_required_props' };\n }\n\n if (!display) {\n console.warn('BotGate: display prop is required (\"show\" or \"hide\")');\n return { isValid: false, error: 'missing_display' };\n }\n\n if (!role) {\n console.warn('BotGate: role prop is required (\"bot\" or \"user\")');\n return { isValid: false, error: 'missing_role' };\n }\n\n if (!['show', 'hide'].includes(display)) {\n console.warn('BotGate: display must be either \"show\" or \"hide\"');\n return { isValid: false, error: 'invalid_display' };\n }\n\n if (!['bot', 'user'].includes(role)) {\n console.warn('BotGate: role must be either \"bot\" or \"user\"');\n return { isValid: false, error: 'invalid_role' };\n }\n\n return { isValid: true };\n}\n\n\nexport function isValidBot(userAgent, ipAddress, bots = null) {\n const cleanIp = sanitizeIpAddress(ipAddress);\n const isValid = validateBot(userAgent, cleanIp);\n \n if (!isValid) {\n return false;\n }\n \n // If specific bots are requested, check if this bot is in the list\n if (bots && Array.isArray(bots) && bots.length > 0) {\n const botInfo = detectBot(userAgent);\n return botInfo ? bots.includes(botInfo.name) : false;\n }\n \n return true;\n}","import React from 'react';\nimport { warnIfClientSide } from '../../core/index.js';\nimport { validateBotGateProps, isValidBot } from '../../core/shared-validation.js';\n\nexport function BotGate({ \n userAgent,\n ipAddress,\n display,\n role,\n bots = null,\n children\n}) {\n React.useEffect(() => {\n warnIfClientSide();\n }, []);\n\n const validation = validateBotGateProps(userAgent, ipAddress, display, role);\n if (!validation.isValid) {\n return null;\n }\n\n const isBot = isValidBot(userAgent, ipAddress, bots);\n const shouldShow = (display === 'show') ? \n (role === 'bot' ? isBot : !isBot) : \n (role === 'bot' ? !isBot : isBot);\n\n return shouldShow ? children : null;\n}\n\n\n"],"names":["isServerSide","window","process","versions","node","warnIfClientSide","console","warn","sanitizeIpAddress","ipAddress","trim","split","replace","__dirname","path","dirname","fileURLToPath","import","userAgentPatterns","loadUserAgentPatterns","dataPath","join","data","fs","readFileSync","JSON","parse","error","message","bots","detectBot","userAgent","patterns","normalizedUA","toLowerCase","bot","pattern","regex","RegExp","test","name","type","detected","ipRangeCache","Map","loadBotIpRanges","botName","has","actualBotName","rawData","ranges","prefixes","map","prefix","ipv4Prefix","ipv6Prefix","filter","Boolean","set","get","ipToInt","ip","reduce","acc","octet","parseInt","cidrToRange","cidr","prefixLength","ipInt","mask","networkInt","broadcastInt","start","end","isIpInRange","range","includes","startIp","endIp","startInt","endInt","isValidIpAddress","ipv4Regex","validateBotByName","botData","length","some","validateBot","botInfo","validateBotGateProps","display","role","isValid","isValidBot","cleanIp","Array","isArray","BotGate","children","React","useEffect","validation","isBot","shouldShow"],"mappings":";;;;;;;;AAAO,SAASA,YAAYA,GAAG;AAC7B,EAAA,OAAO,OAAOC,MAAM,KAAK,WAAW,IAAI,OAAOC,OAAO,KAAK,WAAW,IAAIA,OAAO,CAACC,QAAQ,IAAID,OAAO,CAACC,QAAQ,CAACC,IAAI;AACrH;AAEO,SAASC,gBAAgBA,GAAG;AACjC,EAAA,IAAI,CAACL,YAAY,EAAE,EAAE;AACnBM,IAAAA,OAAO,CAACC,IAAI,CAAC,uKAAuK,CAAC;AACvL,EAAA;AACF;AAEO,SAASC,iBAAiBA,CAACC,SAAS,EAAE;EAC3C,IAAI,CAACA,SAAS,IAAI,OAAOA,SAAS,KAAK,QAAQ,EAAE,OAAO,IAAI;EAE5D,OAAOA,SAAS,CAACC,IAAI,EAAE,CACpBC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACbD,IAAI,EAAE,CACNE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5B;;ACbA,MAAMC,WAAS,GAAGC,IAAI,CAACC,OAAO,CAACC,iBAAa,CAACC,2PAAe,CAAC,CAAC;AAE9D,IAAIC,iBAAiB,GAAG,IAAI;AAE5B,SAASC,qBAAqBA,GAAG;EAC/B,IAAI,CAACD,iBAAiB,EAAE;IACtB,IAAI;MACF,MAAME,QAAQ,GAAGN,IAAI,CAACO,IAAI,CAACR,WAAS,EAAE,6BAA6B,CAAC;MACpE,MAAMS,IAAI,GAAGC,EAAE,CAACC,YAAY,CAACJ,QAAQ,EAAE,MAAM,CAAC;AAC9CF,MAAAA,iBAAiB,GAAGO,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC;IACtC,CAAC,CAAC,OAAOK,KAAK,EAAE;MACdrB,OAAO,CAACC,IAAI,CAAC,qCAAqC,EAAEoB,KAAK,CAACC,OAAO,CAAC;AAClEV,MAAAA,iBAAiB,GAAG;AAAEW,QAAAA,IAAI,EAAE;OAAI;AAClC,IAAA;AACF,EAAA;AACA,EAAA,OAAOX,iBAAiB;AAC1B;AAEO,SAASY,SAASA,CAACC,SAAS,EAAE;AACnC,EAAA,IAAI,CAACA,SAAS,IAAI,OAAOA,SAAS,KAAK,QAAQ,EAAE;AAC/C,IAAA,OAAO,IAAI;AACb,EAAA;AAEA,EAAA,MAAMC,QAAQ,GAAGb,qBAAqB,EAAE;AACxC,EAAA,MAAMc,YAAY,GAAGF,SAAS,CAACG,WAAW,EAAE;AAE5C,EAAA,KAAK,MAAMC,GAAG,IAAIH,QAAQ,CAACH,IAAI,EAAE;AAC/B,IAAA,KAAK,MAAMO,OAAO,IAAID,GAAG,CAACH,QAAQ,EAAE;AAClC,MAAA,MAAMK,KAAK,GAAG,IAAIC,MAAM,CAACF,OAAO,CAACF,WAAW,EAAE,EAAE,GAAG,CAAC;AACpD,MAAA,IAAIG,KAAK,CAACE,IAAI,CAACN,YAAY,CAAC,EAAE;QAC5B,OAAO;UACLO,IAAI,EAAEL,GAAG,CAACK,IAAI;UACdC,IAAI,EAAEN,GAAG,CAACM,IAAI;AACdC,UAAAA,QAAQ,EAAE,IAAI;AACdN,UAAAA,OAAO,EAAEA;SACV;AACH,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,IAAI;AACb;;ACxCA,MAAMvB,WAAS,GAAGC,IAAI,CAACC,OAAO,CAACC,iBAAa,CAACC,2PAAe,CAAC,CAAC;AAE9D,MAAM0B,YAAY,GAAG,IAAIC,GAAG,EAAE;AAE9B,SAASC,eAAeA,CAACC,OAAO,EAAE;AAChC,EAAA,IAAI,CAACH,YAAY,CAACI,GAAG,CAACD,OAAO,CAAC,EAAE;IAC9B,IAAI;AACF;AACA,MAAA,IAAIE,aAAa,GAAGF,OAAO,CAACZ,WAAW,EAAE;MACzC,IAAIc,aAAa,KAAK,mBAAmB,EAAE;AACzCA,QAAAA,aAAa,GAAG,UAAU;AAC5B,MAAA;MAEA,MAAM5B,QAAQ,GAAGN,IAAI,CAACO,IAAI,CAACR,WAAS,EAAE,CAAA,gBAAA,EAAmBmC,aAAa,CAAA,KAAA,CAAO,CAAC;MAC9E,MAAM1B,IAAI,GAAGC,EAAE,CAACC,YAAY,CAACJ,QAAQ,EAAE,MAAM,CAAC;AAC9C,MAAA,MAAM6B,OAAO,GAAGxB,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC;;AAEhC;AACA,MAAA,MAAM4B,MAAM,GAAGD,OAAO,CAACE,QAAQ,GAC3BF,OAAO,CAACE,QAAQ,CAACC,GAAG,CAACC,MAAM,IAAIA,MAAM,CAACC,UAAU,IAAID,MAAM,CAACE,UAAU,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC,GACtF,EAAE;AAENd,MAAAA,YAAY,CAACe,GAAG,CAACZ,OAAO,EAAE;AAAEI,QAAAA;AAAO,OAAC,CAAC;IACvC,CAAC,CAAC,OAAOvB,KAAK,EAAE;MACdrB,OAAO,CAACC,IAAI,CAAC,CAAA,6BAAA,EAAgCuC,OAAO,GAAG,EAAEnB,KAAK,CAACC,OAAO,CAAC;AACvEe,MAAAA,YAAY,CAACe,GAAG,CAACZ,OAAO,EAAE;AAAEI,QAAAA,MAAM,EAAE;AAAG,OAAC,CAAC;AAC3C,IAAA;AACF,EAAA;AACA,EAAA,OAAOP,YAAY,CAACgB,GAAG,CAACb,OAAO,CAAC;AAClC;AAEA,SAASc,OAAOA,CAACC,EAAE,EAAE;AACnB,EAAA,OAAOA,EAAE,CAAClD,KAAK,CAAC,GAAG,CAAC,CAACmD,MAAM,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK,CAACD,GAAG,IAAI,CAAC,IAAIE,QAAQ,CAACD,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;AACxF;AAEA,SAASE,WAAWA,CAACC,IAAI,EAAE;EACzB,MAAM,CAACN,EAAE,EAAEO,YAAY,CAAC,GAAGD,IAAI,CAACxD,KAAK,CAAC,GAAG,CAAC;AAC1C,EAAA,MAAM0D,KAAK,GAAGT,OAAO,CAACC,EAAE,CAAC;AACzB,EAAA,MAAMS,IAAI,GAAI,EAAE,IAAK,EAAE,GAAGL,QAAQ,CAACG,YAAY,EAAE,EAAE,CAAE,KAAM,CAAC;AAC5D,EAAA,MAAMG,UAAU,GAAGF,KAAK,GAAGC,IAAI;AAC/B,EAAA,MAAME,YAAY,GAAGD,UAAU,GAAI,CAACD,IAAI,KAAK,CAAE;EAE/C,OAAO;AACLG,IAAAA,KAAK,EAAEF,UAAU;AACjBG,IAAAA,GAAG,EAAEF;GACN;AACH;AAEA,SAASG,WAAWA,CAACd,EAAE,EAAEe,KAAK,EAAE;AAC9B,EAAA,MAAMP,KAAK,GAAGT,OAAO,CAACC,EAAE,CAAC;AAEzB,EAAA,IAAIe,KAAK,CAACC,QAAQ,CAAC,GAAG,CAAC,EAAE;IACvB,MAAM;MAAEJ,KAAK;AAAEC,MAAAA;AAAI,KAAC,GAAGR,WAAW,CAACU,KAAK,CAAC;AACzC,IAAA,OAAOP,KAAK,IAAII,KAAK,IAAIJ,KAAK,IAAIK,GAAG;AACvC,EAAA;AAEA,EAAA,IAAIE,KAAK,CAACC,QAAQ,CAAC,GAAG,CAAC,EAAE;IACvB,MAAM,CAACC,OAAO,EAAEC,KAAK,CAAC,GAAGH,KAAK,CAACjE,KAAK,CAAC,GAAG,CAAC;IACzC,MAAMqE,QAAQ,GAAGpB,OAAO,CAACkB,OAAO,CAACpE,IAAI,EAAE,CAAC;IACxC,MAAMuE,MAAM,GAAGrB,OAAO,CAACmB,KAAK,CAACrE,IAAI,EAAE,CAAC;AACpC,IAAA,OAAO2D,KAAK,IAAIW,QAAQ,IAAIX,KAAK,IAAIY,MAAM;AAC7C,EAAA;AAEA,EAAA,OAAOZ,KAAK,KAAKT,OAAO,CAACgB,KAAK,CAAC;AACjC;AAEA,SAASM,gBAAgBA,CAACrB,EAAE,EAAE;EAC5B,MAAMsB,SAAS,GAAG,uFAAuF;AACzG,EAAA,OAAOA,SAAS,CAAC5C,IAAI,CAACsB,EAAE,CAAC;AAC3B;AAEA,SAASuB,iBAAiBA,CAACtC,OAAO,EAAErC,SAAS,EAAE;AAC7C,EAAA,IAAI,CAACqC,OAAO,IAAI,CAACrC,SAAS,EAAE;AAC1B,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,IAAI,CAACyE,gBAAgB,CAACzE,SAAS,CAAC,EAAE;AAChC,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,MAAM4E,OAAO,GAAGxC,eAAe,CAACC,OAAO,CAAC;AAExC,EAAA,IAAI,CAACuC,OAAO,CAACnC,MAAM,IAAImC,OAAO,CAACnC,MAAM,CAACoC,MAAM,KAAK,CAAC,EAAE;AAClD,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,OAAOD,OAAO,CAACnC,MAAM,CAACqC,IAAI,CAACX,KAAK,IAAID,WAAW,CAAClE,SAAS,EAAEmE,KAAK,CAAC,CAAC;AACpE;AAEO,SAASY,WAAWA,CAACzD,SAAS,EAAEtB,SAAS,EAAE;AAChD,EAAA,IAAI,CAACsB,SAAS,IAAI,CAACtB,SAAS,EAAE;AAC5B,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,MAAMgF,OAAO,GAAG3D,SAAS,CAACC,SAAS,CAAC;EAEpC,IAAI,CAAC0D,OAAO,EAAE;AACZ,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,OAAOL,iBAAiB,CAACK,OAAO,CAACjD,IAAI,EAAE/B,SAAS,CAAC;AACnD;;ACtGO,SAASiF,oBAAoBA,CAAC3D,SAAS,EAAEtB,SAAS,EAAEkF,OAAO,EAAEC,IAAI,EAAE;AACxE,EAAA,IAAI,CAAC7D,SAAS,IAAI,CAACtB,SAAS,EAAE;AAC5BH,IAAAA,OAAO,CAACC,IAAI,CAAC,qDAAqD,CAAC;IACnE,OAAO;AAAEsF,MAAAA,OAAO,EAAE,KAAK;AAAElE,MAAAA,KAAK,EAAE;KAA0B;AAC5D,EAAA;EAEA,IAAI,CAACgE,OAAO,EAAE;AACZrF,IAAAA,OAAO,CAACC,IAAI,CAAC,sDAAsD,CAAC;IACpE,OAAO;AAAEsF,MAAAA,OAAO,EAAE,KAAK;AAAElE,MAAAA,KAAK,EAAE;KAAmB;AACrD,EAAA;EAEA,IAAI,CAACiE,IAAI,EAAE;AACTtF,IAAAA,OAAO,CAACC,IAAI,CAAC,kDAAkD,CAAC;IAChE,OAAO;AAAEsF,MAAAA,OAAO,EAAE,KAAK;AAAElE,MAAAA,KAAK,EAAE;KAAgB;AAClD,EAAA;EAEA,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAACkD,QAAQ,CAACc,OAAO,CAAC,EAAE;AACvCrF,IAAAA,OAAO,CAACC,IAAI,CAAC,kDAAkD,CAAC;IAChE,OAAO;AAAEsF,MAAAA,OAAO,EAAE,KAAK;AAAElE,MAAAA,KAAK,EAAE;KAAmB;AACrD,EAAA;EAEA,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAACkD,QAAQ,CAACe,IAAI,CAAC,EAAE;AACnCtF,IAAAA,OAAO,CAACC,IAAI,CAAC,8CAA8C,CAAC;IAC5D,OAAO;AAAEsF,MAAAA,OAAO,EAAE,KAAK;AAAElE,MAAAA,KAAK,EAAE;KAAgB;AAClD,EAAA;EAEA,OAAO;AAAEkE,IAAAA,OAAO,EAAE;GAAM;AAC1B;AAGO,SAASC,UAAUA,CAAC/D,SAAS,EAAEtB,SAAS,EAAEoB,IAAI,GAAG,IAAI,EAAE;AAC5D,EAAA,MAAMkE,OAAO,GAAGvF,iBAAiB,CAACC,SAAS,CAAC;AAC5C,EAAA,MAAMoF,OAAO,GAAGL,WAAW,CAACzD,SAAS,EAAEgE,OAAO,CAAC;EAE/C,IAAI,CAACF,OAAO,EAAE;AACZ,IAAA,OAAO,KAAK;AACd,EAAA;;AAEA;AACA,EAAA,IAAIhE,IAAI,IAAImE,KAAK,CAACC,OAAO,CAACpE,IAAI,CAAC,IAAIA,IAAI,CAACyD,MAAM,GAAG,CAAC,EAAE;AAClD,IAAA,MAAMG,OAAO,GAAG3D,SAAS,CAACC,SAAS,CAAC;IACpC,OAAO0D,OAAO,GAAG5D,IAAI,CAACgD,QAAQ,CAACY,OAAO,CAACjD,IAAI,CAAC,GAAG,KAAK;AACtD,EAAA;AAEA,EAAA,OAAO,IAAI;AACb;;AC7CO,SAAS0D,OAAOA,CAAC;EACtBnE,SAAS;EACTtB,SAAS;EACTkF,OAAO;EACPC,IAAI;AACJ/D,EAAAA,IAAI,GAAG,IAAI;AACXsE,EAAAA;AACF,CAAC,EAAE;EACDC,KAAK,CAACC,SAAS,CAAC,MAAM;AACpBhG,IAAAA,gBAAgB,EAAE;EACpB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMiG,UAAU,GAAGZ,oBAAoB,CAAC3D,SAAS,EAAEtB,SAAS,EAAEkF,OAAO,EAAEC,IAAI,CAAC;AAC5E,EAAA,IAAI,CAACU,UAAU,CAACT,OAAO,EAAE;AACvB,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,MAAMU,KAAK,GAAGT,UAAU,CAAC/D,SAAS,EAAEtB,SAAS,EAAEoB,IAAI,CAAC;EACpD,MAAM2E,UAAU,GAAIb,OAAO,KAAK,MAAM,GACnCC,IAAI,KAAK,KAAK,GAAGW,KAAK,GAAG,CAACA,KAAK,GAC/BX,IAAI,KAAK,KAAK,GAAG,CAACW,KAAK,GAAGA,KAAM;AAEnC,EAAA,OAAOC,UAAU,GAAGL,QAAQ,GAAG,IAAI;AACrC;;;;"}