1 line
28 KiB
Plaintext
1 line
28 KiB
Plaintext
{"version":3,"sources":["pages/user/login.uvue","App.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n <view class=\"page\" :style=\"cssVars\">\r\n <!-- Header:仅保留左侧Logo -->\r\n <view class=\"header\">\r\n <view class=\"header-left\">\r\n <image :src=\"logoUrl\" mode=\"aspectFit\" class=\"logo\" />\r\n </view>\r\n </view>\r\n\r\n <!-- Main -->\r\n <view class=\"main\">\r\n <view class=\"card\">\r\n <!-- Left:扫码区(>=768显示) -->\r\n <view class=\"left\">\r\n <text class=\"left-title\">APP 扫码登录</text>\r\n\r\n <view class=\"left-hint\">\r\n <text class=\"hint-text\">打开 APP 扫一扫</text>\r\n <text class=\"hint-link\" @click=\"handleTutorial\">查看教程</text>\r\n </view>\r\n\r\n <view class=\"qr-wrap\">\r\n <view class=\"qr\">\r\n <view class=\"qr-placeholder\">\r\n <text class=\"qr-text\">二维码占位</text>\r\n <text class=\"qr-sub\">220×220</text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n\r\n <!-- Divider -->\r\n <view class=\"divider\"></view>\r\n\r\n <!-- Right:表单区 -->\r\n <view class=\"right\">\r\n <view class=\"right-inner\">\r\n <!-- Tabs -->\r\n <view class=\"tabs\">\r\n <view class=\"tab\" :class=\"{ active: loginType === 0 }\" @click=\"loginType = 0\">\r\n <text class=\"tab-text\">密码登录</text>\r\n <view v-if=\"loginType === 0\" class=\"tab-line\"></view>\r\n </view>\r\n\r\n <view class=\"tab\" :class=\"{ active: loginType === 1 }\" @click=\"loginType = 1\">\r\n <text class=\"tab-text\">短信登录</text>\r\n <view v-if=\"loginType === 1\" class=\"tab-line\"></view>\r\n </view>\r\n </view>\r\n\r\n <!-- Form -->\r\n <view class=\"form\">\r\n <template v-if=\"loginType === 0\">\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"text\"\r\n placeholder=\"账号名/手机号/邮箱\"\r\n v-model=\"account\"\r\n />\r\n </view>\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"password\"\r\n placeholder=\"密码\"\r\n v-model=\"password\"\r\n />\r\n </view>\r\n </template>\r\n\r\n <template v-else>\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"text\"\r\n placeholder=\"输入手机号码\"\r\n maxlength=\"11\"\r\n v-model=\"account\"\r\n />\r\n </view>\r\n\r\n <view class=\"field code-row\">\r\n <input\r\n class=\"input code-input\"\r\n type=\"text\"\r\n placeholder=\"填写验证码\"\r\n maxlength=\"6\"\r\n v-model=\"captcha\"\r\n />\r\n <view class=\"code-btn\" :class=\"codeDisabled ? 'disabled' : ''\" @click=\"getCode\">\r\n <text class=\"code-text\">{{ codeText }}</text>\r\n </view>\r\n </view>\r\n </template>\r\n\r\n <!-- Button -->\r\n <view class=\"btn\" :class=\"{ disabled: isLoading }\" @click=\"handleLogin\">\r\n <text class=\"btn-text\">登录</text>\r\n </view>\r\n\r\n <!-- Actions:一行横排 -->\r\n <view class=\"actions\">\r\n <view class=\"action-item\" @click=\"handleWechatLogin\">\r\n <view class=\"dot wechat\"></view>\r\n <text class=\"action-text\">微信登录</text>\r\n </view>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <view class=\"action-item\" @click=\"handleQQLogin\">\r\n <view class=\"dot qq\"></view>\r\n <text class=\"action-text\">QQ登录</text>\r\n </view>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <text class=\"action-link\" @click=\"handleForgotPassword\">忘记密码</text>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <text class=\"action-link\" @click=\"navigateToRegister\">立即注册</text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n\r\n <!-- Footer -->\r\n <view class=\"footer\">\r\n <text class=\"footer-text\">Copyright ©2024 Mall. All Rights Reserved</text>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, onMounted } from 'vue'\r\nimport supa from '@/components/supadb/aksupainstance.uts'\r\nimport { IS_TEST_MODE } from '@/ak/config.uts'\r\nimport { getCurrentUser, logout, setIsLoggedIn, setUserProfile } from '@/utils/store.uts'\r\nimport type { UserProfile } from '@/types/mall-types.uts'\r\n\r\nconst cssVars = {\r\n '--bg': '#f5f6f8',\r\n '--card': '#ffffff',\r\n '--brand': '#e1251b',\r\n '--text': '#333333',\r\n '--muted': '#666666',\r\n '--muted2': '#999999',\r\n '--border': '#eeeeee',\r\n '--inputbg': '#f6f7f9',\r\n '--shadow': '0 2px 12px rgba(0,0,0,0.06)'\r\n}\r\n\r\nconst logoUrl = ref<string>('/static/logo.png')\r\n\r\nconst loginType = ref<number>(0)\r\nconst account = ref<string>('')\r\nconst password = ref<string>('')\r\nconst captcha = ref<string>('')\r\n\r\n// 测试账号(开发测试用)\r\nconst TEST_ACCOUNT = 'test@mall.com'\r\nconst TEST_PASSWORD = 'Hf2152111'\r\n\r\nconst isLoading = ref<boolean>(false)\r\n\r\nconst codeDisabled = ref<boolean>(false)\r\nconst codeText = ref<string>('获取验证码')\r\nconst codeTimer = ref<number>(0)\r\nconst codeCountdown = ref<number>(0)\r\n\r\nconst checkLoginStatus = (): void => {\r\n try {\r\n if (IS_TEST_MODE) return\r\n const sessionInfo = supa.getSession()\r\n if (sessionInfo != null && sessionInfo.user != null) {\r\n const pages = getCurrentPages()\r\n if (pages.length > 0) {\r\n const currentPage = pages[pages.length - 1]\r\n const opts = currentPage.options as UTSJSONObject\r\n const redirect = opts.getString('redirect')\r\n if (redirect != null && redirect != '') {\r\n uni.reLaunch({ url: `/pages/mall/consumer/index` })\r\n } else {\r\n uni.reLaunch({ url: '/pages/mall/consumer/index' })\r\n }\r\n } else {\r\n uni.reLaunch({ url: '/pages/mall/consumer/index' })\r\n }\r\n }\r\n } catch (e) {\r\n console.error('检查登录状态失败:', e)\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n checkLoginStatus()\r\n // 自动填充测试账号密码\r\n account.value = TEST_ACCOUNT\r\n password.value = TEST_PASSWORD\r\n})\r\n\r\nconst validateAccount = (): boolean => {\r\n if (account.value.trim() === '') {\r\n uni.showToast({ title: '请填写账号', icon: 'none' })\r\n return false\r\n }\r\n if (loginType.value === 1) {\r\n if (!/^1[3-9]\\d{9}$/.test(account.value)) {\r\n uni.showToast({ title: '请输入正确的手机号码', icon: 'none' })\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nconst validatePassword = (): boolean => {\r\n if (password.value.trim() === '') {\r\n uni.showToast({ title: '请填写密码', icon: 'none' })\r\n return false\r\n }\r\n if (password.value.length < 6) {\r\n uni.showToast({ title: '密码长度不能少于6位', icon: 'none' })\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nconst validateCaptcha = (): boolean => {\r\n if (captcha.value.trim() === '') {\r\n uni.showToast({ title: '请填写验证码', icon: 'none' })\r\n return false\r\n }\r\n if (!/^\\d{6}$/.test(captcha.value)) {\r\n uni.showToast({ title: '请输入正确的验证码', icon: 'none' })\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nconst getCode = async () => {\r\n if (codeDisabled.value) return\r\n if (!validateAccount()) return\r\n\r\n uni.showToast({ title: '验证码已发送', icon: 'success' })\r\n\r\n codeDisabled.value = true\r\n codeCountdown.value = 60\r\n codeText.value = `${codeCountdown.value}秒后重试`\r\n\r\n codeTimer.value = setInterval(() => {\r\n codeCountdown.value--\r\n if (codeCountdown.value > 0) {\r\n codeText.value = `${codeCountdown.value}秒后重试`\r\n } else {\r\n codeDisabled.value = false\r\n codeText.value = '获取验证码'\r\n if (codeTimer.value != 0) {\r\n clearInterval(codeTimer.value)\r\n codeTimer.value = 0\r\n }\r\n }\r\n }, 1000) as number\r\n}\r\n\r\nconst handleLogin = async () => {\r\n if (!validateAccount()) return\r\n\r\n // 特殊账号处理:admin/admin 直接跳转\r\n if (account.value === 'admin' && password.value === 'admin') {\r\n setIsLoggedIn(true)\r\n const adminProfile = {\r\n id: 'admin',\r\n username: 'Admin',\r\n email: 'admin@mall.com',\r\n gender: 'unknown',\r\n birthday: '',\r\n height_cm: 0,\r\n weight_kg: 0,\r\n bio: 'Administrator',\r\n avatar_url: '/static/logo.png',\r\n preferred_language: 'zh-CN',\r\n role: 'admin',\r\n school_id: '',\r\n grade_id: '',\r\n class_id: ''\r\n } as UserProfile\r\n setUserProfile(adminProfile)\r\n \r\n uni.showToast({ title: '管理员登录成功', icon: 'success' })\r\n setTimeout(() => {\r\n uni.reLaunch({ url: '/pages/mall/consumer/index' })\r\n }, 500)\r\n return\r\n }\r\n\r\n if (loginType.value === 0) {\r\n if (!validatePassword()) return\r\n } else {\r\n if (!validateCaptcha()) return\r\n }\r\n\r\n isLoading.value = true\r\n try {\r\n logout()\r\n\r\n if (loginType.value === 0) {\r\n const isEmail = account.value.includes('@')\r\n if (isEmail) {\r\n // 邮箱 + 密码登录(Supabase Auth)\r\n const result = await supa.signIn(account.value.trim(), password.value)\r\n console.log('signIn result:', result)\r\n \r\n // 检查登录是否失败\r\n if (result.user == null) {\r\n // 检查是否是邮箱未确认的错误\r\n const rawData = result.raw as UTSJSONObject\r\n const errorMsg = rawData?.getString('msg') ?? ''\r\n const errorCode = rawData?.getString('error_code') ?? ''\r\n \r\n if (errorMsg.includes('email') && errorMsg.includes('confirm') || \r\n errorCode === 'email_not_confirmed' ||\r\n errorMsg.includes('邮箱') && errorMsg.includes('确认')) {\r\n throw new Error('邮箱未确认,请先检查邮箱并点击确认链接')\r\n } else if (errorMsg.includes('Invalid login credentials') || \r\n errorCode === 'invalid_credentials') {\r\n throw new Error('邮箱或密码错误')\r\n } else {\r\n throw new Error(errorMsg != '' ? errorMsg : '登录失败,请重试')\r\n }\r\n }\r\n } else {\r\n uni.showToast({ title: '手机号密码登录功能开发中', icon: 'none' })\r\n return\r\n }\r\n } else {\r\n uni.showToast({ title: '手机验证码登录功能开发中', icon: 'none' })\r\n return\r\n }\r\n\r\n // 尝试获取/补全用户资料,但失败时不再阻塞登录\r\n try {\r\n const profile = await getCurrentUser()\r\n console.log('current user profile:', profile)\r\n } catch (e) {\r\n console.error('获取用户信息失败(忽略,不阻塞登录):', e)\r\n }\r\n\r\n // 显式保存用户ID到本地存储,确保页面刷新或重启后 SupabaseService 能恢复身份\r\n const currentSession = supa.getSession()\r\n if (currentSession.user != null) {\r\n const uid = currentSession.user?.getString('id')\r\n if (uid != null) {\r\n uni.setStorageSync('user_id', uid)\r\n console.log('用户ID已保存到本地存储:', uid)\r\n }\r\n }\r\n\r\n uni.showToast({ title: '登录成功', icon: 'success' })\r\n setTimeout(() => {\r\n uni.reLaunch({ url: '/pages/mall/consumer/index' })\r\n }, 500)\r\n } catch (err) {\r\n console.error('登录错误:', err)\r\n let msg = '登录失败,请重试'\r\n // UTS 不支持 typeof 检查,直接尝试转换\r\n try {\r\n const e = err as Error\r\n if (e.message != null && e.message.trim() !== '') msg = e.message\r\n } catch (e2) {\r\n // 忽略转换错误,使用默认消息\r\n }\r\n uni.showToast({ title: msg, icon: 'none' })\r\n } finally {\r\n isLoading.value = false\r\n }\r\n}\r\n\r\nconst navigateToRegister = (): void => {\r\n uni.navigateTo({\r\n url: '/pages/user/register'\r\n })\r\n}\r\nconst handleTutorial = () => uni.showToast({ title: '扫码教程开发中', icon: 'none' })\r\nconst handleForgotPassword = () => uni.showToast({ title: '忘记密码开发中', icon: 'none' })\r\nconst handleWechatLogin = () => uni.showToast({ title: '微信登录开发中', icon: 'none' })\r\nconst handleQQLogin = () => uni.showToast({ title: 'QQ登录开发中', icon: 'none' })\r\n</script>\r\n\r\n<style scoped>\r\n/* Base */\r\n.page{\r\n /* min-height: 100vh; */ /* UVUE 不支持 vh */\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n background-color: #f5f6f8; /* UVUE 暂不支持 cssVars 在 style 标签中的变量引用 */\r\n}\r\n\r\n/* Header */\r\n.header{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: flex-start;\r\n padding: 30px 40px; /* 调整边距 */\r\n}\r\n.logo{\r\n width: 240px;\r\n height: 64px;\r\n}\r\n\r\n/* Main */\r\n.main{\r\n flex: 1;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 20px 10px;\r\n}\r\n\r\n/* Card */\r\n.card{\r\n /* width: min(980px, 92vw); UVUE 不支持 min/vw */\r\n /* min-height: 460px; */\r\n width: 90%;\r\n background-color: #ffffff;\r\n border-radius: 16px;\r\n /* box-shadow: var(--shadow); */\r\n padding: 30px;\r\n display: flex;\r\n flex-direction: column; /* App端改为列式布局兼容性更好,或者用 row 需注意 */\r\n /* gap: 32px; UVUE 不支持 gap */\r\n}\r\n\r\n/* Left - 暂隐藏或简化 */\r\n/* .left{ display: none; } */\r\n\r\n.left{\r\n /* flex: 0 0 52%; UVUE flex 简写支持不全,建议用 flex-grow/basis */\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n /* padding-left: 18px; */\r\n display: none; /* 移动端 App 暂时隐藏扫码区 */\r\n}\r\n.left-title{\r\n font-size: 18px;\r\n font-weight: 700; /* 600 -> 700 */\r\n color: #333333;\r\n margin-bottom: 10px;\r\n}\r\n.left-hint{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 14px; */\r\n margin-bottom: 18px;\r\n}\r\n/* 替代 gap */\r\n.hint-text{ font-size: 13px; color: #666666; margin-right: 14px; }\r\n.hint-link{ font-size: 13px; color: #e1251b; }\r\n\r\n.qr-wrap{\r\n width: 100%;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: flex-start;\r\n}\r\n.qr{\r\n width: 240px;\r\n height: 240px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.qr-placeholder{\r\n width: 220px;\r\n height: 220px;\r\n border: 1px solid #e6e6e6;\r\n border-radius: 8px;\r\n background-color: #fff;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n /* gap: 8px; */\r\n}\r\n/* 替代 gap */\r\n.qr-text{ font-size: 14px; color: #666666; margin-bottom: 8px; }\r\n.qr-sub{ font-size: 12px; color: #999999; }\r\n\r\n/* Divider */\r\n.divider{\r\n display: none; /* 移动端隐藏分割线 */\r\n}\r\n\r\n/* Right */\r\n.right{\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n}\r\n.right-inner{\r\n /* width: 360px; */\r\n /* max-width: 100%; UVUE 不支持百分比 max-width */\r\n width: 100%;\r\n margin-left: auto;\r\n}\r\n\r\n/* Tabs */\r\n.tabs{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center; /* 移动端居中 */\r\n /* gap: 24px; */\r\n margin-bottom: 18px;\r\n}\r\n.tab{\r\n position: relative;\r\n padding: 8px 12px; /* 增加内边距替代 gap */\r\n margin: 0 12px;\r\n}\r\n.tab-text{\r\n font-size: 16px;\r\n color: #666666;\r\n}\r\n.tab.active .tab-text{\r\n color: #e1251b;\r\n font-weight: 700; /* 600 -> 700 */\r\n}\r\n.tab-line{\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: -6px;\r\n height: 2px;\r\n background-color: #e1251b;\r\n border-radius: 2px;\r\n}\r\n\r\n/* Form */\r\n.form{ margin-top: 10px; }\r\n.field{ margin-bottom: 14px; }\r\n.input{\r\n width: 100%;\r\n height: 44px;\r\n border-radius: 10px;\r\n background-color: #f6f7f9;\r\n padding: 0 14px;\r\n font-size: 14px;\r\n color: #333333;\r\n /* box-sizing: border-box; */ /* App-UVUE 默认就是 border-box */\r\n}\r\n\r\n/* Code row */\r\n.code-row{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 10px; */\r\n}\r\n.code-input{ flex: 1; margin-right: 10px; }\r\n.code-btn{\r\n height: 44px;\r\n padding: 0 12px;\r\n border-radius: 10px;\r\n background-color: #fff;\r\n border: 1px solid #eee;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.code-btn.disabled{ opacity: 0.5; }\r\n.code-text{ font-size: 13px; color: #e1251b; }\r\n\r\n/* Button */\r\n.btn{\r\n margin-top: 16px;\r\n height: 46px;\r\n border-radius: 10px;\r\n background-color: rgba(225, 37, 27, 0.45); /* 注意 rgba 兼容性,建议用 hex 或 view opacity */\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.btn.disabled{ background-color: #d9d9d9; }\r\n.btn-text{\r\n color: #fff;\r\n font-size: 16px;\r\n font-weight: 700; /* 600 -> 700 */\r\n}\r\n\r\n/* Actions:一行横排 */\r\n.actions{\r\n margin-top: 16px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n /* gap: 12px; */\r\n flex-wrap: wrap; /* 允许换行 */\r\n}\r\n.action-item{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 8px; */\r\n margin: 0 6px;\r\n}\r\n.dot{\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 8px; /* 50% -> 8px (一半) */\r\n margin-right: 8px;\r\n}\r\n.dot.wechat{ background-color: #19be6b; }\r\n.dot.qq{ background-color: #2d8cf0; }\r\n\r\n.action-text{ font-size: 13px; color: #666666; }\r\n.action-link{ font-size: 13px; color: #666666; margin: 0 6px; }\r\n.sep{ font-size: 13px; color: #e0e0e0; margin: 0 6px; }\r\n\r\n/* Footer */\r\n.footer{\r\n padding: 18px 0 28px;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: center;\r\n}\r\n.footer-text{ font-size: 12px; color: #999999; }\r\n\r\n/* ===== 自适应:移除复杂 Media Query,使用简单流式布局 ===== */\r\n/*\r\n@media screen and (max-width: 1024px){\r\n .header{ padding: 24px 20px; }\r\n .logo{ width: 240px; height: 68px; }\r\n .card{ width: 92vw; padding: 28px; gap: 22px; }\r\n .right-inner{ width: 360px; }\r\n}\r\n@media screen and (max-width: 768px){\r\n .card{ flex-direction: column; min-height: auto; }\r\n .left{ display: none; }\r\n .divider{ display: none; }\r\n .right-inner{ width: 100%; margin-left: 0; }\r\n .actions{ flex-wrap: wrap; }\r\n}\r\n@media screen and (max-width: 520px){\r\n .sep{ display: none; }\r\n}\r\n*/\r\n</style>\r\n",null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BA6XM,cAAA;+BApOL,YAAA;+BANC,kBAAA;+BAsNE,aAAA;;;;;;;;;YA1NJ,IAAM,yBAAU,uBAAA,qBAAA,WAAA,yBAAA,GAAA,EAAA,CAAA;gBACd,aAAQ;gBACR,eAAU;gBACV,gBAAW;gBACX,eAAU;gBACV,gBAAW;gBACX,iBAAY;gBACZ,iBAAY;gBACZ,kBAAa;gBACb,iBAAY;aACb;YAED,IAAM,UAAU,IAAI,MAAM,EAAE;YAE5B,IAAM,YAAY,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAM,UAAU,IAAI,MAAM,EAAE;YAC5B,IAAM,WAAW,IAAI,MAAM,EAAE;YAC7B,IAAM,UAAU,IAAI,MAAM,EAAE;YAG5B,IAAM,eAAe;YACrB,IAAM,gBAAgB;YAEtB,IAAM,YAAY,IAAI,OAAO,EAAE,KAAK;YAEpC,IAAM,eAAe,IAAI,OAAO,EAAE,KAAK;YACvC,IAAM,WAAW,IAAI,MAAM,EAAE;YAC7B,IAAM,YAAY,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAM,gBAAgB,IAAI,MAAM,EAAE,CAAC;YAEnC,IAAM,mBAAmB,OAAI,IAAI,CAAG;gBAClC,IAAI;oBACF;wBAAkB;;oBAClB,IAAM,cAAc,aAAK,UAAU;oBACnC,IAAI,YAAW,EAAA,CAAI,IAAI,CAAA,EAAA,CAAI,YAAY,IAAI,CAAA,EAAA,CAAI,IAAI,EAAE;wBACnD,IAAM,QAAQ;wBACd,IAAI,MAAM,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;4BACpB,IAAM,cAAc,KAAK,CAAC,MAAM,MAAM,CAAA,CAAA,CAAG,CAAC,CAAC;4BAC3C,IAAM,OAAO,YAAY,OAAO,CAAA,EAAA,CAAI;4BACpC,IAAM,WAAW,KAAK,SAAS,CAAC;4BAChC,IAAI,SAAQ,EAAA,CAAI,IAAI,CAAA,EAAA,CAAI,SAAQ,EAAA,CAAI,IAAI;gCA9B/C,6BA+BwB,MAAK;8BACf,IAEN,CAFM;gCAhCd,6BAiCwB,MAAK;6BACrB;0BACI,IAEN,CAFM;4BAnCZ,6BAoCsB,MAAK;;;;iBAGxB,OAAO,cAAG;oBACV,QAAQ,KAAK,CAAC,aAAa,GAAA;;YAE/B;YAEA,UAAU,KAAK;gBACb;gBAEA,QAAQ,KAAK,GAAG;gBAChB,SAAS,KAAK,GAAG;YACnB;;YAEA,IAAM,kBAAkB,OAAI,OAAO,CAAG;gBACpC,IAAI,QAAQ,KAAK,CAAC,IAAI,GAAE,GAAA,CAAK,IAAI;oBA4J/B,+BA3JgB,QAAO,SAAS,OAAM;oBACtC,OAAO,KAAK;;gBAEd,IAAI,UAAU,KAAK,CAAA,GAAA,CAAK,CAAC,EAAE;oBACzB,IAAI,CAAC,iCAAgB,IAAI,CAAC,QAAQ,KAAK,GAAG;wBAuJ1C,+BAtJkB,QAAO,cAAc,OAAM;wBAC3C,OAAO,KAAK;;;gBAGhB,OAAO,IAAI;YACb;YAEA,IAAM,mBAAmB,OAAI,OAAO,CAAG;gBACrC,IAAI,SAAS,KAAK,CAAC,IAAI,GAAE,GAAA,CAAK,IAAI;oBA8IhC,+BA7IgB,QAAO,SAAS,OAAM;oBACtC,OAAO,KAAK;;gBAEd,IAAI,SAAS,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC,EAAE;oBA0I7B,+BAzIgB,QAAO,cAAc,OAAM;oBAC3C,OAAO,KAAK;;gBAEd,OAAO,IAAI;YACb;YAEA,IAAM,kBAAkB,OAAI,OAAO,CAAG;gBACpC,IAAI,QAAQ,KAAK,CAAC,IAAI,GAAE,GAAA,CAAK,IAAI;oBAkI/B,+BAjIgB,QAAO,UAAU,OAAM;oBACvC,OAAO,KAAK;;gBAEd,IAAI,CAAC,2BAAU,IAAI,CAAC,QAAQ,KAAK,GAAG;oBA8HlC,+BA7HgB,QAAO,aAAa,OAAM;oBAC1C,OAAO,KAAK;;gBAEd,OAAO,IAAI;YACb;YAEA,IAAM,UAAU,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBACzB,IAAI,aAAa,KAAK;4BAAE;;wBACxB,IAAI,CAAC;4BAAmB;;wBAqHtB,+BAnHc,QAAO,UAAU,OAAM;wBAEvC,aAAa,KAAK,GAAG,IAAI;wBACzB,cAAc,KAAK,GAAG,EAAE;wBACxB,SAAS,KAAK,GAAG,KAAG,cAAc,KAAK,GAAA;wBAEvC,UAAU,KAAK,GAAG,YAAY,KAAK;4BACjC,cAAc,KAAK;4BACnB,IAAI,cAAc,KAAK,CAAA,CAAA,CAAG,CAAC,EAAE;gCAC3B,SAAS,KAAK,GAAG,KAAG,cAAc,KAAK,GAAA;8BAClC,IAON,CAPM;gCACL,aAAa,KAAK,GAAG,KAAK;gCAC1B,SAAS,KAAK,GAAG;gCACjB,IAAI,UAAU,KAAK,CAAA,EAAA,CAAI,CAAC,EAAE;oCACxB,cAAc,UAAU,KAAK;oCAC7B,UAAU,KAAK,GAAG,CAAC;;;wBAGzB;0BAAG,IAAI,EAAC,EAAA,CAAI,MAAM;iBACnB;YAAD;YAEA,IAAM,cAAc,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC7B,IAAI,CAAC;4BAAmB;;wBAGxB,IAAI,QAAQ,KAAK,CAAA,GAAA,CAAK,QAAO,EAAA,CAAI,SAAS,KAAK,CAAA,GAAA,CAAK,SAAS;4BAC3D,cAAc,IAAI;4BAClB,IAAM,eAeD,YAdH,KAAI,SACJ,WAAU,SACV,QAAO,kBACP,SAAQ,WACR,WAAU,IACV,YAAW,CAAC,EACZ,YAAW,CAAC,EACZ,MAAK,iBACL,aAAY,oBACZ,qBAAoB,SACpB,OAAM,SACN,YAAW,IACX,WAAU,IACV,WAAU;4BAEZ,eAAe;4BAwEf,+BAtEgB,QAAO,WAAW,OAAM;4BACxC,WAAW,KAAK;gCA3InB,6BA4IoB,MAAK;4BACtB;8BAAG,GAAG;4BACN;;wBAGF,IAAI,UAAU,KAAK,CAAA,GAAA,CAAK,CAAC,EAAE;4BACzB,IAAI,CAAC;gCAAoB;;0BACpB,IAEN,CAFM;4BACL,IAAI,CAAC;gCAAmB;;;wBAG1B,UAAU,KAAK,GAAG,IAAI;wBACtB,IAAI;4BACF;4BAEA,IAAI,UAAU,KAAK,CAAA,GAAA,CAAK,CAAC,EAAE;gCACzB,IAAM,UAAU,QAAQ,KAAK,CAAC,QAAQ,CAAC;gCACvC,IAAI,SAAS;oCAEX,IAAM,SAAS,MAAM,aAAK,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,SAAS,KAAK;oCACrE,QAAQ,GAAG,CAAC,kBAAkB,QAAK;oCAGnC,IAAI,OAAO,IAAI,CAAA,EAAA,CAAI,IAAI,EAAE;wCAEvB,IAAM,UAAU,OAAO,GAAG,CAAA,EAAA,CAAI;wCAC9B,IAAM,WAAW,SAAS,UAAU,OAAM,EAAA,CAAI;wCAC9C,IAAM,YAAY,SAAS,UAAU,cAAa,EAAA,CAAI;wCAEtD,IAAI,SAAS,QAAQ,CAAC,SAAQ,EAAA,CAAI,SAAS,QAAQ,CAAC,WAAU,EAAA,CAC1D,UAAS,GAAA,CAAK,sBAAqB,EAAA,CACnC,SAAS,QAAQ,CAAC,MAAK,EAAA,CAAI,SAAS,QAAQ,CAAC,OAAO;4CACtD,MAAM,AAAI,SAAM,sBAAsB;0CACjC,IAKN,CALM,IAAI,SAAS,QAAQ,CAAC,6BAA4B,EAAA,CAC9C,UAAS,GAAA,CAAK,uBAAuB;4CAC9C,MAAM,AAAI,SAAM,UAAU;0CACrB,IAEN,CAFM;4CACL,MAAM,AAAI,SAAM,IAAA,SAAQ,EAAA,CAAI,IAAK;gDAAA;4CAAA,EAAW,IAAU,CAAV;gDAAA;4CAAA;4CAAU,CAAC;;;kCAGtD,IAGN,CAHM;oCA4BT,+BA3BoB,QAAO,gBAAgB,OAAM;oCAC7C;iCACD;8BACI,IAGN,CAHM;gCAwBP,+BAvBkB,QAAO,gBAAgB,OAAM;gCAC7C;;4BAIF,IAAI;gCACF,IAAM,UAAU,MAAM;gCACtB,QAAQ,GAAG,CAAC,yBAAyB,SAAM;;6BAC3C,OAAO,cAAG;gCACV,QAAQ,KAAK,CAAC,uBAAuB,GAAA;;4BAIvC,IAAM,iBAAiB,aAAK,UAAU;4BACtC,IAAI,eAAe,IAAI,CAAA,EAAA,CAAI,IAAI,EAAE;gCAC/B,IAAM,MAAM,eAAe,IAAI,EAAE,UAAU;gCAC3C,IAAI,IAAG,EAAA,CAAI,IAAI,EAAE;oCA/MrB,mBAgNyB,WAAW;oCAC9B,QAAQ,GAAG,CAAC,iBAAiB,KAAE;;;4BAKnC,+BADgB,QAAO,QAAQ,OAAM;4BACrC,WAAW,KAAK;gCAhNnB,6BAiNoB,MAAK;4BACtB;8BAAG,GAAG;;yBACN,OAAO,gBAAK;4BACZ,QAAQ,KAAK,CAAC,SAAS,KAAE;4BACzB,IAAI,MAAM;4BAEV,IAAI;gCACF,IAAM,IAAI,IAAG,EAAA,CAAI;gCACjB,IAAI,EAAE,OAAO,CAAA,EAAA,CAAI,IAAI,CAAA,EAAA,CAAI,EAAE,OAAO,CAAC,IAAI,GAAE,GAAA,CAAK;oCAAI,MAAM,EAAE,OAAO;;;6BACjE,OAAO,eAAI;4BAVb,+BAagB,QAAO,KAAK,OAAM;;iCAC1B;4BACR,UAAU,KAAK,GAAG,KAAK;;iBAE1B;YAAD;YAEA,IAAM,qBAAqB,OAAI,IAAI,CAAG;gBAChC,iCACF,MAAK;YAET;YACA,IAAM,iBAAiB;uBAAM,AAxBzB,+BAwByC,QAAO,WAAW,OAAM;;YACrE,IAAM,uBAAuB;uBAAM,AAzB/B,+BAyB+C,QAAO,WAAW,OAAM;;YAC3E,IAAM,oBAAoB;uBAAM,AA1B5B,+BA0B4C,QAAO,WAAW,OAAM;;YACxE,IAAM,gBAAgB;uBAAM,AA3BxB,+BA2BwC,QAAO,WAAW,OAAM;;;uBAnYlE,IAoIO,QAAA,IApID,WAAM,QAAQ,WAAO;oBAEzB,IAIO,QAAA,IAJD,WAAM,WAAQ;wBAClB,IAEO,QAAA,IAFD,WAAM,gBAAa;4BACvB,IAAsD,SAAA,IAA9C,SAAK,QAAA,KAAO,EAAE,UAAK,aAAY,WAAM;;;;;oBAKjD,IAqHO,QAAA,IArHD,WAAM,SAAM;wBAChB,IAmHO,QAAA,IAnHD,WAAM,SAAM;4BAEhB,IAgBO,QAAA,IAhBD,WAAM,SAAM;gCAChB,IAAwC,QAAA,IAAlC,WAAM,eAAa;gCAEzB,IAGO,QAAA,IAHD,WAAM,cAAW;oCACrB,IAAyC,QAAA,IAAnC,WAAM,cAAY;oCACxB,IAA2D,QAAA,IAArD,WAAM,aAAa,aAAO,iBAAgB;;gCAGlD,IAOO,QAAA,IAPD,WAAM,YAAS;oCACnB,IAKO,QAAA,IALD,WAAM,OAAI;wCACd,IAGO,QAAA,IAHD,WAAM,mBAAgB;4CAC1B,IAAkC,QAAA,IAA5B,WAAM,YAAU;4CACtB,IAAmC,QAAA,IAA7B,WAAM,WAAS;;;;;4BAO7B,IAA6B,QAAA,IAAvB,WAAM;4BAGZ,IA0FO,QAAA,IA1FD,WAAM,UAAO;gCACjB,IAwFO,QAAA,IAxFD,WAAM,gBAAa;oCAEvB,IAUO,QAAA,IAVD,WAAM,SAAM;wCAChB,IAGO,QAAA,IAHD,WAAK,IAAA;4CAAC;4CAAc,IAAA,aAAA,UAAA,KAAA,CAAA,GAAA,CAAA,CAAA;yCAA2B,GAAG,aAAK,KAAA;4CAAE,UAAA,KAAS,GAAA,CAAA;wCAAA;;4CACtE,IAAkC,QAAA,IAA5B,WAAM,aAAW;4CACX,IAAA,UAAA,KAAS,CAAA,GAAA,CAAA,CAAA,EAArB;gDAAA,IAAqD,QAAA,gBAAxB,WAAM;;;;;;;wCAGrC,IAGO,QAAA,IAHD,WAAK,IAAA;4CAAC;4CAAc,IAAA,aAAA,UAAA,KAAA,CAAA,GAAA,CAAA,CAAA;yCAA2B,GAAG,aAAK,KAAA;4CAAE,UAAA,KAAS,GAAA,CAAA;wCAAA;;4CACtE,IAAkC,QAAA,IAA5B,WAAM,aAAW;4CACX,IAAA,UAAA,KAAS,CAAA,GAAA,CAAA,CAAA,EAArB;gDAAA,IAAqD,QAAA,gBAAxB,WAAM;;;;;;;;oCAKvC,IAwEO,QAAA,IAxED,WAAM,SAAM;wCACA,IAAA,UAAA,KAAS,CAAA,GAAA,CAAA,CAAA,EAAzB;4CAAA,IAiBW,UAAA,IAAA,SAAA,CAAA,GAAA;gDAhBT,IAOO,QAAA,IAPD,WAAM,UAAO;oDACjB,IAKE,SAAA,IAJA,WAAM,SACN,UAAK,QACL,iBAAY,8BACH,QAAA,KAAO;wDAAP,QAAO,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oDAAA;;;;;gDAGpB,IAOO,QAAA,IAPD,WAAM,UAAO;oDACjB,IAKE,SAAA,IAJA,WAAM,SACN,UAAK,YACL,iBAAY,sBACH,SAAA,KAAQ;wDAAR,SAAQ,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oDAAA;;;;;;0CAKvB,KAAA;4CAAA,IAuBW,UAAA,IAAA,SAAA,CAAA,GAAA;gDAtBT,IAQO,QAAA,IARD,WAAM,UAAO;oDACjB,IAME,SAAA,IALA,WAAM,SACN,UAAK,QACL,iBAAY,UACZ,eAAU,sBACD,QAAA,KAAO;wDAAP,QAAO,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oDAAA;;;;;;gDAIpB,IAWO,QAAA,IAXD,WAAM,mBAAgB;oDAC1B,IAME,SAAA,IALA,WAAM,oBACN,UAAK,QACL,iBAAY,SACZ,eAAU,qBACD,QAAA,KAAO;wDAAP,QAAO,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oDAAA;;;;;oDAElB,IAEO,QAAA,IAFD,WAAK,IAAA;wDAAC;wDAAmB,IAAA,aAAA,KAAY,EAAA;4DAAA;wDAAA,EAAA,IAAA,CAAA;4DAAA;wDAAA;qDAAA,GAAqB,aAAO;wDACrE,IAA6C,QAAA,IAAvC,WAAM,cAAW,IAAI,SAAA,KAAQ,GAAA,CAAA;;;;;;wCAMzC,IAEO,QAAA,IAFD,WAAK,IAAA;4CAAC;4CAAc,IAAA,cAAA,UAAA,KAAA;yCAAuB,GAAG,aAAO;4CACzD,IAAgC,QAAA,IAA1B,WAAM,aAAW;;wCAIzB,IAoBO,QAAA,IApBD,WAAM,YAAS;4CACnB,IAGO,QAAA,IAHD,WAAM,eAAe,aAAO;gDAChC,IAAgC,QAAA,IAA1B,WAAM;gDACZ,IAAqC,QAAA,IAA/B,WAAM,gBAAc;;4CAG5B,IAA0B,QAAA,IAApB,WAAM,QAAM;4CAElB,IAGO,QAAA,IAHD,WAAM,eAAe,aAAO;gDAChC,IAA4B,QAAA,IAAtB,WAAM;gDACZ,IAAqC,QAAA,IAA/B,WAAM,gBAAc;;4CAG5B,IAA0B,QAAA,IAApB,WAAM,QAAM;4CAElB,IAAmE,QAAA,IAA7D,WAAM,eAAe,aAAO,uBAAsB;4CAExD,IAA0B,QAAA,IAApB,WAAM,QAAM;4CAElB,IAAiE,QAAA,IAA3D,WAAM,eAAe,aAAO,qBAAoB;;;;;;;oBASlE,IAEO,QAAA,IAFD,WAAM,WAAQ;wBAClB,IAA0E,QAAA,IAApE,WAAM,gBAAc"} |