From b54fef91614554051c32813d7d570f8d7bb3fdde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B7=E4=B8=AA=E5=90=8D=E5=AD=97=E5=A5=BD=E9=9A=BE?= =?UTF-8?q?=E7=9A=84=E5=96=B5?= <25520958+MisakaAldrich@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:19:54 +0800 Subject: [PATCH] =?UTF-8?q?JS:=20=E5=88=87=E6=8D=A2=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E4=B8=89=E5=90=88=E4=B8=80=20(#2298)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JS: 切换账号三合一 * 存档以供后人参考 --- .../js/切换账号(OCR)版本/README.md | 84 +-- .../js/切换账号(OCR)版本/assets/agree.png | Bin .../切换账号(OCR)版本/assets/click_into.png | Bin .../assets/input_password.png | Bin .../assets/input_phone_or_email.png | Bin .../assets/login_other_account.png | Bin .../assets/login_other_account_1.png | Bin .../assets/login_out_account.png | Bin .../切换账号(OCR)版本/assets/out_account.png | Bin .../切换账号(OCR)版本/assets/out_to_login.png | Bin .../js/切换账号(OCR)版本/assets/pm_menu.png | Bin .../js/切换账号(OCR)版本/assets/pm_out.png | Bin .../切换账号(OCR)版本/assets/verification.png | Bin .../js/切换账号(OCR)版本/main.js | 400 ++++++------ .../js/切换账号(OCR)版本/manifest.json | 36 +- .../js/切换账号(OCR)版本/settings.json | 26 +- .../js/切换账号(非OCR)版本/README.md | 0 .../js/切换账号(非OCR)版本/main.js | 126 ++-- .../js/切换账号(非OCR)版本/manifest.json | 36 +- .../js/切换账号(非OCR)版本/settings.json | 26 +- .../js/切换账号Dropdown/README.md | 0 .../js/切换账号Dropdown/assets/caret.png | Bin .../js/切换账号Dropdown/assets/logout.png | Bin .../切换账号Dropdown/assets/paimon_cancel.png | Bin .../切换账号Dropdown/assets/paimon_menu.png | Bin .../js/切换账号Dropdown/assets/quit.png | Bin {repo => archive}/js/切换账号Dropdown/main.js | 0 .../js/切换账号Dropdown/manifest.json | 0 .../js/切换账号Dropdown/settings.json | 0 .../Assets/RecognitionObject/agree.png | Bin 0 -> 1722 bytes .../Assets/RecognitionObject/caret.png | Bin 0 -> 367 bytes .../Assets/RecognitionObject/click_into.png | Bin 0 -> 13921 bytes .../RecognitionObject/input_password.png | Bin 0 -> 2438 bytes .../input_phone_or_email.png | Bin 0 -> 3830 bytes .../RecognitionObject/login_other_account.png | Bin 0 -> 3868 bytes .../login_other_account_1.png | Bin 0 -> 3876 bytes .../RecognitionObject/login_out_account.png | Bin 0 -> 852 bytes .../Assets/RecognitionObject/logout.png | Bin 0 -> 646 bytes .../Assets/RecognitionObject/out_account.png | Bin 0 -> 1886 bytes .../Assets/RecognitionObject/out_to_login.png | Bin 0 -> 12498 bytes .../RecognitionObject/paimon_cancel.png | Bin 0 -> 1721 bytes .../Assets/RecognitionObject/paimon_menu.png | Bin 0 -> 2372 bytes .../Assets/RecognitionObject/pm_menu.png | Bin 0 -> 2661 bytes .../Assets/RecognitionObject/pm_out.png | Bin 0 -> 2070 bytes .../Assets/RecognitionObject/quit.png | Bin 0 -> 1904 bytes .../Assets/RecognitionObject/verification.png | Bin 0 -> 2241 bytes repo/js/SwitchAccountMultipleMode/README.md | 35 + repo/js/SwitchAccountMultipleMode/main.js | 604 ++++++++++++++++++ .../SwitchAccountMultipleMode/manifest.json | 32 + .../SwitchAccountMultipleMode/settings.json | 23 + 50 files changed, 1061 insertions(+), 367 deletions(-) rename {repo => archive}/js/切换账号(OCR)版本/README.md (97%) rename {repo => archive}/js/切换账号(OCR)版本/assets/agree.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/click_into.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/input_password.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/input_phone_or_email.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/login_other_account.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/login_other_account_1.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/login_out_account.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/out_account.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/out_to_login.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/pm_menu.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/pm_out.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/assets/verification.png (100%) rename {repo => archive}/js/切换账号(OCR)版本/main.js (97%) rename {repo => archive}/js/切换账号(OCR)版本/manifest.json (97%) rename {repo => archive}/js/切换账号(OCR)版本/settings.json (95%) rename {repo => archive}/js/切换账号(非OCR)版本/README.md (100%) rename {repo => archive}/js/切换账号(非OCR)版本/main.js (96%) rename {repo => archive}/js/切换账号(非OCR)版本/manifest.json (96%) rename {repo => archive}/js/切换账号(非OCR)版本/settings.json (94%) rename {repo => archive}/js/切换账号Dropdown/README.md (100%) rename {repo => archive}/js/切换账号Dropdown/assets/caret.png (100%) rename {repo => archive}/js/切换账号Dropdown/assets/logout.png (100%) rename {repo => archive}/js/切换账号Dropdown/assets/paimon_cancel.png (100%) rename {repo => archive}/js/切换账号Dropdown/assets/paimon_menu.png (100%) rename {repo => archive}/js/切换账号Dropdown/assets/quit.png (100%) rename {repo => archive}/js/切换账号Dropdown/main.js (100%) rename {repo => archive}/js/切换账号Dropdown/manifest.json (100%) rename {repo => archive}/js/切换账号Dropdown/settings.json (100%) create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/agree.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/caret.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/click_into.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/input_password.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/input_phone_or_email.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_other_account_1.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/logout.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/out_account.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/out_to_login.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_cancel.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_menu.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_menu.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_out.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/quit.png create mode 100644 repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/verification.png create mode 100644 repo/js/SwitchAccountMultipleMode/README.md create mode 100644 repo/js/SwitchAccountMultipleMode/main.js create mode 100644 repo/js/SwitchAccountMultipleMode/manifest.json create mode 100644 repo/js/SwitchAccountMultipleMode/settings.json diff --git a/repo/js/切换账号(OCR)版本/README.md b/archive/js/切换账号(OCR)版本/README.md similarity index 97% rename from repo/js/切换账号(OCR)版本/README.md rename to archive/js/切换账号(OCR)版本/README.md index f0d48ab5f..abbc7bcab 100644 --- a/repo/js/切换账号(OCR)版本/README.md +++ b/archive/js/切换账号(OCR)版本/README.md @@ -1,42 +1,42 @@ -# 自动切换账号脚本 - -**重要免责声明:** - -1. **数据安全:** - 1. 本脚本使用的用户名、密码等敏感信息仅存储在本地设备,开发者无法获取。 - 2. 使用者需自行承担账户信息泄露风险,请勿在公共设备或不可信环境中使用。 -2. **使用风险:** - 1. 本脚本为开源学习项目,禁止用于商业用途或违反游戏条款的行为。 - 2. 滥用可能导致游戏账号封禁,开发者不承担任何直接或间接责任。 -3. **责任限制:** - 1. 本脚本按“现状”提供,不承诺兼容性、安全性或功能完整性。 - 2. 因使用本脚本导致的账号、数据、设备损失,开发者概不负责。 -4. **禁止条款:** - 1. 严禁逆向工程、恶意篡改或用于外挂等非法用途。 - 2. 若游戏运营商提出要求,开发者保留随时停止维护的权利。 - -使用脚本即表示您已阅读并同意上述条款。 - -如果使用BGI一条龙启动,且第一个脚本就是账号切换,则需要开启BGI启动配置-同时启动原神-自动进入游戏 - -根据使用者设备配置和网络环境,脚本中的延时可以适当调整。(如果不熟悉脚本操作则不建议修改延时) - -作者留言: -毕竟都使用BGI了,时间还算个事吗?(笑) - -需要国际服适配脚本私信我。 - -**Last Updated:** 2025-06-26 - ---- -# 脚本信息 - @name 原神自动化登录脚本 - @version 1.2 - @description 原神自动登录工具(仅供学习交流,请勿商业用途) - @author 彩虹QQ人 - @match 原神版本:≥5.5;BGI版本:≥0.44.6 - - # 更新记录 -2025年6月26日 version 1.1 整合代码 - -2025年6月27日 version 1.2 解决循环无法跳出的问题 +# 自动切换账号脚本 + +**重要免责声明:** + +1. **数据安全:** + 1. 本脚本使用的用户名、密码等敏感信息仅存储在本地设备,开发者无法获取。 + 2. 使用者需自行承担账户信息泄露风险,请勿在公共设备或不可信环境中使用。 +2. **使用风险:** + 1. 本脚本为开源学习项目,禁止用于商业用途或违反游戏条款的行为。 + 2. 滥用可能导致游戏账号封禁,开发者不承担任何直接或间接责任。 +3. **责任限制:** + 1. 本脚本按“现状”提供,不承诺兼容性、安全性或功能完整性。 + 2. 因使用本脚本导致的账号、数据、设备损失,开发者概不负责。 +4. **禁止条款:** + 1. 严禁逆向工程、恶意篡改或用于外挂等非法用途。 + 2. 若游戏运营商提出要求,开发者保留随时停止维护的权利。 + +使用脚本即表示您已阅读并同意上述条款。 + +如果使用BGI一条龙启动,且第一个脚本就是账号切换,则需要开启BGI启动配置-同时启动原神-自动进入游戏 + +根据使用者设备配置和网络环境,脚本中的延时可以适当调整。(如果不熟悉脚本操作则不建议修改延时) + +作者留言: +毕竟都使用BGI了,时间还算个事吗?(笑) + +需要国际服适配脚本私信我。 + +**Last Updated:** 2025-06-26 + +--- +# 脚本信息 + @name 原神自动化登录脚本 + @version 1.2 + @description 原神自动登录工具(仅供学习交流,请勿商业用途) + @author 彩虹QQ人 + @match 原神版本:≥5.5;BGI版本:≥0.44.6 + + # 更新记录 +2025年6月26日 version 1.1 整合代码 + +2025年6月27日 version 1.2 解决循环无法跳出的问题 diff --git a/repo/js/切换账号(OCR)版本/assets/agree.png b/archive/js/切换账号(OCR)版本/assets/agree.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/agree.png rename to archive/js/切换账号(OCR)版本/assets/agree.png diff --git a/repo/js/切换账号(OCR)版本/assets/click_into.png b/archive/js/切换账号(OCR)版本/assets/click_into.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/click_into.png rename to archive/js/切换账号(OCR)版本/assets/click_into.png diff --git a/repo/js/切换账号(OCR)版本/assets/input_password.png b/archive/js/切换账号(OCR)版本/assets/input_password.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/input_password.png rename to archive/js/切换账号(OCR)版本/assets/input_password.png diff --git a/repo/js/切换账号(OCR)版本/assets/input_phone_or_email.png b/archive/js/切换账号(OCR)版本/assets/input_phone_or_email.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/input_phone_or_email.png rename to archive/js/切换账号(OCR)版本/assets/input_phone_or_email.png diff --git a/repo/js/切换账号(OCR)版本/assets/login_other_account.png b/archive/js/切换账号(OCR)版本/assets/login_other_account.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/login_other_account.png rename to archive/js/切换账号(OCR)版本/assets/login_other_account.png diff --git a/repo/js/切换账号(OCR)版本/assets/login_other_account_1.png b/archive/js/切换账号(OCR)版本/assets/login_other_account_1.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/login_other_account_1.png rename to archive/js/切换账号(OCR)版本/assets/login_other_account_1.png diff --git a/repo/js/切换账号(OCR)版本/assets/login_out_account.png b/archive/js/切换账号(OCR)版本/assets/login_out_account.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/login_out_account.png rename to archive/js/切换账号(OCR)版本/assets/login_out_account.png diff --git a/repo/js/切换账号(OCR)版本/assets/out_account.png b/archive/js/切换账号(OCR)版本/assets/out_account.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/out_account.png rename to archive/js/切换账号(OCR)版本/assets/out_account.png diff --git a/repo/js/切换账号(OCR)版本/assets/out_to_login.png b/archive/js/切换账号(OCR)版本/assets/out_to_login.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/out_to_login.png rename to archive/js/切换账号(OCR)版本/assets/out_to_login.png diff --git a/repo/js/切换账号(OCR)版本/assets/pm_menu.png b/archive/js/切换账号(OCR)版本/assets/pm_menu.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/pm_menu.png rename to archive/js/切换账号(OCR)版本/assets/pm_menu.png diff --git a/repo/js/切换账号(OCR)版本/assets/pm_out.png b/archive/js/切换账号(OCR)版本/assets/pm_out.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/pm_out.png rename to archive/js/切换账号(OCR)版本/assets/pm_out.png diff --git a/repo/js/切换账号(OCR)版本/assets/verification.png b/archive/js/切换账号(OCR)版本/assets/verification.png similarity index 100% rename from repo/js/切换账号(OCR)版本/assets/verification.png rename to archive/js/切换账号(OCR)版本/assets/verification.png diff --git a/repo/js/切换账号(OCR)版本/main.js b/archive/js/切换账号(OCR)版本/main.js similarity index 97% rename from repo/js/切换账号(OCR)版本/main.js rename to archive/js/切换账号(OCR)版本/main.js index 2cc2faa9f..2f0cfdca0 100644 --- a/repo/js/切换账号(OCR)版本/main.js +++ b/archive/js/切换账号(OCR)版本/main.js @@ -1,201 +1,201 @@ -const author = "彩虹QQ人"; -const script_name = "切换账号(OCR)版本"; - -const pm_out = { - template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/pm_out.png")), - name: "pm_out.png" -}; -const out_to_login = { - template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/out_to_login.png")), - name: "out_to_login.png" -}; -const login_out_account = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/login_out_account.png")), - name: "login_out_account.png" -}; -const out_account = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/out_account.png")), - name: "out_account.png" -}; -const login_other_account = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/login_other_account_1.png")), - name: "login_other_account.png" -}; -const input_phone_or_email = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/input_phone_or_email.png")), - name: "input_phone_or_email.png" -}; -const input_password = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/input_password.png")), - name: "input_password.png" -}; -const agree = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/agree.png")), - name: "agree.png" -}; -//人机验证识别图片 -const login_verification = { - template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/verification.png")), - name: "verification.png" -}; - -async function clickCenter(x, y, width, height) { - let centerX = Math.round(x + width / 2); - let centerY = Math.round(y + height / 2); - await click(centerX, centerY); - await sleep(500); // 确保点击后有足够的时间等待 - return { success: true, x: centerX, y: centerY }; -} - -async function matchImgAndClick(obj, desc, timeout = 8000) { - const start = Date.now(); - let retryCount = 0; // 识别次数计数 - let status = false; // 用于记录是否匹配成功 - try { - while (Date.now() - start < timeout && !status) { - await sleep(300); - const ro = captureGameRegion(); - let result = ro.Find(obj.template); - ro.dispose(); - await sleep(500); // 短暂延迟,避免过快循环 - if (result.isExist()) { - let clickResult = await clickCenter(result.x, result.y, result.width, result.height); - log.info(`【IMG】成功识别并点击 ${desc}| 耗时: ${Date.now() - start}ms`); - status = true; // 设置匹配成功状态 - return {success: true, x: clickResult.x, y: clickResult.y}; - } - // await sleep(200); // 短暂延迟,避免过快循环 - log.info(`【IMG】第${retryCount++}次识别并点击 ${desc} 失败 | 耗时: ${Date.now() - start}ms`); - } - } catch (error) { - log.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); - //如果有配置通知…… - notification.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); - throw new Error(`【IMG】识别图像时发生异常: ${error.message}`); - } - return {success: false}; -} -async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { - let start = Date.now(); - let retryCount = 0; // 重试计数 - let status = false; // 用于记录是否匹配成功 - try { - while (Date.now() - start < timeout && !status) { - const ro = captureGameRegion(); - let resultList = ro.findMulti(ocrRegion); - ro.dispose(); - await sleep(500); // 短暂延迟,避免过快循环 - for (let result of resultList) { - if (result.text.includes(targetText)) { - let clickResult = await clickCenter(result.x, result.y, result.width, result.height); - log.info(`【OCR】成功识别并点击 ${targetText}| 耗时: ${Date.now() - start}ms`); - status = true; // 设置匹配成功状态 - return {success: true, x: clickResult.x, y: clickResult.y}; - } - } - // await sleep(200); // 短暂延迟,避免过快循环 - log.info(`【OCR】${targetText}失败,正在进行第 ${retryCount++} 次重试...`); - } - }catch (error) { - log.warn(`【OCR】经过多次尝试,仍然无法识别文字: ”${targetText}“,尝试点击默认中心位置`); - await clickCenter(result.x, result.y, result.width, result.height); - //如果有配置通知…… - notification.error(`【OCR】识别文字: “${targetText}”,发生异常`); - throw new Error(`【OCR】识别文字时发生异常: ${error.message}`); - } - return {success: false }; -} -/** - * main流程开始 - */ -(async function () { - - setGameMetrics(1920, 1080, 1); - // 如果切换账号是第一个脚本,则有可能出现月卡选项 - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 - try { - keyDown("VK_MENU"); - await sleep(500); - for(let i = 0; i<=4; i++){ - await click(genshin.width / 2.0, genshin.height * 0.8); - await sleep(1000); - } - }finally { - keyUp("VK_MENU"); - } - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - await genshin.returnMainUi(); - - await keyPress("VK_ESCAPE"); - await sleep(500); - try { - await matchImgAndClick(pm_out,"左下角退出门"); - await matchImgAndClick(out_to_login,"退出至登陆页面"); - //这一步根据 电脑配置和当前网络情况不同休眠时间不同,建议实际运行之后,如果有日志 : 第x次 识别失败,就适当增加休眠时间 - await sleep(9000); - await matchImgAndClick(login_out_account,"登录页的右下角退出按钮"); - await matchImgAndClick(out_account,"退出当前账号"); - await matchImgAndClick(login_other_account,"登录其他账号"); - await sleep(1000); - await matchImgAndClick(input_phone_or_email,"填写邮箱/手机号"); - await inputText(settings.username); - await sleep(1000); - await matchImgAndClick(input_password,"填写密码"); - await inputText(settings.password); - await sleep(1000); - //按下回车登录账号,弹出用户协议对话框 - await keyPress("VK_RETURN"); - //点击回车后,等待特瓦特大门加载 - await matchImgAndClick(agree,"同意用户协议"); - //如果当天上下线次数过于频繁 - for(let i = 1;i<=2;i++){ - const ro = captureGameRegion(); - let verify = ro.Find(login_verification.template); - ro.dispose(); - //等待1s避免循环速度过快 - await sleep(1000); - if (verify.isExist()) { - //这里可配置通知方法 - notification.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); - log.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); - } - } - /** - * 根据不同网络环境和电脑配置,此操作可能会将领取月卡操作取代,但是不影响使用 - * 如果发现卡在这一步,请适当延长sleep时间 - */ - await sleep(8000); - await recognizeTextAndClick("点击进入", RecognitionObject.Ocr(862, 966, 206, 104), 960, 540, 5000); - await sleep(15000); - - //可能登录账号的时候出现月卡提醒,则先点击一次月卡。 - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //await genshin.blessingOfTheWelkinMoon(); - //await sleep(1000); - //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 - await sleep(2000); - keyDown("VK_MENU"); - await sleep(500); - for(let i = 0; i<=4; i++){ - await click(genshin.width / 2.0, genshin.height * 0.8); - await sleep(1000); - } - //keyUp("VK_MENU"); - await genshin.returnMainUi(); - await sleep(1000); - // 如果配置了通知 - notification.send("账号【" + settings.UID + "】切换成功"); - }catch (error) { - log.error(`${script_name}脚本执行过程中发生错误:${error.message}`); - //如果发生错误,则发送通知 - notification.error(`${script_name}脚本执行过程中发生错误:${error.message}`); - throw new Error(`${script_name}脚本执行过程中发生错误:${error.message}`); - }finally { - keyUp("VK_MENU"); - } - +const author = "彩虹QQ人"; +const script_name = "切换账号(OCR)版本"; + +const pm_out = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/pm_out.png")), + name: "pm_out.png" +}; +const out_to_login = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/out_to_login.png")), + name: "out_to_login.png" +}; +const login_out_account = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/login_out_account.png")), + name: "login_out_account.png" +}; +const out_account = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/out_account.png")), + name: "out_account.png" +}; +const login_other_account = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/login_other_account_1.png")), + name: "login_other_account.png" +}; +const input_phone_or_email = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/input_phone_or_email.png")), + name: "input_phone_or_email.png" +}; +const input_password = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/input_password.png")), + name: "input_password.png" +}; +const agree = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/agree.png")), + name: "agree.png" +}; +//人机验证识别图片 +const login_verification = { + template:RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/verification.png")), + name: "verification.png" +}; + +async function clickCenter(x, y, width, height) { + let centerX = Math.round(x + width / 2); + let centerY = Math.round(y + height / 2); + await click(centerX, centerY); + await sleep(500); // 确保点击后有足够的时间等待 + return { success: true, x: centerX, y: centerY }; +} + +async function matchImgAndClick(obj, desc, timeout = 8000) { + const start = Date.now(); + let retryCount = 0; // 识别次数计数 + let status = false; // 用于记录是否匹配成功 + try { + while (Date.now() - start < timeout && !status) { + await sleep(300); + const ro = captureGameRegion(); + let result = ro.Find(obj.template); + ro.dispose(); + await sleep(500); // 短暂延迟,避免过快循环 + if (result.isExist()) { + let clickResult = await clickCenter(result.x, result.y, result.width, result.height); + log.info(`【IMG】成功识别并点击 ${desc}| 耗时: ${Date.now() - start}ms`); + status = true; // 设置匹配成功状态 + return {success: true, x: clickResult.x, y: clickResult.y}; + } + // await sleep(200); // 短暂延迟,避免过快循环 + log.info(`【IMG】第${retryCount++}次识别并点击 ${desc} 失败 | 耗时: ${Date.now() - start}ms`); + } + } catch (error) { + log.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + //如果有配置通知…… + notification.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + throw new Error(`【IMG】识别图像时发生异常: ${error.message}`); + } + return {success: false}; +} +async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { + let start = Date.now(); + let retryCount = 0; // 重试计数 + let status = false; // 用于记录是否匹配成功 + try { + while (Date.now() - start < timeout && !status) { + const ro = captureGameRegion(); + let resultList = ro.findMulti(ocrRegion); + ro.dispose(); + await sleep(500); // 短暂延迟,避免过快循环 + for (let result of resultList) { + if (result.text.includes(targetText)) { + let clickResult = await clickCenter(result.x, result.y, result.width, result.height); + log.info(`【OCR】成功识别并点击 ${targetText}| 耗时: ${Date.now() - start}ms`); + status = true; // 设置匹配成功状态 + return {success: true, x: clickResult.x, y: clickResult.y}; + } + } + // await sleep(200); // 短暂延迟,避免过快循环 + log.info(`【OCR】${targetText}失败,正在进行第 ${retryCount++} 次重试...`); + } + }catch (error) { + log.warn(`【OCR】经过多次尝试,仍然无法识别文字: ”${targetText}“,尝试点击默认中心位置`); + await clickCenter(result.x, result.y, result.width, result.height); + //如果有配置通知…… + notification.error(`【OCR】识别文字: “${targetText}”,发生异常`); + throw new Error(`【OCR】识别文字时发生异常: ${error.message}`); + } + return {success: false }; +} +/** + * main流程开始 + */ +(async function () { + + setGameMetrics(1920, 1080, 1); + // 如果切换账号是第一个脚本,则有可能出现月卡选项 + //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 + try { + keyDown("VK_MENU"); + await sleep(500); + for(let i = 0; i<=4; i++){ + await click(genshin.width / 2.0, genshin.height * 0.8); + await sleep(1000); + } + }finally { + keyUp("VK_MENU"); + } + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + await genshin.returnMainUi(); + + await keyPress("VK_ESCAPE"); + await sleep(500); + try { + await matchImgAndClick(pm_out,"左下角退出门"); + await matchImgAndClick(out_to_login,"退出至登陆页面"); + //这一步根据 电脑配置和当前网络情况不同休眠时间不同,建议实际运行之后,如果有日志 : 第x次 识别失败,就适当增加休眠时间 + await sleep(9000); + await matchImgAndClick(login_out_account,"登录页的右下角退出按钮"); + await matchImgAndClick(out_account,"退出当前账号"); + await matchImgAndClick(login_other_account,"登录其他账号"); + await sleep(1000); + await matchImgAndClick(input_phone_or_email,"填写邮箱/手机号"); + await inputText(settings.username); + await sleep(1000); + await matchImgAndClick(input_password,"填写密码"); + await inputText(settings.password); + await sleep(1000); + //按下回车登录账号,弹出用户协议对话框 + await keyPress("VK_RETURN"); + //点击回车后,等待特瓦特大门加载 + await matchImgAndClick(agree,"同意用户协议"); + //如果当天上下线次数过于频繁 + for(let i = 1;i<=2;i++){ + const ro = captureGameRegion(); + let verify = ro.Find(login_verification.template); + ro.dispose(); + //等待1s避免循环速度过快 + await sleep(1000); + if (verify.isExist()) { + //这里可配置通知方法 + notification.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); + log.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); + } + } + /** + * 根据不同网络环境和电脑配置,此操作可能会将领取月卡操作取代,但是不影响使用 + * 如果发现卡在这一步,请适当延长sleep时间 + */ + await sleep(8000); + await recognizeTextAndClick("点击进入", RecognitionObject.Ocr(862, 966, 206, 104), 960, 540, 5000); + await sleep(15000); + + //可能登录账号的时候出现月卡提醒,则先点击一次月卡。 + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 + await sleep(2000); + keyDown("VK_MENU"); + await sleep(500); + for(let i = 0; i<=4; i++){ + await click(genshin.width / 2.0, genshin.height * 0.8); + await sleep(1000); + } + //keyUp("VK_MENU"); + await genshin.returnMainUi(); + await sleep(1000); + // 如果配置了通知 + notification.send("账号【" + settings.UID + "】切换成功"); + }catch (error) { + log.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + //如果发生错误,则发送通知 + notification.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + throw new Error(`${script_name}脚本执行过程中发生错误:${error.message}`); + }finally { + keyUp("VK_MENU"); + } + })(); \ No newline at end of file diff --git a/repo/js/切换账号(OCR)版本/manifest.json b/archive/js/切换账号(OCR)版本/manifest.json similarity index 97% rename from repo/js/切换账号(OCR)版本/manifest.json rename to archive/js/切换账号(OCR)版本/manifest.json index 53f961f90..472b7b8b0 100644 --- a/repo/js/切换账号(OCR)版本/manifest.json +++ b/archive/js/切换账号(OCR)版本/manifest.json @@ -1,19 +1,19 @@ -{ - "manifest_version": 1, - "name": "切换账号(OCR)版本", - "version": "1.3", - "description": "使用OCR实现:从主页面退出登录实现切换选定账号。脚本维护/脚本问题请联系作者。\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", - "tags": [ - "切换账号", - "OCR" - ], - "authors": [ - { - "name": "彩虹QQ人", - "email": "846224811@qq.com", - "links": "https://github.com/KRdingsan" - } - ], - "settings_ui": "settings.json", - "main": "main.js" +{ + "manifest_version": 1, + "name": "切换账号(OCR)版本", + "version": "1.3", + "description": "使用OCR实现:从主页面退出登录实现切换选定账号。脚本维护/脚本问题请联系作者。\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", + "tags": [ + "切换账号", + "OCR" + ], + "authors": [ + { + "name": "彩虹QQ人", + "email": "846224811@qq.com", + "links": "https://github.com/KRdingsan" + } + ], + "settings_ui": "settings.json", + "main": "main.js" } \ No newline at end of file diff --git a/repo/js/切换账号(OCR)版本/settings.json b/archive/js/切换账号(OCR)版本/settings.json similarity index 95% rename from repo/js/切换账号(OCR)版本/settings.json rename to archive/js/切换账号(OCR)版本/settings.json index 2357498a0..3cb60e644 100644 --- a/repo/js/切换账号(OCR)版本/settings.json +++ b/archive/js/切换账号(OCR)版本/settings.json @@ -1,13 +1,13 @@ -[ - { - "name": "username", - "type": "input-text", - "label": "账号(账号只保存在本地,请妥善保管)" - }, - { - "name": "password", - "type": "input-text", - "label": "密码(账号只保存在本地,请妥善保管)" - } - -] +[ + { + "name": "username", + "type": "input-text", + "label": "账号(账号只保存在本地,请妥善保管)" + }, + { + "name": "password", + "type": "input-text", + "label": "密码(账号只保存在本地,请妥善保管)" + } + +] diff --git a/repo/js/切换账号(非OCR)版本/README.md b/archive/js/切换账号(非OCR)版本/README.md similarity index 100% rename from repo/js/切换账号(非OCR)版本/README.md rename to archive/js/切换账号(非OCR)版本/README.md diff --git a/repo/js/切换账号(非OCR)版本/main.js b/archive/js/切换账号(非OCR)版本/main.js similarity index 96% rename from repo/js/切换账号(非OCR)版本/main.js rename to archive/js/切换账号(非OCR)版本/main.js index 4890f0947..362f9da3e 100644 --- a/repo/js/切换账号(非OCR)版本/main.js +++ b/archive/js/切换账号(非OCR)版本/main.js @@ -1,64 +1,64 @@ -(async function () { - /** - * 不使用屏幕识别的登出至其他账号的脚本 - * 版本: - * 原神:5.5 - * BIG:0.44.6 - */ - //实测缩放倍数1.0、1.5可行,实测凡16:9(大于1920*1080)均能正常使用。 - setGameMetrics(1920, 1080, 2.0); - //到达主页面 - await genshin.returnMainUi(); - await sleep(1000); - //打开派蒙页面 - keyPress("VK_ESCAPE"); - await sleep(1000); - click(50, 1030); - //退出门图标 - await sleep(1000); - //退出至登录页面 - click(978, 540); - await sleep(10000); - //登录页面退出当前账号的小门图标 - click(1828, 985); - await sleep(1000); - //勾选:退出并保留登录记录 - click(701, 573); - await sleep(1000); - //点击退出大按钮 - click(1107, 684); - await sleep(1000); - //登录其他账号 - click(946, 703); - await sleep(1000); - //点击用户名输入框 - click(815, 400); - //如果有文本,清除 - await keyPress("VK_DELETE"); - // 输入文本 - await inputText(settings.username); - await sleep(500); - //点击密码输入框 - click(815, 480); - //如果有文本,清除 - await keyPress("VK_DELETE"); - // 输入文本 - await inputText(settings.password); - await sleep(500); - //登录 - keyPress("VK_RETURN"); - await sleep(500); - //用户协议弹窗,点击同意,等待8.5s,增加容错 - click(1093, 593); - await sleep(8500); - //进入世界循环点击,增加容错 - for(let i = 3;i>0;i--){ - click(960, 540); - await sleep(1500); - } - //确保进入主页面 - await sleep(12000); - //点击领月卡 - await genshin.blessingOfTheWelkinMoon(); - +(async function () { + /** + * 不使用屏幕识别的登出至其他账号的脚本 + * 版本: + * 原神:5.5 + * BIG:0.44.6 + */ + //实测缩放倍数1.0、1.5可行,实测凡16:9(大于1920*1080)均能正常使用。 + setGameMetrics(1920, 1080, 2.0); + //到达主页面 + await genshin.returnMainUi(); + await sleep(1000); + //打开派蒙页面 + keyPress("VK_ESCAPE"); + await sleep(1000); + click(50, 1030); + //退出门图标 + await sleep(1000); + //退出至登录页面 + click(978, 540); + await sleep(10000); + //登录页面退出当前账号的小门图标 + click(1828, 985); + await sleep(1000); + //勾选:退出并保留登录记录 + click(701, 573); + await sleep(1000); + //点击退出大按钮 + click(1107, 684); + await sleep(1000); + //登录其他账号 + click(946, 703); + await sleep(1000); + //点击用户名输入框 + click(815, 400); + //如果有文本,清除 + await keyPress("VK_DELETE"); + // 输入文本 + await inputText(settings.username); + await sleep(500); + //点击密码输入框 + click(815, 480); + //如果有文本,清除 + await keyPress("VK_DELETE"); + // 输入文本 + await inputText(settings.password); + await sleep(500); + //登录 + keyPress("VK_RETURN"); + await sleep(500); + //用户协议弹窗,点击同意,等待8.5s,增加容错 + click(1093, 593); + await sleep(8500); + //进入世界循环点击,增加容错 + for(let i = 3;i>0;i--){ + click(960, 540); + await sleep(1500); + } + //确保进入主页面 + await sleep(12000); + //点击领月卡 + await genshin.blessingOfTheWelkinMoon(); + })(); \ No newline at end of file diff --git a/repo/js/切换账号(非OCR)版本/manifest.json b/archive/js/切换账号(非OCR)版本/manifest.json similarity index 96% rename from repo/js/切换账号(非OCR)版本/manifest.json rename to archive/js/切换账号(非OCR)版本/manifest.json index 8b399186c..20eccb6c3 100644 --- a/repo/js/切换账号(非OCR)版本/manifest.json +++ b/archive/js/切换账号(非OCR)版本/manifest.json @@ -1,19 +1,19 @@ -{ - "manifest_version": 1, - "name": "切换账号(非OCR方案)", - "version": "1.0", - "description": "从主页面退出登录实现切换选定账号。\n脚本问题请联系作者。\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。\n", - "tags": [ - "切换账号", - "坐标点击" - ], - "authors": [ - { - "name": "彩虹QQ人", - "email": "846224811@qq.com", - "links": "https://github.com/KRdingsan" - } - ], - "settings_ui": "settings.json", - "main": "main.js" +{ + "manifest_version": 1, + "name": "切换账号(非OCR方案)", + "version": "1.0", + "description": "从主页面退出登录实现切换选定账号。\n脚本问题请联系作者。\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。\n", + "tags": [ + "切换账号", + "坐标点击" + ], + "authors": [ + { + "name": "彩虹QQ人", + "email": "846224811@qq.com", + "links": "https://github.com/KRdingsan" + } + ], + "settings_ui": "settings.json", + "main": "main.js" } \ No newline at end of file diff --git a/repo/js/切换账号(非OCR)版本/settings.json b/archive/js/切换账号(非OCR)版本/settings.json similarity index 94% rename from repo/js/切换账号(非OCR)版本/settings.json rename to archive/js/切换账号(非OCR)版本/settings.json index 1e56970bc..f26474621 100644 --- a/repo/js/切换账号(非OCR)版本/settings.json +++ b/archive/js/切换账号(非OCR)版本/settings.json @@ -1,13 +1,13 @@ -[ - { - "name": "username", - "type": "input-text", - "label": "账号(账号只保存在本地)" - }, - { - "name": "password", - "type": "input-text", - "label": "密码(账号只保存在本地)" - } - -] +[ + { + "name": "username", + "type": "input-text", + "label": "账号(账号只保存在本地)" + }, + { + "name": "password", + "type": "input-text", + "label": "密码(账号只保存在本地)" + } + +] diff --git a/repo/js/切换账号Dropdown/README.md b/archive/js/切换账号Dropdown/README.md similarity index 100% rename from repo/js/切换账号Dropdown/README.md rename to archive/js/切换账号Dropdown/README.md diff --git a/repo/js/切换账号Dropdown/assets/caret.png b/archive/js/切换账号Dropdown/assets/caret.png similarity index 100% rename from repo/js/切换账号Dropdown/assets/caret.png rename to archive/js/切换账号Dropdown/assets/caret.png diff --git a/repo/js/切换账号Dropdown/assets/logout.png b/archive/js/切换账号Dropdown/assets/logout.png similarity index 100% rename from repo/js/切换账号Dropdown/assets/logout.png rename to archive/js/切换账号Dropdown/assets/logout.png diff --git a/repo/js/切换账号Dropdown/assets/paimon_cancel.png b/archive/js/切换账号Dropdown/assets/paimon_cancel.png similarity index 100% rename from repo/js/切换账号Dropdown/assets/paimon_cancel.png rename to archive/js/切换账号Dropdown/assets/paimon_cancel.png diff --git a/repo/js/切换账号Dropdown/assets/paimon_menu.png b/archive/js/切换账号Dropdown/assets/paimon_menu.png similarity index 100% rename from repo/js/切换账号Dropdown/assets/paimon_menu.png rename to archive/js/切换账号Dropdown/assets/paimon_menu.png diff --git a/repo/js/切换账号Dropdown/assets/quit.png b/archive/js/切换账号Dropdown/assets/quit.png similarity index 100% rename from repo/js/切换账号Dropdown/assets/quit.png rename to archive/js/切换账号Dropdown/assets/quit.png diff --git a/repo/js/切换账号Dropdown/main.js b/archive/js/切换账号Dropdown/main.js similarity index 100% rename from repo/js/切换账号Dropdown/main.js rename to archive/js/切换账号Dropdown/main.js diff --git a/repo/js/切换账号Dropdown/manifest.json b/archive/js/切换账号Dropdown/manifest.json similarity index 100% rename from repo/js/切换账号Dropdown/manifest.json rename to archive/js/切换账号Dropdown/manifest.json diff --git a/repo/js/切换账号Dropdown/settings.json b/archive/js/切换账号Dropdown/settings.json similarity index 100% rename from repo/js/切换账号Dropdown/settings.json rename to archive/js/切换账号Dropdown/settings.json diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/agree.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/agree.png new file mode 100644 index 0000000000000000000000000000000000000000..04d02d66fde2ba5918c53f4861cb9c2944140841 GIT binary patch literal 1722 zcmV;r21WUaP)eh4bY)!^&fNe222V*uK~#90?cIA! zQ&$`Z@ZY_+w=I3r@+=@C(^RI;7iJ=8HlK)d&WuPjMzG?xWc$xVvtgF_&ywxmZCOZI z2ifLELexc_uPnL=(dpEbI8Z>HsI*86E%ZU3cYoYk2#@x*Zq}o}&tJEvr`%u5m)mpC zJuMW+aR6X6HZ>R<0U<)v8fpxNYJQsrfac~FOfVu#gR!x>xrN`R&1Or3u_?I)A(Vgy zW0Toz0RTpwn%>dbne2KHiksi>>*>BzQBlr}`hv+W2B8F*EtaZnmCTI%f@D{MP~uot zj3Gv3qky85T?0Z-#cZ))h!NQ^#OOtUAx6Z*5F_GYh!OEH#E5tpVnjR)F(Mv@7!eOc zjEILJPBM84T|8H|Yok^rXOdkDsYJ;x;JL=oREm^J_~A}>D0&B(l>Yp~T#b?e0FHz2 zPY))%ua_ByIGR~G;zN6Ni9I$L;&vUnAGtZNP`Yq-%H(bqo1YKynq|rm2mD7K$Gg$x z>HKFju^L_y7~*GSPM%~_sX9srRzy{-P)%;PJA)YF=rF{BghEhP-zTJ}K3`I^DQ$B5 zMU$)JNfy@>D_1N~&@>$T!(r-nNBYb!OnLXsQ~$UiV^h{MueST(h1Z<9Q9J91+$pSe5wR)-I)FlT$bWV}bA5~`X9a>GU+xPM4D-?!U zD7AtqUp~d#{dlg?(3Dx+>G(`b`O3r+>Z^n}rV3_bpb7n}Qbhy&tj&g5=#pdsM=#A1rpD)eO;IBp~e5K-`pDF!dYkHIp zH}5_W@^c){U{`On5bM%e46$(dN+rTR5_~u?HVdK8m$ITbu1@P`O7%0PvHKxmFvN*y z@A1?hvqo-yxi3$visO|ub$iZTiFS^-sZ?E5fGHOWL!1P8ne4jPqn+XD(pY}OJsM*P z5dsYHvlQYW7~%jRRmr3($0pktngR&l748`V`$*8#?P+ayKKnX}gCR~tUKTrkv5r(6 zUX~qwPB&8{YVYw_Y=K7uevdZ<0QW7vwZ+Qv5*5cm{ZVUMyDQRpR*txQxoXFH?RO`p zxO#%d!w@H;Fh^3DGjXo%&Li)17drr8`FweCkqiL5KF;n8W@$wL@Z*`m-)}fe7s{0~ z=KZbdUO)F&ryBsYD$%C~otUKn;QDR1soV2EJ{j_1h~v<2^Pj&qGP&L7=gc;LtH}ib z^i;DHtccpSM#FEnoF6JKlJOx1fZl%J!Fuz1ThiwhO1H1mT)XAwI2arb7*E*v>AbyL z(hq$7$Tj_+2f`4?q3eOS>p`^nT>!|*2%nRAePct5%GIfSYA@e(ow_ujYd{!{&LZgsTIAFD-pBQg!y2vk85jpHJ%Kg%>8zC zQ6;5sB)f*^mzbrp)7U_OGu!-=KKwQjMM0*9)v6e$C)7Xa_xWS5K9h(ij-ba6LXbch zVnjUr-U&oJ3^5`eh8PhKLyU-rAx6Z*5F_GYh!OEH#E5tpVnjR)F(Mv@7?DjbS73+{ z+4OT}V~7#iR<10?5F@g!T2)3bS+pqGWgwKGjpZA3x@@|x?tombNOmy@#Z4|()b6PP z09vQZt~FFAxg3PzS8J%&>9T>JVymjEH0;J4BVte#W!PO^RaF_j8TrR)&CM+h#wM2w zzc&dz*W_|Vtzj&|Fh0ZpU^ZJCzHK~p`b;uvLnsD{q82Y+RQK_IeiRY$FVr6ppuPZ1 QdH?_b07*qoM6N<$g77&tod5s; literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/caret.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/caret.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb837eb0660c9c5c81af3074795cb85cde8d7f9 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&J!3HGrh2HJ~QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uLSEsD@VqPy>sni(`m|e`=5?SAzl1m;d!aE;0Rawi;R- zU8e&Jx_uNBuQevzn&~s!tzX9G{Ncpw-)mn>?fek-`X|RiB!()pQr`YR-fq^1_9N$l{;EYmfx00L|Gp_ zFU{!msJrY#9LJMs#RuKKv2QuB^7p>t8y}m( LtDnm{r-UW|la!Id literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/click_into.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/click_into.png new file mode 100644 index 0000000000000000000000000000000000000000..b99a56d0834b9810c3fa16aaa340d96d1a2bd1aa GIT binary patch literal 13921 zcmV-nHlE3eP)eh4bY)!^&fNe2AOJ~3K~#90#a(y2 zRn@Vc+4peor3qJxG*J`~6u}zA*kXx>SQ8s6prWQ3HEK-Mh)FaivAlFq1J0f;D+iW&G52!IF>frvu=QVbwo zBv)0aILR2l5C8&&oKk=IJJ!!7Oj)hpiydU641u_-wnfPgK)_W~o+D!Po zv*s8Tte1e2 zaD`%DK?~?O$k2hnFRI%DnlJK@M{tX>V-FST0ti;LtKW}lic?l8_ri4(BV@wxI2aHS zW*HBxnnkoy1zd{wkcYpSfcV4@)qd_>ej#)?a{mLz`* zO;yFVSf^%8qqQi@IH4T4E6r&G~S%7aK3{;9SWG2npd4emV_4NTJ{7rk%d!7UM}EU{h^jH@3iYt-H{oRDtj zUgYaSxvFO@)Md?^(nf?d1D%VZI$|Y9oe;+>FQ~z~S73+ZTSBeS3-F0g`}#)8@o!p$iRXSl#Q&{ zxk(v!5f!EkT4C03T^*O<(Zqj5?3Te4)Fjj%f|{dAIQ5snG=>nOtpeae%x)bqiaxEP zc~pqU53x8r+`MfikNHU=UN3+v>1zzabD&1C=QgWGB(}JTle{qDD*HMfHZoONSjkn2 zrHp(m84)I>BG@Sk4@P*c&j$Ts_jaUW9Yzn#8sKqB-dwE;DRwN2SQJYRUtXuxgNk3yQM-$bp^nqUbSm3IZKLYDCpfg^V|djddT)Ux)w67DDz+Z!EJk=0Inng3vd&=irpf$ zI#Dl@^iJwaJY;O1*d$VmCdRaBi)ZZ?>jV%cfB*aS2LU)S_ij^>mt3_WlX&=~!@-24X)=z@4vsP<;odC*;BLk!M zFHH!MG9|N#D&z8}9a$cul0*<(c4qmH&D)x%z8K(T_1BoIw8 zQsUTjQkd!~EufqbO@hFBHQ`2yXthUC4<*gpwmeMzKqXShN`iGmOv0uby=mMUyBHAQ zkpVZDdg6cPmVs-C1VRv+s4T8JVM(72o1!#T+^r?|FMo=7pyr5diB9ke+|@W zA^%g*bmB8Xv_~@j(Ikwv0mDSigw(uM5jqBl39~FiQ+fYE7Gd$C)elao2m;alql5C>xC&w9KW!ld9gLJ zR$M5s#Y?F{FD=yI(ycOpgMH5myvf?afS5cH$ca(x$Jz!Q0 zY{+XoJhPIF6$ze8Mo1^I1$7Z+=6eZ(%pybLDp<3&Bhf{fjRP}JXD%aC26R!0Nn0gI z$0o(G`oP9raGyI;)c<(4j>?W?)qyo3WOfRVeLOfnwFT9MM`nmyvT!ZiyDy zj-nJYFr6z9i#U7{A;betUfWNl!i0BhzY7Qs6l;f) zRb!X;Og{{XCps%5%Y9!z*SJ?5Dd1UK-htlbV1bAV^w0jnCi{{C4b1W zv`xs3rNd)Irm{ky42U48G7dGmU^N)A4G3ds?J1dRV60WHlN{cYwj>NpiCH8j0Ra=O z5wW?jM(JLgBf^VHG+D)q(|02`1}Sc zrfKPD{F6_`tI;z|Q`3w>7Xn=Fi9Il3HK2rT)hCsd!41^pT=Z>y9oVUcY&UQzQ*jdH zdq2w(keRHO^g4KcHPNtR%XgxGj1}t60(n%~8o(%sivs*t?~a^%3WnL`W2 zh;aWIY;k@SMp4Y`tO8E;$hthNibM3(f?5Ay*{mfKke=6L){eY7d=WLh8Fkmk#af zv>5^bm^ts0=Da1qQ=q0Th$MD*z}*oGDeN>F4aj)MzVboi&K=sFecZvxnA|w!>G?}O zjqS=b%l0isYdrfg4qp`Kb*SQS1xWEBBNkp;NHyng0n1=NB}%g+6>(3oF=FM|Ej{;) zoy_5?7%|xSrU+mo0nOb3l{)r(iG)Z@|=-GkzT@ZjM) z9&^C%R+tYKEV<&A2a@hzH1@C|+x9VffP0>N`R*rQ)85bOf;l zuXRC*)+Spi%*;k$d*X)$K;}L-i3G;3#IhCM)Z=E&psKLq2gRktYvzeRBdv{I9CU&} zX{4AWO#b4~lDFOMQ&29Zb7RQMhr%Lixsp|hk#7}=Av7X!A0lr7P_8%tw`N-=l3HGe z`nvBNbI^&0?D^)*c_&|XLrb1>4d}}t0QBnGX~dBJR+x76wM7ZH>D_%;|GxIh)Hi3M z?PgIlZme*NuKMl?!*|%WOcT)D(z0^R`i~YZdt>H@lb?BQ>8Gn4Xq>xO#1)%m6q#MN z;PF&2p$6w&D@wWHx;YqTJT+^RDU|72)uDNej=1TFvH*z%D&0wbvZM$~vSgpbyU0`6}9tZ5c!?(VE;LmQF zeE(CgkiZlYEs`PT^kGZuJjtWZ?KF`al?)IuGsm*R2a2I+{X8UOYvI`#yKjnI!$l-w zHi!9RxvFD9vOq(TU5$DvYC&O2QXAVSv8q~0PInUHw^~M|B7hu-NET99Vj{wDUBDbC zo>+*yNDI2dU8+Y-2@000$k1JghDpCplIfYjod&FvxRw1j1P?W&aNE@D&T0vQbgk znk*|`Y&~Up26=7~DsXkN3JJpOEiZ97UUSM@SYD#$Jb071GLjPluaXp!2}^L+yoHxd zy60!#KHg?%TUYy=^Tr(e!{4l4w}EA|Cz;CR$#dtcqUc4La}a`y5eo6N2!L`x^ieo> zp}OlUrriejtI43HCD(XRsf>5YElj=0GM!?ZcQXOxO+)S~Mt-d}Pavm?&_dKEaiC#E zzyegXsKgJV!p|>}A6MxGA)S2azGr;xz)h^D)LJH9d`5Fi%cjWz_dM~!HMdO>6@eoz zyyx*325#AN>|y)bLR9* z@$tR?xvkQs#sZ=y!_FN$?67U0afk0Wuy0S>M!WjDt$TExHUE>)K`^H%1-AqSgrx9c z4673cFv~5ZcoX=9^(;dUaZNH-hemZ^p{CChvJT~2`LklAXGlG1e=bSZfSi>e0APJ> zn}&|<|DDP^wyWRt%x&vx*~m$zaST{O#9!QeUvu6v?uh+usRMQ&a@vt!`s4ji0>Z(2 z4Beq$pKyKX05|IgfSz3&&OKqIzlK}&=$d5PbH@R7Z7TBh)#-DdetkM9Rk;~FnzMHR zuzLLlTn`>&uzcm(*$Wo6wB%QxePSw7w}x5s7qKjLT^pC6D6w(@krZ*E_-d?iAV#%*Cp zJ<9i0)4vjeecp+LTqAIK^&u#Q2#~J5>u)c=^Zu1*kM7yEA(X1gvTM#c@sRIc@j1Jm zC{kF>h(f3uNrOaLOOqghHz{Qak&<8_q-}b4qcSkYY9uo7pfNjV;(n6FH9e$7%&`?R zLr>ZY#~+22M9|Bq_uoR<1Ob}oALUKMT!dt>IyHc$IOEg$DllaD$WPn>=;?6R} z%!-~Fk0qDUR;&IXhD5}f3E;u0uTPo!x=~FbOfYKg)ve+2>&7P%T|V)ix8DCyn~YzR_aUq7^G*Ch zU;buq`3os#H2kK`J9p^buvxM4LH&Bmp%$h&iH;G>c?v;U)B(@FZPVs~GJcL7GYMiV zLRFzYt{MplFpGo3FPuSc)Eq=0nZCui2eEB!n@WwDXp4CSf5T3oQmH9+zC*jV>ozp9 z3jpi23VcX;PHWa}5F;xp9ZS9$>oAEWpQ662@Kz)Cf zjXM(8q4ebrCHzMmTI(sg4L(naDw+J3-iq87{sk02Tqe5GApinqu~dA62BLIdUO*OG zL`2N^<#`#mV)zYXHUN7giYINCbXKHoCAcz`M{)((W*3xjjDo@I#v+syN36-RFAg10 zt*H@11|X`QIc3^GLl$#Znmx6#3OHF*w956sxGB)M@LuY4~M)1;duZHCL*d zmj6QuO;}c~VYYSk0Oo&`kD!*45Ct*3##yRz28kMx2{#cRg_ND)e7{|{@7$rCtuy>1 z;G6o!d&^d?))Ro>jLXRrf)j89QWV-W0YXE`7{;g0O}}h+Lf)`oKXl+$os9fR`r@#G zSyq#iScI8GNqB(na&#vkn*n~B3_Nv0r}GMHxY%pdSj=^sd=WJHL#jS~{@hcvyd<(M z=JHcxUdGjZ6H#RuT`@<7+!B|w63Hl7)~6A8hlBufgqrUh`;{TvZrMs#PX6ij%U7-S z#!$^w+4-nLuJ5#DQ!cd*m=^)uv*E?Mf`ShF;!dpyzxihEhYsB8&G$dz2~e>*BKcb* zj~LBcoEiD$TP6cksUGviWdYkR>DU)e1g6s%msYM>_tfj}B{qZ}+URc=Z|ya7K*MI~ zPL(gE3&T6~>%GG^eMAGOjOsh6UkCv@btu^hJMarb%GPmM_vWh+n`X~n^y-W`0N{eQ zR#SwYS#B&zfr@0_u#x&?%mYBs2u*HiTTSiiYY*LPSnGMdvd4~ZzWwQ z0U#4*SK?3oh9O5l0IC>clOeE^UpexvO9#Nn;Nh{XUf%nKOIQ5x+PnOcoP{Tw`| z+b%t$h}TpM7GS?!27UYJO+7ZydK!25zW;|(e|hZ1SKpf(S$`8iUG{^A54rO8NAh_5oM-T|mucJ|fnP%i zm;CfhL{3aSGdHEY>%ZeUecIjL;$R4>tFELz#g0^~A1^(*^Ex~X)$*Vr-`11laC}~cZcThy4YU5& zxd@n=HU%O7g%p;$2(Gw!a)a0=8un+8;?l66M_>TR0b+aDtwfE-U`S%w9*cv$8&d^_Ed*QD>8i*oR?7*haSD5#MI$sMV3w?_tJbc+{qN6xw0K#9*FAUa zzg^!RGv<8~hs|u}C-GzgRx1;vV2e-31T*0CSrLEEM;E+~-LwUMQc52=G&#x>8+I#s ztmcZau9DbzEVS=?>eZLt{lHZ$Y+gNe?cDL|vqmKsFS~K_?D>nU1>5OG9;?Nlu8iMN zp0f0(G5-HkstS3ht#tOFFAN#7O`jy&ZI3*+YVC%!5SAZm;Ng6D`Z?J$shmT0|WyZU{0<{jE%MB}wr zre6Yr;(9d+Dj=??Mi|Max7I3gaJ5v8KY9CyBnDDTwowNoIAwZ(1iMvY6@;81IiJyMhtYU6iE#^?gptO8 zJ8vSC*mQ|TdUtEM_WZHM>;Gn2{@EIT5(dDoO9KMZRz12NwePN4h6oV<@{bn+`?^$Z zc|KOuPK=Lz(23O_X)cz30{t3|5SYlfUsTPo@X7CE(kvN_N+%< zc$=bkrB!R!Pnz=dImfvGcf^ow58Q3=g=yGaOz;;Bv{!7Nih5v~PRDL3<>Z zXUzNfjhP>U;544t20?HuswujFfrX=`?|-z2V~;pnsG@9hsuFCllsGqgJP#x!t8G)c z@;k@YnkQ-iVAb07Ke=(T405RBwnv^n@!%2N{QC-ibjsnc%$U1k^;&fA8VZsKOzkFr z;&ZE}=tK-*TBRZ1;w2&tq)|)A=YI*MF}*x}&g5ra2SEmdDqVbSWupk?NC&u+C`m@W zh5TP@Hi_b>q8#SQLyo?xlye->t7}6;M;8LESiN@kg2miEa%WrVpmFwoUR;thf)xqy z+);=0@6$c0Z~PzcTd?F)Ip7}z*wEDU^IIQGa(3(7@#3+Eq3yZVfa|@eY2#o8IcwP3 zITh1Q(LWd3*b3HvCN2AH^|kjt@r^5Q$-}u$md1#OkRGQmCI>;{N{ac!cYvIBYQ;1S zTe;$K&{}&@2x#310Eg_cV{-Sow`b)lbL%^*EJqQhN=|I3J`&n%*nktiocfL1AASBG zFTX=-Cje}CkG?qVzNcSH@{ine=-1>awAAU7wdPdj))G}>H*8LOW&nBTOpnndV@kz8 zC*1esU5~$1EtUlibFB}6D2LoiUX%wEj(#>a&tI}){^I31Q5F;};dqo6WR|JtPfC+n zU1Hx@HGY+o3B2L$1uyi@sUy))Yu0Vf#vzOxF*LdTm&aa`jDF%!R+S1^h+<_y#RPdF z+qQkWUvuVh$)x$EcR#rL&PPOc8Cf}_`14z*?6%$3TW+zrEp_q9hrK&@;q|5agFafkeBPpEA1zuwZ_%=k7BBy3(eh1z zsfJYu*si{I^*VjBIHV5sbzj|c*vJt>H{Y!N@t0m7V{Sx6QIbl>)5O{7>8&bCGa{oZ zqAZ~~zU+f`P|`H}zt73xVuK~#Ev+U(b6e#q^EtblMZSt@mU z3`08W2r8bc#BQBBUU$Km4*vP|86SRp)~{|44l)Ad-JfqAe|mkbzP+Zd zP2~^goiu9vghk6&miAbV!j!v*g3HJFzPG~363sx)pF~s)dhgodzbgO`P%+0Ni-dsk;sCXCJzs zvvA4WkCz5s+-bm;e;R+f^+dzB@7JeW!~7*H0Elur^XLNx^l^KPXB~6kqc6SF)ZA=$ zB7i?jUshmx2r`@--MnSumMTk`Jl+v6VL(m1%tioE`moS;eS5q*V{RyZ&T(J1Gwuyd z&1e1kj`@o}O+zeQ=r0x71gu4C^ubb1mR*hmu>*Su?Os)ywzvkqGkVh`5gdQuyjS{(Y^D)t-|w)1n}1E1#>@HX73{6k^Afd z00`JZbmgD^mI&FaYv)l1ej%L%NO8dG(Vd)8MhQqZfibaosWdxB(+Lw25FLHM@GHJ^ zT(Qh|k3O(_!)63<)IPf&f1sX+YHV&k=Qnr0@XiOptr6GNx`lnZYK_LH2CQi*1R|)b zZS$+MNA2TTX4d@0V=nvSC(Bnv%Zq2FK!}!O4%+&<3&ysq zuLXsXsZ4@;AzEPd8RZ2mW*h0Z9`P0Y@`NTT!-nlxSKDS(VM+4F2cHQtyfS@Ga%<;- zeU-2B{N{(BO)?z0&n`9mH1G4%WL+}E%-+Mc8-L2-a&f_uPsdy~aq3&|OI>JX zl#%wSskvq9TQgn!M_>m_B0V5zS6@5f{Lu&OHrUqi?wo~VFPpe@#VTSq#WPJZZ~%V0 zg6sB;Q=YzP!rjS}lDiG=ck88RbZ_Vwpl^spG)cjpnF4LxAHQN;&ng>LbtBZcImXo4%>==SKaZ* z2EWbNxkJ0t4&58nr|bAYEARsuGNp>vgG)1W+ISSol{zuLb@V|$Jo$)LN)7DWW5W5P z+wf!V4?g$iF_%nuXU;+pd~oyPSBvSh)$1<#8swW*BrZ{7odtL}ItZe$ZIT)N_w>2s1pXgd$w>d_ac z1u+_%o3FU-q2HYCPDmZL*RbcN%?cS7EctZOgU@{Xs4v+JqYvKWj(@z!=b=L4xTi{Z zcis7;n_5a08mb}WW}oH=9Xmp7)-=18rf=#E`K=hq<-dzEfHOR z|380!&lB#o!{H8leIYEZ&{$=Z5b@c!-aqLl*I)D9<8A$0Y~JZlKmO+TfB)yFUYl+x z(N6~iXzWi&1c>u3CspYdfPdpqk{G~azVgNH4NmpXy*=x1&%dS3B3?iFsRCa6KKkM` zY4Pz_rvLNx_x9UaXCzl`B@SZER`|FFGT)=1`WB;WvN3KJ&wepMN`i-E+tO*L?Rl+wQszjTc^b z&tosWLp%dA-qZ13)nJI^oy`aU?|u03(HH;zqOpg4-Mqf8ecQS}oImE)hoAk`pC4&z zZZQ%&m`YPTosR=q@jXl?ZZ?^Y;nvD@#9Hec^R?C;s;NX|tz1`-Xkk za_52RD4E;^PwUe?z6h;D+q%7m_J88F82|u?d7htt?cH~bKh2)KKXUJ#Zhhpr zSqqjVt5h4CmVD0X(HE!9{bZ@Vf{69CZH5*4NJKxr{_e?7y^0y0_Opo-esD^cP92gw zZR={c-@4cKWv{IIzoi$$fnbC&hwOR&35VEe@ypZa{OE@J<}X^NQL2!q8+5X4ojR}x zEjd_1>o+uwzv15J-hBU(aYsm?h=^mqy4UX8Z*%@{@BHwSrHVSEo#M(sxX6E*LN&ixyE!R+R%?DO@4FMM{;>k-=6h#wcK4q#HF9D zKJAycELpKi@`Rm9ejNs^Ub}wmozogXvRKitj*FXKnOaRz($hJQ?X{3O4 z?fS;cZ+hUApG}&-Xc<5fG_WgHujN7u3xibS2FQ=R`1V)7_dkDq;-%bN+`eD0Uwr3S zKk1M#%DF`$AOgVcM_mNQqKYG2zL{W;=m6|Kc$=GlG)``=Uc3IRU*GXkVRj`w-F&n5 z6MuNJ96mbbikn`UF*gPsY;0Tg=<>^N9lb-pUI4ImedFF|UfI~#WT$s^wQa6B^VogO zD$Ll+C%ravo^}oZfOhED`<&yJarW{>~ly$hGD;O^-xrJx4+M_++vm7`yaScVux4B4j7g<}rg zY2a4j+BdJf`I$G~+Z5P|&T;!u7q*h$JAqi1z(3{%cV%6ohJov<`Gu&x$AOfh=WTzjtPygQC?|?P$G-%pmBM|4H^X~dhH>1e?pue zKqU%4#!Ez$=erH=H|a-b+;H#XzrX9z$id+qJmFm|S%!$1WjhVna>S7S1Gn6wch`n4 zo!WQm(5|*pQ}uNOo1Dg7anpAhIjemf63=lFw{eYSes6%*6KRMM!6#k?Jsnl!?u%bQRRW_%_rY76>cJ;Mu*EJePT#7y0dmRn=vxI2Xd<*p%^2-o6Yu|Ro z>a~gfs)TW|G&K`|BLg%YBlmcd9RRJ+%9xU0 zA(fe9xZcXhwaT%n>nJqi8nf8tRsyvXQH~rE@U#3m3tiIX2(Tpuf0H@Yyk!aOn`em_8kak(>r&0j9-g3W8bL_#GA5(>S zu}c25sA3axhzDb*(xI4LPg}TAj&Zh(HULwDo-xw;%8rhi4wl^V@+JAB<#Q==Z@RPH zV68LrTMjO%IDLnrXd-k;B+{)B)u|psbVhHxkvQUHe9(OcZXyd0MExPCcw2jf34#Sq zmV(PDHbHPnk_y=vo~=+fRFgw$9A1}n%$_bP zu?X#0q8wXSqS9g`N+{L^WJyO2pE<`aod)LN`B$#0YlW4hC5geiivQ2@<3&)cfI|k|k~Sz9!nUT~+&5 zCnH9l9+);>!rVYdv^FIdEv$6XS+dA(rH|SZyE3OYH6#%Ut#(Q}s<(;_*?Z^?{uy!& z4g!ghrvWaTuU3c#%`&KD#A0(498eNps!YVhTsFF;8-X@#<@;o?Yn+#nEHFJ|*9y&2 zr7%^y^2F(}Xn(Fg;8eum3+9e{(OTMDNSy!zNc5HXJqJI_7cP~>FOG5z;4Q0J!Bjh%{pzs2uPlKo(xV~~y5F!B(VO-eCA^x&!;tI^y zl(LObkw&Z+)LWoKWU4}kQ_*^yOs4^>F$2N9o8MYu7xYmQO%+0ggv!0)s|m}*lhUH` z=mcfnqgflZpZ1|)C0b!D(wZGvq)*<(zZr2PgYHjNT0|%Aq6k(C)095J_Fjid*bZVu zQm{0MR-B)*2B#6e>l){YN+HT~qCEckaNa@!RwBp=cy$&$%)kk3L15QAQ$o>RI5%h* zN7>U|3`)TyzX(+JV4SEX&ODvmE}l!-%*g?wF>)Tv-!$0GT%{Tb1d~E{N4sI#5ycsy z#O4YTkpIK67fG0#$V;pdhtISMls*fcd!zSa@H^PR5O)Mg(Z<|2HJSLIXZiqB;Ze#d zZ=sgvJa4AFh5ri}&223rm{7#}#$4)E^e}-ro3g!*&P&?#)~z1;rEl`JZqe zgoOnH7s!LOFRdiqcbu$664noW%%vt5oVeq9`~at^HFizb$`L3hQ&EU~1gtr=1f=G` zdj*I@S%%>~@x)x4#>51g6bah0aBvrduuwW}Ugj3Op2^f8ldD)OS0wN6q@)p6X+1U!ZCcqrB z8psKOAS22VFbB}zLIMc@kVWy1S(%>sB5?z{E1KGMe7&oE4Yoj7-}~SOT@W95-VQ*u zfgpELZ_3yv@*4FPEF=hAF;B`DD)i-wOGT(nsz-G+i?&ZDXFR!Ly2@Tj6i*yb6%iL?Q9i*i-yrO5CtR1fq*E7Jg1fx;^39|S12GSLV%nw;|M#>82~8w9sW5DT?kN6 zDs81&1pnRRwbVmNSfJUF^;UkSC;AhJgT@mC%iosfl%(wN3nIgO-$)t+VpGfuQWF4R z1%TMCC43GcLIUMb1d?iqlKu!)l?=3fo;F21#<0o-tlXYchW<&ZdfY#32riP~#@w@V zQh=SE)UEbzW;HUXlmjABZnyzB5{wM*Dm0CKaJIzP0viZH{4r>MP@*-eXMhl!Kzwf!iYhamUQ?uVMr{}Y1nXBVxuzyT<`0QAD87s>&yBXD z=0m@ukD*u(*Nw7xUkQd*U@#fyQoghpFraYZvz62)1j=nEB!;3emJ~@)-sA>R-{i$f zkZ0pK_j&}I+hWJxN^(Z{I2$SR8wTo(_^_BI<3UWKcHst%Y6#-QKPSl85~6Ozuz8(c z6(?~*u>TwgK&VM?iP-Y9SVsClq%k`Z=BPhaBER(>#v_78uqfS+^pLYN6Em^o>6}y; z%v}1z3)0poS$dx5$R8D=7Fikarllyc1LWc*3j=`>>6g3&vdCC3+~5ru!>C$&=!JDV zRt^tWfqbEjvRE$d5Dy6nHBz*& z_H}^E`h%e>~5V?&N4AC!-<*0Dv6E z*4jnHVIt^CiHo9ajmnUSq{D4-Q2?NH=06a_xWK-OOnD;OgXnq_PmJ}83p)}rMo<~K<_#ZwIB{5r;n~y8Nl?{@1eUgdZsdpCCzigLw``XCnMRCMG zO}AK}jP#sF9R5r0r8|cd_PK|Ui^0D?>|EmQR_f}UysOiq0I9R{4f1R-r1(t@IAq=_ zev_`1fiHkzlH+^-mWu|6ZNEb_@2e*2j0H(t&01Pw8oF+&W z*e6C`g!8}db;aE-ntESqdkTQ_NVIUH8m!yI!Tvu}Q7o>2H|=p4C~f-Fc!uFQ;ui#Y z$`y#>6&l^#?c@4dBDk92Xj0no1Fezg(~IJqW_!-iAfV41HZx7=S?2?KK;@GL!AN!Lhq ztzGW?H=!Ha+2mwC60%OZSfrEo@#h3n3V+AL9kSJ(43*-){38(UoQEsMn{+M2pt9G! zJ93AP`Hwy13Ji2>Yv+(}mxxE%#o_?vq@;`l2?!s*bQnl^E$SMDbzgcFj+{sKuZ$=G z-F#_0!vp^uPA_nxTz>A)00FC9cN}#r+BBiWKur#fqg-D4yfYmd+Uf#0)x0gV(qRbS zhxx`cMpypw|04Y7NNU2H&k%~d#B(@evH5DQ2?Rt0UPpVUj(=)}ws5%txw>VgbO_~$ zOyY1?a`#Hh!Kf*B= zX!YD8DVhg@L?lT9V(i$1o*2fpMx(;7?Lh`0*#-%sw~bWgxu#?2gf=B_PiE&Ntx+J1 z=X~dd{#kzSb)Iyd-6w1vXL&1Gj2#Taz#*GM8Szo~4*{w}eg3q%O+CvG##7hnnqo9(|cV=HM`Ez$oQC!l4*TH%%vGDE5M}393Dt0q?b`tL8)KUa-nI@!_xrg@u@#| z1-zUH-T6rLg$1NpM>Tded%b_Jyy)l~B$aFn`*`y1 z5W=VO=IF?Ibi{||^9j?lxa--cQ#`1<&H0ZTu$F|9GT-ChjPlQ`+?@>l^3FC7pEyM7 zB8G>@g@;$yY6EHIq9l&AKED?mNT$gsn4{mO%a?c4C94vb_wrD`r{GvD6;Ns_PH2=ixri;F;T`r8gzoY>W3b)F9 zMbj%ty8ycHI4f?kAh@w#d(Ex0YXAT!eq$aGb#QvUmv7KDx8cRi)%U%9?*vcJVO%O* z>Wm5lnv3w}AnG1OvWg)TbOnuokN|jIVmWmosEZugbXjcFIs6|b*xp5(y>G^>SgKm`TZXDBSoSbs7m%b(^FR^BlI4(^69;XX0K{r*j zc>a{y6ZV8*NbPv`R4mD&yI()cnblSVIdVp0BO+4mH$|VOs`rGfXqTGt#y4$G8}Bk9 z4>(Je*T5Q)nQh@zA<+ir`XYIDz-#*UebB42{^D|X{ z(AbQwwFO~tD9vr54oC`!YnvKc zyvi(x1SK;tPdcp3eEo5Fjr|dPK-D%rfOq#BtHX;%>@O>=RJiWjn+t@KXWQ8aAp@ed z8?$WdtVG=lfhNO-JG1yH{d^*;1mA#!koHN*{D<_V1&{`8*ApL_stn;V-M1AssP0C*aJlSP2R zY4!i%Z;}5`;dJ`s1pvefPy~!I0>uFgARr?McrpYKIW@_^2w?o%@PEN_2FT3Hz{JLQ z_LP_51^}5D{sxfwpB_da0~0fVniRe_b&aB_GWBzyZa+4DW}rf0iFprS?Q_)66HwGh`VSiYRK z--K{gyjN?CK?u-Auwu5|B;Qq?;hmLH;=|dT&u9?GI_9QL9Nk9)w~G`fA?|1Ck$?3N zcC&nW9q~$;KIZV3(caJ->pDt>$?O1NreuU$!8-%}Bh?rQn;O=ra@)=8Z<>dj?~tb+ z`IzC3WZsZXLVD`b%`1vpw*r?~O1qGcyDZbBo#NZ19&rSjej5ru_dQEe!WF314<$ZG z5nPwVn$XkE;9tSv6_Kwr5g*;@Lz1$BN8&h>pR|xE=QPgi}?a?h6T1vKkU*XsyoPsn9-VI9t=L!A^^SX=vK z?%tC*=MU%IBiZ*K$8S3xzLfD_C7$iy7VS3i8#9Nx^Y&plko&lrFQ-oy{vhg zBsg2I6;RyDd7a^TNL-MTDwU19R!ZoFIJbO6@s!f&9H`8^FRI4T$xqz(=}dc)4lL?r zW?;m05yW|n?#n}To$YXX_F~e0o3z|o?WC9OmBDC~rqaKHTabsuLh#dL-?6vXf6VoO z9N<@K#5SDzr4#Jt-QEdwMN7^a92`Icp~lfe2TW#@P;rS!ghPiyRFub5kX5c`yn5RH zdl7FKtjBUEr+4{PaYQ-IsG9cmy`vYL7lRzStG$<%#<`9cCYVgmjI&3mnsL}XPm{SY z^H~*@ziw1=Bsyq`F8$qV0iJfy9G^ZgCN)}<95jQc4GpbH2$!r&cRxwxNwnUsngXw# zUT9_|brS6)Fa6%^3~J8v54n(16LhIe@QyVWWu~g4FjCA)O<0!JOqjf;7Mf558pJ}s z8oTV&>(MrY!r_CSGyWV|n;VOQ-l_Lc(1GV)HBdazkn+tn-6zTn>#8!1K1b=}2AL3P zQ<{32u+KCRa<-_~R`1=D!ykjCopV9Ee#;qdy!DG*veoU4SK~6M&7YgoK9I>04jmze zyRM=pNIFh)dYj#%WjiMaUJf?DXPayC6qNzbRtRli@;4MJ-2Xv$$@^OU^A&*(Ku9v& zq6NI?mt3ts2f4Ep*pz2cDTMFy%>8RHvVg}3b=z)%V)nS{FnBrpFwt99(U_+_mL2>i ze@FrV!%MIou@CoAV`+W0$Vy!2zSS(%*DNI4M7xSlt)3Zgyf7TjG|f&YRoKEP7eH}) zDVIY?*c!j*;gqjtnj5-SKHFqOcc;n@c~P)91D>3pd)@~$Sl-fB&;Q-SR3`qa!Q60( z!hmDRhX&k0M$#5aBuyb>(c8mt09II~Wd|mkpPoyW>k5<~)%cOUV24-^jZUF7sPx-H zNlITinpwwV(Z={8n=-qY%!(C}bpcxH-@FlZee2_=w+UZb)E#s1gH=wpw(||M4I7=o z>#e-9I#;u03~)T0O+~x+W!hF1D)bX}19kh)+bab(y-6LrFWUAtIZ5L9NN3&W=nds( z{6rJFSwNLn%C!^$iFr$ zGXBhykmps4Q9HhTBou)EtxKF7Pq%(-dyUZ8($P|zc&Vy3c^0E6(b~8oB{!<{5TC3R zj}_zxN&L8JOGiU5dgtO_IZ0{8|7+#lW^`X=RU85;m1{CP0`{1PJH9XzIkIK@M!2Gh zs&WLe{Ce}5!qb<45eR3Cc+ldb%X{lCBGdBjP0mhlu_j@)epAC#x|}PJ6(_@`4^8Y> zr@R|6OWF)oICyJFm~_)!$q{REqYM(<(^vj{?+X|2B~+H9Dk&<^=(CqrL11aE+3}ZN zHTPT8BJY^M?vY^+qF~|Q-{TJG>Z`Ha^W~Dx4)_LQd$*JAxfw2>S+0_t-fCCA0Nkx0 z6wI_2)@mHC`C1{}B#^13GqXW1Y~n_`PJ#=BN8qUEb@IJ_j6+&1zG+iTnKd`d6VT|f z5c8QE1=1&AB_)=+7d5Qydsk|&KCmCI6zQEbn`s0tR!=X+%p1>hr`lv1tmPA;3XfWL z?*t0t_;O7yKHrDWOD+D4&wG$La^+bYtG~eWoOb7K75d1>`y{NFnE&+Kn4iw0tIJIn zh0!u0=jG=onEe=CMzO-jN@^F5d0yB|(K*w^H6=+PXv#sZeO5CjGyoI!Ec;V~+ZM%4 zM~rxZ%c3^qvk4oC>RW#q*-{nbR+%eW0LCQ;Kvxuv89;9;r;CZhzhEQX!>L8ezKRWA z(|6ij5p8efmPb38V38WF){xBlDh+CyFj&@r%oly^(8;6>)pRF(x_dKCB4~9q&xz{N zWAel((^E57B~@AXd76m^BwPa;Y#C*TYuD(%Q8cU4ej}0PpG0PD|yfuJUXCyF9B5; z72+r7oG698`JTT_Q@SH^Sm7wGF*f8m=@CLPNmztOi^iB%0vl+l8eIDmnZ~1mBy-R_ zS*`|f0C>6EX242pjbK`GU9Y?k%%{(hZR#Q~9^T6pj6g9v4FBcQ=H9X8%?aG?I5&Os zW&ND3Ya_8a=T3_|jLGXgz>#zE~M3JU^1jry&>b_JqNtg%#GEir7UJ zt{PbtzdwB7u$p4-l(JC7LiSEDYj?1k=LU~X4HOf(G~$FO z3Jm48VZ8V<$PSuudZTv7OzPUmMEos%(8T_g^vTj^2N$uOQe8Jm(|oywrQLqVqABho z;^v8~$3ETs7OT3|M%GK3h^uA4I}RJ+zA8Jba69VS{r95gy!cif-#DtvlF}KFl$ds# zX_)dBLu>w@cPz#dcN*^HIMsewl6Gn7SBSr5!aw`kDJt}`#K69}qd)+gU^^Etjap&f zq5apz(rGM*zWPY-%)i8%wj$>QI3}DO-iEk+bLOwQVg=l1{dMdxQLEhE`6%~#Tu-JW zA>nEFo8IH<3!(OA3wAb%;;B}KxG)Ow(tWL^+sVjZ-`P$8@@K9R3sl7y*G8J03Mhxi zHzrh=uxw0r7?K8D;8TqWK9<;+rAU#yNJyW1Hi~pNe?8+_Psu31G5A2h&m+nj>R+hm zk~5BGSMe+8Fip`;UbO~)TWkT=pngi^D&0g+<#)+b)s{Y{hc1w4OM$|K@ypEh)dkm4 zZWnE0E!5Ha8Wt)qnkmv6i6+1FO>q!ik!y=er5EXY>YyMAo|tfMSAVP-s8{^#Ixh?I zdP0o$(($vc9EGJPq|cXmR#Lj33LHDT^weht+mdhZdN;#0PXK}j`_~HzSQfM4sOJj- zRdbXeJV#s>$2SpuNOg6=&*W|{g<@wbptq+f!^&)}=yNTA-3ve_o(b~~YPC*m}j}k_X83q~F zHF*r<)tEjW*K`hvU@+ki>tWt0^>%->-w$-sWS1A?sXxcc>aJG`5EU!t?2W3OWj7z! zRo6p#Mfe`)LBFOBjBrny zh-;&&Eyx|`Rp(_dXLEc_2X$P!>#nsE)_BRRql$;ODcj+~6HQ#MbQ z76xbk)Q4kWa$|2j_42tA)av1p`yZCgQQ&d4Iuv;LQYwnCL9G#G(}2D`ZG~?%MBC^N zhzBK>eOF0EW|NhY|MNZCi2xhdvyyvoR>dPE=p5|OzKfqV%bpvS?P4gf8+_M$3_T4L&PR&L(8QPH+SUH_q}gLCDpdM7H5RULuagV e_(3*yzho4sHNVGB0HXifiULeh4bY)!^&fNe24zWo@K~#90?OJJ+ zT*Y<1_1^2(`#QbMOwX!)LmI8NgcQqGAZD>_2nivO*s(EI;uvft@xcKfz`==+(TR_I zP9Ql^EDIS7*ddmQEEy1B(7vN}7HPJgrT6u{e*O9_l^-?JYIVQv=^h8m=V-oP)m67{ z-FjbF)xEb0VT@r0HzlYWZNLm}7-qP?c`?KN%?swEP^v09iZ*-{nu~!|87nye0E8&U ztZj*$1*`%9q78_ud$NTg5T!%3e!7NY01NYiOY(Ztjk1G!%|A8L2Wj2I(*>;0ALL6)?1&`>^pYy zS&1J90MDX_Elsyp8Y0%STgrxLoyF?^q`^7AP|pPqM=$RL09(tZhWQU^_Elv;&P6qw zD8|efT*0&3g!m-@@PGVS*6c5|VpT$vuB3~ci%NX3lAW5+nHw2{yRI$-Q*$o~q0ysH zR%*32t>;3=uqsi^C4*yrtb3OvgaIIa<+aAHtpKP*J~gyYh@G#?#O5_m>9x53|AH#< znbF^1tN?&>_8-^VJ(uVXo%^9?lcj0BXVI55o4C-ic;BnOrH|@u9mVy0_+-5A)w&FD z&As2=_UXF15KPTIMe7aD1z5==nk`g{sVi8O0f5q(&EC~q@USWi!86YRfX?W(cYem& zbSqXRM6o5>^wu`ON-dTNiEgr8mq1JpMlbIG09DG88bwTu9@GAJ%0h$`;#dDWHM|c1 z+zTHr``jl8@do=GSxmXVPc=x0ylmza`{Jq@%ZWQ`PV$H zGc{_8vDS8kN*B)rFo>DKy38xb)Z8-$w`Y%ySetY9eKlG(^xhU#5zFhbBIdc#>uRu4 zQd15^OekW4bT4VjjD0`~R{ustOk^Xc0ib+0zNRXl7E^sD&&rZ|-_l2ou0^CAIJi|7 z6Pn%ABk#s~b^~AlUn%-hM~) z@-9;EnsXm9-O{+03myTCg+vc)?TB{&ScqK!fW*KaqiYdsZ7;G}N)EnJ%b;XmDFaSR5=R(md3TV*4v1HYu=ydl09-Ro({a78G9cqBBEGJ(^_Ze=V-m7 zSQS>~}BG=#7IjI49LwOvyt9eA4*%)T{M0)fovdxW#X zh#EqwoJ;lrfXUsZsU&>i1t}W>0E1($XYnIbI%v`EU8rJcaP2@r)HDN-8p9ss=-g~+ zT0eH;X(gW_Rbpmv^!QWPY?)Z57%QTwVX0@y7K$-yD597e&(U|DI>m40EQ~uVuu{=(|{{iF?3mrNgy4lKp$|q&tZ*miRFteu4bVbAdb;C`g*Ut38Xq zoJ;lw&uoKA>wYRUc5O8_+)`b}V4v%peQzz=C|XbJU8aVm)B7VrZQNrncr@PovLbO5 zt#{7(Q(McYR9VmvLm9zOU(;*~pMPG?#Wb7p+$a}1QuH%0a`cI7Q=#={&k95_#1o`h8=`br z&68HDvL{#qS%?(Al_K%Pw0HC>_0|3zAUGmpr+aDzd|2G@`FxLBWa^RPqTmHuATqyD5B*jrL$oHypIwHjA zZL_qSDy<2Oquo29=nj*$v`YM_EG9`{X>xaY7C(|1d%q9`0034dJ&c-{T4LarVtRm- zBNzXpT)^aB=3Dl402n**j3QP$p{fHh#+HwNx2`Tza4+ZLk`T7F-fnB%G=B2Cfx{|IU#Z6S6(7I+I|B{Oosx9l;!eNMe|s{)#}vex#-uC3{jw+odzb90^>snV;E8_-<$ znx1LH{J)U0L9*fbmi}$GdOnqnM%rNy~ELQSG@04Rmp|UZFhFw=Yr^^ z9b$Sg(f>Mtn&-z5x@JaVU{5Y}bt31FkiG2==d62*BX1?2CIymaAYw3?Osxb}&K5e- ztPN2Ns&np{kpsEZ6;d|3G~9Jn<|p;rC+#X-izd&?)X=Z6Dhsg-l@dE7j3gL8^)FLK zgN?r@A?1% zLX^(jRM?y-T1V^ch-Qm@7XnMuy427<0GtlIsmZ-8M2d3~m4cLFP>iYm*#JzB`|1f3 zMCn*dt83l^l?1RNCWrQ=hWBA54*<57O&F`0(RTsB;9QvJ0;0Gi;NL(gq=IaL1S(?{8Ro<}# zv7VoZsjC102+^#q&e=?$4({7FYzM%6_(W=GKUSsYRZkQjY!W{@e){_+cbBd8wvvmo zYrtw|{7|C*b#jGY$Z5xVe@fa}OKZdY2ZLv}DPl5mX@?NM=$iXyC39=ru)Rd9oQuV; zzV4iLkIr~44iw@S#q@x!^$(}}iUb1y&Dsr)xs=XoZP|2P8&*__rx;_w;m>n{!rio- ziv>@AziH*SO7htR&d$w3{32Gwc+X4CtG`|HB!ps&dTU1w)=loOI@`3Lgw(-3IdsMJ z07-bodSCJ^{>p?UYCdx5KUF!)1rO`Y%^KWe%!Q662lhzWiH8Yh?@HIa2N}JSG#3O} zv){kwJF(uE_|P#fcqAJ=YiqsT-g;Z%`36r5C1xT)%UOuQD+{Cm}i zskv8WK^EhMpVsC-Q1WR$beszwH8>XN9diI6J+zQ#wsp0+h_PcB?8>h_0PW~4`NL)$>-lX*| zbe$K8F;=8(C^fj3)>&9<8vtM>AHMK>J~K=)M&Ht}>Fsm$w%MU`Kg{!^!86;MR(w;H zbEGqQ0%UF8VD_zXD`KpB7auwnrSBth@c8wb04s`-7brX(1+XenIYEN=3V@i zg1@cGLULeFI`DSG{D-1FFOmcz#h4oAKV)fKJ7HeBKi0il%nXvDD-ASy?8(CG1cd04 zEP`*@*EM&hS}-;DSw^=QBfz z{{NA(K_$;=yuCpbqqm#AYaAVS1ERRlvDoFEB!yLe1+0ikTJMN<@5+q6XLK!cFZ>c? za9t;XF&8{+Y*w!(2(j}f_i~!G7Hi9MBaG2wm}cG(EBQ=yPa7*D7dmEb z-cZZzs_T(*Q7q>WZJ>2#nw`FvM{t9=pTP~p@7Ig*8T>9W!~M;R8SZah%y576Vut&h e7c<=7y!b!ntf#rFpV1Nk0000D@0bQQ|Zc4wTkI@@K1Lu4c)D`a-IQzv^SoLz{+B_r2aCE+XC zJM-v>_`N^>|NeN5=RdF4^Ywf@pO44$g+ZFa*;oWwKp+qs!a&y?SYHA|oQV;bpHRdv z0}D-nIUEM68x~#%40;c!2^0isOlLiHW&mvF#|EeX5Qx3!zd`fauM!Px+7P->%Miz{ z-0;V)he4mUsD|y>nnbr_pQ%UTsCp_J*;UN#xf@*;Ew{N`#vQgh2o|<-of3ujo&H+(d*^u+F1%Hmbi>vM@NEG14oCH`@~MRw}v#TK76M>%AgBZx7^(M;l}!! ze1Jy{MU7args&go$)^yooG@g`Cl;|hHr|^NJU3&i8%izdt(^6$n5sV|nR8jj^S-%O z$#Tn356NrIvmRB(@ydvS1cr09C*kLfK^1UE5Gm>HviiGln&)*DL;YYe1fN8*i;|FW z7xh`7bZXy9h3~)Y!5&77opX@1kPg;I!Mpvdx;;!r#ZdJxP18_pXPBaOc&cm#Uf%eR zI&Cz5Uh1dGD$kI;X4?|v>+>SIxkp6$Jbd5p{YK}h7{e5z=~9nK&JY+i8(*4_6UUxj)=@tM zeHbe`Kmm;;kW)_EIK=iNAGDW`) zRjcdw0Y}0fUhIlsZO_&9zfkEA&W6Esf{s*WfS4QcSuRbcWBzC{U{mY^wSuHsnFQ~3 z@*-M>_+N5{ngK^6D*VYJ!`xPl#okt_l9BVk_ozWbPr+N0Ui5M?;N0% zak0zoh4UZsmGBcnxj38#Q!(b-gCa01Dw4jRoX6C;d8%$%qw(a9zt|gTw9E9oLLs@k z*D?cd98K8k1)aPBw=DHK#w3c+7q^@Uf?)7-wrHHsY_AtJoA+g*ksPzJ2HBtN8cr_H0Q}xu)n^o*Uxau*7lqkfZ07?df1ZKi*&L}s=6^f2m z!I6C_#DB__>zr6UvB!UAK(^k#=towV*~zn=CCYVtR?8L@D-a$8g|_95==rzG$sfzC z+umj>XbCuH$M>yJ5pwIpLWw4AJwheCDNHBTcnRgL5n3yQiY_B=DnOYgm2 zRfZu!Oa(`~lwQU{nW?fzg!=C7Ed|HVj75r(dLShax@{a~uVq`eMV0MDs)QrbAYu*m zF4XJ`bM@;f;V&)$7R0?>_(~I3ouMd{U?M3QSXPBeMh?t7nDC3BuHWg^WG246l zd<-2m$9?!~JtZ} zq6Y=$Ky_s*??k&Xc~#{bAQyMeG^$3Sp#0`MAbpe;bchlM-BBP>l2Tlu{Haf!d&l#F z@-jGrahA5&^|O|c)%p{L<(io|LbjJ%|^n~Sfko^d()k5S0| zhAYwubrnohO~&}@Z_|Gf(J;Hx1N{*e!=}kS1;5*uZ%N9Y3AX3nMGQ4A>?Yd4?Fb1c6kp>d zAHZt>KfU0vj}0o1l*``qptHmiYL5@Jx>r~RjlRStib$w5@*`Tl`p;7@p7+s@11||=f`;^&uX}lGb-j1OgZvOW48x@8GAh1u1TiG#lfVcLXxJ^;e-$}Eu%!p5D0%o zDomuQ^d<6~->?y!{^Y%+jb+L|G~v0YCi+5n)+Zu!d@Fm-iPDBu^tdrxGWaG)_E<9) za;p+}D|+$Y_qufBbIR4$Z9&_Gj(0UQ85@P)JClS z)K58?3fhAv=9%pu*1Upe+|V^EaRacN&}X-6-A;!53eGymnEk|m(eI77ZTBeo1cA>a zY%+Tj0=n_RTl|9-EAw9J1W^Ud!e zZ^A%!oLblXmPw@nN+qT8ry^KXPAI-*0B!e$1YP{MJs_mjBc*q!*i))mZ zbwak4p2#mUNv9Ilg}-HrGfBs`23=<==skLbTziDzQ(HIS@KTLw4O)#^eT~_hNIfwX zbHi}_^ZIH;?)O*BH*5M~j{1SKG2X+qT1rgmlTlA!=7;BSwHpHdmOdkV9p_296^%<> z#w$!Q!pN&C*8D>rXP1+1J#btQFJQ%$ZT%$nZB!~ca&&|&%C&Tm_ktWvWn^RY_FNiI zQi34f{yCGf!d=ZNo&Ovl!qmH7Kg3YN9|VU*dADy=?eo~M>eSDqjao$%WLv!Zn*?Ma zpw(`cdC8fWL&0a28&fM%x)CS(fOy;v45$YsEj*2+jlRCrL4u$+a zu6RRGh>33!EEih)n8Xa?+0Ct5-$?jRG%K_%*&-}j1fG&Z!LNqR8NehK6Fa}2`AwPo zwd!BHW^~ie2SXe>H!Of76Jpi|ePXA68nvi;YOLDXCKU$Xy$tY_&x?`SAjNUKrdu%T z5_wuQ8Tqp| zP$}wFI~!5?cD~KH-<#uude;EOEX=ck0ih`92de+~z=7RNY4#2u{%m{p+56b;XUALj zns6zeQ}h7Pi1_rm-Jp>?LVnX_hn~`qwaGosEw!up*DIzHe*bRdijO^fc%FqE0E0;| z?_GW{ZJyqU3HR2yUk3X3ukkgnB#aJ+zy-?n{PgtE$y_9gMOthjKv&PBhPfuGl_xIzYdDvD80OeUzQPjmQk9V#{Q+Yr8`PC54uI7RT9m|oPkIn zD{J=8ZG;sy;&XGQ?4eC#Isj<=IY+Xm4mRR;Jl~Du_MYzOjevJs9CZKvy}ekuF3GE^ zeKU}As#J8kIz_w&{a9;#-~>q2;+2=T5b*R23^mi_;-c52*LyBLn2m?_i-blMc?ZPd<5m929B;LtOj!Js;)kgKA=CAT+<>cE zd2bvyId}W@)le=6GU!rW|GUcd(<|O}E0<>5r2SY;-u~kPsAqT6>Gq(V@VzI zqY@wMm?`9`@#X3HGce^-Y``tc4c<_2>G@EbuN$u=Ghb~lT3S-O+kpqk;vX3@BWLZdsU z{mPa5e&xY4L6pMCVonSgAMkYmn_dx)fTxvK=scW)h`O4oL$ gn*D#D!sRH?{z~2fss4c!@UsOW^h|Z@U=L#c4?WC!p8x;= literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/login_out_account.png new file mode 100644 index 0000000000000000000000000000000000000000..7efbff243965b9c40046c9ba72689c175a9cca15 GIT binary patch literal 852 zcmV-a1FQUrP)eh4bY)!^&fNe20_jOaK~z|Uy;wa= zB0&^>vx_0w7(pVn7FIwgEx-b!9fh5tByRknu`ni7R(6J9Mc7af8=}c2T&&iRK&&u1 z3Mwe9Os)_^MIaoq?93ID+k;j1&t1N1_RY8R&3kWlX5OMdW7+Lu009E0KmdTi$3*_| z>o>xLP^+_g001x=%ZL!7#kCu*nTZer02t#^sU!%(`}@1`fmoIehr`#`*X!%+EX&TL z&G<*#CnqP>YSr}20RVvGxXa7SgM)*41V;7z@bF++3;>41VWCjaAgJ|fwHiX-S~{<< zuNu8BjXnSf1OhzIFD)(2BhVCxqWJjuIBhYchY%u!OutYp7X5y|_M8A99*=KsZtBwD zb39crB1XY+9BpVUPSA~~K_Gdk-9gRk7wc3L8 z3WY+a(>Xdi%IEW6E>xTKBuS!;OeT}bWE|IHnEwL`g23~h61jN7(fe~Inw zZ9x#GPbde!_rt@(+uK`~Wf4Nk9mQt<+-^5*TwGkx4?qQ*{Yxg3KA$g_%cW8&^bgYn zoBa!gLXAd4gJ7FptJPBO6Ol;7Sv^8XB9RylhXBB`?90o`Jf=?my4|ipNh$^avMg)R z)b$F@u(Cb!JkRsI%QZI)l&M^Hb)gf_R;zV>er|9q3hi=WCY~7MSSAqr z?CPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0vkz0K~z{r&6qo{ z0YMms&u<|*jYLDMbtyCoQ4k_7QHaD3Q27CRr9wy$5l1PfK0&D$3PE*t#dq>evKwZ0 zW6bRBP2OrI?>@UbGvCa7fk&h$Dt!O^!WZ4(rW95677*$M=<#?E-|u(m_xliuM8N0s z2|Ex7Ksud<{eDj}d1MGwEEbt?83%(w7z_r_k1`blG#ZVVKr0-J#hxE!Dh8-tuY=$3 zX98u7nLOeGipS&R%T1@#x1LNU#Fa{gf#MM}%WAb66LdTt>27a@FGuI_hzm$W2!w-K z%fK1OBin#b+wE5WmFxAIZZ?#yKq7JkXt&!zG#Z7~YDG6Oas;T+Xy{qJUXP3~GdTi8 zF9F?dm+qp=5g?^#9aY z^A3lDJP-z)&u3UJm&`!s9n_gjhGb}qr4$gaj55)MLV?WE=at(vpj<8os;cVyculSV zbvhjeM3W;x&1O^2(u%9AK%315!r?H?=X1J=kt0B#$W|avZDDQQ@$1vUX6cR;%^_Sz)20G#1O@aL9yNVWGeD!q+hx5N^J$y0A*6QsNg@ gUXZ7N{uCAd0e~SdWl-dWF8}}l07*qoM6N<$g2Oct3IG5A literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/out_account.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/out_account.png new file mode 100644 index 0000000000000000000000000000000000000000..4e25371ca4cd65c007c90a05c89eacea08d022bb GIT binary patch literal 1886 zcmbW2`8V4M7skJFY)wO{C6;+(87f0VFsfp&mZH|iR${4YL)BJmi$M*h@nTSv znTRH$G__TAkXUMuwP+O4ASB+*pYXmveC~73bMCqKo^#K+H`CDpDFT)Q0{|dmYlCp& z=?M=@VLo1jnim`KGiD!!O2o(rZLh@{b}mfG;3>}Va;!mq;sy1F-Pw6*Sq!FEo%%ceBB>HSsm*4B4X~_ z4xA->L+@*!s-E|28K-ri^~#pKl`MDO;5t5e;I)nobxOEwb~Ac2mNx2!CL*i$0093NA8;ctzni+#Z!K{_scKzSv6b1AG+ji|`;XrY0!vE#4#rs#Y8 zd|bptisS9_LuT{n%KpeYF&p9j#IZwwkIP~zxZnnVQP;H()UScrLjOnHop7g1Ce^|5 z=57VG=m1X<5kNG&E9!z+15CxYg!@&>-c=6fFgxM{pQVcpTw>O17TS>I|cWi5Qlf zpA4t^2R{p*?Dld@M=wnM`U#=T@AM*Mr)_XZNGQDBh^S!etz^RBl}f$Rf-i&_?H0 zxR=auZ`cVFjK^L>XEJ;<}(!~9)`)fDek(7{_~cg3akm!dyLE z--81}tVe|gbq*W1ySundxtPA#>7!O99}9HVzo8g)`mp;xtU)(eUqrcdjeeB(n}hGA zLm5klCLfQ_1^A(_RlVPv=YuwKv&PX);ONEMSaj_bKRnXTNha|Kc0-3V;@Cg%!X)&- z=2uc}pE%@l#rig6{yWwuS&#~E@?lrKa&t;cccLJTu=h>OIA}Y3!*A7y(4P8WV4M8_ zyFd*4*jUyoAk$H-oFam&PW`s{Hs#2LKaFVpXiGjOefUpa2eEjuzbf93su<}?Md9+P zl)fW!qI1?QEfqS48!0IOJeN4jXOMZ$EOB&}R_|g8R4P zK`*Dx05M^3^1^VCW%zHF_E^HzN!p@l&S1b(6so|$Kv?J4)DXke;po!O2nU_897r(@2CC?UCwNN|Q-hr(P;k^`-P{H8>V@sKmvs zD){61|HPcBsV_SCJr8;?2UmN=RRNvnuL-*Jp{I5b?^n>f1yMYv;2%{o=9F120hg+o z1#8eh;cy>#?9?N&32KJ7RYIh6!9&BXl`MnH3W_^_NCWW}I)nt#N=*5^{fydO*w1t} zK2`Jbc%e2eG#<12)}eAXlk<_EvWKiwzu`r`rxz2Wtp-Pic$Bhx@>mz`@JRb6YyCBu z@tmE*)U=vTPG31yZ&`-3lk}5kVgwFd62H1!Z* zmYsf4_FxVs;&y#R5(GG-Pm19`>Wd0@=(IzDY$pq;mAZ()G>3+hGL>99wRJ;0H?s(A zS103}ct;{Ozn7m1%ei|wJS@s-z>HOO)tw(SqsXPOD`tKQqL`YW4%RK)fEFnQJhlQ2cm~yRa?#6MSC8Qc|8nt#awcT|* V&g$wQl&)}ntPND`u5S`I`C%PfJ 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 literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_cancel.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..2bffc12fb91c9a315b66d0f3b377f90ac45ca172 GIT binary patch literal 1721 zcmY*adpy%?7$2utF11(`a!bu*o7r~Smbo=+!zgVbp>4m7$u73B712$(^-;>DP^Yt` zW6_~-B*)RkrF=+E2ofByzg^)pZEKG-|zFso4zeztFeKF0R#du zX3(iYptS~npUjhp&>TR*<)c+1DOe4GxOu3g9Nu2O!j{XA5{fB^srp8Q ztq`Cff(c9)rgRHGT1ek7 zps!71?A_gDfPfrCrG2dcBZ_^rLLnt%FiNEot;C@vvM3CeL?U5aTrsY$D6j%0-zQdZ zR4B20-B$oAU(S;Wr3#@$Y^w$2a3%2yihX>%5FiUU0s-yI4lal z;ebs9EYVef<=TI3uMi6U?Jt&pl>rn4qdmc3(JorbTAv&!6Y@b8+LrEEw=d`a%ei5+ zME*m}{qGF;R?z!L8LdqJsLL0Fk}5&%oX->(f@7;^P`y|oTdVUY0#659wRm*S%=*^B zufVBdAAs&vD!8jkucwyw<+TI(?dA`5SD81*Vgz{&vlpIBi2Atg%{5dL+~sb1mVfa| z9E_E*Y8M(+n>UQ<>@$oO`T6+Ho-Vr7I6`Wiq4bXIb3*x_fWjQu>E1u7KA5!(???4E ze7n)a#I?%FGyM1!n0@#$TG61T6?0&M=4@`q0_^hMRJXn!94&fQ8i}bKUm>VQ!b!cA zX3NJMJc_2CU%cZJnvSf!Y1@NxBfft2NuDD6+(ayMdIBIHh=O39@Q%Umlu4tRrcJ7-ycY5NIV}*#J#`&PN(B@@~W1nj2s4GsICoY%|OD1J(Q}LG;e6qqAjIi zVRs`bEh+&^>4rOlVf zmKxDjy$!ymAt1BsN=pnfDl)%#Aw1!}Z@$DUhVbZiVE&xPExCJ6+v}1cXofux|4KN> zeg1y4{*%Xjx*LDb=_NSp>8(}#Ig2H~*kF-q?)G5pqN6LJ$9I@gmA~%Vlvj?!nf_xn z*N4n2u#2fYp4B>@F_#XDU`oW0#Lk|r@`>SEzznz<%R*r-hnRYui z7Jr(&x{$kJ{t!$)vzYIGu*4Huyz_ceaS&s)x!mq%;>Xp>#E4grgc}3r4NB9fyxq4H zr_T>3n=Ld&S>Kqh;yUN@;e}a{qj$E05Hp5;R9;+b+rhKH_Jm9$V0KG*9mwR#pW7d% z;fA&wFmj0USKrLV_jM;^(DBV%j%RK>p#1RX@D|;sKgx7K7{`&M10Q4al&LcLvhezW zw0oxh%+8e$h;MToIFjpKTn%#oiML2~$~;TCCRX38Nky3AG{a(c+I%+E;7CMEsmrfo!x2yNkWQC*(i8E92f^*vsLKFjJg3y70S^dpnwiaz!`!TBTr`D2aC zL1#aZ@ss+f#JotgDsj9u*hFw6IInrxw{VvE|bUG+kK=Mm6+)}MB+@Y~V}AhbF9 z*XQQRX5bV$iWX0HBv_8p@wH@3hV#Yln5v}Q=OwAjzF`&k5#RMChG?8*nrV}4M6k&3 z9_^@((?(y?hqi&b$y-YfbF5F)J*sK?PR+@TKXAM56N+I%JL0~uIiIy53t^H~Pcbqg zLmmnV3UTe*=0n93ro+&(GS|sz>C67Lg0ZCW8y365UJ;X`H^o=8F%cn9FTB}US3w~- zqK}f1(krc=EeV!WHUpn$dA5=F2OTR_y4lJ@`fAhN^>NwyYIK>#X*{+zE_!5ntTEwb zdEZH?V3N&V^*IPSRg{gWSfh8`W(MHusl5Vu4Y_OQ%3sGyn)f^`;W=EoeU$fh$tijk z9Zz$#va|O4aePJ9Z(-aR!TGkAB!3^hSmVdBdn?qH9T__{q4ALQp680KR(3A*)*SA% zx%)Kym(62$D3r`j8z4qtJ+T3I;@x9#0?}pHnhLO+W!9(omW%q#WiA?zp*U~t|H1GH KpjLSAIs6xkHuGr! literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_menu.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/paimon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c424325b17a4956f7802352e7609bfcff2721afa GIT binary patch literal 2372 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 literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_out.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/pm_out.png new file mode 100644 index 0000000000000000000000000000000000000000..df31ebd6f55ea0637829cb0530425c986cbb4991 GIT binary patch literal 2070 zcmV+x2eh4bY)!^&fNe22dha$K~z|UrCIBC z+qe;)0YFlsBwrLe@g>f-JwBV{?EgMSU!r}}K0^DaXR}VTyJ@W0Ze&@aNa8a60fGd0 zk?nMj4^4vu;KR&d<^zm>`Rm_crw{?6djcQ;P^bWa?pe3gI&~u;Rzm;*8TYa7-4bLy zQ0z}VGy)JHBJ{z6aA5MmRuA`)jQgQJSlD`sU_^hd*s=x@c?Rf!17E$z3Iu@7a+{fY zQ33!7^402@5P*OH7y;wBmx`lVlE$3KHt&?jzE>+jAc9irk6*W?(jiI!KvChuup0mY zFa$yvMeO25`sd5Tm-~q!A{vg39*hHeh=^be-DmRp@4uHyL&qPYwG^^ew`OyrB!bPx zVv_Jju{=vGWX7-y3jkQXq9#P#JNc3D1Rp(Dj3Ejf*gO$I_-JcCR==F8CNf^|TF^w# z09$(it6g4+HWVm$n^}Orr~J@pwtZWqGPyL{LMvkskqzxw9~mGb2#({JClOurcxQH zjHlVGyIZdefFWAvs*vW1@hPZdc7G|>=?u|Eh82z|7&2F{dUtSlLo-CdS;SHBCj_ST zW*1!3l|UQF3bWeESTF#P+N^V>G})v=p>4c=f!PoM5f}pEj>z-{J9V=oQk$Dq@sD30 z=F`$t`M*S9evo)OHY%<~zN2$%fKCctEp>k>RLL0m3 zTkZ_19M%QJ!5Tv25h$#3nrNY^Un0(qX7R<*coeg{hw{@+_OMb`g$#i!`SyvyC>2+7 z6F%m>z>ZC-70?GuaCS6{E>91DD-;n?xPx)WuO~=PAfZFn62Wmk z6PG8`cW2Yn!%-~QK^jFI5$NaZtdPndER6J_bhZoX(1$jsX67`4#b+&$+&!YF|)Az6UP7ab977-|IN<|Fu<$m(=AQ?qWn}z~0 zR}7Rkt4u!R`gT<)-A*Cj!SO0&XYQPX(Y4tysLRhs_V#S{?tFSQOJWgBjR+BE`zh|Ff{1W1TY}a!ir8YAM;vom z!}?w>Ob*#>EG8o%c+b>`z!Awi8uY?r2(e(C1-qktihC5MmxP3^u#07JkVf$fHja5~ zVjI^!cj-l@G;K>=sxa5J7P%Xc*9)D^=$A#Ni44KT(Krpk*{reL$gI@O1mPqMk%;ad zlMC&F@F1BMI$qRBZ30IixZ%G8wu_vSc_INoRS!C(9k~U z5=5xttRkU62FamZ=kmk#CM)$Q;y0_}>wSR;Hj&y4hkbdWZ(?$d>{s&FwNMM@qvAYW@O0$(lDnsTeGht23d#Zp-exABR=A}*lPO&nh*2Fj-PU4^5 z%uWsx04SvS^56Vwk$qhiF`i3F&(#Dv!rJhuwI)5UfGL#j%)a19<(Jq39 zQ0!9j(p)VzSBuTF$;}|J!O#9CWX)@%h=F3$^?RWWhX6u5g6q5+@>Fzr!q2?*KYSdO zdnT?&Z)SUN6ST5Mpwo?w@1U!@&I5Jg>&t-fKbEx7sNmL4IRF3v07*qoM6N<$g4j>t AoB#j- literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/quit.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..1d11fa5a31a5539e4b4b47985417e0c029c2d95a GIT binary patch literal 1904 zcmZ8ic|6ox8y{k9@sX`k!r(P-7-NiO7+YgEbHfPN)~pO>Ff)uLAr)i2UED&-QdzQG zQIwQ@LP=R7OpzAbTT{vnHScfk+vmQ^ALpFsdCqgb&-Z-K`JBT&igS^dRhI>UK=N*` z7;j+o0-Av|80fLz2TFlKjOFd(2x=NVxC}TFVGdXa5U8aX~tgK)rrZ7`eBOt?wmB?Td z5{wuuogV-g3X8;~#jt773@s5LffyafMnmG_Xk-+XKt&SCWTX+1fFK*e;bejlfsB9~ zkr4>81rly)N`(_4KgzRd)c@3Huztt@2m%w$z~IIvBFZ8g^)r)30a%Di+QM!An*X1e z4NOGjzlhoXI|A$#u>Mv?B-7vOQW$`w96&q6q6=~$kR;O$Gd70J8 z2=0t;NG2(~NjPVvD2_Rsre3|fM$0+Ri!0$^CZVJF#X%da?3Ei^a-kxeIxW>|xYbi@ zDBJH;WS^CfJ@diT$vo&*9BDo>^x6DsCOvp|vS+H5;(B>WxNwQZVEuD^JUMj}Zx|>@ zb1up{>Uf|k_fjoJ2BYV$^^=#l7gs6Ey~rM4C2_?AeuaGfWSVq^fn6-D#wrxwE zQ#9@SGPfUW-i*E0);l^gVw}3&W`GsHY)qd(=|%u3w{Z>IU(Nt7>Pcy_4($Q z_N!B7+#FW!+6iNM?FwGqjqO6`=cp7=Ltt_LiYm9VCilTL&Wa!*qvo2A#P6poukxSF zXR4Wyb-9k+Dy^fbbL&S1pWSY=6Ybu<5V8e+8B%Ey)xG&)-rOhLF@jn9XJ+N7#;v3j zolv~9`)(=On(Yyy`fp4$@iXMz+**WK)mu7W+B=8TyPvg zJdHKI@@`p95K-<6^ZW0e;>*A_c{f(awbx2^Qtxt4Bf8UXoBbDto7Z%NK*Mb;}p zL_*2}MX!HVQG70>_|bL~cwjI1YSbs@Ykvfuj~!JpEd_`Uf%bJsXfeNU6IT z*T3yC^uE%7!Je5?&}`JWw>ntV;h#QJD;MaPHr~iww2*4qS`a{0oR%NwXCR@!rU&ht z-V6P}L(D&wfJEwnZ@e9-TO#j&X?JYVk7r%mwL;)~?&4if9uq&7Qzd;UB!ci-39)x& z?rtcxZ`OJu+6-z~s{Gzg;q|>UG7m3LzDTX(um3EQ(P5*GrFWSHugXUhs2CiMHIo)Q z@XSAPjgJXQvf1w>9Tl%xQrEJ^{}p%g(thpk@#_Rxu1!4{dDA!|B6x?%9~!bd=%5Pa zQ8(pR?Ka!x+Wqu~s&ouquIqXKBdDs~@70c~MJbrWXS|$mY!?g;)~Pgk^hIzNG|SFc z-B8OOj%wpbX1-4eG=b|IVjB?~ZElZFdrTOd3Mh$vSVrhx9sjfL4o`?UvDKp+;$NQo z#AIPSTY9-wbvGI^(2b6nYO_q8{UmvepJbI0_NnlJ=cG^Y>e9^ubt`s99?nJcYa%r} zVl^eBN+9BmU&H z{nwUwyy`8Rb4qMJ8Mw{^R?fF4ZJp*n7DJ6 zekbX!x~jhQ%)R^RT~{AXcP>$G3o!1uAQS6Ly>Ybf-}d}U|Tr`_f1_@24wEMHg8cLnB+>$dT0 z(b6lLhrM-;Lyr?z3+trCCeL3~Ip2QV3>p_E*0p9k{mxFIXrDpmPtR+2 zke0axss>78Qw^?5-<@Rc20T4|__z+?OPi(IC|7^Jo~P2Rs994HB+OGt^9j>9C_gPT z{1`#XemT@Arf`0EW`q$HpBQcQRM+%FyL|y-=S{D$q$RbH(4i^`30!P+2VSr$B|XJr eX!`#@Zr%5D0#G{fye%owx98@B!!$V_KlLx!Oj;WN literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/verification.png b/repo/js/SwitchAccountMultipleMode/Assets/RecognitionObject/verification.png new file mode 100644 index 0000000000000000000000000000000000000000..939b7a9d9966ec1fff2d72b300ce322c5548a32d GIT binary patch literal 2241 zcmV;y2tN0TP)eh4bY)!^&fNe22v$i%K~!jg?O9n< z8eJOhy`kB6kVT+G%;FL?O4j;PNv`vg@{e+FRVw90EGjr@xEy zeH4=!6-Z{L#__pgY0mpR=e*l_K>+~B{}ZtPHi7>%?gig<+zYntF>4xCX)%Og%mMt%6O4wc`z8TEL*G9TCG;M z+m$4VAP9zG32$4D<2a7zd1y$fR5A?XbUJ5eXWeeMUaz0R#JKKJ zEEZ$2SUesVMNy~I84L!kR*PZSU@&Mlo6TmkTCHj{nm{11w6tWm+ou*>sZ=77$jQkG z06?u)8w>`GMuX$HD2nZNn`K#!YP%xZR~2jmG}|emb4DTCIzV ziwg@2G)-d|2KCT1O;MEDZ1#G+$z(Dfk0+B!0KmI<@3dO&L~3POPN&m_LcwOUJ$UdS z7z{EDgX1^=07X%nrtNmS!{KnbT+mP=k&tCsqtR%!+VM5xA3uJ)fdq=8;c)o)_*ku0 zzk2m*etuq|P#}L-qtUdaP$&!rgG!|;l}hDunWkx{(>al2OOn*-bku6~lP6DnJ|Dv{ za9f9!53WX0l+kEZsZ_;cu~aG%1mSkO$4`(q2}V(rCXq-qn@y9+G&eWLFbn`79*=KrZSC*x*J`!FU{I}A z!{PAf&!4}4|2`NDR4UcN!otkVOuOAqrBY+6MMf(5&Af-F%`nWu!h+3a>vTHFWb(Jg za4wgVB`RPM@L7!UT<@A zQ=`$0lD2v@927>_x6^f!Nm1=!` z{n4XG0DyM8ElJYDhY#1*)<%gk3IE0@cS_UhO2#xT3x{{H=Yy6bf-1SFhKXmzUqXc{3Uv zH^(GR(=M0GX0wgft($S}2}2)txm*N6q*AGNyNw_SK@c8~$L)5%eED*1ZB3`st*)-V zc=5vH@pwEQ9LEs^;W#c9i%}Hi_xs0TfFKBlVGf4_MbS#7(r&j$FQM1T82xIZYuU9Y z46SOl+GH|WsZ?m1Hk-{fO`A-nU@+)*yJ?!naU92StJN9|2CY^rK@jbBI}(Yc(`k#v z^2Z;4kR&-K50lAsa&l5Gmnn*}SS&P6BmdZMi~g6Da?UQbcf==1~9;y5lG4)5*l zAqcXuv9Y$cHW3d5L5xPDAPD7h85Sp_(Fhao(0c&@vMe{7&4Yu3y}i9wtL622-EQ|p z9s4aOj35Y(<2IWO!?1ilpU>yB*{mQ4@Q~rOrBbOxqtSzd1K8p%EiFBJ_H4|WGz!>D zqbOP`m2$aUCX<2P8$l2RK}eExb#)bw$HU?9>FKE?Nz2R2>+9>|M-9a7_hIN%JkK8= zAAkGyty-bqK@jj>4jaR6x9e~?R##Vp!Qib0>0eVpQCXIIyBu(C_!*T*+WCY;0@<0)Z(EjU^cROt05tS@z=MBA3fmt5uHUBuOGkQmfUP&1Rd; z=J)&Ub~{B;0011vryF0w$yuY(`0?XMCX<2lvwpu%lB8O#HX4nyv$I~W*J822o7wLd zJmdi#xZm%yEDMhUHdQ!|!?6}@{b4ejPA$CaBM5?`D9`g8$8|a#Ns?g7AP52u3>6B+ z)U(ma1S8jU0>5!O`|rjt&3OM8asOA#UB|uPyN-LocOCbF?>g=U-*x;6g=4S!Ld-nS P00000NkvXXu0mjfSo$y! literal 0 HcmV?d00001 diff --git a/repo/js/SwitchAccountMultipleMode/README.md b/repo/js/SwitchAccountMultipleMode/README.md new file mode 100644 index 000000000..7c784f2bc --- /dev/null +++ b/repo/js/SwitchAccountMultipleMode/README.md @@ -0,0 +1,35 @@ +# 下拉列表模式 + +## 使用前准备 + +确保你想要切换的账号是已登录状态,且账号选择列表中存在。 + +## 使用方式 + +1. 把此脚本添加到配置组 +2. 右键点击选择"修改JS脚本自定义配置" +3. 填入你想登录的账户名称,该名称必须和账号列表中显示的一致 + - 请确认你此次登录使用的是手机号还是邮箱 + +# 账号+密码 / 账号+密码+OCR模式 + +**重要免责声明:** + +1. **数据安全:** + 1. 本脚本使用的用户名、密码等敏感信息仅存储在本地设备,开发者无法获取。 + 2. 使用者需自行承担账户信息泄露风险,请勿在公共设备或不可信环境中使用。 +2. **使用风险:** + 1. 本脚本为开源学习项目,禁止用于商业用途或违反游戏条款的行为。 + 2. 滥用可能导致游戏账号封禁,开发者不承担任何直接或间接责任。 +3. **责任限制:** + 1. 本脚本按“现状”提供,不承诺兼容性、安全性或功能完整性。 + 2. 因使用本脚本导致的账号、数据、设备损失,开发者概不负责。 +4. **禁止条款:** + 1. 严禁逆向工程、恶意篡改或用于外挂等非法用途。 + 2. 若游戏运营商提出要求,开发者保留随时停止维护的权利。 + +使用脚本即表示您已阅读并同意上述条款。 + +如果使用BGI一条龙启动,且第一个脚本就是账号切换,则需要开启BGI启动配置-同时启动原神-自动进入游戏 + +根据使用者设备配置和网络环境,脚本中的延时可以适当调整。(如果不熟悉脚本操作则不建议修改延时) \ No newline at end of file diff --git a/repo/js/SwitchAccountMultipleMode/main.js b/repo/js/SwitchAccountMultipleMode/main.js new file mode 100644 index 000000000..614bffbb2 --- /dev/null +++ b/repo/js/SwitchAccountMultipleMode/main.js @@ -0,0 +1,604 @@ +// ====================================================== +// 切换账号(OCR)版本 +const author = "彩虹QQ人"; +const script_name = "切换账号(OCR)版本"; + +const pm_out = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/pm_out.png")), + name: "pm_out.png" +}; +const out_to_login = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/out_to_login.png")), + name: "out_to_login.png" +}; +const login_out_account = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/login_out_account.png")), + name: "login_out_account.png" +}; +const out_account = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/out_account.png")), + name: "out_account.png" +}; +const login_other_account = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/login_other_account_1.png")), + name: "login_other_account.png" +}; +const input_phone_or_email = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/input_phone_or_email.png")), + name: "input_phone_or_email.png" +}; +const input_password = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/input_password.png")), + name: "input_password.png" +}; +const agree = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/agree.png")), + name: "agree.png" +}; +//人机验证识别图片 +const login_verification = { + template: RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/verification.png")), + name: "verification.png" +}; + +async function clickCenter(x, y, width, height) { + let centerX = Math.round(x + width / 2); + let centerY = Math.round(y + height / 2); + await click(centerX, centerY); + await sleep(500); // 确保点击后有足够的时间等待 + return { success: true, x: centerX, y: centerY }; +} + +async function matchImgAndClick(obj, desc, timeout = 8000) { + const start = Date.now(); + let retryCount = 0; // 识别次数计数 + let status = false; // 用于记录是否匹配成功 + try { + while (Date.now() - start < timeout && !status) { + await sleep(300); + const ro = captureGameRegion(); + let result = ro.Find(obj.template); + ro.dispose(); + await sleep(500); // 短暂延迟,避免过快循环 + if (result.isExist()) { + let clickResult = await clickCenter(result.x, result.y, result.width, result.height); + log.info(`【IMG】成功识别并点击 ${desc}| 耗时: ${Date.now() - start}ms`); + status = true; // 设置匹配成功状态 + return { success: true, x: clickResult.x, y: clickResult.y }; + } + // await sleep(200); // 短暂延迟,避免过快循环 + log.info(`【IMG】第${retryCount++}次识别并点击 ${desc} 失败 | 耗时: ${Date.now() - start}ms`); + } + } catch (error) { + log.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + //如果有配置通知…… + notification.error(`【IMG】${script_name}等待超时,请人工介入。===待切换账号:${settings.username}===超时原因:未找到目标 [${desc}] | 文件:${obj.name}`); + throw new Error(`【IMG】识别图像时发生异常: ${error.message}`); + } + return { success: false }; +} +async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { + let start = Date.now(); + let retryCount = 0; // 重试计数 + let status = false; // 用于记录是否匹配成功 + try { + while (Date.now() - start < timeout && !status) { + const ro = captureGameRegion(); + let resultList = ro.findMulti(ocrRegion); + ro.dispose(); + await sleep(500); // 短暂延迟,避免过快循环 + for (let result of resultList) { + if (result.text.includes(targetText)) { + let clickResult = await clickCenter(result.x, result.y, result.width, result.height); + log.info(`【OCR】成功识别并点击 ${targetText}| 耗时: ${Date.now() - start}ms`); + status = true; // 设置匹配成功状态 + return { success: true, x: clickResult.x, y: clickResult.y }; + } + } + // await sleep(200); // 短暂延迟,避免过快循环 + log.info(`【OCR】${targetText}失败,正在进行第 ${retryCount++} 次重试...`); + } + } catch (error) { + log.warn(`【OCR】经过多次尝试,仍然无法识别文字: ”${targetText}“,尝试点击默认中心位置`); + await clickCenter(result.x, result.y, result.width, result.height); + //如果有配置通知…… + notification.error(`【OCR】识别文字: “${targetText}”,发生异常`); + throw new Error(`【OCR】识别文字时发生异常: ${error.message}`); + } + return { success: false }; +} +// 切换账号(OCR)版本 +// ====================================================== + +// ====================================================== +//切换账号DropDown + + +//切换账号DropDown +// ====================================================== + +(async function () { + // ====================================================== + // Library functions + + var u = {}; // utilities 工具函数集合 + u.logi = function (message, args) { log.info("[切换账号]" + message, args) }; + u.logw = function (message, args) { log.warn("[切换账号]" + message, args) }; + u.x = function (value) { return (value === undefined) ? genshin.width : genshin.width * (value / 1920); }; + u.y = function (value) { return (value === undefined) ? genshin.height : genshin.height * (value / 1080); }; + u.loadTemplate = function (filePath, x /* 0 if omit */, y /* 0 if omit */, w /* maxWidth if omit */, h /* maxHeight if omit */) { + const _x = u.x(x === undefined ? 0 : x); + const _y = u.y(y === undefined ? 0 : y); + const _w = u.x(w) - _x; + const _h = u.y(h) - _y; + return RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath), _x, _y, _w, _h); + }; + u.findText = function (resList, text) { + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text == text) { + return res; + } + } + return null; + }; + u.matchUser = function (text, username) { + if (typeof text !== "string" || typeof username !== "string") return false; + if (text.length !== username.length) return false; + for (let i = 0; i < text.length; i++) { + const a = text[i]; + const b = username[i]; + if (a === '*' || b === '*') continue; + if (a !== b) return false; + } + return true; + }; + u.matchUserRelaxed = function (text, username) { + if (typeof text !== "string" || typeof username !== "string") return false; + // Check the head + for (let i = 0; i < text.length; i++) { + const a = text[i]; + const b = username[i]; + if (a === '*') break; // Stop checking when a '*' is found in text. + if (a !== b) return false; + } + // Check the tail + for (let i = 0; i < text.length; i++) { + const a = text[text.length - 1 - i]; + const b = username[username.length - 1 - i]; + if (a === '*') break; // Stop checking when a '*' is found in text. + if (a !== b) return false; + } + return true; + }; + u.waitAndFindImage = async function (asset, internal = 500, timeout = 60000) { + const start = Date.now(); + let lastLog = start; + let endTime = start + timeout; + while (Date.now() < endTime) { + let captureRegion = captureGameRegion(); + let res = captureRegion.Find(asset); + captureRegion.dispose(); + if (!res.isEmpty()) { + return res; + } + if (Date.now() - lastLog >= 10000) { + let elapsed = ((Date.now() - start) / 1000).toFixed(1); + u.logw("等待匹配图像已持续 {0} 秒,仍在尝试寻找图像:{1}", elapsed, asset.Name); + lastLog = Date.now(); + } + await sleep(internal); + } + return null; + } + u.waitAndFindText = async function (text, x, y, w, h, internal = 500) { + const start = Date.now(); + let lastLog = start; + while (true) { + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(x, y, w, h)); + captureRegion.dispose(); + if (typeof text === "string") { + let textFound = u.findText(resList, text); + if (textFound) { + return textFound; + } + } else if (text instanceof Array) { + var textFound = null; + for (let i = 0; i < text.length; i++) { + let textItem = text[i]; + textFound = u.findText(resList, textItem); + if (!textFound) { + break; + } + } + if (textFound) { + return textFound; + } + } + + if (Date.now() - lastLog >= 10000) { + let elapsed = ((Date.now() - start) / 1000).toFixed(1); + u.logw("等待匹配图像已持续 {0} 秒,仍在尝试寻找文字:{1}", elapsed, text.toString()); + lastLog = Date.now(); + } + await sleep(internal); + } + } + + // ====================================================== + // Setup + + const targetUser = settings.username; + + const assetLogoutIcon = u.loadTemplate("Assets/RecognitionObject/logout.png", 1750, 900); + const assetPaimonMenuIcon = u.loadTemplate("Assets/RecognitionObject/paimon_menu.png", 0, 0, 150, 150); + + // Check current state + + /** + * 领取空月祝福 + */ + async function useBlessingOfTheWelkinMoon() { + u.logi("开始尝试领取空月祝福"); + + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocrThis); + captureRegion.dispose(); + + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes("点击领取") || res.text.includes("空月祝福")) { + res.click(); + await sleep(500); + res.click(); + res.click(); + await sleep(500); + } + } + + let captureRegionGetReward = captureGameRegion(); + let resGetReward = captureRegionGetReward.findMulti(RecognitionObject.ocrThis); + captureRegionGetReward.dispose(); + for (let i = 0; i < resGetReward.count; i++) { + let res = resGetReward[i]; + if (res.text.includes("点击") || res.text.includes("空白") || res.text.includes("获得")) { + res.click(); + await sleep(500); + } + } + + u.logi("空月祝福领取成功"); + } + + async function waitAndDetermineCurrentView() { + u.logi("开始判断当前画面状态"); + while (true) { + let captureRegion = captureGameRegion(); + let res = captureRegion.Find(assetLogoutIcon); + let logoutIconFound = !res.isEmpty(); + + if (logoutIconFound) { + let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(850), u.y(970), u.x(220), u.y(100))); + captureRegion.dispose(); + if (u.findText(resList, "点击进入")) { + u.logi("检测到目前处于登录界面"); + return false; + } + } + + // 尝试领取空月祝福 + await useBlessingOfTheWelkinMoon(); + + // Not in the login screen, check if is in the game main menu. + let paimonIcon = captureRegion.Find(assetPaimonMenuIcon); + captureRegion.dispose(); + if (!paimonIcon.isEmpty()) { + u.logi("检测到目前处于游戏主界面"); + return true; + } + + // Not in the main game screen either, wait and try again. + u.logi("未检测到登出按钮或派蒙菜单图标,可能处于游戏中,等待状态变化"); + genshin.blessingOfTheWelkinMoon(); + moveMouseTo(960, 0); + await sleep(100); + middleButtonClick(); + genshin.returnMainUi(); + await sleep(4900); + } + } + + async function stateReturnToGenshinGate() { + const assetPaimonCancelIcon = u.loadTemplate("Assets/RecognitionObject/paimon_cancel.png", 0, 0, 100, 100); + + while (true) { + let paimonIcon = await u.waitAndFindImage(assetPaimonMenuIcon, 500, 1000); + if (!paimonIcon) { + u.logi("检测到派蒙菜单图标不存在,可能已开启菜单,进入登出按钮识别流程"); + break; + } + moveMouseTo(960, 0); + await sleep(100); + middleButtonClick(); + keyPress("VK_ESCAPE"); + u.logi("已按下ESC键,打开派蒙菜单"); + await sleep(1000); + } + + // 识别派蒙菜单,点击登出按钮 + await u.waitAndFindImage(assetPaimonCancelIcon); + // u.logi("点击登出按钮"); + click(u.x(50), u.y(1024)); + + // 退出至登录界面 + let btnExitToLogin = await u.waitAndFindText("退出至登录界面", u.x(680), u.y(380), u.x(540), u.y(340)); + // u.logi("检测到\"退出至登录界面\"按钮,点击"); + // btnExitToLogin.DrawSelf("ExitToLoginBtn"); + btnExitToLogin.Click(); + } + + async function stateLogout() { + u.logi("开始登出"); + + let btnLogout = await u.waitAndFindImage(assetLogoutIcon); + // u.logi("识别到登出按钮,点击"); + btnLogout.DrawSelf("LogoutBtn"); + btnLogout.Click(); + + const assetQuitTextButton = u.loadTemplate("Assets/RecognitionObject/quit.png", 680, 380, 1220, 720); + let btnQuit = await u.waitAndFindImage(assetQuitTextButton, 200); + // u.logi("识别到退出按钮,点击"); + // btnQuit.DrawSelf("QuitBtn"); + btnQuit.Click(); + }; + + async function stateChangeUser() { + u.logi("开始切换账号"); + await u.waitAndFindText(["进入游戏", "登录其他账号"], u.x(680), u.y(380), u.x(540), u.y(340), 200); + + const assetSelectUserDropDownIcon = u.loadTemplate("Assets/RecognitionObject/caret.png", 680, 380, 1220, 720); + let captureRegion = captureGameRegion(); + let res = captureRegion.Find(assetSelectUserDropDownIcon); + captureRegion.dispose(); + if (res.isEmpty()) { + u.logi("未找到下拉菜单图标,点击硬编码的坐标(960, 500)展开菜单"); + click(u.x(960), u.y(500)); + } else { + // u.logi("识别到下拉菜单,点击"); + // res.DrawSelf("UserDropdown"); + res.Click(); + } + + u.logi("开始从下拉列表选择账号"); + var selectedUser = null; + { + const start = Date.now(); + let lastLog = start; + while (selectedUser == null) { + await sleep(200); + + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(680), u.y(540), u.x(540), u.y(500))); + captureRegion.dispose(); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + let user = lastLog > start ? u.matchUserRelaxed(res.text, targetUser) : u.matchUser(res.text, targetUser); + if (user) { + selectedUser = res; + break; + } + } + + if (Date.now() - lastLog >= 10000) { + let elapsed = ((Date.now() - start) / 1000).toFixed(1); + u.logw("等待匹配图像已持续 {0} 秒,仍在尝试寻找账号文本:{1}", elapsed, targetUser); + lastLog = Date.now(); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + u.logw("账户文本:{0}", res.text); + } + } + } + } + + u.logi("识别到目标账号:{0}", selectedUser.text); + selectedUser.DrawSelf("SelectUser"); + selectedUser.Click(); + + await sleep(500); + { + let captureRegion = captureGameRegion(); + let btnEnterGame = captureRegion.DeriveCrop(u.x(684), u.y(598), u.x(552), u.y(66)); + btnEnterGame.Click(); + captureRegion.dispose(); + btnEnterGame.dispose(); + // btnEnterGame.DrawSelf("EnterGameBtn"); + // u.logi("已点击\"进入游戏\"按钮,完成账号选择。"); + } + } + + async function stateEnterGame() { + // u.logi("开始进入游戏,等待游戏加载。"); + let textClickToStart = await u.waitAndFindText("点击进入", u.x(850), u.y(970), u.x(220), u.y(100)); + // u.logi("已识别到\"点击进入\"文本,点击鼠标进入游戏。"); + textClickToStart.DrawSelf("ClickToStart"); + textClickToStart.Click(); + } + + // ====================================================== + // Main flow + + if (settings.Modes == "下拉列表") { + await DropDownMode(); + } else if (settings.Modes == "账号+密码") { + await KeyboardMouseMode(); + } else if (settings.Modes == "账号+密码+OCR") { + await OcrMode(); + } else { + log.info("尖尖哇嘎乃") + } + + async function DropDownMode() { + const isInGame = await waitAndDetermineCurrentView(); + if (isInGame) { + await stateReturnToGenshinGate(); + await sleep(1000); + } + await stateLogout(); + await sleep(500); + await stateChangeUser(); + await sleep(500); + await stateEnterGame(); + await sleep(20000); + await waitAndDetermineCurrentView(); + + } + + async function KeyboardMouseMode() { + setGameMetrics(1920, 1080, 2.0); + //到达主页面 + await genshin.returnMainUi(); + await sleep(1000); + //打开派蒙页面 + keyPress("VK_ESCAPE"); + await sleep(1000); + click(50, 1030); + //退出门图标 + await sleep(1000); + //退出至登录页面 + click(978, 540); + await sleep(15000); + //登录页面退出当前账号的小门图标 + click(1828, 985); + await sleep(1000); + //勾选:退出并保留登录记录 + click(701, 573); + await sleep(1000); + //点击退出大按钮 + click(1107, 684); + await sleep(1000); + //登录其他账号 + click(946, 703); + await sleep(1000); + //点击用户名输入框 + click(815, 400); + //如果有文本,清除 + await keyPress("VK_DELETE"); + // 输入文本 + await inputText(settings.username); + await sleep(500); + //点击密码输入框 + click(815, 480); + //如果有文本,清除 + await keyPress("VK_DELETE"); + // 输入文本 + await inputText(settings.password); + await sleep(500); + //登录 + keyPress("VK_RETURN"); + await sleep(500); + //用户协议弹窗,点击同意,等待8.5s,增加容错 + click(1093, 593); + await sleep(8500); + //进入世界循环点击,增加容错 + for (let i = 3; i > 0; i--) { + click(960, 540); + await sleep(1500); + } + //确保进入主页面 + await sleep(12000); + //点击领月卡 + await genshin.blessingOfTheWelkinMoon(); + } + + async function OcrMode() { + setGameMetrics(1920, 1080, 1); + // 如果切换账号是第一个脚本,则有可能出现月卡选项 + //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 + try { + keyDown("VK_MENU"); + await sleep(500); + for (let i = 0; i <= 4; i++) { + await click(genshin.width / 2.0, genshin.height * 0.8); + await sleep(1000); + } + } finally { + keyUp("VK_MENU"); + } + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + await genshin.returnMainUi(); + + await keyPress("VK_ESCAPE"); + await sleep(500); + try { + await matchImgAndClick(pm_out, "左下角退出门"); + await matchImgAndClick(out_to_login, "退出至登陆页面"); + //这一步根据 电脑配置和当前网络情况不同休眠时间不同,建议实际运行之后,如果有日志 : 第x次 识别失败,就适当增加休眠时间 + await sleep(9000); + await matchImgAndClick(login_out_account, "登录页的右下角退出按钮"); + await matchImgAndClick(out_account, "退出当前账号"); + await matchImgAndClick(login_other_account, "登录其他账号"); + await sleep(1000); + await matchImgAndClick(input_phone_or_email, "填写邮箱/手机号"); + await inputText(settings.username); + await sleep(1000); + await matchImgAndClick(input_password, "填写密码"); + await inputText(settings.password); + await sleep(1000); + //按下回车登录账号,弹出用户协议对话框 + await keyPress("VK_RETURN"); + //点击回车后,等待特瓦特大门加载 + await matchImgAndClick(agree, "同意用户协议"); + //如果当天上下线次数过于频繁 + for (let i = 1; i <= 2; i++) { + const ro = captureGameRegion(); + let verify = ro.Find(login_verification.template); + ro.dispose(); + //等待1s避免循环速度过快 + await sleep(1000); + if (verify.isExist()) { + //这里可配置通知方法 + notification.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); + log.error(`${script_name}触发人机验证,请手动登录。===待切换UID:${settings.UID}`); + } + } + /** + * 根据不同网络环境和电脑配置,此操作可能会将领取月卡操作取代,但是不影响使用 + * 如果发现卡在这一步,请适当延长sleep时间 + */ + await sleep(8000); + await recognizeTextAndClick("点击进入", RecognitionObject.Ocr(862, 966, 206, 104), 960, 540, 5000); + await sleep(15000); + + //可能登录账号的时候出现月卡提醒,则先点击一次月卡。 + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //await genshin.blessingOfTheWelkinMoon(); + //await sleep(1000); + //防止genshin.blessingOfTheWelkinMoon();方法失效,先使用物理点击。 + await sleep(2000); + keyDown("VK_MENU"); + await sleep(500); + for (let i = 0; i <= 4; i++) { + await click(genshin.width / 2.0, genshin.height * 0.8); + await sleep(1000); + } + //keyUp("VK_MENU"); + await genshin.returnMainUi(); + await sleep(1000); + // 如果配置了通知 + notification.send("账号【" + settings.UID + "】切换成功"); + } catch (error) { + log.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + //如果发生错误,则发送通知 + notification.error(`${script_name}脚本执行过程中发生错误:${error.message}`); + throw new Error(`${script_name}脚本执行过程中发生错误:${error.message}`); + } finally { + keyUp("VK_MENU"); + } + } +})(); diff --git a/repo/js/SwitchAccountMultipleMode/manifest.json b/repo/js/SwitchAccountMultipleMode/manifest.json new file mode 100644 index 000000000..c78faaaa8 --- /dev/null +++ b/repo/js/SwitchAccountMultipleMode/manifest.json @@ -0,0 +1,32 @@ +{ + "manifest_version": 1, + "name": "切换账号多模式", + "version": "1.0", + "bgi_version": "0.49.0", + "description": "多种模式的切换账号,有下拉列表、填写账号密码,OCR操作或键鼠操作\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", + "tags": [ + "切换账号", + "鼠标点击", + "OCR" + ], + "authors": [ + { + "name": "起个名字好难的喵", + "links": "https://github.com/MisakaAldrich" + }, + { + "name": "密密麻麻" + }, + { + "name": "羊汪汪", + "links": "https://github.com/ColinXHL" + }, + { + "name": "彩虹QQ人", + "email": "846224811@qq.com", + "links": "https://github.com/KRdingsan" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/SwitchAccountMultipleMode/settings.json b/repo/js/SwitchAccountMultipleMode/settings.json new file mode 100644 index 000000000..fe9cfde7e --- /dev/null +++ b/repo/js/SwitchAccountMultipleMode/settings.json @@ -0,0 +1,23 @@ +[ + { + "name": "Modes", + "type": "select", + "label": "切换模式", + "options": [ + "下拉列表", + "账号+密码", + "账号+密码+OCR" + ], + "default": "下拉列表" + }, + { + "name": "username", + "type": "input-text", + "label": "账号(只保存在本地,请妥善保管)\n下拉列表手机号格式:114******98\n下拉列表邮箱格式:11****1@919.com\n账号密码模式请输入完整的手机号或邮箱" + }, + { + "name": "password", + "type": "input-text", + "label": "密码(只保存在本地,请妥善保管)\n切换模式为下拉列表时无需填写" + } +] \ No newline at end of file