\n
鈴?/div>\n
婵€娲荤爜宸茶繃鏈?/div>\n
\n 鎮ㄧ殑婵€娲荤爜宸茶繃鏈燂紝璇风画璐瑰悗缁х画浣跨敤\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
鈿狅笍
\n
娓呯悊 Cursor 鐜
\n
\n 姝ゆ搷浣滀細鍒犻櫎鎵€鏈夐厤缃拰鐧诲綍淇℃伅
纭畾瑕佺户缁悧锛焅n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
馃挵
\n
璐﹀彿鏈娇鐢ㄥ畬
\n
\n 褰撳墠璐﹀彿
\n 宸茬敤棰濆害: $0.00 (涓嶈冻 $10)
\n 纭畾瑕佹崲鍙峰悧锛焅n
\n
\n \n \n
\n
\n
\n \n \n
\n
馃摗\n
\n
缃戠粶杩炴帴澶辫触
\n
璇锋鏌ョ綉缁滃悗閲嶈瘯
\n
\n
\n
\n \n \n
\n
\n 馃攼\n 杞欢鎺堟潈\n 鏈巿鏉?/span>\n
\n \n
\n \n \n
\n \n
\n 婵€娲荤爜\n 灏氭湭婵€娲?/span>\n
\n
\n 鍒版湡鏃堕棿\n 灏氭湭婵€娲?/span>\n
\n
\n \n \n
\n
\n 馃懁\n 璐﹀彿鏁版嵁\n 鏈縺娲?/span>\n
\n \n
\n CI绉垎浣欓\n 0 \n
\n \n
\n
\n \n \n
\n
\n 鈿?/span>\n 鏃犳劅鎹㈠彿\n 鏈惎鐢?/span>\n
\n \n
\n 绉垎\n 0\n
\n \n
\n 褰撳墠璐﹀彿\n 鏈垎閰?/span>\n
\n \n
\n 鍏嶉瓟娉曟ā寮?/span>\n PRO\n \n \n
\n \n
鍚敤鏃犳劅鎹㈠彿\n
閲嶇疆鏈哄櫒鐮?/span>\n
绂佺敤鏃犳劅鎹㈠彿\n
涓€閿崲鍙?鎵?绉垎)\n
\n \n \n
\n
\n 馃搳\n 璐﹀彿鐢ㄩ噺\n 馃攧\n
\n \n
\n
\n 浼氬憳绫诲瀷\n -\n
\n
\n 璇曠敤鍓╀綑\n -\n
\n
\n
\n
\n 璇锋眰娆℃暟\n -\n
\n
\n 宸茬敤棰濆害\n -\n
\n
\n
-
\n
\n \n \n
\n
\n 馃摙\n 鍏憡\n info\n
\n
\n
\n
\n
\n \n \n
\n
\n 馃摝\n 鐗堟湰淇℃伅\n 鏈夋洿鏂?/span>\n
\n
\n 褰撳墠鐗堟湰\n -\n
\n
\n 鏈€鏂扮増鏈?/span>\n -\n
\n
\n 鈿狅笍 鍙戠幇鏂扮増鏈紝璇锋洿鏂版彃浠朵互鑾峰彇鏈€鏂板姛鑳絓n
\n
\n \n \n \n \n \n
\n \n \n\n";
- }
-}
-exports.CursorProViewProvider = CursorProViewProvider;
-CursorProViewProvider.CURRENT_VERSION = '0.4.5';
-
diff --git a/codexfanbianyi/extension/out/webview/provider_clean.js b/codexfanbianyi/extension/out/webview/provider_clean.js
deleted file mode 100644
index e66cf55..0000000
--- a/codexfanbianyi/extension/out/webview/provider_clean.js
+++ /dev/null
@@ -1,3974 +0,0 @@
-'use strict';
-
-var __createBinding = this && this.__createBinding || (Object.create ? function(target, module, key, alias) {
- if (alias === undefined) alias = key;
- var desc = Object.getOwnPropertyDescriptor(module, key);
- if (!desc || ("get" in desc ? !module.__esModule : desc.writable || desc.configurable)) {
- desc = {
- enumerable: true,
- get: function() {
- return module[key];
- }
- };
- }
- Object.defineProperty(target, alias, desc);
-} : function(target, module, key, alias) {
- if (alias === undefined) alias = key;
- target[alias] = module[key];
-});
-var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(target, value) {
- Object.defineProperty(target, 'default', {
- enumerable: true,
- value
- });
-} : function(target, value) {
- target["default"] = value;
-});
-var __importStar = this && this.__importStar || function(mod) {
- if (mod && mod.__esModule) {
- return mod;
- }
- var result = {};
- if (mod != null) {
- for (var key in mod) {
- if (key !== 'default' && Object.prototype.hasOwnProperty.call(mod, key)) {
- __createBinding(result, mod, key);
- }
- }
- }
- __setModuleDefault(result, mod);
- return result;
-};
-Object.defineProperty(exports, '__esModule', {
- 'value': true
-});
-exports.CursorProViewProvider = undefined;
-const vscode = __importStar(require("vscode"));
-const client_1 = require("../api/client");
-const extension_1 = require("../extension");
-const account_1 = require('../utils/account');
-const path = __importStar(require("path"));
-const fs = __importStar(require('fs'));
-const child_process_1 = require('child_process');
-const util_1 = require("util");
-const sqlite_1 = require('../utils/sqlite');
-0x0;
-const execAsync = util_1.promisify(child_process_1.exec);
-class CursorProViewProvider {
- constructor(ref1, ref2) {
- this._extensionUri = ref1;
- this._context = ref2;
- this._hostsPermissionGranted = false;
- this.SNI_PROXY_IP = "154.36.154.163";
- this.CURSOR_DOMAINS = ["api2.cursor.sh", "api3.cursor.sh"];
- this.HOSTS_MARKER_START = "# ===== CursorPro SNI Proxy Start =====";
- this.HOSTS_MARKER_END = "# ===== CursorPro SNI Proxy End =====";
- this._cachedCursorPath = null;
- 0x0;
- this._onlineStatusUnsubscribe = client_1.onOnlineStatusChange(ref3 => {
- this._postMessage({
- 'type': "networkStatus",
- 'online': ref3
- });
- });
- }
- ["resolveWebviewView"](ref4, ref5, ref6) {
- this._view = ref4;
- ref4.webview.options = {
- 'enableScripts': true,
- 'localResourceRoots': [this._extensionUri]
- };
- ref4.webview.html = this._getHtmlContent(ref4.webview);
- ref4.webview.onDidReceiveMessage(async ref7 => {
- switch (ref7.type) {
- case "activate":
- await this._handleActivate(ref7.key);
- break;
- case 'switch':
- await this._handleSwitch();
- break;
- case "resetMachineId":
- await this._handleResetMachineId();
- break;
- case "disableUpdate":
- await this._handleDisableUpdate();
- break;
- case 'cleanEnv':
- await this._handleCleanEnv();
- break;
- case 'disable':
- await this._handleDisable();
- break;
- case 'toggleProxy':
- await this._handleToggleProxy(ref7.enabled, ref7.url);
- break;
- case 'getProxyStatus':
- await this._handleGetProxyStatus();
- break;
- case "getState":
- await this._sendState();
- break;
- case "retryConnect":
- await this._handleRetryConnect();
- break;
- case "getSeamlessStatus":
- await this._handleGetSeamlessStatus();
- break;
- case "injectSeamless":
- await this._handleInjectSeamless();
- break;
- case "restoreSeamless":
- await this._handleRestoreSeamless();
- break;
- case 'toggleSeamless':
- await this._handleToggleSeamless(ref7.enabled);
- break;
- case 'getUserSwitchStatus':
- await this._handleGetUserSwitchStatus();
- break;
- case "manualSeamlessSwitch":
- await this._handleManualSeamlessSwitch();
- break;
- case "checkUsageBeforeSwitch":
- await this._handleCheckUsageBeforeSwitch(ref7.email);
- break;
- case "confirmSwitch":
- await this._handleManualSeamlessSwitch();
- break;
- case "getCursorPath":
- await this._handleGetCursorPath();
- break;
- case 'getAccountUsage':
- await this._handleGetAccountUsage(ref7.email);
- break;
- case "getAnnouncement":
- await this._handleGetAnnouncement();
- break;
- case 'checkVersion':
- await this._handleCheckVersion();
- break;
- case "getCursorRunningPath":
- await this._handleGetCursorRunningPath();
- break;
- case "reloadWindow":
- vscode.commands.executeCommand("workbench.action.reloadWindow");
- break;
- case 'closeCursor':
- 0x0;
- await account_1.closeCursor();
- break;
- }
- });
- this._sendState();
- this._checkKeyStatus();
- }
- async ["_checkKeyStatus"]() {
- const ref8 = this._context.globalState.get("cursorpro.key");
- if (!ref8) {
- return;
- }
- try {
- 0x0;
- const ref9 = await client_1.verifyKey(ref8);
- if (ref9.success && ref9.valid) {
- await this._context.globalState.update('cursorpro.expireDate', ref9.expire_date);
- await this._context.globalState.update('cursorpro.switchRemaining', ref9.switch_remaining);
- await this._context.globalState.update("cursorpro.switchLimit", ref9.switch_limit);
- this._postMessage({
- 'type': "keyStatusChecked",
- 'valid': true,
- 'expireDate': ref9.expire_date,
- 'switchRemaining': ref9.switch_remaining,
- 'switchLimit': ref9.switch_limit
- });
- } else {
- this._postMessage({
- 'type': "keyStatusChecked",
- 'valid': false,
- 'expired': true,
- 'error': ref9.error || "激活码已过期或无效"
- });
- }
- } catch (ref10) {
- console.error("[CursorPro] 检查激活码状态失败:", ref10);
- }
- }
- async ["_handleActivate"](ref11) {
- try {
- const ref12 = await this._isSeamlessInjected();
- if (ref12) {
- this._postMessage({
- 'type': "activated",
- 'success': false,
- 'error': "无感换号已启用,请先禁用后再更换授权码"
- });
- return;
- }
- this._cleanProxySettings();
- 0x0;
- const ref13 = await client_1.verifyKey(ref11);
- if (ref13.success && ref13.valid) {
- console.log("[CursorPro] 激活成功,后端返回:", {
- 'expire_date': ref13.expire_date,
- 'switch_remaining': ref13.switch_remaining,
- 'switch_limit': ref13.switch_limit
- });
- await this._context.globalState.update("cursorpro.key", ref11);
- await this._context.globalState.update("cursorpro.expireDate", ref13.expire_date);
- await this._context.globalState.update("cursorpro.switchRemaining", ref13.switch_remaining);
- await this._context.globalState.update("cursorpro.switchLimit", ref13.switch_limit);
- this._postMessage({
- 'type': "activated",
- 'success': true,
- 'key': ref11,
- 'expireDate': ref13.expire_date,
- 'switchRemaining': ref13.switch_remaining,
- 'switchLimit': ref13.switch_limit
- });
- 0x0;
- extension_1.showStatusBar();
- await this._handleGetUserSwitchStatus();
- } else {
- this._postMessage({
- 'type': "activated",
- 'success': false,
- 'error': ref13.error || "授权码无效"
- });
- }
- } catch (ref14) {
- this._postMessage({
- 'type': "activated",
- 'success': false,
- 'error': "连接服务器失败"
- });
- }
- }
- async ["_handleSwitch"]() {
- const ref15 = this._context.globalState.get("cursorpro.key");
- if (!ref15) {
- this._postMessage({
- 'type': 'showToast',
- 'message': "请先激活授权码",
- 'icon': '⚠️'
- });
- return;
- }
- try {
- 0x0;
- const ref16 = await client_1.switchSeamlessToken(ref15);
- if (ref16.switched) {
- await this._context.globalState.update("cursorpro.switchRemaining", ref16.switchRemaining);
- this._postMessage({
- 'type': 'switched',
- 'success': true,
- 'email': ref16.email,
- 'switchRemaining': ref16.switchRemaining,
- 'switchLimit': this._context.globalState.get("cursorpro.switchLimit") || 0x64
- });
- const ref17 = ref16.switchRemaining ?? 0x0;
- this._postMessage({
- 'type': "userSwitchStatus",
- 'switchRemaining': ref17,
- 'canSwitch': ref17 > 0x0,
- 'lockedAccount': ref16.email ? {
- 'email': ref16.email
- } : null
- });
- } else {
- this._postMessage({
- 'type': 'switched',
- 'success': false,
- 'error': ref16.message || '换号失败'
- });
- }
- } catch (ref18) {
- this._postMessage({
- 'type': 'switched',
- 'success': false,
- 'error': "连接服务器失败"
- });
- }
- }
- async ["_writeAccountToLocal"](ref19) {
- try {
- const ref20 = process.env.APPDATA || '';
- const ref21 = path.join(ref20, "Cursor", 'User', "globalStorage", "state.vscdb");
- const ref22 = path.join(ref20, "Cursor", 'User', "globalStorage", 'storage.json');
- const ref23 = path.join(ref20, "Cursor", "machineid");
- if (fs.existsSync(ref21)) {
- const ref24 = [];
- if (ref19.accessToken) {
- ref24.push(["cursorAuth/accessToken", ref19.accessToken]);
- }
- if (ref19.refreshToken) {
- ref24.push(["cursorAuth/refreshToken", ref19.refreshToken]);
- }
- if (ref19.email) {
- ref24.push(["cursorAuth/cachedEmail", ref19.email]);
- }
- if (ref19.membership_type) {
- ref24.push(["cursorAuth/stripeMembershipType", ref19.membership_type]);
- }
- if (ref19.sign_up_type) {
- ref24.push(["cursorAuth/cachedSignUpType", ref19.sign_up_type]);
- }
- if (ref19.serviceMachineId) {
- ref24.push(["storage.serviceMachineId", ref19.serviceMachineId]);
- }
- 0x0;
- await sqlite_1.sqliteSetBatch(ref21, ref24);
- console.log("[CursorPro] SQLite 数据库已更新");
- }
- if (fs.existsSync(ref22)) {
- const ref25 = JSON.parse(fs.readFileSync(ref22, 'utf-8'));
- if (ref19.machineId) {
- ref25["telemetry.machineId"] = ref19.machineId;
- }
- if (ref19.macMachineId) {
- ref25['telemetry.macMachineId'] = ref19.macMachineId;
- }
- if (ref19.devDeviceId) {
- ref25["telemetry.devDeviceId"] = ref19.devDeviceId;
- }
- if (ref19.sqmId) {
- ref25["telemetry.sqmId"] = ref19.sqmId;
- }
- fs.writeFileSync(ref22, JSON.stringify(ref25, null, 0x4));
- console.log("[CursorPro] storage.json 已更新");
- }
- if (ref19.machineId) {
- fs.writeFileSync(ref23, ref19.machineId);
- console.log("[CursorPro] machineid 文件已更新");
- }
- if (ref19.registryGuid && process.platform === 'win32') {
- try {
- const ref26 = "reg add \"HKLM\\SOFTWARE\\Microsoft\\Cryptography\" /v MachineGuid /t REG_SZ /d \"" + ref19.registryGuid + "\" /f";
- await execAsync(ref26);
- console.log("[CursorPro] 注册表 MachineGuid 已更新");
- } catch (ref27) {
- console.warn("[CursorPro] 注册表写入失败(可能需要管理员权限):", ref27);
- }
- }
- return true;
- } catch (ref28) {
- console.error("[CursorPro] 写入本地失败:", ref28);
- vscode.window.showErrorMessage("写入失败: " + ref28);
- return false;
- }
- }
- async ["_handleReset"]() {
- await this._context.globalState.update("cursorpro.key", undefined);
- await this._context.globalState.update("cursorpro.expireDate", undefined);
- await this._context.globalState.update('cursorpro.switchRemaining', undefined);
- 0x0;
- extension_1.hideStatusBar();
- this._postMessage({
- 'type': 'reset',
- 'success': true
- });
- vscode.window.showInformationMessage("插件已重置");
- }
- async ['_handleDisable']() {
- await this._handleReset();
- vscode.window.showInformationMessage("插件已停用");
- }
- async ['_checkAdminPrivilege']() {
- if (process.platform !== "win32") {
- return true;
- }
- try {
- await execAsync("reg query \"HKLM\\SOFTWARE\\Microsoft\\Cryptography\" /v MachineGuid 2>nul");
- const ref29 = await execAsync("net session 2>nul")["catch"](() => ({
- 'stdout': '',
- 'stderr': 'error'
- }));
- return !ref29.stderr;
- } catch (ref30) {
- return false;
- }
- }
- async ["_handleResetMachineId"]() {
- try {
- const ref31 = process.platform;
- if (ref31 === 'win32') {
- const ref32 = await this._checkAdminPrivilege();
- if (!ref32) {
- this._postMessage({
- 'type': 'adminPermissionRequired'
- });
- return;
- }
- }
- 0x0;
- const ref33 = account_1.getCursorPaths();
- const {
- dbPath: ref34,
- storagePath: ref35,
- machineidPath: ref36
- } = ref33;
- const ref37 = require("crypto");
- const ref38 = ref37.randomBytes(0x20).toString("hex");
- const ref39 = ref37.randomBytes(0x20).toString("hex");
- const ref40 = ref37.randomUUID();
- const ref41 = '{' + ref37.randomUUID().toUpperCase() + '}';
- let ref42 = 0x0;
- let ref43 = [];
- if (fs.existsSync(ref35)) {
- let ref44 = 0x3;
- while (ref44 > 0x0) {
- try {
- const ref45 = JSON.parse(fs.readFileSync(ref35, "utf-8"));
- ref45["telemetry.machineId"] = ref38;
- ref45["telemetry.macMachineId"] = ref39;
- ref45["telemetry.devDeviceId"] = ref40;
- ref45["telemetry.sqmId"] = ref41;
- fs.writeFileSync(ref35, JSON.stringify(ref45, null, 0x4));
- console.log("[CursorPro] storage.json 已更新");
- ref42++;
- break;
- } catch (ref46) {
- ref44--;
- if (ref44 === 0x0) {
- console.warn("[CursorPro] storage.json 更新失败:", ref46.message);
- ref43.push("storage.json");
- } else {
- await new Promise(ref47 => setTimeout(ref47, 0x64));
- }
- }
- }
- } {
- let ref48 = 0x3;
- while (ref48 > 0x0) {
- try {
- const ref49 = path.dirname(ref36);
- if (!fs.existsSync(ref49)) {
- fs.mkdirSync(ref49, {
- 'recursive': true
- });
- }
- fs.writeFileSync(ref36, ref38);
- console.log("[CursorPro] machineid 文件已更新");
- ref42++;
- break;
- } catch (ref50) {
- ref48--;
- if (ref48 === 0x0) {
- console.warn("[CursorPro] machineid 更新失败:", ref50.message);
- ref43.push("machineid");
- } else {
- await new Promise(ref51 => setTimeout(ref51, 0x64));
- }
- }
- }
- }
- if (fs.existsSync(ref34)) {
- let ref52 = 0x3;
- while (ref52 > 0x0) {
- try {
- const ref53 = ref37.randomUUID();
- 0x0;
- const ref54 = await sqlite_1.sqliteSetBatch(ref34, [
- ['storage.serviceMachineId', ref53]
- ]);
- if (ref54) {
- console.log("[CursorPro] SQLite 数据库已更新");
- ref42++;
- break;
- } else {
- throw new Error("sqliteSetBatch 返回 false");
- }
- } catch (ref55) {
- ref52--;
- if (ref52 === 0x0) {
- console.warn("[CursorPro] SQLite 更新失败:", ref55.message);
- ref43.push("SQLite");
- } else {
- await new Promise(ref56 => setTimeout(ref56, 0x1f4));
- }
- }
- }
- }
- if (ref31 === "win32") {
- const ref57 = ref37.randomUUID();
- try {
- await execAsync("reg add \"HKLM\\SOFTWARE\\Microsoft\\Cryptography\" /v MachineGuid /t REG_SZ /d \"" + ref57 + "\" /f");
- console.log("[CursorPro] 注册表 MachineGuid 已更新");
- ref42++;
- } catch (ref58) {
- console.warn("[CursorPro] 注册表更新失败(需要管理员权限),已跳过");
- ref43.push("注册表");
- }
- }
- if (ref42 >= 0x2) {
- this._postMessage({
- 'type': 'machineIdReset',
- 'success': true,
- 'needRestart': true,
- 'message': ref43.length > 0x0 ? "机器码重置成功(" + ref43.join(", ") + " 更新失败,不影响使用)" : "机器码重置成功"
- });
- } else {
- this._postMessage({
- 'type': "showToast",
- 'message': "重置部分失败: " + ref43.join(", ") + "。请先完全关闭 Cursor 再试",
- 'icon': '⚠️'
- });
- }
- } catch (ref59) {
- this._postMessage({
- 'type': "showToast",
- 'message': "重置机器码失败: " + ref59,
- 'icon': '❌'
- });
- }
- }
- ['_generateRandomMAC']() {
- const ref60 = require('crypto');
- const ref61 = ref60.randomBytes(0x6);
- ref61[0x0] = (ref61[0x0] | 0x2) & 0xfe;
- return Array.from(ref61).map(ref62 => ref62.toString(0x10).padStart(0x2, '0')).join(':');
- }
- async ['_handleDisableUpdate']() {
- try {
- const ref63 = process.env.LOCALAPPDATA || '';
- const ref64 = path.join(ref63, "cursor-updater");
- if (fs.existsSync(ref64)) {
- if (fs.statSync(ref64).isDirectory()) {
- fs.rmSync(ref64, {
- 'recursive': true,
- 'force': true
- });
- } else {
- fs.unlinkSync(ref64);
- }
- }
- fs.writeFileSync(ref64, '');
- this._postMessage({
- 'type': 'showToast',
- 'message': "已禁用 Cursor 自动更新",
- 'icon': '✅'
- });
- } catch (ref65) {
- this._postMessage({
- 'type': 'showToast',
- 'message': "禁用自动更新失败: " + ref65,
- 'icon': '❌'
- });
- }
- }
- async ["_handleCleanEnv"]() {
- try {
- if (process.platform === "win32") {
- await execAsync("taskkill /F /IM Cursor.exe")["catch"](() => {});
- } else {
- await execAsync("pkill -f Cursor")['catch'](() => {});
- }
- await new Promise(ref66 => setTimeout(ref66, 0x7d0));
- const ref67 = process.env.APPDATA || '';
- const ref68 = process.env.LOCALAPPDATA || '';
- const ref69 = process.env.HOME || process.env.USERPROFILE || '';
- let ref70 = 0x0;
- if (process.platform === "win32") {
- const ref71 = [path.join(ref67, "Cursor"), path.join(ref68, "Cursor"), path.join(ref68, "cursor-updater"), path.join(ref69, ".cursor")];
- for (const ref72 of ref71) {
- try {
- if (fs.existsSync(ref72)) {
- fs.rmSync(ref72, {
- 'recursive': true,
- 'force': true
- });
- ref70++;
- console.log("[CursorPro] 已清理: " + ref72);
- }
- } catch (ref73) {
- console.warn("[CursorPro] 清理失败: " + ref72, ref73);
- }
- }
- } else {
- if (process.platform === "darwin") {
- const ref74 = [path.join(ref69, "Library", "Application Support", "Cursor"), path.join(ref69, "Library", 'Caches', "Cursor"), path.join(ref69, "Library", "Logs", "Cursor"), path.join(ref69, 'Library', "Application Support", 'Caches', "cursor-updater"), path.join(ref69, ".cursor")];
- for (const ref75 of ref74) {
- try {
- if (fs.existsSync(ref75)) {
- fs.rmSync(ref75, {
- 'recursive': true,
- 'force': true
- });
- ref70++;
- }
- } catch (ref76) {
- console.warn("[CursorPro] 清理失败: " + ref75, ref76);
- }
- }
- } else {
- const ref77 = [path.join(ref69, ".config", "Cursor"), path.join(ref69, '.cache', "Cursor"), path.join(ref69, ".local", "share", "Cursor"), path.join(ref69, ".cursor")];
- for (const ref78 of ref77) {
- try {
- if (fs.existsSync(ref78)) {
- fs.rmSync(ref78, {
- 'recursive': true,
- 'force': true
- });
- ref70++;
- }
- } catch (ref79) {
- console.warn("[CursorPro] 清理失败: " + ref78, ref79);
- }
- }
- }
- }
- vscode.window.showInformationMessage("✅ Cursor 环境清理完成!已清理 " + ref70 + " 个目录。请重新启动 Cursor。");
- } catch (ref80) {
- vscode.window.showErrorMessage("清理失败: " + ref80);
- }
- }
- ['_cleanProxySettings']() {
- try {
- const ref81 = process.platform;
- const ref82 = process.env.HOME || process.env.USERPROFILE || '';
- let ref83;
- if (ref81 === "win32") {
- const ref84 = process.env.APPDATA || '';
- ref83 = path.join(ref84, "Cursor", 'User', "settings.json");
- } else {
- if (ref81 === "darwin") {
- ref83 = path.join(ref82, 'Library', "Application Support", "Cursor", 'User', "settings.json");
- } else {
- ref83 = path.join(ref82, ".config", "Cursor", 'User', "settings.json");
- }
- }
- if (!fs.existsSync(ref83)) {
- return;
- }
- const ref85 = fs.readFileSync(ref83, 'utf-8');
- let ref86;
- try {
- ref86 = JSON.parse(ref85);
- } catch {
- return;
- }
- const ref87 = ["http.proxy", "http.proxyStrictSSL", "http.proxySupport", "cursor.general.disableHttp2", "http.noProxy"];
- let ref88 = false;
- for (const ref89 of ref87) {
- if (ref89 in ref86) {
- ref88 = true;
- delete ref86[ref89];
- }
- }
- if (ref88) {
- fs.writeFileSync(ref83, JSON.stringify(ref86, null, 0x4), "utf-8");
- console.log("[CursorPro] 已清理 settings.json 中的旧代理配置");
- }
- } catch (ref90) {
- console.warn("[CursorPro] 清理 settings.json 代理配置失败:", ref90);
- }
- }
- ["_getHostsPath"]() {
- return process.platform === "win32" ? "C:\\Windows\\System32\\drivers\\etc\\hosts" : '/etc/hosts';
- }
- ['_readHostsFile']() {
- try {
- const ref91 = this._getHostsPath();
- if (fs.existsSync(ref91)) {
- return fs.readFileSync(ref91, 'utf-8');
- }
- } catch (ref92) {
- console.error("[CursorPro] Read hosts error:", ref92);
- }
- return '';
- }
- ["_hasHostsConfig"]() {
- const ref93 = this._readHostsFile();
- return ref93.includes(this.HOSTS_MARKER_START);
- }
- async ['_grantHostsWritePermission']() {
- if (process.platform !== "win32") {
- return false;
- }
- try {
- const ref94 = this._getHostsPath();
- const ref95 = process.env.USERNAME || '';
- if (!ref95) {
- return false;
- }
- const ref96 = ref94.replace(/\\/g, "\\\\");
- const ref97 = "powershell -WindowStyle Hidden -Command \"Start-Process powershell -ArgumentList '-WindowStyle Hidden -Command icacls \\\"" + ref96 + "\\\" /grant " + ref95 + ":M' -Verb RunAs -Wait\"";
- await execAsync(ref97);
- this._hostsPermissionGranted = true;
- console.log("[CursorPro] Hosts file permission granted to user:", ref95);
- return true;
- } catch (ref98) {
- console.error("[CursorPro] Grant hosts permission error:", ref98);
- return false;
- }
- }
- async ["_writeHostsFile"](ref99) {
- const ref100 = this._getHostsPath();
- try {
- if (process.platform === "win32") {
- let ref101 = false;
- try {
- fs.writeFileSync(ref100, ref99, 'utf-8');
- ref101 = true;
- } catch (ref102) {
- console.log("[CursorPro] Direct write failed, trying to grant permission");
- }
- if (!ref101) {
- if (!this._hostsPermissionGranted) {
- const ref103 = await this._grantHostsWritePermission();
- if (ref103) {
- try {
- fs.writeFileSync(ref100, ref99, 'utf-8');
- ref101 = true;
- } catch (ref104) {
- console.log("[CursorPro] Write still failed after permission grant");
- }
- }
- }
- }
- if (!ref101) {
- const ref105 = path.join(process.env.TEMP || '', "cursorpro_hosts_temp.txt");
- fs.writeFileSync(ref105, ref99, 'utf-8');
- const ref106 = ref105.replace(/\\/g, "\\\\");
- const ref107 = ref100.replace(/\\/g, "\\\\");
- const ref108 = "powershell -WindowStyle Hidden -Command \"Start-Process powershell -ArgumentList '-WindowStyle Hidden -Command Copy-Item -Path \\\"" + ref106 + "\\\" -Destination \\\"" + ref107 + "\\\" -Force' -Verb RunAs -Wait\"";
- await execAsync(ref108);
- try {
- fs.unlinkSync(ref105);
- } catch {}
- }
- try {
- await execAsync("ipconfig /flushdns");
- console.log("[CursorPro] Windows DNS 缓存已刷新");
- } catch (ref109) {
- console.warn("[CursorPro] Windows DNS 刷新失败:", ref109);
- }
- } else {
- if (process.platform === "darwin") {
- fs.writeFileSync("/tmp/hosts_cursor_temp", ref99, 'utf-8');
- const ref110 = "do shell script \"cp '/tmp/hosts_cursor_temp' '" + ref100 + "' && rm '" + "/tmp/hosts_cursor_temp" + "' && dscacheutil -flushcache && killall -HUP mDNSResponder\" with administrator privileges";
- await execAsync("osascript -e \"" + ref110.replace(/"/g, "\\\"") + "\"");
- } else {
- fs.writeFileSync(ref100, ref99, 'utf-8');
- }
- }
- return true;
- } catch (ref111) {
- console.error("[CursorPro] Write hosts error:", ref111);
- return false;
- }
- }
- async ["_handleToggleProxy"](ref112, ref113) {
- try {
- if (ref112) {
- const ref114 = this._context.globalState.get("cursorpro.key");
- const ref115 = this._context.globalState.get('cursorpro.expireDate');
- if (!ref114) {
- this._postMessage({
- 'type': "proxyUpdated",
- 'success': false,
- 'error': '请先激活授权码'
- });
- this._postMessage({
- 'type': 'showToast',
- 'message': '请先激活授权码',
- 'icon': '⚠️'
- });
- return;
- }
- if (ref115) {
- const ref116 = new Date(ref115).getTime();
- if (Date.now() > ref116) {
- this._postMessage({
- 'type': "proxyUpdated",
- 'success': false,
- 'error': "授权码已过期,无法开启免魔法"
- });
- this._postMessage({
- 'type': 'showToast',
- 'message': "授权码已过期,无法开启免魔法",
- 'icon': '⚠️'
- });
- return;
- }
- }
- }
- this._cleanProxySettings();
- let ref117 = this._readHostsFile();
- const ref118 = ref117.indexOf(this.HOSTS_MARKER_START);
- const ref119 = ref117.indexOf(this.HOSTS_MARKER_END);
- if (ref118 !== -0x1 && ref119 !== -0x1) {
- ref117 = ref117.substring(0x0, ref118) + ref117.substring(ref119 + this.HOSTS_MARKER_END.length);
- }
- ref117 = ref117.replace(/\n{3,}/g, "\n\n").trim();
- if (ref112) {
- const ref120 = this.CURSOR_DOMAINS.map(ref121 => this.SNI_PROXY_IP + " " + ref121).join("\n");
- const ref122 = "\n\n" + this.HOSTS_MARKER_START + "\n" + ref120 + "\n" + this.HOSTS_MARKER_END + "\n";
- ref117 += ref122;
- }
- const ref123 = await this._writeHostsFile(ref117);
- if (ref123) {
- 0x0;
- await client_1.updateProxyConfig(ref112, this.SNI_PROXY_IP);
- this._postMessage({
- 'type': "proxyUpdated",
- 'success': true,
- 'enabled': ref112,
- 'url': this.SNI_PROXY_IP
- });
- this._postMessage({
- 'type': 'showToast',
- 'message': ref112 ? "免魔法已开启" : "免魔法已关闭",
- 'icon': '✅'
- });
- } else {
- this._postMessage({
- 'type': "proxyUpdated",
- 'success': false,
- 'error': "修改 hosts 文件失败,请确保有管理员权限"
- });
- this._postMessage({
- 'type': "showToast",
- 'message': "需要管理员权限修改 hosts 文件",
- 'icon': '⚠️'
- });
- }
- } catch (ref124) {
- console.error("[CursorPro] Toggle proxy error:", ref124);
- this._postMessage({
- 'type': "proxyUpdated",
- 'success': false,
- 'error': '更新配置失败'
- });
- }
- }
- async ["_handleGetProxyStatus"]() {
- try {
- const ref125 = this._hasHostsConfig();
- this._postMessage({
- 'type': "proxyStatus",
- 'enabled': ref125,
- 'url': ref125 ? this.SNI_PROXY_IP : ''
- });
- } catch (ref126) {
- console.error("[CursorPro] Get proxy status error:", ref126);
- this._postMessage({
- 'type': "proxyStatus",
- 'enabled': false,
- 'url': ''
- });
- }
- }
- async ["_handleGetSeamlessStatus"]() {
- try {
- const ref127 = await this._getWorkbenchPathAsync();
- let ref128 = false;
- if (ref127 && fs.existsSync(ref127)) {
- const ref129 = fs.readFileSync(ref127, 'utf-8');
- ref128 = this._checkInjected(ref129);
- }
- this._postMessage({
- 'type': 'seamlessStatus',
- 'is_injected': ref128,
- 'workbench_path': ref127 || '未找到'
- });
- } catch (ref130) {
- this._postMessage({
- 'type': "seamlessStatus",
- 'is_injected': false,
- 'error': "检测状态失败"
- });
- }
- }
- async ['_getCursorInstallPath']() {
- if (this._cachedCursorPath) {
- return this._cachedCursorPath;
- }
- const ref131 = vscode.workspace.getConfiguration("cursorpro");
- const ref132 = ref131.get("cursorPath");
- if (ref132 && fs.existsSync(ref132)) {
- console.log("[CursorPro] 使用用户配置的 Cursor 路径:", ref132);
- this._cachedCursorPath = ref132;
- return ref132;
- }
- const ref133 = process.platform;
- let ref134 = null;
- try {
- if (ref133 === "win32") {
- try {
- const {
- stdout: ref135
- } = await execAsync("wmic process where \"name='Cursor.exe'\" get ExecutablePath /format:list 2>nul");
- if (ref135) {
- const ref136 = ref135.match(/ExecutablePath=(.+)/);
- if (ref136 && ref136[0x1]) {
- const ref137 = ref136[0x1].trim();
- ref134 = path.dirname(ref137);
- }
- }
- } catch (ref138) {
- console.log("[CursorPro] WMIC 获取路径失败");
- }
- if (!ref134) {
- try {
- const {
- stdout: ref139
- } = await execAsync("powershell -Command \"Get-Process Cursor -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty Path\"");
- if (ref139 && ref139.trim()) {
- ref134 = path.dirname(ref139.trim());
- }
- } catch (ref140) {
- console.log("[CursorPro] PowerShell Get-Process 获取路径失败");
- }
- }
- if (!ref134) {
- try {
- const {
- stdout: ref141
- } = await execAsync("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\" /s /f \"Cursor\" 2>nul | findstr \"InstallLocation\"");
- if (ref141 && ref141.trim()) {
- const ref142 = ref141.match(/InstallLocation\s+REG_SZ\s+(.+)/);
- if (ref142 && ref142[0x1] && fs.existsSync(ref142[0x1].trim())) {
- ref134 = ref142[0x1].trim();
- }
- }
- } catch (ref143) {
- console.log("[CursorPro] 注册表方法1获取路径失败");
- }
- }
- if (!ref134) {
- try {
- const {
- stdout: ref144
- } = await execAsync("reg query \"HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\" /s /f \"Cursor\" 2>nul | findstr \"InstallLocation\"");
- if (ref144 && ref144.trim()) {
- const ref145 = ref144.match(/InstallLocation\s+REG_SZ\s+(.+)/);
- if (ref145 && ref145[0x1] && fs.existsSync(ref145[0x1].trim())) {
- ref134 = ref145[0x1].trim();
- }
- }
- } catch (ref146) {
- console.log("[CursorPro] 注册表方法2获取路径失败");
- }
- }
- if (!ref134) {
- try {
- const ref147 = path.join(process.env.APPDATA || '', 'Microsoft', "Windows", "Start Menu", 'Programs', 'Cursor.lnk');
- const ref148 = path.join("C:\\ProgramData", 'Microsoft', 'Windows', "Start Menu", "Programs", 'Cursor.lnk');
- for (const ref149 of [ref147, ref148]) {
- if (fs.existsSync(ref149)) {
- const {
- stdout: ref150
- } = await execAsync("powershell -Command \"(New-Object -ComObject WScript.Shell).CreateShortcut('" + ref149.replace(/'/g, "''") + "').TargetPath\"");
- if (ref150 && ref150.trim() && fs.existsSync(ref150.trim())) {
- ref134 = path.dirname(ref150.trim());
- break;
- }
- }
- }
- } catch (ref151) {
- console.log("[CursorPro] 快捷方式解析获取路径失败");
- }
- }
- if (!ref134) {
- try {
- const {
- stdout: ref152
- } = await execAsync("where cursor 2>nul");
- if (ref152 && ref152.trim()) {
- const ref153 = ref152.trim().split("\n");
- for (const ref154 of ref153) {
- const ref155 = ref154.trim();
- if (ref155 && fs.existsSync(ref155)) {
- ref134 = path.dirname(ref155);
- break;
- }
- }
- }
- } catch (ref156) {
- console.log("[CursorPro] where 命令获取路径失败");
- }
- }
- if (!ref134) {
- const ref157 = process.env.LOCALAPPDATA || '';
- const ref158 = process.env.USERPROFILE || '';
- const ref159 = process.env.ProgramFiles || "C:\\Program Files";
- const ref160 = process.env["ProgramFiles(x86)"] || "C:\\Program Files (x86)";
- const ref161 = [path.join(ref157, "Programs", "Cursor"), path.join(ref157, "Programs", 'cursor'), path.join(ref158, "AppData", "Local", "Programs", "Cursor"), path.join(ref159, "Cursor"), path.join(ref160, "Cursor"), path.join(ref157, "Cursor"), path.join(ref157, 'cursor')];
- for (const ref162 of ref161) {
- if (ref162 && fs.existsSync(ref162)) {
- ref134 = ref162;
- break;
- }
- }
- }
- } else {
- if (ref133 === 'darwin') {
- try {
- const {
- stdout: ref163
- } = await execAsync("lsof -c Cursor 2>/dev/null | grep \"txt\" | grep -i \"Cursor.app\" | head -1 | awk '{print $9}'");
- if (ref163 && ref163.trim()) {
- const ref164 = ref163.trim().match(/(.+\.app)/);
- if (ref164) {
- ref134 = ref164[0x1];
- }
- }
- } catch (ref165) {}
- if (!ref134) {
- try {
- const {
- stdout: ref166
- } = await execAsync("ps -eo comm,args | grep -i \"[C]ursor\" | grep -v \"grep\" | head -1");
- if (ref166 && ref166.trim()) {
- const ref167 = ref166.match(/(\/.+\.app)/);
- if (ref167) {
- ref134 = ref167[0x1];
- }
- }
- } catch (ref168) {
- console.warn("[CursorPro] macOS 获取进程路径失败:", ref168);
- }
- }
- if (!ref134) {
- try {
- const {
- stdout: ref169
- } = await execAsync("mdfind \"kMDItemCFBundleIdentifier == 'com.todesktop.*cursor*'\" 2>/dev/null | head -1");
- if (ref169 && ref169.trim() && fs.existsSync(ref169.trim())) {
- ref134 = ref169.trim();
- }
- } catch (ref170) {}
- }
- if (!ref134 && fs.existsSync('/Applications/Cursor.app')) {
- ref134 = '/Applications/Cursor.app';
- }
- } else {
- try {
- const {
- stdout: ref171
- } = await execAsync("pgrep -f \"[c]ursor\" | head -1");
- const ref172 = ref171 && ref171.trim();
- if (ref172) {
- const {
- stdout: ref173
- } = await execAsync("readlink -f /proc/" + ref172 + "/exe 2>/dev/null");
- if (ref173 && ref173.trim()) {
- const ref174 = ref173.trim();
- ref134 = path.dirname(ref174);
- if (ref134.endsWith('/bin')) {
- ref134 = path.dirname(ref134);
- }
- }
- }
- } catch (ref175) {}
- if (!ref134) {
- try {
- const {
- stdout: ref176
- } = await execAsync("which cursor 2>/dev/null");
- if (ref176 && ref176.trim()) {
- const ref177 = await execAsync("readlink -f \"" + ref176.trim() + "\" 2>/dev/null");
- if (ref177.stdout && ref177.stdout.trim()) {
- ref134 = path.dirname(ref177.stdout.trim());
- if (ref134.endsWith('/bin')) {
- ref134 = path.dirname(ref134);
- }
- }
- }
- } catch (ref178) {
- console.warn("[CursorPro] Linux 获取进程路径失败:", ref178);
- }
- }
- if (!ref134) {
- const ref179 = ["/opt/Cursor", '/opt/cursor', "/usr/share/cursor", "/usr/lib/cursor", path.join(process.env.HOME || '', ".local/share/cursor"), path.join(process.env.HOME || '', "Applications/cursor")];
- for (const ref180 of ref179) {
- if (fs.existsSync(ref180)) {
- ref134 = ref180;
- break;
- }
- }
- }
- }
- }
- } catch (ref181) {
- console.error("[CursorPro] 获取 Cursor 安装路径失败:", ref181);
- }
- if (ref134) {
- this._cachedCursorPath = ref134;
- }
- return ref134;
- }
- ['_getWorkbenchPath']() {
- return this._getWorkbenchPathSync();
- }
- ['_getWorkbenchPathSync']() {
- const ref182 = process.platform;
- if (this._cachedCursorPath) {
- let ref183;
- if (ref182 === "darwin") {
- ref183 = path.join(this._cachedCursorPath, 'Contents', "Resources", "app", "out", 'vs', "workbench", "workbench.desktop.main.js");
- } else {
- ref183 = path.join(this._cachedCursorPath, "resources", "app", "out", 'vs', "workbench", "workbench.desktop.main.js");
- }
- if (fs.existsSync(ref183)) {
- return ref183;
- }
- }
- if (ref182 === 'win32') {
- return null;
- }
- let ref184 = [];
- if (ref182 === "darwin") {
- ref184 = ["/Applications/Cursor.app/Contents/Resources/app/out/vs/workbench/workbench.desktop.main.js"];
- } else {
- ref184 = ["/opt/Cursor/resources/app/out/vs/workbench/workbench.desktop.main.js", '/usr/share/cursor/resources/app/out/vs/workbench/workbench.desktop.main.js'];
- }
- for (const ref185 of ref184) {
- if (fs.existsSync(ref185)) {
- return ref185;
- }
- }
- return null;
- }
- async ["_getWorkbenchPathAsync"]() {
- const ref186 = process.platform;
- const ref187 = await this._getCursorInstallPath();
- if (ref187) {
- let ref188;
- if (ref186 === "darwin") {
- ref188 = path.join(ref187, "Contents", "Resources", "app", "out", 'vs', "workbench", "workbench.desktop.main.js");
- } else {
- ref188 = path.join(ref187, "resources", "app", "out", 'vs', "workbench", "workbench.desktop.main.js");
- }
- if (fs.existsSync(ref188)) {
- return ref188;
- }
- }
- return this._getWorkbenchPathSync();
- }
- ["_checkInjected"](ref189) {
- return ref189.includes("/*i0*/") || ref189.includes('/*i1s*/');
- }
- async ["_isSeamlessInjected"]() {
- try {
- const ref190 = await this._getWorkbenchPathAsync();
- if (ref190 && fs.existsSync(ref190)) {
- const ref191 = fs.readFileSync(ref190, "utf-8");
- return this._checkInjected(ref191);
- }
- return false;
- } catch (ref192) {
- console.error("[CursorPro] 检测无感换号状态失败:", ref192);
- return false;
- }
- }
- ['_getInjectionConfig'](ref193, ref194) {
- return [{
- 'name': "注入点0: 完整性检查绕过",
- 'scode': '_showNotification(){',
- 'replacement': "_showNotification(){/*i0*/}_showNotificationOld(){",
- 'restore': {
- 'find': "_showNotification(){/*i0*/}_showNotificationOld(){",
- 'replace_with': '_showNotification(){'
- }
- }, {
- 'name': "注入点1: 核心模块初始化",
- 'scode': "this.database.getItems()))",
- 'replacement': "this.database.getItems()))/*i1s*/;await(async function(e){if(e.get('releaseNotes/lastVersion')){window.store=e;window.__cpKey='CursorPro2024!@#';window.__cpEnc=function(t){var k=window.__cpKey,r='';for(var i=0;i
0x0) {
- console.warn("[CursorPro] 未找到的注入点:", ref205);
- }
- try {
- fs.writeFileSync(ref197, ref201, "utf-8");
- } catch (ref209) {
- console.error("[CursorPro] 写入文件失败:", ref209);
- if (ref209.code === "EPERM" || ref209.code === 'EACCES' || ref209.code === "EROFS") {
- const ref210 = process.platform;
- let ref211 = "没有写入权限";
- if (ref210 === "darwin") {
- ref211 = "没有写入权限,请在终端执行: sudo chmod -R 777 /Applications/Cursor.app";
- } else if (ref210 === "linux") {
- ref211 = "没有写入权限,请使用 sudo 权限运行或修改文件权限";
- }
- this._postMessage({
- 'type': "seamlessInjected",
- 'success': false,
- 'error': ref211,
- 'needAdmin': true,
- 'path': ref197
- });
- return;
- }
- throw ref209;
- }
- await this._context.globalState.update("cursorpro.seamlessInjected", true);
- this._postMessage({
- 'type': 'seamlessInjected',
- 'success': true,
- 'applied': ref204,
- 'needRestart': true,
- 'message': "无感换号已启用"
- });
- } catch (ref212) {
- console.error("[CursorPro] Inject error:", ref212);
- if (ref212.code === "EPERM" || ref212.code === 'EACCES') {
- this._postMessage({
- 'type': "seamlessInjected",
- 'success': false,
- 'error': "没有写入权限",
- 'needAdmin': true
- });
- return;
- }
- this._postMessage({
- 'type': "seamlessInjected",
- 'success': false,
- 'error': ref212.message || '注入失败'
- });
- }
- }
- async ["_handleRestoreSeamless"]() {
- try {
- const ref213 = await this._getWorkbenchPathAsync();
- if (!ref213) {
- this._postMessage({
- 'type': "seamlessRestored",
- 'success': false,
- 'error': '未找到Cursor安装目录'
- });
- return;
- }
- let ref214 = fs.readFileSync(ref213, "utf-8");
- if (!this._checkInjected(ref214)) {
- return;
- }
- ref214 = ref214.replace("_showNotification(){/*i0*/}_showNotificationOld(){", "_showNotification(){");
- const ref215 = ref214.indexOf("/*i1s*/");
- const ref216 = ref214.indexOf("/*i1e*/");
- if (ref215 !== -0x1 && ref216 !== -0x1) {
- ref214 = ref214.substring(0x0, ref215) + ref214.substring(ref216 + 0x7);
- }
- const ref217 = ref214.indexOf('/*i2s*/');
- const ref218 = ref214.indexOf("/*i2e*/");
- if (ref217 !== -0x1 && ref218 !== -0x1) {
- ref214 = ref214.substring(0x0, ref217) + ref214.substring(ref218 + 0x7);
- }
- try {
- fs.writeFileSync(ref213, ref214, "utf-8");
- } catch (ref219) {
- if (ref219.code === "EPERM" || ref219.code === "EACCES") {
- this._postMessage({
- 'type': "seamlessRestored",
- 'success': false,
- 'error': "没有写入权限",
- 'needAdmin': true
- });
- return;
- }
- throw ref219;
- }
- this._postMessage({
- 'type': "seamlessRestored",
- 'success': true,
- 'needRestart': true,
- 'message': "无感换号已禁用"
- });
- } catch (ref220) {
- console.error("[CursorPro] Restore error:", ref220);
- if (ref220.code === "EPERM" || ref220.code === "EACCES") {
- this._postMessage({
- 'type': "seamlessRestored",
- 'success': false,
- 'error': "没有写入权限",
- 'needAdmin': true
- });
- return;
- }
- this._postMessage({
- 'type': "seamlessRestored",
- 'success': false,
- 'error': ref220.message || '还原失败'
- });
- }
- }
- async ["_handleToggleSeamless"](ref221) {
- try {
- 0x0;
- await client_1.updateSeamlessConfig({
- 'enabled': ref221
- });
- this._postMessage({
- 'type': "seamlessConfigUpdated",
- 'success': true,
- 'enabled': ref221
- });
- } catch (ref222) {
- this._postMessage({
- 'type': "seamlessConfigUpdated",
- 'success': false,
- 'error': "更新配置失败"
- });
- }
- }
- async ['_handleGetUserSwitchStatus']() {
- try {
- const ref223 = this._context.globalState.get('cursorpro.key');
- if (!ref223) {
- this._postMessage({
- 'type': 'userSwitchStatus',
- 'valid': false,
- 'switchRemaining': 0x0,
- 'canSwitch': false,
- 'error': "未激活授权码"
- });
- return;
- }
- 0x0;
- const ref224 = await client_1.getUserSwitchStatus(ref223);
- let ref225 = false;
- try {
- 0x0;
- const ref226 = await client_1.getSeamlessStatus();
- ref225 = ref226.is_injected || false;
- } catch (ref227) {}
- this._postMessage({
- 'type': 'userSwitchStatus',
- ...ref224,
- 'seamlessEnabled': ref225
- });
- } catch (ref228) {
- this._postMessage({
- 'type': "userSwitchStatus",
- 'valid': false,
- 'switchRemaining': 0x0,
- 'canSwitch': false,
- 'error': "获取状态失败"
- });
- }
- }
- async ["_handleGetAccountUsage"](ref229) {
- try {
- if (!ref229) {
- this._postMessage({
- 'type': "accountUsage",
- 'success': false,
- 'error': "未提供账号邮箱"
- });
- return;
- }
- 0x0;
- const ref230 = client_1.getApiUrl() + "/api/cursor-accounts/query?email=" + encodeURIComponent(ref229) + '&refresh=true';
- const ref231 = await fetch(ref230);
- const ref232 = await ref231.json();
- if (ref232.success && ref232.data) {
- this._postMessage({
- 'type': "accountUsage",
- 'success': true,
- 'data': ref232.data
- });
- const ref233 = ref232.data.usage || {};
- const ref234 = ref233.totalUsageCount || 0x0;
- const ref235 = parseFloat(ref233.totalCostUSD || 0x0);
- 0x0;
- extension_1.updateUsageStatusBar(ref234, ref235);
- } else {
- this._postMessage({
- 'type': "accountUsage",
- 'success': false,
- 'error': ref232.error || "获取用量失败"
- });
- }
- } catch (ref236) {
- this._postMessage({
- 'type': "accountUsage",
- 'success': false,
- 'error': ref236.message || "请求失败"
- });
- }
- }
- async ["_handleGetAnnouncement"]() {
- try {
- 0x0;
- const ref237 = client_1.getApiUrl() + "/api/announcements/latest";
- const ref238 = await fetch(ref237);
- const ref239 = await ref238.json();
- if (ref239.success && ref239.data) {
- this._postMessage({
- 'type': 'announcement',
- 'success': true,
- 'data': ref239.data
- });
- } else {
- this._postMessage({
- 'type': "announcement",
- 'success': false,
- 'error': ref239.error || "获取公告失败"
- });
- }
- } catch (ref240) {
- this._postMessage({
- 'type': 'announcement',
- 'success': false,
- 'error': ref240.message || "请求失败"
- });
- }
- }
- async ["_handleCheckVersion"]() {
- try {
- 0x0;
- const ref241 = await client_1.getLatestVersion();
- if (ref241.success && ref241.version) {
- const ref242 = ref241.version;
- const ref243 = CursorProViewProvider.CURRENT_VERSION;
- const ref244 = this._compareVersions(ref242, ref243) > 0x0;
- this._postMessage({
- 'type': "versionCheck",
- 'success': true,
- 'currentVersion': ref243,
- 'latestVersion': ref242,
- 'hasUpdate': ref244
- });
- } else {
- this._postMessage({
- 'type': "versionCheck",
- 'success': false,
- 'currentVersion': CursorProViewProvider.CURRENT_VERSION,
- 'error': ref241.error || "获取版本失败"
- });
- }
- } catch (ref245) {
- this._postMessage({
- 'type': "versionCheck",
- 'success': false,
- 'currentVersion': CursorProViewProvider.CURRENT_VERSION,
- 'error': ref245.message || "请求失败"
- });
- }
- }
- ["_compareVersions"](ref246, ref247) {
- const ref248 = ref246.split('.').map(Number);
- const ref249 = ref247.split('.').map(Number);
- const ref250 = Math.max(ref248.length, ref249.length);
- for (let ref251 = 0x0; ref251 < ref250; ref251++) {
- const ref252 = ref248[ref251] || 0x0;
- const ref253 = ref249[ref251] || 0x0;
- if (ref252 > ref253) {
- return 0x1;
- }
- if (ref252 < ref253) {
- return -0x1;
- }
- }
- return 0x0;
- }
- async ["_handleGetCursorRunningPath"]() {
- try {
- const ref254 = process.platform;
- let ref255 = "未找到";
- let ref256 = '';
- const ref257 = vscode.workspace.getConfiguration('cursorpro');
- const ref258 = ref257.get('cursorPath');
- if (ref258 && fs.existsSync(ref258)) {
- ref255 = ref258;
- if (ref254 === "darwin") {
- ref256 = path.join(ref258, 'Contents', "Resources", "app", "package.json");
- } else {
- ref256 = path.join(ref258, "resources", "app", "package.json");
- }
- console.log("[CursorPro] 使用用户配置的路径:", ref258);
- } else {
- if (ref254 === "win32") {
- try {
- const {
- stdout: ref259
- } = await execAsync("wmic process where \"name='Cursor.exe'\" get ExecutablePath /format:list 2>nul");
- const ref260 = ref259.match(/ExecutablePath=(.+)/);
- if (ref260 && ref260[0x1]) {
- const ref261 = ref260[0x1].trim();
- ref255 = path.dirname(ref261);
- ref256 = path.join(ref255, "resources", "app", "package.json");
- }
- } catch (ref262) {
- console.log("[CursorPro] WMIC 获取路径失败:", ref262);
- }
- if (ref255 === "未找到") {
- const ref263 = process.env.LOCALAPPDATA || '';
- const ref264 = [path.join(ref263, 'Programs', 'cursor'), path.join(ref263, "cursor")];
- for (const ref265 of ref264) {
- const ref266 = path.join(ref265, "resources", "app", "package.json");
- if (fs.existsSync(ref266)) {
- ref255 = ref265;
- ref256 = ref266;
- break;
- }
- }
- }
- } else {
- if (ref254 === "darwin") {
- ref255 = (await this._getCursorInstallPath()) || "/Applications/Cursor.app";
- ref256 = path.join(ref255, 'Contents', "Resources", 'app', "package.json");
- } else {
- const ref267 = process.env.HOME || '';
- const ref268 = ["/usr/share/cursor", path.join(ref267, ".local", "share", "cursor")];
- for (const ref269 of ref268) {
- if (fs.existsSync(ref269)) {
- ref255 = ref269;
- ref256 = path.join(ref269, "resources", 'app', "package.json");
- break;
- }
- }
- }
- }
- }
- const ref270 = ref256 && fs.existsSync(ref256);
- let ref271 = '';
- if (ref270) {
- try {
- const ref272 = fs.readFileSync(ref256, 'utf-8');
- const ref273 = JSON.parse(ref272);
- ref271 = ref273.version || '';
- console.log("[CursorPro] 从路径获取 Cursor 版本:", ref271);
- } catch (ref274) {
- console.log("[CursorPro] 读取 package.json 失败:", ref274);
- }
- }
- this._postMessage({
- 'type': 'cursorRunningPath',
- 'path': ref255,
- 'packageJsonPath': ref256,
- 'packageExists': ref270,
- 'cursorVersion': ref271
- });
- } catch (ref275) {
- this._postMessage({
- 'type': 'cursorRunningPath',
- 'path': "获取失败: " + (ref275.message || ref275),
- 'packageJsonPath': '',
- 'packageExists': false,
- 'cursorVersion': ''
- });
- }
- }
- async ["_handleCheckUsageBeforeSwitch"](ref276) {
- try {
- const ref277 = this._context.globalState.get("cursorpro.key");
- if (!ref277) {
- this._postMessage({
- 'type': 'usageCheckResult',
- 'success': false,
- 'error': "未激活授权码"
- });
- return;
- }
- if (!ref276) {
- this._postMessage({
- 'type': "usageCheckResult",
- 'success': true,
- 'needConfirm': false
- });
- return;
- }
- 0x0;
- const ref278 = client_1.getApiUrl() + '/api/cursor-accounts/query?email=' + encodeURIComponent(ref276) + "&refresh=false";
- const ref279 = await fetch(ref278);
- const ref280 = await ref279.json();
- if (ref280.success && ref280.data) {
- const ref281 = ref280.data.usage || {};
- const ref282 = parseFloat(ref281.totalCostUSD || 0x0);
- if (ref282 < 0xa) {
- this._postMessage({
- 'type': 'usageCheckResult',
- 'success': true,
- 'needConfirm': true,
- 'costUSD': ref282.toFixed(0x2),
- 'email': ref276
- });
- } else {
- this._postMessage({
- 'type': 'usageCheckResult',
- 'success': true,
- 'needConfirm': false
- });
- }
- } else {
- this._postMessage({
- 'type': 'usageCheckResult',
- 'success': true,
- 'needConfirm': false
- });
- }
- } catch (ref283) {
- this._postMessage({
- 'type': 'usageCheckResult',
- 'success': true,
- 'needConfirm': false
- });
- }
- }
- async ['_handleManualSeamlessSwitch']() {
- try {
- const ref284 = this._context.globalState.get("cursorpro.key");
- if (!ref284) {
- this._postMessage({
- 'type': 'manualSeamlessSwitched',
- 'success': false,
- 'error': "未激活授权码"
- });
- return;
- }
- 0x0;
- const ref285 = await client_1.switchSeamlessToken(ref284);
- if (ref285.switched) {
- if (ref285.email) {
- await this._context.globalState.update("cursorpro.seamlessCurrentAccount", ref285.email);
- }
- this._postMessage({
- 'type': 'manualSeamlessSwitched',
- 'success': true,
- 'email': ref285.email,
- 'switchRemaining': ref285.switchRemaining
- });
- } else {
- const ref286 = ref285.message || ref285.error || "换号失败";
- this._postMessage({
- 'type': 'manualSeamlessSwitched',
- 'success': false,
- 'error': ref286
- });
- }
- } catch (ref287) {
- const ref288 = ref287?.['message'] || "连接服务器失败";
- this._postMessage({
- 'type': 'manualSeamlessSwitched',
- 'success': false,
- 'error': ref288
- });
- }
- }
- async ["_handleGetCursorPath"]() {
- try {
- const ref289 = process.platform;
- let ref290 = '';
- let ref291 = '';
- if (ref289 === "win32") {
- try {
- const {
- stdout: ref292
- } = await execAsync("wmic process where \"name='Cursor.exe'\" get ExecutablePath /format:list 2>nul");
- const ref293 = ref292.match(/ExecutablePath=(.+)/);
- if (ref293 && ref293[0x1]) {
- const ref294 = ref293[0x1].trim();
- ref290 = path.dirname(ref294);
- }
- } catch (ref295) {
- try {
- const {
- stdout: ref296
- } = await execAsync("powershell -Command \"Get-Process Cursor -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty Path\"");
- if (ref296.trim()) {
- ref290 = path.dirname(ref296.trim());
- }
- } catch (ref297) {
- console.warn("[CursorPro] 获取进程路径失败:", ref297);
- }
- }
- const ref298 = process.env.APPDATA || '';
- ref291 = path.join(ref298, "Cursor");
- } else {
- if (ref289 === "darwin") {
- try {
- const {
- stdout: ref299
- } = await execAsync("ps aux | grep -i \"[C]ursor\" | head -1 | awk '{print $11}'");
- if (ref299.trim()) {
- const ref300 = ref299.trim();
- const ref301 = ref300.match(/(.+\.app)/);
- if (ref301) {
- ref290 = ref301[0x1];
- } else {
- ref290 = path.dirname(ref300);
- }
- }
- } catch (ref302) {
- console.warn("[CursorPro] 获取进程路径失败:", ref302);
- }
- const ref303 = process.env.HOME || '';
- ref291 = path.join(ref303, 'Library', "Application Support", "Cursor");
- } else {
- try {
- const {
- stdout: ref304
- } = await execAsync("ps aux | grep -i \"[c]ursor\" | head -1 | awk '{print $11}'");
- if (ref304.trim()) {
- ref290 = path.dirname(ref304.trim());
- }
- } catch (ref305) {
- console.warn("[CursorPro] 获取进程路径失败:", ref305);
- }
- const ref306 = process.env.HOME || '';
- ref291 = path.join(ref306, '.config', "Cursor");
- }
- }
- if (!ref290) {
- ref290 = '未检测到运行中的Cursor进程';
- }
- let ref307 = '';
- if (ref290 && !ref290.includes("未检测")) {
- if (ref289 === "win32") {
- ref307 = path.join(ref290, 'resources', "app", 'out', 'vs', 'workbench', "workbench.desktop.main.js");
- } else {
- if (ref289 === "darwin") {
- ref307 = path.join(ref290, "Contents", "Resources", "app", 'out', 'vs', 'workbench', 'workbench.desktop.main.js');
- } else {
- ref307 = path.join(ref290, "resources", "app", 'out', 'vs', "workbench", "workbench.desktop.main.js");
- }
- }
- if (!fs.existsSync(ref307)) {
- ref307 = (await this._getWorkbenchPathAsync()) || "未找到";
- }
- } else {
- ref307 = (await this._getWorkbenchPathAsync()) || "未找到";
- }
- const ref308 = ref290 && !ref290.includes("未检测") ? fs.existsSync(ref290) : false;
- const ref309 = ref291 ? fs.existsSync(ref291) : false;
- this._postMessage({
- 'type': "cursorPath",
- 'cursorPath': ref308 ? ref290 : ref290 || "未找到",
- 'dataPath': ref309 ? ref291 : "未找到",
- 'workbenchPath': ref307,
- 'platform': ref289
- });
- } catch (ref310) {
- this._postMessage({
- 'type': "cursorPath",
- 'cursorPath': '获取失败',
- 'dataPath': '获取失败',
- 'workbenchPath': '获取失败',
- 'error': ref310.message
- });
- }
- }
- async ['_loadAccountsFromDB']() {
- try {
- 0x0;
- const ref311 = account_1.getCursorPaths();
- const {
- dbPath: ref312
- } = ref311;
- if (!fs.existsSync(ref312)) {
- return [];
- }
- 0x0;
- const ref313 = await sqlite_1.sqliteGet(ref312, "cursorAuth/accessToken");
- 0x0;
- const ref314 = await sqlite_1.sqliteGet(ref312, "cursorAuth/refreshToken");
- 0x0;
- const ref315 = await sqlite_1.sqliteGet(ref312, "cursorAuth/cachedEmail");
- if (ref313 && ref315) {
- return [{
- 'email': ref315,
- 'access_token': ref313,
- 'refresh_token': ref314 || ref313
- }];
- }
- return [];
- } catch (ref316) {
- console.error("[CursorPro] 读取账号失败:", ref316);
- return [];
- }
- }
- async ["_sendState"]() {
- const ref317 = this._context.globalState.get("cursorpro.key");
- const ref318 = this._context.globalState.get('cursorpro.expireDate');
- const ref319 = this._context.globalState.get('cursorpro.switchRemaining');
- const ref320 = this._context.globalState.get("cursorpro.switchLimit");
- const ref321 = await this._getCursorVersion();
- 0x0;
- const ref322 = client_1.getOnlineStatus();
- this._postMessage({
- 'type': "state",
- 'isActivated': !!ref317,
- 'key': ref317 || '',
- 'expireDate': ref318 || '',
- 'switchRemaining': ref319 ?? 0x0,
- 'switchLimit': ref320 ?? 0x64,
- 'cursorVersion': ref321,
- 'isOnline': ref322
- });
- }
- async ["_handleRetryConnect"]() {
- try {
- const ref323 = this._context.globalState.get('cursorpro.key');
- if (ref323) {
- 0x0;
- await client_1.verifyKey(ref323);
- } else {
- 0x0;
- const ref324 = client_1.getApiUrl() + '/api/announcements/latest';
- await fetch(ref324, {
- 'method': 'GET'
- });
- }
- await this._sendState();
- this._postMessage({
- 'type': "networkStatus",
- 'online': true
- });
- } catch (ref325) {
- console.error("[CursorPro] Retry connect failed:", ref325);
- this._postMessage({
- 'type': "networkStatus",
- 'online': false
- });
- }
- }
- async ["_getCursorVersion"]() {
- try {
- const ref326 = process.platform;
- const ref327 = [];
- const ref328 = await this._getCursorInstallPath();
- if (ref328) {
- if (ref326 === "darwin") {
- ref327.push(path.join(ref328, "Contents", "Resources", 'app', 'package.json'));
- } else {
- ref327.push(path.join(ref328, "resources", 'app', "package.json"));
- }
- }
- if (ref326 === "win32") {
- const ref329 = process.env.LOCALAPPDATA || '';
- const ref330 = process.env.USERPROFILE || '';
- const ref331 = process.env.ProgramFiles || "C:\\Program Files";
- const ref332 = process.env['ProgramFiles(x86)'] || "C:\\Program Files (x86)";
- ref327.push(path.join(ref329, "Programs", "Cursor", "resources", "app", "package.json"), path.join(ref329, "Programs", "cursor", "resources", 'app', "package.json"), path.join(ref330, "AppData", "Local", "Programs", "Cursor", "resources", 'app', "package.json"), path.join(ref331, "Cursor", "resources", 'app', "package.json"), path.join(ref331, "cursor", "resources", 'app', "package.json"), path.join(ref332, "Cursor", "resources", 'app', "package.json"));
- } else {
- if (ref326 === "darwin") {
- ref327.push('/Applications/Cursor.app/Contents/Resources/app/package.json');
- } else {
- const ref333 = process.env.HOME || '';
- ref327.push("/usr/share/cursor/resources/app/package.json", "/opt/Cursor/resources/app/package.json", "/opt/cursor/resources/app/package.json", path.join(ref333, ".local", 'share', "cursor", "resources", 'app', "package.json"));
- }
- }
- for (const ref334 of ref327) {
- try {
- if (fs.existsSync(ref334)) {
- const ref335 = fs.readFileSync(ref334, "utf-8");
- const ref336 = JSON.parse(ref335);
- if (ref336.version) {
- console.log("[CursorPro] 找到 Cursor 版本:", ref336.version, "路径:", ref334);
- return ref336.version;
- }
- }
- } catch (ref337) {
- console.log("[CursorPro] 尝试路径失败:", ref334, ref337);
- }
- }
- try {
- const ref338 = require("vscode");
- if (ref338.version) {
- console.log("[CursorPro] 使用 VS Code API 获取版本:", ref338.version);
- return ref338.version;
- }
- } catch (ref339) {}
- console.log("[CursorPro] 未找到 Cursor 版本,尝试的路径:", ref327);
- return '未知';
- } catch (ref340) {
- console.error("[CursorPro] 获取 Cursor 版本失败:", ref340);
- return '未知';
- }
- }
- ['_postMessage'](ref341) {
- this._view?.["webview"]["postMessage"](ref341);
- }
- ["_getNonce"]() {
- let ref342 = '';
- for (let ref343 = 0x0; ref343 < 0x20; ref343++) {
- ref342 += 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.charAt(Math.floor(Math.random() * 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.length));
- }
- return ref342;
- }
- ["_getHtmlContent"](ref344) {
- const ref345 = this._getNonce();
- return "\n\n\n \n \n
- CursorPro
-
-
-
-
-
-
- 🚀
- 发现新版本
- v0.0
- ×
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 请关闭 Cursor,右键点击图标
- 选择 以管理员身份运行
-
-
- 我知道了
-
-
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 重置机器码需要管理员权限才能完整执行。
- 请按以下步骤操作:
- 1. 完全关闭 Cursor
- 2. 右键点击 Cursor 图标
- 3. 选择 以管理员身份运行
- 4. 再次点击重置机器码
-
-
- 我知道了
-
-
-
-
-
-
-
-
✓
-
操作成功
-
- 需要重启 Cursor 才能生效
-
-
- 立即重启
- 稍后
-
-
-
-
-
-
-
-
⏰
-
激活码已过期
-
- 您的激活码已过期,请续费后继续使用
-
-
- 我知道了
-
-
-
-
-
-
-
-
⚠️
-
清理 Cursor 环境
-
- 此操作会删除所有配置和登录信息
确定要继续吗?
-
-
- 确定清理
- 取消
-
-
-
-
-
-
-
-
💰
-
账号未使用完
-
- 当前账号
- 已用额度: $0.00 (不足 $10)
- 确定要换号吗?
-
-
- 确认换号
- 取消
-
-
-
-
-
-
-
-
-
-
- 🔐
- 软件授权
- 未授权
-
-
-
-
- 激活
-
-
-
- 激活码
- 尚未激活
-
-
- 到期时间
- 尚未激活
-
-
-
-
-
-
- 👤
- 账号数据
- 未激活
-
-
-
- CI积分余额
- 0 🔄
-
-
-
换号
-
重置机器码
-
禁用自动更新
-
清理Cursor环境
-
停用插件
-
-
-
-
-
- ⚡
- 无感换号
- 未启用
-
-
-
- 积分
- 0
-
-
-
- 当前账号
- 未分配
-
-
-
- 免魔法模式
- PRO
-
-
-
-
-
启用无感换号
-
重置机器码
-
禁用无感换号
-
一键换号(扣1积分)
-
-
-
-
-
- 📊
- 账号用量
- 🔄
-
-
-
-
- 会员类型
- -
-
-
- 试用剩余
- -
-
-
-
-
- 请求次数
- -
-
-
- 已用额度
- -
-
-
-
-
-
-
-
-
-
- 📢
- 公告
- info
-
-
-
-
-
-
-
-
-
- 📦
- 版本信息
- 有更新
-
-
- 当前版本
- -
-
-
- 最新版本
- -
-
-
- ⚠️ 发现新版本,请更新插件以获取最新功能
-
-
-
-
-
-
-
-
-
-
-
-`;
- }
-}
-exports.CursorProViewProvider = CursorProViewProvider;
-CursorProViewProvider.CURRENT_VERSION = '0.4.5';
\ No newline at end of file
diff --git a/codexfanbianyi/extension/package.json b/codexfanbianyi/extension/package.json
deleted file mode 100644
index d9c1d91..0000000
--- a/codexfanbianyi/extension/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "name": "cursorpro",
- "displayName": "CursorPro",
- "description": "Cursor 账号管理与换号工具",
- "version": "0.4.5",
- "publisher": "cursorpro",
- "repository": {
- "type": "git",
- "url": "https://github.com/cursorpro/cursorpro-extension"
- },
- "engines": {
- "vscode": "^1.80.0"
- },
- "categories": [
- "Other"
- ],
- "extensionKind": [
- "ui"
- ],
- "activationEvents": [
- "onStartupFinished"
- ],
- "main": "./out/extension.js",
- "contributes": {
- "commands": [
- {
- "command": "cursorpro.showPanel",
- "title": "CursorPro: 打开控制面板"
- },
- {
- "command": "cursorpro.switchAccount",
- "title": "CursorPro: 立即换号"
- }
- ],
- "viewsContainers": {
- "activitybar": [
- {
- "id": "cursorpro-sidebar",
- "title": "CursorPro",
- "icon": "media/icon.svg"
- }
- ]
- },
- "views": {
- "cursorpro-sidebar": [
- {
- "type": "webview",
- "id": "cursorpro.mainView",
- "name": "控制面板"
- }
- ]
- },
- "configuration": {
- "title": "CursorPro",
- "properties": {
- "cursorpro.cursorPath": {
- "type": "string",
- "default": "",
- "description": "手动设置 Cursor 安装路径(如果自动检测失败)。例如:C:\\Program Files\\cursor 或 /Applications/Cursor.app"
- }
- }
- }
- },
- "scripts": {
- "vscode:prepublish": "npm run compile",
- "compile": "tsc -p ./",
- "watch": "tsc -watch -p ./",
- "lint": "eslint src --ext ts"
- },
- "devDependencies": {
- "@types/node": "^20.0.0",
- "@types/vscode": "^1.80.0",
- "esbuild": "^0.27.0",
- "typescript": "^5.0.0"
- }
-}
diff --git a/codexfanbianyi/extension/scripts/reset_cursor_macos.sh b/codexfanbianyi/extension/scripts/reset_cursor_macos.sh
deleted file mode 100644
index 4bf34c6..0000000
--- a/codexfanbianyi/extension/scripts/reset_cursor_macos.sh
+++ /dev/null
@@ -1,280 +0,0 @@
-#!/bin/bash
-# ==============================================
-# CursorPro - macOS 机器码重置脚本
-# 一次授权,永久免密
-# 纯 Shell 实现,不依赖 Python
-# ==============================================
-
-# 颜色定义
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-BLUE='\033[0;34m'
-NC='\033[0m' # No Color
-
-# 路径定义
-CURSOR_APP="/Applications/Cursor.app"
-CURSOR_OUT="$CURSOR_APP/Contents/Resources/app/out"
-MAIN_JS="$CURSOR_OUT/main.js"
-UUID_PLIST="/Library/Preferences/SystemConfiguration/com.apple.platform.uuid.plist"
-
-# 用户数据路径
-USER_HOME="$HOME"
-CURSOR_DATA="$USER_HOME/Library/Application Support/Cursor"
-STORAGE_JSON="$CURSOR_DATA/User/globalStorage/storage.json"
-STATE_VSCDB="$CURSOR_DATA/User/globalStorage/state.vscdb"
-MACHINEID_FILE="$CURSOR_DATA/machineid"
-
-# 备份目录
-BACKUP_DIR="$USER_HOME/CursorPro_backups"
-
-echo ""
-echo -e "${BLUE}======================================${NC}"
-echo -e "${BLUE} CursorPro macOS 机器码重置工具${NC}"
-echo -e "${BLUE}======================================${NC}"
-echo ""
-
-# 检查 Cursor 是否安装
-if [ ! -d "$CURSOR_APP" ]; then
- echo -e "${RED}错误: 未找到 Cursor 应用${NC}"
- echo "请确保 Cursor 安装在 /Applications/Cursor.app"
- exit 1
-fi
-
-# 创建备份目录
-mkdir -p "$BACKUP_DIR" 2>/dev/null
-
-# ============================================
-# 第一步:检测并设置权限(一次性)
-# ============================================
-echo -e "${YELLOW}[步骤 1/7] 检查权限...${NC}"
-
-NEED_SUDO=false
-
-# 检查 main.js 权限
-if [ ! -w "$MAIN_JS" ] 2>/dev/null; then
- NEED_SUDO=true
- echo " - main.js: 需要授权"
-else
- echo -e " - main.js: ${GREEN}已有权限${NC}"
-fi
-
-# 检查 UUID plist 权限(文件可能不存在)
-if [ -f "$UUID_PLIST" ]; then
- if [ ! -w "$UUID_PLIST" ] 2>/dev/null; then
- NEED_SUDO=true
- echo " - UUID plist: 需要授权"
- else
- echo -e " - UUID plist: ${GREEN}已有权限${NC}"
- fi
-else
- echo -e " - UUID plist: ${YELLOW}文件不存在,跳过${NC}"
-fi
-
-# 如果需要授权
-if [ "$NEED_SUDO" = true ]; then
- echo ""
- echo -e "${YELLOW}首次运行,需要管理员权限${NC}"
- echo -e "${YELLOW}授权后以后重置不再需要输入密码${NC}"
- echo ""
-
- # 请求 sudo 权限
- sudo -v || { echo -e "${RED}授权失败${NC}"; exit 1; }
-
- # 修改 Cursor 目录权限
- if [ ! -w "$MAIN_JS" ] 2>/dev/null; then
- echo " 正在修改 Cursor 目录权限..."
- sudo chown -R $(whoami) "$CURSOR_OUT" 2>/dev/null || true
- sudo chmod -R u+rw "$CURSOR_OUT" 2>/dev/null || true
- echo -e " ${GREEN}✓ Cursor 目录权限已修改${NC}"
- fi
-
- # 修改 UUID plist 权限(如果文件存在)
- if [ -f "$UUID_PLIST" ] && [ ! -w "$UUID_PLIST" ] 2>/dev/null; then
- echo " 正在修改 UUID plist 权限..."
- sudo chown $(whoami) "$UUID_PLIST" 2>/dev/null || true
- echo -e " ${GREEN}✓ UUID plist 权限已修改${NC}"
- fi
-
- echo ""
- echo -e "${GREEN}✓ 权限设置完成!以后重置不再需要密码${NC}"
-fi
-
-echo ""
-
-# ============================================
-# 第二步:关闭 Cursor
-# ============================================
-echo -e "${YELLOW}[步骤 2/7] 关闭 Cursor...${NC}"
-
-if pgrep -x "Cursor" > /dev/null; then
- killall Cursor 2>/dev/null || true
- echo " 等待 Cursor 完全退出..."
- sleep 3
- echo -e " ${GREEN}✓ Cursor 已关闭${NC}"
-else
- echo -e " ${GREEN}✓ Cursor 未运行${NC}"
-fi
-
-echo ""
-
-# ============================================
-# 第三步:Patch main.js
-# ============================================
-echo -e "${YELLOW}[步骤 3/7] Patch main.js...${NC}"
-
-if [ ! -f "$MAIN_JS" ]; then
- echo -e " ${RED}警告: 未找到 main.js${NC}"
-else
- # 检查是否已经 patch 过
- if grep -q 'uuidgen' "$MAIN_JS" 2>/dev/null; then
- echo -e " ${GREEN}✓ main.js 已经 Patch 过,跳过${NC}"
- else
- # 检查目标字符串
- if grep -q 'ioreg -rd1 -c IOPlatformExpertDevice' "$MAIN_JS"; then
- # 备份到用户目录
- BACKUP_FILE="$BACKUP_DIR/main.js.backup_$(date +%s)"
- cp "$MAIN_JS" "$BACKUP_FILE" 2>/dev/null
- if [ $? -eq 0 ]; then
- echo " 备份已创建: $BACKUP_FILE"
- fi
-
- # 使用 perl 替换(macOS 自带,比 sed 更可靠处理特殊字符)
- perl -i -pe 's/ioreg -rd1 -c IOPlatformExpertDevice/UUID=\$(uuidgen | tr '"'"'[:upper:]'"'"' '"'"'[:lower:]'"'"');echo "IOPlatformUUID = "\$UUID";/g' "$MAIN_JS" 2>/dev/null
-
- if [ $? -eq 0 ]; then
- echo -e " ${GREEN}✓ main.js Patch 成功${NC}"
- else
- echo -e " ${RED}✗ main.js Patch 失败${NC}"
- fi
- else
- echo -e " ${YELLOW}警告: 未找到目标字符串,可能已 patch 或版本不兼容${NC}"
- fi
- fi
-fi
-
-echo ""
-
-# ============================================
-# 第四步:重置系统 UUID
-# ============================================
-echo -e "${YELLOW}[步骤 4/7] 重置系统 UUID...${NC}"
-
-if [ ! -f "$UUID_PLIST" ]; then
- echo -e " ${YELLOW}提示: UUID plist 文件不存在,跳过${NC}"
-else
- NEW_SYS_UUID=$(uuidgen | tr '[:upper:]' '[:lower:]')
- /usr/libexec/PlistBuddy -c "Set :IOPlatformUUID $NEW_SYS_UUID" "$UUID_PLIST" 2>/dev/null || \
- /usr/libexec/PlistBuddy -c "Add :IOPlatformUUID string $NEW_SYS_UUID" "$UUID_PLIST" 2>/dev/null || true
- echo -e " ${GREEN}✓ 系统 UUID 已重置: $NEW_SYS_UUID${NC}"
-fi
-
-echo ""
-
-# ============================================
-# 第五步:重置 storage.json
-# ============================================
-echo -e "${YELLOW}[步骤 5/7] 重置 storage.json...${NC}"
-
-# 生成新的机器码(64位十六进制)
-NEW_MACHINE_ID=$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')
-NEW_MAC_MACHINE_ID=$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')
-NEW_DEV_DEVICE_ID=$(uuidgen | tr '[:upper:]' '[:lower:]')
-NEW_SQM_ID="{$(uuidgen | tr '[:lower:]' '[:upper:]')}"
-
-if [ -f "$STORAGE_JSON" ]; then
- # 备份
- cp "$STORAGE_JSON" "$BACKUP_DIR/storage.json.backup_$(date +%s)" 2>/dev/null
-
- # 使用 sed 替换 JSON 中的值(macOS sed 语法)
- # machineId
- sed -i '' "s/\"telemetry\.machineId\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"telemetry.machineId\": \"$NEW_MACHINE_ID\"/g" "$STORAGE_JSON" 2>/dev/null
-
- # macMachineId
- sed -i '' "s/\"telemetry\.macMachineId\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"telemetry.macMachineId\": \"$NEW_MAC_MACHINE_ID\"/g" "$STORAGE_JSON" 2>/dev/null
-
- # devDeviceId
- sed -i '' "s/\"telemetry\.devDeviceId\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"telemetry.devDeviceId\": \"$NEW_DEV_DEVICE_ID\"/g" "$STORAGE_JSON" 2>/dev/null
-
- # sqmId
- sed -i '' "s/\"telemetry\.sqmId\"[[:space:]]*:[[:space:]]*\"[^\"]*\"/\"telemetry.sqmId\": \"$NEW_SQM_ID\"/g" "$STORAGE_JSON" 2>/dev/null
-
- echo -e " ${GREEN}✓ storage.json 已更新 (4个ID)${NC}"
-else
- echo -e " ${YELLOW}警告: 未找到 storage.json${NC}"
-fi
-
-echo ""
-
-# ============================================
-# 第六步:重置 SQLite 数据库
-# ============================================
-echo -e "${YELLOW}[步骤 6/7] 重置 SQLite 数据库...${NC}"
-
-NEW_SERVICE_MACHINE_ID=$(uuidgen | tr '[:upper:]' '[:lower:]')
-
-if [ -f "$STATE_VSCDB" ]; then
- # 备份
- cp "$STATE_VSCDB" "$BACKUP_DIR/state.vscdb.backup_$(date +%s)" 2>/dev/null
-
- # 使用 sqlite3 命令(macOS 自带)
- sqlite3 "$STATE_VSCDB" "UPDATE ItemTable SET value = '$NEW_SERVICE_MACHINE_ID' WHERE key = 'storage.serviceMachineId';" 2>/dev/null
-
- if [ $? -eq 0 ]; then
- echo -e " ${GREEN}✓ state.vscdb 已更新 (serviceMachineId)${NC}"
- else
- # 如果更新失败,尝试插入
- sqlite3 "$STATE_VSCDB" "INSERT OR REPLACE INTO ItemTable (key, value) VALUES ('storage.serviceMachineId', '$NEW_SERVICE_MACHINE_ID');" 2>/dev/null
- echo -e " ${GREEN}✓ state.vscdb 已更新${NC}"
- fi
-else
- echo -e " ${YELLOW}警告: 未找到 state.vscdb${NC}"
-fi
-
-# 更新 machineid 文件
-echo ""
-if [ -d "$(dirname "$MACHINEID_FILE")" ]; then
- echo "${NEW_MACHINE_ID:0:64}" > "$MACHINEID_FILE"
- echo -e " ${GREEN}✓ machineid 文件已更新${NC}"
-else
- echo -e " ${YELLOW}警告: 未找到 machineid 目录${NC}"
-fi
-
-# 清理缓存
-rm -rf "$CURSOR_DATA/Cache" 2>/dev/null || true
-rm -rf "$CURSOR_DATA/CachedData" 2>/dev/null || true
-rm -rf "$CURSOR_DATA/GPUCache" 2>/dev/null || true
-echo -e " ${GREEN}✓ 缓存已清理${NC}"
-
-echo ""
-
-# ============================================
-# 第七步:重新打开 Cursor
-# ============================================
-echo -e "${YELLOW}[步骤 7/7] 重新打开 Cursor...${NC}"
-
-sleep 1
-open "$CURSOR_APP"
-echo -e " ${GREEN}✓ Cursor 已启动${NC}"
-
-echo ""
-echo -e "${GREEN}======================================${NC}"
-echo -e "${GREEN} ✅ 机器码重置完成!${NC}"
-echo -e "${GREEN}======================================${NC}"
-echo ""
-echo "已重置的内容:"
-echo " ✓ main.js (ioreg patch)"
-echo " ✓ storage.json (4个ID)"
-echo " ✓ state.vscdb (serviceMachineId)"
-echo " ✓ machineid 文件"
-echo " ✓ 缓存已清理"
-echo ""
-echo "新机器码信息:"
-echo " machineId: ${NEW_MACHINE_ID:0:32}..."
-echo " devDeviceId: $NEW_DEV_DEVICE_ID"
-echo " serviceMachineId: $NEW_SERVICE_MACHINE_ID"
-echo ""
-echo "备份位置: $BACKUP_DIR"
-echo ""
-echo -e "${BLUE}此窗口可以关闭${NC}"
-echo ""
diff --git a/convert_unicode.js b/convert_unicode.js
deleted file mode 100644
index 48881ed..0000000
--- a/convert_unicode.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * 安全转换 Unicode 转义序列为中文
- * 只处理字符串字面量,不破坏正则表达式
- */
-const fs = require('fs');
-const babel = require('@babel/core');
-const traverse = require('@babel/traverse').default;
-const generate = require('@babel/generator').default;
-const t = require('@babel/types');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-const code = fs.readFileSync(inputPath, 'utf8');
-
-console.log('安全转换 Unicode...');
-
-let ast;
-try {
- ast = babel.parseSync(code, { sourceType: 'script' });
-} catch (e) {
- console.error('解析失败:', e.message);
- process.exit(1);
-}
-
-let converted = 0;
-
-traverse(ast, {
- StringLiteral(path) {
- const value = path.node.value;
- // 检查是否包含 Unicode 转义(已解码的中文字符)
- // 或者检查原始值是否有 \u
- if (path.node.extra && path.node.extra.raw) {
- const raw = path.node.extra.raw;
- if (raw.includes('\\u')) {
- // 保持已解码的 value,只是清除 extra 让生成器使用 value
- delete path.node.extra;
- converted++;
- }
- }
- }
-});
-
-console.log(`处理了 ${converted} 个字符串`);
-
-const output = generate(ast, {
- comments: false,
- compact: false,
- jsescOption: {
- minimal: true // 最小转义,保留中文
- }
-}, code);
-
-fs.writeFileSync(inputPath, output.code);
-
-// 验证
-try {
- babel.parseSync(output.code, { sourceType: 'script' });
- console.log('✅ 语法正确');
-} catch (e) {
- console.error('❌ 语法错误:', e.message);
-}
-
-// 统计
-const unicodeRemaining = (output.code.match(/\\u[0-9a-fA-F]{4}/g) || []).length;
-console.log(`剩余 Unicode 转义: ${unicodeRemaining}`);
-console.log(`文件大小: ${(output.code.length / 1024).toFixed(2)} KB`);
diff --git a/copy_files.js b/copy_files.js
deleted file mode 100644
index 53b7405..0000000
--- a/copy_files.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-
-function copyRecursive(src, dst) {
- if (!fs.existsSync(dst)) {
- fs.mkdirSync(dst, { recursive: true });
- }
- fs.readdirSync(src).forEach(f => {
- const srcPath = path.join(src, f);
- const dstPath = path.join(dst, f);
- if (fs.statSync(srcPath).isDirectory()) {
- copyRecursive(srcPath, dstPath);
- } else {
- fs.copyFileSync(srcPath, dstPath);
- }
- });
-}
-
-// Copy original extension files
-copyRecursive(
- 'D:/temp/破解/cursorpro-0.4.5/原版本/extension/out',
- 'D:/temp/破解/cursorpro-0.4.5/extension/out'
-);
-
-console.log('Files copied from original extension');
-
-// Now we need to write our clean client.js
-// The clean version is already saved earlier
-console.log('Note: client.js should be replaced with clean version');
diff --git a/decode_extension.js b/decode_extension.js
deleted file mode 100644
index afd02a5..0000000
--- a/decode_extension.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * 解码 extension.js 的混淆字符串
- */
-const fs = require('fs');
-
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/extension.js', 'utf8');
-
-var vip = 'cursor';
-
-// 1. 提取字符串数组函数 _0x2b0b
-const arrMatch = code.match(/function _0x2b0b\(\)\{[\s\S]*?return _0x2b0b\(\);\}/);
-if (!arrMatch) {
- console.log('找不到 _0x2b0b 函数');
- process.exit(1);
-}
-eval(arrMatch[0]);
-console.log('1. _0x2b0b 已定义');
-
-// 2. 提取解码函数 _0xc90d
-const decStart = code.indexOf('function _0xc90d(');
-const decEnd = code.indexOf('},_0xc90d(_0x25a632,_0x29df0b);}', decStart) + '},_0xc90d(_0x25a632,_0x29df0b);}'.length;
-const decCode = code.substring(decStart, decEnd);
-eval(decCode);
-console.log('2. _0xc90d 已定义');
-
-// 3. 执行 IIFE 来打乱数组
-const iifeStart = code.indexOf('const _0x50c5e9=_0xc90d;');
-const iifeEnd = code.indexOf('var __createBinding');
-let iifeCode = code.substring(iifeStart, iifeEnd).trim();
-if (iifeCode.endsWith(';')) iifeCode = iifeCode.slice(0, -1);
-eval(iifeCode);
-console.log('3. IIFE 已执行, vip =', vip);
-
-// 4. 测试解码
-const decode = _0xc90d;
-
-console.log('\n=== 测试解码 ===');
-// require 路径
-console.log('require(0x222, "8j^A"):', decode(0x222, '8j^A'));
-console.log('require(0x203, "3pMS"):', decode(0x203, '3pMS'));
-
-// 收集所有解码调用
-console.log('\n=== 收集所有字符串 ===');
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-const decodedMap = new Map();
-
-let match;
-while ((match = regex.exec(code)) !== null) {
- const fullMatch = match[0];
- const index = parseInt(match[1], 16);
- const key = match[2];
-
- if (!decodedMap.has(fullMatch)) {
- try {
- const decoded = decode(index, key);
- decodedMap.set(fullMatch, decoded);
- } catch (e) {
- // 跳过
- }
- }
-}
-
-console.log(`共解码 ${decodedMap.size} 个字符串\n`);
-
-// 找出关键字符串
-const important = [...decodedMap.entries()].filter(([k, v]) =>
- v.includes('client') ||
- v.includes('api') ||
- v.includes('verify') ||
- v.includes('http') ||
- v.includes('cursor')
-);
-
-console.log('=== 关键字符串 ===');
-important.forEach(([call, decoded]) => {
- console.log(`${decoded}`);
-});
-
-// 保存完整映射
-const mapObj = {};
-for (const [call, decoded] of decodedMap) {
- mapObj[call] = decoded;
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/extension_decoded_map.json', JSON.stringify(mapObj, null, 2));
-console.log('\n完整映射已保存到 extension_decoded_map.json');
diff --git a/decode_provider.js b/decode_provider.js
deleted file mode 100644
index 7f5c722..0000000
--- a/decode_provider.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * 解码 provider.js 的混淆字符串
- */
-const fs = require('fs');
-
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/webview/provider.js', 'utf8');
-
-var vip = 'cursor';
-
-// 找函数名
-const funcMatch = code.match(/function (_0x[a-f0-9]+)\(/g);
-const funcNames = [...new Set(funcMatch)].map(f => f.match(/_0x[a-f0-9]+/)[0]);
-console.log('函数名:', funcNames.slice(0, 5));
-
-// 1. 提取字符串数组函数
-const arrFuncName = funcNames.find(n => {
- const regex = new RegExp(`function ${n}\\(\\)\\{`);
- return regex.test(code);
-});
-console.log('字符串数组函数:', arrFuncName);
-
-const arrMatch = code.match(new RegExp(`function ${arrFuncName}\\(\\)\\{[\\s\\S]*?return ${arrFuncName}\\(\\);\\}`));
-if (!arrMatch) {
- console.log('找不到字符串数组函数');
- process.exit(1);
-}
-eval(arrMatch[0]);
-console.log('1. 字符串数组函数已定义');
-
-// 2. 找解码函数 (两个参数的函数)
-const decFuncName = funcNames.find(n => {
- const regex = new RegExp(`function ${n}\\(_0x[a-f0-9]+,_0x[a-f0-9]+\\)\\{`);
- return regex.test(code) && n !== arrFuncName;
-});
-console.log('解码函数:', decFuncName);
-
-// 提取解码函数
-const decStart = code.indexOf(`function ${decFuncName}(`);
-const decEndMarker = `},${decFuncName}(`;
-let searchPos = decStart + 100;
-while (true) {
- const pos = code.indexOf(decEndMarker, searchPos);
- if (pos === -1) break;
- const endPos = code.indexOf(';}', pos);
- if (endPos !== -1 && endPos - pos < 100) {
- const decCode = code.substring(decStart, endPos + 2);
- try {
- eval(decCode);
- console.log('2. 解码函数已定义');
- break;
- } catch (e) {
- searchPos = pos + 10;
- }
- } else {
- searchPos = pos + 10;
- }
-}
-
-// 3. 执行 IIFE
-const aliasMatch = code.match(/const (_0x[a-f0-9]+)=_0x[a-f0-9]+;/);
-if (aliasMatch) {
- const aliasName = aliasMatch[1];
- console.log('别名:', aliasName);
-
- const iifeStart = code.indexOf(aliasMatch[0]);
- const iifeEnd = code.indexOf('var __createBinding');
- if (iifeStart >= 0 && iifeEnd > iifeStart) {
- let iifeCode = code.substring(iifeStart, iifeEnd).trim();
- if (iifeCode.endsWith(';')) iifeCode = iifeCode.slice(0, -1);
- try {
- eval(iifeCode);
- console.log('3. IIFE 已执行');
- } catch (e) {
- console.log('IIFE 执行失败:', e.message);
- }
- }
-}
-
-// 4. 测试解码并收集
-const decode = eval(decFuncName);
-console.log('\n=== 收集所有字符串 ===');
-
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-const decodedMap = new Map();
-
-let match;
-let count = 0;
-while ((match = regex.exec(code)) !== null && count < 5000) {
- const fullMatch = match[0];
- const index = parseInt(match[1], 16);
- const key = match[2];
-
- if (!decodedMap.has(fullMatch)) {
- try {
- const decoded = decode(index, key);
- decodedMap.set(fullMatch, decoded);
- count++;
- } catch (e) {
- // 跳过
- }
- }
-}
-
-console.log(`共解码 ${decodedMap.size} 个字符串\n`);
-
-// 找关键字符串
-console.log('=== 关键字符串 (client/api/verify) ===');
-[...decodedMap.entries()]
- .filter(([k, v]) =>
- v.includes('client') ||
- v.includes('/api') ||
- v.includes('verify') ||
- v.includes('http')
- )
- .slice(0, 30)
- .forEach(([call, decoded]) => {
- console.log(decoded);
- });
-
-// 保存
-const mapObj = {};
-for (const [call, decoded] of decodedMap) {
- mapObj[call] = decoded;
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/provider_decoded_map.json', JSON.stringify(mapObj, null, 2));
-console.log('\n完整映射已保存到 provider_decoded_map.json');
diff --git a/decoded_map.json b/decoded_map.json
deleted file mode 100644
index 0001bf2..0000000
--- a/decoded_map.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "_0x355e79(0x184,'egez')": "5reEtQd",
- "_0x355e79(0x1c1,'%x%T')": "23770LVWEdW",
- "_0x355e79(0x12e,'1I3q')": "3ktOdFK",
- "_0x355e79(0x16b,'4%)S')": "632132lNNTfI",
- "_0x355e79(0x1b1,'zF^s')": "1344315EcEHRY",
- "_0x355e79(0x14f,']$%b')": "6koiVbP",
- "_0x355e79(0x167,'nS#0')": "11914LZMNyo",
- "_0x355e79(0x14e,'CAFj')": "2832WeOmel",
- "_0x355e79(0x130,'i9F1')": "8166069IzisAD",
- "_0x355e79(0x139,'%x%T')": "6188420AiIftc",
- "_0x355e79(0x19a,'FaV!')": "11JtKyhU",
- "_0x355e79(0x153,'xDiN')": "828180CkAwGM",
- "_0x355e79(0x198,'@Xc6')": "13HFFOSQ",
- "_0x1ede40(0x199,'!D4Z')": "__createBinding",
- "_0x1ede40(0x1c8,'@Xc6')": "create",
- "_0x4eb85c(0x18f,'CAFj')": "HNdUv",
- "_0x4eb85c(0x156,'i9F1')": "getOwnPropertyDescriptor",
- "_0x4eb85c(0x187,')0X3')": "__esModule",
- "_0x4eb85c(0x183,'Kfdi')": "writable",
- "_0x4eb85c(0x19d,'kp3(')": "configurable",
- "_0x1ede40(0x180,'H%&^')": "__setModuleDefault",
- "_0x1ede40(0x1b8,'csY!')": "create",
- "_0x182fa9(0x1a9,'Tn!E')": "default",
- "_0x182fa9(0x131,'egez')": "defineProperty",
- "_0x182fa9(0x1ba,'E$^%')": "RDtLV",
- "_0xaaa62a(0x191,'3nFX')": "default",
- "_0xaaa62a(0x1a7,'wvYe')": "UDNOD",
- "_0x2df000(0x188,'1I3q')": "ChbgJ",
- "_0x2df000(0x17b,')0X3')": "4|3|2|1|0",
- "_0xde3d97(0x16d,'gtUF')": "hasOwnProperty",
- "_0xde3d97(0x137,'P#LQ')": "call",
- "_0xde3d97(0x168,'g547')": "length",
- "_0x4fbc9f(0x143,'csY!')": "LynhB",
- "_0x4fbc9f(0x169,'CMPY')": "qBjFZ",
- "_0x4fbc9f(0x155,'@Xc6')": "ChbgJ",
- "_0x4fbc9f(0x1a4,')0X3')": "EpACO",
- "_0x4fbc9f(0x14c,')0X3')": "split",
- "_0x4fbc9f(0x162,'nS#0')": "QIZWZ",
- "_0x4fbc9f(0x1be,'wvYe')": "KJmyh",
- "_0x4fbc9f(0x192,'cY2P')": "Otlxd",
- "_0x4fbc9f(0x18e,'xDiN')": "forEach",
- "_0x1ede40(0x144,'*1hl')": "__esModule",
- "_0x1ede40(0x1b6,'mBo%')": "getApiUrl",
- "_0x1ede40(0x146,'pIfk')": "getOnlineStatus",
- "_0x1ede40(0x145,'j#7G')": "switchAccount",
- "_0x1ede40(0x154,'fjkd')": "updateProxyConfig",
- "_0x1ede40(0x13e,'3nFX')": "getSeamlessStatus",
- "_0x1ede40(0x193,'HShS')": "getUserSwitchStatus",
- "_0x1ede40(0x17f,'fjkd')": "getSeamlessConfig",
- "_0x1ede40(0x1c2,'0hHe')": "updateSeamlessConfig",
- "_0x1ede40(0x1b7,'csY!')": "injectSeamless",
- "_0x1ede40(0x13c,'fjkd')": "getSeamlessAccounts",
- "_0x1ede40(0x173,'j#7G')": "syncSeamlessAccounts",
- "_0x1ede40(0x175,'pIfk')": "getSeamlessToken",
- "_0x1ede40(0x152,')0X3')": "getLatestVersion",
- "_0x1ede40(0x151,'pIfk')": "vscode",
- "_0x1ede40(0x18a,'yC20')": "http://111.170.7.59:5000",
- "_0x517f75(0x177,']8Ci')": "workspace",
- "_0x517f75(0x194,'H%&^')": "sKqFt",
- "_0x517f75(0x15b,'j#7G')": "apiUrl",
- "_0x4c36cf(0x179,')0X3')": "push",
- "_0x1977a2(0x14b,'dpeu')": "filter",
- "_0x5afdbb(0x1b9,'zF^s')": "LiLdl",
- "_0x5afdbb(0x147,'j#7G')": "forEach",
- "_0x507ce6(0x1a6,'H%&^')": "abort",
- "_0x507ce6(0x163,'pIfk')": "MXvym",
- "_0x1b24d0(0x195,'rI*M')": "application/json",
- "_0x1b24d0(0x196,'pIfk')": "wwMyU",
- "_0x1b24d0(0x164,'rI*M')": "AbortError",
- "_0x1b24d0(0x16f,'P#LQ')": "TypeError",
- "_0x1b24d0(0x165,'rI*M')": "ECONNREFUSED",
- "_0x1b24d0(0x189,'kp3(')": "ENOTFOUND",
- "_0x1b24d0(0x134,'N$(9')": "ETIMEDOUT",
- "_0x1b24d0(0x16a,'0hHe')": "JTIwx",
- "_0x1b24d0(0x185,'yC20')": "HSNSw",
- "_0x1b24d0(0x133,'3nFX')": "body",
- "_0x1b24d0(0x19c,']$%b')": "stringify",
- "_0x1b24d0(0x1bc,'kp3(')": "TbLeL",
- "_0x1b24d0(0x1ad,'FaV!')": "hqoir",
- "_0x1b24d0(0x172,')0X3')": "json",
- "_0x1b24d0(0x1bf,'Kfdi')": "UlSjX",
- "_0x1b24d0(0x1a5,'g547')": "dVHKp",
- "_0x1b24d0(0x19e,'CAFj')": "dVHKp",
- "_0x1b24d0(0x178,'gtUF')": "BNHsr",
- "_0x1b24d0(0x157,'0hHe')": "getOwnPropertyDescriptor",
- "_0x1b24d0(0x16c,'CAFj')": "QeGOL",
- "_0x1b24d0(0x176,'T3[u')": "get",
- "_0x1b24d0(0x1b0,'Kfdi')": "__esModule",
- "_0x1b24d0(0x18b,'rI*M')": "writable",
- "_0x1b24d0(0x140,'lC$h')": "configurable",
- "_0x1b24d0(0x1bd,'cY2P')": "defineProperty",
- "_0x1b24d0(0x1a0,'HShS')": "ttOtR",
- "_0x1b24d0(0x14d,'H%&^')": "MNJYC",
- "_0x1b24d0(0x1b4,']$%b')": "vaLQW",
- "_0x1b24d0(0x19b,'zF^s')": "includes",
- "_0x1b24d0(0x15f,'Tn!E')": "NtsiM",
- "_0x1b24d0(0x1a3,'zF^s')": "message",
- "_0x1b24d0(0x17e,'E$^%')": "includes",
- "_0x1b24d0(0x142,'zF^s')": "qUkdJ",
- "_0x1b24d0(0x12f,'CMPY')": "message",
- "_0x1b24d0(0x13d,'gtUF')": "includes",
- "_0x1b24d0(0x1c6,'gtUF')": "EJlaN",
- "_0x1b24d0(0x135,'2T[v')": "ztjks",
- "_0x1b24d0(0x14a,'E$^%')": "RnnaP",
- "_0x1b24d0(0x181,'^UhV')": "网络连接失败,请检查网络",
- "_0x36d9c0(0x197,'Kfdi')": "/api/verify-key",
- "_0x36d9c0(0x186,'dpeu')": "POST",
- "_0x36d9c0(0x150,'g547')": "ZDjOQ",
- "_0x36d9c0(0x19f,'!D4Z')": "WqzrL",
- "_0x15748f(0x141,'z&uV')": "/api/switch-account",
- "_0x15748f(0x15e,'cY2P')": "POST",
- "_0x15748f(0x171,'^UhV')": "UZIiJ",
- "_0x15748f(0x18c,')0X3')": "BFJKe",
- "_0x15748f(0x182,'wvYe')": "mnjoz",
- "_0x1acc63(0x1ac,')0X3')": "GET",
- "_0x1acc63(0x1bb,'z&uV')": "tGYeq",
- "_0x1acc63(0x166,'!D4Z')": "gOUCa",
- "_0x1acc63(0x1c7,'FKQ]')": "qAfDy",
- "_0xda86de(0x170,'1I3q')": "yDQrL",
- "_0xda86de(0x1c0,'h^2B')": "/api/proxy-config",
- "_0xda86de(0x13a,'h^2B')": "PUT",
- "_0x42cb20(0x15c,'pIfk')": "FIIzk",
- "_0x42cb20(0x1b5,'E$^%')": "/api/seamless/status",
- "_0x3f99ea(0x148,'dpeu')": "MGwRv",
- "_0x3f99ea(0x159,'1I3q')": "/api/seamless/user-status?userKey=",
- "_0xeb43df(0x158,'CMPY')": "DfQJY",
- "_0xeb43df(0x17c,'cY2P')": "WtWjp",
- "_0xac9b59(0x1a8,'0hHe')": "/api/seamless/config",
- "_0xac9b59(0x132,'3)@J')": "POST",
- "_0xac9b59(0x174,'HShS')": "eVhRM",
- "_0xac9b59(0x18d,'lC$h')": "ksxVc",
- "_0xac9b59(0x149,'0hHe')": "LROFh",
- "_0x15aadd(0x13b,'nS#0')": "/api/seamless/inject",
- "_0x15aadd(0x1a1,'j#7G')": "POST",
- "_0x15aadd(0x1af,'rI*M')": "ozfwi",
- "_0x15aadd(0x17d,'fjkd')": "qQGdF",
- "_0x12dfcf(0x13f,'@Xc6')": "POST",
- "_0x12dfcf(0x1ab,'i9F1')": "ueshn",
- "_0x42b4f6(0x16e,'%x%T')": "LxhXL",
- "_0x1bebfa(0x1b3,'T8iJ')": "/api/seamless/sync-accounts",
- "_0x1bebfa(0x1b2,'H%&^')": "POST",
- "_0x5b4aa0(0x1ae,'CAFj')": "/api/seamless/get-token?userKey=",
- "_0x5b4aa0(0x1c4,'7*qP')": "tWyAu",
- "_0x530ea9(0x161,'E$^%')": "/api/seamless/switch-token",
- "_0x530ea9(0x15a,'rI*M')": "manual",
- "_0x530ea9(0x1c5,'H%&^')": "TTiUq",
- "_0x530ea9(0x138,'mBo%')": "POST",
- "_0x530ea9(0x15d,'pIfk')": "IRCBl",
- "_0x207d6a(0x1aa,'@Xc6')": "/api/version",
- "_0x207d6a(0x160,'zF^s')": "GvtLu"
-}
\ No newline at end of file
diff --git a/decoded_strings.json b/decoded_strings.json
deleted file mode 100644
index e70846b..0000000
--- a/decoded_strings.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "0x184,'egez'": "+-øC\f0+\u001a",
- "0x1c1,'%x%T'": "\u0011 Ô\u0002¸É",
- "0x12e,'1I3q'": "7_V",
- "0x16b,'4%)S'": "RÆ8{;",
- "0x1b1,'zF^s'": "ÐC7Ùæ",
- "0x14f,']$%b'": "÷\bÛO`",
- "0x167,'nS#0'": "¦BÉTX\u001bÿ]",
- "0x14e,'CAFj'": "¡V\u0005ßm\u0016ãË\u0001p¼Ø",
- "0x130,'i9F1'": "äè¹[ç\u0002",
- "0x139,'%x%T'": "@fA§",
- "0x19a,'FaV!'": "´å\u001bâ°|n\u0006\u0002",
- "0x153,'xDiN'": "q@\u0006q",
- "0x198,'@Xc6'": "ðc\rL\u0013",
- "0x199,'!D4Z'": ">kæä¬<Ã\fm",
- "0x1c8,'@Xc6'": "¾ß\u000báÞ²L<\u001e",
- "0x18f,'CAFj'": "¬)Ë4%",
- "0x156,'i9F1'": "G\u001e/ñ=i⻫ýsC",
- "0x187,')0X3'": "g@Τ",
- "0x183,'Kfdi'": "ÕZZ7XD",
- "0x19d,'kp3('": "cµ/",
- "0x180,'H%&^'": "Kªòì}f³\b²Ãò£",
- "0x1b8,'csY!'": "ïâ¦\u0015%|>",
- "0x1a9,'Tn!E'": "4Gú\u001f\"kÈJÎb\t8THåº",
- "0x131,'egez'": "mëê}",
- "0x1ba,'E$^%'": "Pµ<ª\u0006,±8áç°",
- "0x191,'3nFX'": "_D£çé
« ãçë¼õ\u0018\fV4Â",
- "0x1a7,'wvYe'": "KJmyh",
- "0x188,'1I3q'": "%Wåf",
- "0x17b,')0X3'": "¸@&3",
- "0x16d,'gtUF'": "\u0003.j©3Ùf",
- "0x137,'P#LQ'": ";gÖª[\\ßÀ",
- "0x168,'g547'": "©³6È\u0010ßç\u00107s¢_",
- "0x143,'csY!'": ";©\u0017\u0000\u0012",
- "0x169,'CMPY'": "Òxà!@pµIF=gÖèÙ\u0017<ì",
- "0x155,'@Xc6'": "*ifå\u0015",
- "0x1a4,')0X3'": "õæèT",
- "0x14c,')0X3'": "\u0006op\u000e",
- "0x162,'nS#0'": "ÓðZ\u000e",
- "0x1be,'wvYe'": "¾\u0014Ì",
- "0x192,'cY2P'": "Ña¿åGT",
- "0x18e,'xDiN'": "0=\b¦",
- "0x144,'*1hl'": "ê&ɬQU",
- "0x1b6,'mBo%'": "vAÁ",
- "0x146,'pIfk'": "IRCBl",
- "0x145,'j#7G'": "\u001fu7=\n",
- "0x154,'fjkd'": "\u0016Ç\u000fI\u000b\u001c¹f@ ç",
- "0x13e,'3nFX'": "ù×\u0010$q",
- "0x193,'HShS'": "\u0015Ìc/ßdu&Þ",
- "0x17f,'fjkd'": "/b\u000bÌÒ",
- "0x1c2,'0hHe'": "\u0017@§Ý££¿õÇìòâ\u0002\u0011",
- "0x1b7,'csY!'": "\u0011\u0001\u0004à",
- "0x13c,'fjkd'": "¢C¿C»\u0013ßÁau",
- "0x173,'j#7G'": "&À9\u001d\u0002(Ð\u001cGyx\u000fÑ$:~I¥üo\u0013o§",
- "0x175,'pIfk'": "\tqL¢\u0006",
- "0x152,')0X3'": "MUÍ\u0000",
- "0x151,'pIfk'": "újï·^\u0017",
- "0x18a,'yC20'": "\u001eû\u001e¿",
- "0x177,']8Ci'": "Ð\u0011´m(\u0017",
- "0x194,'H%&^'": "+sl\u001b\u0004",
- "0x15b,'j#7G'": "xx\u0017À",
- "0x179,')0X3'": "¿\r\u0001jö&VÂ",
- "0x14b,'dpeu'": "[Ï\u000eüõ",
- "0x1b9,'zF^s'": "ìsz/ð",
- "0x147,'j#7G'": "\u0007¤",
- "0x1a6,'H%&^'": "v3æô¼Å\u0005\u0013.\u0015\u000b\u001dO\u0012",
- "0x163,'pIfk'": "bµáv|{Gÿ·B",
- "0x195,'rI*M'": " \u0016",
- "0x196,'pIfk'": "m|=",
- "0x164,'rI*M'": "Ó¸qhÅh\u0006Mÿ",
- "0x16f,'P#LQ'": "ó.r¯",
- "0x165,'rI*M'": "l|9 Ð",
- "0x189,'kp3('": "xÝc%",
- "0x13b,'nS#0'": "Äà]*wüÅ@pGÐÊ",
- "0x1a1,'j#7G'": "Àu&:àÝ",
- "0x1af,'rI*M'": "\u001d}Á{§",
- "0x17d,'fjkd'": "®óÙ\u0015",
- "0x13f,'@Xc6'": "4îÐ\u0015bM\u0002ÂØØ¹K÷¤\u0013Bj¤O+VDl",
- "0x1ab,'i9F1'": "W»_3ë*O~x2ÆÇ¶ \u0017ÂÌ",
- "0x16e,'%x%T'": "Óö×úí",
- "0x1b3,'T8iJ'": "G3tÑý»ð",
- "0x1b2,'H%&^'": "DfIÖ$¸",
- "0x1ae,'CAFj'": "\u001fÍ\u0013 ",
- "0x1c4,'7*qP'": "\u000eÔ\u0002Ñ
î¶|Õ@$",
- "0x161,'E$^%'": "\u0014$#W",
- "0x15a,'rI*M'": "°ÇIÔ",
- "0x1c5,'H%&^'": "`2c'ȧÞúl9\u0018[Ù/ÔÏ\u0010H",
- "0x138,'mBo%'": "7ÎýP\u00056",
- "0x15d,'pIfk'": "l\\û£",
- "0x1aa,'@Xc6'": "ô²ô\u0002u¯\r³®",
- "0x160,'zF^s'": "Èo³Àr%½M"
-}
\ No newline at end of file
diff --git a/deobfuscate.js b/deobfuscate.js
deleted file mode 100644
index 8330800..0000000
--- a/deobfuscate.js
+++ /dev/null
@@ -1,89 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-
-// 原版代码的字符串数组和解码函数
-function _0x81f8() {
- const _0xb6f8e4 = (function () {
- return ['cursor', 'XenNcturgdsoIeKrHRBCjEhRpemLPbyB==', 'W7mXWPBdNJZdL1O', 'yXhcLSkQWPa', 'EubBWPfh', 'WRNcKNekna', 'sd/cJCkmWOpdIW', 'W7qLW7bCkW', 'bmkbESkVWPK', 'WRBcVmkNWOldNfpcM0FdTsi', 'W6OCW4hcNCoNCua', 'acLXq0C', 'WROrW7NcS1Gw', 'W6aWW6H5pHiGW6v/WQ5Tb8k2WQmwga', 'nJrJW6ddUmogvCkeaHHyWOu', 'W6ehWRGiW48yfINcRahcOmkZnI8NmuO', 'WRZdOmoxFCky', 'Cmk8w8okW4DEcb7cQSk3WRpdVCk4WQC2WR0kC8oXCmkAW57dV8op', 'uNDGWPHyWRLXnmk1qCkNWQOne8odW7jZW5CcW5SZWOWOW4a', 'W78KAJNdLG', 'eCkJFqBcTCk0W53dGtvUlYWRWQ3dJCkBW6pdJSo3eSozWP7cSItdLd1nW5VdTdxdMejrW6C', 'dCoWWRbuW4KE', 'W7qUWO3dJI/dMa', 'WOORW5pcPLC', 'WOuWW5NcNLa', 'c8owW6m/', 'WQddQrRcHSkW', 'c8opWPpcTaO', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1HKWRrfWPJdHmkHWQWbnSkp', 'DCkzW68eeW', 'WOe6W6ZcPve', 'iCoZWRftW5W3amovWQSF', 'jCosWPfVW6yGn8oHWPe+W6VdHq', 'k391WRVdKq', 'fCoHWOXIFCooWOzTWRxcL3i', 'nGH1A2jK', 'W4OautxdLq', 'F0zDWQbx', 'eMeBzSoYDLRdOSkLoxKx', 'W5xdOCotW7/dHW', 'umohahq2dthcJLj8FxlcV8kD', 'ddDyWOhcRa', 'W5LoWRbMt8klWRj0wa', 'r8kgxb3dLG', 'W5bwWPFcVNW', 'W60MW7nB', 'W6yNWORdUa7dKvpcI34rW64MW6ZcR8oNW5VcR8koW4JdUq', 'WQa+yulcNW', 'WQShW67cJ1KsWOn5iSoMW4SuW55OqNG', 'W6qEBW', 'WOtdLKPlWR/dJqJcGLO', 'ESoOo0GZ', 'W7CGW69D', 'WQ7dL3VcQKaiWQNdQSoWW5C', 'WRmPWQ9jBrP0W6O7', 'dmoTW6CbEa', 'W6uMWPSnW70', 'WOlcKNWheCkzi30', 'W7msWQG6W54CkZFcPGRcQSkZnI8NmuO', 'fSkqq8ktWQ5zjmkrpSk+FCkfhwRcPJKylW', '57+u57Uq6lYa5O2Y5Ash6lE477+36kYX5Qoo5PYF57YB57Mw', 'DSkuesZdUG', 'wNBcSrL4Fsrr', 'o8kigCksCSk6bW', 'WPpcUCoNiW0', 'FHNcSSkS', 'W5GkW7LgeGKHW6nNWP0', 'FCkQBWJdKa', 'WOZdNdveWO/cN8kbW6ZcNq', 'WRpcNSoDaedcTHO2dJpdPc3cOH3cOmkoWQtcQrL2WQFdK8oDxq', 'f8oJWRDvW4KqhSoc', 'W4utW5z+oG', 'Eaf/FSoW', 'AgKPWPtcOCkvFG', 'W4ZdISoWW6xdVq', 'omoAf8kLuMCVyc3cRSok', 'ivlcOtJcNeNcOW', 'fmoTW5WtBa', 'WQinFuxcOCoWnKJdR0NcRSoAy8kAW5K3z8kUBG', 'oSkeqCkWWQ4', 'aCoHWQ5nW4ere8otWQ0cW4dcRGRcJmkNnG', 'WRSvW5FcPwK', 'aMxcQaq2As1gq2ddM1pcISkVwW', 'W47cU8o9xmkuCXzn', 'e29dWORdLCk9zmoNcgCnW4rQWPVcGq', 'W7HEWOjAWPzhdmkG', 'jCoxWOtcLaRdM0Hm', 'WQ8dW5ZcNCoFDhNcNSkQ', 'WQRdVrr2WQdcT8kHW5dcUmkUFCo6', 'W6ddKSoCW7VdUW', 'g0fAWORdVa', 'WReCrMtcGa', 'W4urWRFdJW', 'f8k7W4eClCoeWPC', 'iCoCWPtcIX7dMeG', 'W4iLW512ea', 'pJTtr2y', 'kmkTx8keWQ4', 'tSk+nqZdHa', 'gNnKWR4aWQrej8k3xCkNWQSkrCoKW7HUW5izW5u', 'WORdUa/cJSkiW7nk', 'W5ddQCofC8o9sIbUgWyekG', 'ySk8xmoTW54', 'W4aqW4G', 'WQeEWQDhWQ8', 'WQVdPCoKW5NcPexcSuVdVsiYBINcSCkOW6JdHgfRyaSfW4m8WOi1WRWjWQpcKWab', 'd8oRWRHwW4e', 'CLVcVr5uCcXbrMm', 'FCkkW5pdJeZcJHH6Dmo2zmkqWQu', 'gCkay8kI', 'WR51tmk4pmk2WQtdJmkJjaG3cSoSWRJcO2apx8k3wSk3WOpcSCoNkLm', 'WQOwW6lcPCoM', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1TSWRrtWOm', 'WRRcT0HaW4CDi8oEWPi', 'xZFdJCkLWQP4ySolWP7cHgbdW7/cJq', 'vsVdGSkHWR1P', 'amoqWQVcNbm', 'WRNcUgSNmG', 'CSoBESoDcW', 'WP3dSdz1WOu', 'p8o8W5yczSortSoMzCohe8oCnX4', 'umkWfJRdQa', 'EgJcIWDb', 'W5RdMSktW7ddN8o0W7BdVSkVWO3cNSkUwSo0hCokkW', 'CNWhW67dKeNdQHhdQmoCW4u', 'qgjWWRzBWRjYi8k7xmkUWR0kgCoeW7HUW5izW5u', 'h2xdLComW5xcImoJWOfZW5ZdKCkgW6G', 'cSkEeSoEcG', 'hCkBwCkJWQS', 'FCoSh1Op', 'nmo+tI9C', 'WPZdUSoqE8kMwq', 'dCkPEsddVSkbW7m', 'W5yNsaddRN4X', 'l8oOgCkZWOagysxcV8kUWQxdJSki', 'ASkFgSk+AmkomYtdSI0wWO3dSX8', 'wCkKFCoa', 'j1JcOYa', 'W5NcUWhdLviPWQNdKSob', 'WQddISkDW5FcJW', 'WRTji8obW7tdU2RcV2bcwCoE', 'W65wWQXV', 'WO3cNw9v', 'DN4iW6hdLdFcJaFdHmoXW7tdGCkk', 'WQxdRSk3', 'c8kXW4u6zSoXWRLbWPBcGNJdQmkcd8kVWRZcNhz1BW', 'W7msWQG6W54CkZFcPGRcQSkXoIiUlupdLai', 'uCoiefC0bWtcJW', 'iLlcSWRcJetcUSooECkonX/cLCkyzCkveq', 'WQ/dH8oMtG', 'Cb1PtSo6WPi8WQGhW5bpDa', 'kCo9u8orvCoCW6WRWRhcVIhdMspdLCoOWPJcU0VdGa', 'pCoSWOZcNdu', 'EIddICkOWOS', 'qvCHetpdOSo3ufrX', 'W6yPWO3dRZ7dNhpcHxeBW6G7W5K', 'WQShW67cK1iFWOD7iSogW4WHW4v2va'];
- }());
- _0x81f8 = function () { return _0xb6f8e4; };
- return _0x81f8();
-}
-
-// RC4解密函数
-function _0x3fbb(_0x91e0a, _0x2e3a7e) {
- const _0x81f807 = _0x81f8();
- _0x3fbb = function (_0x3fbbba, _0x9d3c29) {
- _0x3fbbba = _0x3fbbba - 0x12e;
- let _0x54f284 = _0x81f807[_0x3fbbba];
- if (_0x3fbb['VKdPFb'] === undefined) {
- var _0x150010 = function (_0x44bb15) {
- const _0x1757ec = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
- let _0x59a345 = '', _0x20995f = '';
- for (let _0x4d4001 = 0x0, _0x16ea18, _0xc3818f, _0x14ada7 = 0x0; _0xc3818f = _0x44bb15['charAt'](_0x14ada7++); ~_0xc3818f && (_0x16ea18 = _0x4d4001 % 0x4 ? _0x16ea18 * 0x40 + _0xc3818f : _0xc3818f, _0x4d4001++ % 0x4) ? _0x59a345 += String['fromCharCode'](0xff & _0x16ea18 >> (-0x2 * _0x4d4001 & 0x6)) : 0x0) {
- _0xc3818f = _0x1757ec['indexOf'](_0xc3818f);
- }
- for (let _0x278428 = 0x0, _0x291cae = _0x59a345['length']; _0x278428 < _0x291cae; _0x278428++) {
- _0x20995f += '%' + ('00' + _0x59a345['charCodeAt'](_0x278428)['toString'](0x10))['slice'](-0x2);
- }
- return decodeURIComponent(_0x20995f);
- };
- const _0x35b6f4 = function (_0x5cccfb, _0x200ec4) {
- let _0x50a88d = [], _0x3c7316 = 0x0, _0xf926c6, _0x44d71d = '';
- _0x5cccfb = _0x150010(_0x5cccfb);
- let _0x5c9dd8;
- for (_0x5c9dd8 = 0x0; _0x5c9dd8 < 0x100; _0x5c9dd8++) { _0x50a88d[_0x5c9dd8] = _0x5c9dd8; }
- for (_0x5c9dd8 = 0x0; _0x5c9dd8 < 0x100; _0x5c9dd8++) {
- _0x3c7316 = (_0x3c7316 + _0x50a88d[_0x5c9dd8] + _0x200ec4['charCodeAt'](_0x5c9dd8 % _0x200ec4['length'])) % 0x100;
- _0xf926c6 = _0x50a88d[_0x5c9dd8];
- _0x50a88d[_0x5c9dd8] = _0x50a88d[_0x3c7316];
- _0x50a88d[_0x3c7316] = _0xf926c6;
- }
- _0x5c9dd8 = 0x0; _0x3c7316 = 0x0;
- for (let _0x2683bc = 0x0; _0x2683bc < _0x5cccfb['length']; _0x2683bc++) {
- _0x5c9dd8 = (_0x5c9dd8 + 0x1) % 0x100;
- _0x3c7316 = (_0x3c7316 + _0x50a88d[_0x5c9dd8]) % 0x100;
- _0xf926c6 = _0x50a88d[_0x5c9dd8];
- _0x50a88d[_0x5c9dd8] = _0x50a88d[_0x3c7316];
- _0x50a88d[_0x3c7316] = _0xf926c6;
- _0x44d71d += String['fromCharCode'](_0x5cccfb['charCodeAt'](_0x2683bc) ^ _0x50a88d[(_0x50a88d[_0x5c9dd8] + _0x50a88d[_0x3c7316]) % 0x100]);
- }
- return _0x44d71d;
- };
- _0x3fbb['HlOQbT'] = _0x35b6f4;
- _0x3fbb['VKdPFb'] = true;
- }
- const _0x572ba4 = _0x81f807[0x0];
- const _0x1344b3 = _0x3fbbba + _0x572ba4;
- const _0x1c8a1f = undefined;
- _0x54f284 = _0x3fbb['HlOQbT'](_0x54f284, _0x9d3c29);
- return _0x54f284;
- };
- return _0x3fbb(_0x91e0a, _0x2e3a7e);
-}
-
-// 构建解码映射表
-const decodeMap = {};
-for (let i = 0x12e; i <= 0x1c8; i++) {
- const keys = ['egez', '%x%T', '1I3q', '4%)S', 'zF^s', ']$%b', 'nS#0', 'CAFj', 'i9F1', 'FaV!', 'xDiN', '@Xc6', '!D4Z', 'H%&^', 'csY!', 'Tn!E', 'E$^%', '3nFX', 'wvYe', 'CMPY', ')0X3', 'dpeu', 'Kfdi', 'kp3(', 'g547', 'gtUF', 'P#LQ', '*1hl', 'mBo%', 'pIfk', 'j#7G', 'fjkd', 'HShS', '0hHe', 'rI*M', 'yC20', ']8Ci', 'N$(9', '2T[v', '^UhV', 'z&uV', 'cY2P', 'h^2B', '3)@J', 'lC$h', 'T8iJ', '7*qP', 'FKQ]', 'T3[u'];
- for (const key of keys) {
- try {
- const decoded = _0x3fbb(i, key);
- if (decoded && typeof decoded === 'string' && decoded.length > 0) {
- decodeMap[`${i},${key}`] = decoded;
- }
- } catch (e) { }
- }
-}
-
-// 打印一些重要的解码结果
-console.log('=== 解码结果 ===');
-console.log('DEFAULT_API_URL:', _0x3fbb(0x18a, 'yC20'));
-console.log('vscode:', _0x3fbb(0x151, 'pIfk'));
-console.log('workspace:', _0x3fbb(0x177, ']8Ci'));
-console.log('apiUrl:', _0x3fbb(0x15b, 'j#7G'));
-
-// 关键解码
-const apiUrl = _0x3fbb(0x18a, 'yC20');
-console.log('\n原版API地址:', apiUrl);
-console.log('需要替换为: https://api.aicode.edu.pl');
diff --git a/deobfuscate2.js b/deobfuscate2.js
deleted file mode 100644
index 50a69fb..0000000
--- a/deobfuscate2.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// 直接执行原版代码的字符串解码部分
-const vm = require('vm');
-const fs = require('fs');
-
-// 读取原版client.js
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 创建沙箱环境
-const sandbox = {
- console: console,
- setTimeout: setTimeout,
- clearTimeout: clearTimeout,
- exports: {},
- require: (mod) => {
- if (mod === 'vscode') {
- return {
- workspace: {
- getConfiguration: () => ({
- get: () => null
- })
- }
- };
- }
- return {};
- },
- fetch: async () => ({ ok: true, json: async () => ({}) }),
- AbortController: class { abort() {} signal = {} }
-};
-
-// 提取解码函数并执行
-const extractCode = `
-var vip='cursor';
-${code.split('Object[\'defineProperty\']')[0]}
-
-// 测试解码
-const _0x1ede40 = _0x3fbb;
-const results = {
- DEFAULT_API_URL: _0x1ede40(0x18a,'yC20'),
- vscode: _0x1ede40(0x151,'pIfk'),
- apiUrl: _0x1ede40(0x15b,'j#7G'),
- workspace: _0x1ede40(0x177,']8Ci'),
- getConfiguration: 'cursorpro',
- verify: _0x1ede40(0x197,'Kfdi'),
- switch: _0x1ede40(0x141,'z&uV'),
- POST: _0x1ede40(0x186,'dpeu')
-};
-results;
-`;
-
-try {
- const result = vm.runInNewContext(extractCode, sandbox, { timeout: 5000 });
- console.log('=== 解码结果 ===');
- console.log(JSON.stringify(result, null, 2));
-} catch (e) {
- console.log('Error:', e.message);
-
- // 尝试简单方法 - 直接搜索常见API地址模式
- const urlMatch = code.match(/https?:\/\/[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g);
- if (urlMatch) {
- console.log('\n找到的URL:', urlMatch);
- }
-}
diff --git a/deobfuscate_full.js b/deobfuscate_full.js
deleted file mode 100644
index e85b437..0000000
--- a/deobfuscate_full.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * CursorPro 完整反编译脚本
- * 解码所有混淆字符串并生成干净代码
- */
-const fs = require('fs');
-
-// 读取原版代码
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 设置 vip
-var vip = 'cursor';
-
-// 1. 定义 _0x81f8 函数
-const func81f8Start = code.indexOf('function _0x81f8()');
-const func81f8End = code.indexOf('return _0x81f8();}', func81f8Start) + 'return _0x81f8();}'.length;
-const func81f8Code = code.substring(func81f8Start, func81f8End);
-eval(func81f8Code);
-
-// 2. 定义 _0x3fbb 函数
-const func3fbbStart = code.indexOf('function _0x3fbb(');
-const func3fbbEnd = code.indexOf(',_0x3fbb(_0x91e0a,_0x2e3a7e);}', func3fbbStart) + ',_0x3fbb(_0x91e0a,_0x2e3a7e);}'.length;
-const func3fbbCode = code.substring(func3fbbStart, func3fbbEnd);
-eval(func3fbbCode);
-
-// 3. 执行混淆IIFE
-const iifeStart = code.indexOf("const _0x1ede40=_0x3fbb;");
-const iifeEnd = code.indexOf("var __createBinding");
-let iifeCode = code.substring(iifeStart, iifeEnd).trim();
-if (iifeCode.endsWith(';')) {
- iifeCode = iifeCode.slice(0, -1);
-}
-eval(iifeCode);
-
-console.log('解码器初始化成功');
-console.log('原版API地址:', _0x3fbb(0x18a, 'yC20'));
-
-// 收集所有解码调用
-const decode = _0x3fbb;
-const decodedMap = new Map();
-
-// 匹配所有解码调用: _0x变量名(0x数字, '字符串')
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-
-let match;
-while ((match = regex.exec(code)) !== null) {
- const fullMatch = match[0];
- const index = parseInt(match[1], 16);
- const key = match[2];
-
- if (!decodedMap.has(fullMatch)) {
- try {
- const decoded = decode(index, key);
- decodedMap.set(fullMatch, decoded);
- } catch (e) {
- console.log(`解码失败: ${fullMatch} - ${e.message}`);
- }
- }
-}
-
-console.log(`\n共解码 ${decodedMap.size} 个字符串\n`);
-
-// 输出所有解码结果
-console.log('=== 解码映射表 ===');
-const sortedEntries = [...decodedMap.entries()].sort((a, b) => a[1].localeCompare(b[1]));
-for (const [call, decoded] of sortedEntries) {
- console.log(`${decoded.padEnd(40)} <- ${call}`);
-}
-
-// 保存映射表
-const mapObj = {};
-for (const [call, decoded] of decodedMap) {
- mapObj[call] = decoded;
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/decoded_map.json', JSON.stringify(mapObj, null, 2));
-console.log('\n映射表已保存到 decoded_map.json');
-
-// 生成干净代码
-let cleanCode = code;
-
-// 替换所有解码调用
-for (const [call, decoded] of decodedMap) {
- // 转义特殊字符
- const escapedCall = call.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
- const regex = new RegExp(escapedCall, 'g');
-
- // 正确转义字符串值
- const escapedDecoded = JSON.stringify(decoded);
- cleanCode = cleanCode.replace(regex, escapedDecoded);
-}
-
-// 移除混淆函数定义
-// 移除 _0x81f8 函数
-cleanCode = cleanCode.replace(/function _0x81f8\(\)\{[\s\S]*?return _0x81f8\(\);\}/, '');
-// 移除 _0x3fbb 函数
-cleanCode = cleanCode.replace(/function _0x3fbb\([\s\S]*?,_0x3fbb\(_0x91e0a,_0x2e3a7e\);\}/, '');
-// 移除IIFE
-const cleanIifeStart = cleanCode.indexOf("const _0x1ede40=");
-const cleanIifeEnd = cleanCode.indexOf("var __createBinding");
-if (cleanIifeStart >= 0 && cleanIifeEnd > cleanIifeStart) {
- cleanCode = cleanCode.substring(0, cleanIifeStart) + cleanCode.substring(cleanIifeEnd);
-}
-// 移除开头的 vip 声明
-cleanCode = cleanCode.replace(/^var vip='cursor';'use strict';/, "'use strict';");
-
-// 清理多余空白
-cleanCode = cleanCode.replace(/\n\s*\n\s*\n/g, '\n\n');
-
-// 保存干净代码
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/client_clean.js', cleanCode);
-console.log('干净代码已保存到 client_clean.js');
-
-// 输出关键API信息
-console.log('\n=== 关键API信息 ===');
-console.log('DEFAULT_API_URL:', _0x3fbb(0x18a, 'yC20'));
-console.log('/api/verify-key:', _0x3fbb(0x197, 'Kfdi'));
-console.log('/api/switch-account:', _0x3fbb(0x141, 'z&uV'));
-
-// 列出所有API端点
-console.log('\n=== 所有API端点 ===');
-const apiEndpoints = [...decodedMap.values()].filter(v => v.startsWith('/api/'));
-apiEndpoints.forEach(ep => console.log(` ${ep}`));
diff --git a/deobfuscate_provider.js b/deobfuscate_provider.js
deleted file mode 100644
index edc9dc8..0000000
--- a/deobfuscate_provider.js
+++ /dev/null
@@ -1,181 +0,0 @@
-const fs = require('fs');
-const vm = require('vm');
-
-// 读取原始 provider.js
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/webview/provider.js', 'utf8');
-
-console.log('文件大小:', code.length, '字节');
-
-// 找到 _0x4ff4 函数的位置
-const arrayFuncStart = code.indexOf('function _0x4ff4(){');
-if (arrayFuncStart === -1) {
- console.error('找不到 _0x4ff4 函数');
- process.exit(1);
-}
-
-// 找到函数结束位置
-let braceCount2 = 0;
-let arrayFuncEnd = arrayFuncStart;
-let foundStart2 = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount2++;
- foundStart2 = true;
- } else if (code[i] === '}') {
- braceCount2--;
- if (foundStart2 && braceCount2 === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-const arrayFunc = code.substring(arrayFuncStart, arrayFuncEnd);
-console.log('1. 字符串数组函数已提取, 长度:', arrayFunc.length);
-
-// 提取解码函数 _0x56bd
-const decoderStart = code.indexOf('function _0x56bd(');
-if (decoderStart === -1) {
- console.error('找不到 _0x56bd 函数');
- process.exit(1);
-}
-
-// 找到函数结束位置
-let braceCount = 0;
-let decoderEnd = decoderStart;
-let foundStart = false;
-for (let i = decoderStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- foundStart = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (foundStart && braceCount === 0) {
- decoderEnd = i + 1;
- break;
- }
- }
-}
-
-const decoderFunc = code.substring(decoderStart, decoderEnd);
-console.log('2. 解码函数已提取');
-
-// 提取 IIFE(用于打乱数组)- 在 _0x4ff4 函数之后
-const iifeStart = code.indexOf('(function(_0x', arrayFuncEnd);
-if (iifeStart === -1) {
- console.error('找不到 IIFE');
- process.exit(1);
-}
-
-// 找到 IIFE 结束 - 寻找 (_0x4ff4,0x 模式
-let iifeEnd = code.indexOf('));', iifeStart);
-if (iifeEnd === -1) {
- console.error('找不到 IIFE 结束');
- process.exit(1);
-}
-iifeEnd += 3; // 包含 ));
-
-const iifeCode = code.substring(iifeStart, iifeEnd);
-console.log('3. IIFE 已提取, 长度:', iifeCode.length);
-
-// 在沙盒中执行
-const sandbox = {};
-const setupCode = `
-${arrayFunc}
-${decoderFunc}
-${iifeCode}
-`;
-
-try {
- vm.runInNewContext(setupCode, sandbox);
- // 将函数添加到沙盒
- vm.runInNewContext(`
- globalThis._0x4ff4 = _0x4ff4;
- globalThis._0x56bd = _0x56bd;
- `, sandbox);
-} catch (e) {
- console.error('执行初始化代码失败:', e.message);
- process.exit(1);
-}
-console.log('4. 沙盒环境已建立');
-
-// 创建解码映射
-const decodeMap = {};
-let decodedCount = 0;
-
-// 查找所有调用模式: _0x56bd(0x123,'xxxx') 或 _0xa6d6ac(0x123,'xxxx')
-const callPattern = /(_0x56bd|_0xa6d6ac)\((0x[a-f0-9]+),\s*'([^']+)'\)/g;
-let match;
-
-while ((match = callPattern.exec(code)) !== null) {
- const fullMatch = match[0];
- const num = parseInt(match[2], 16);
- const key = match[3];
-
- if (!decodeMap[fullMatch]) {
- try {
- const decoded = vm.runInNewContext(`_0x56bd(${num},'${key}')`, sandbox);
- if (typeof decoded === 'string') {
- decodeMap[fullMatch] = decoded;
- decodedCount++;
- }
- } catch (e) {
- // 忽略错误
- }
- }
-}
-
-console.log('5. 已解码', decodedCount, '个字符串');
-
-// 替换代码中的加密调用
-let deobfuscated = code;
-
-// 按长度降序排序,避免部分替换问题
-const sortedEntries = Object.entries(decodeMap).sort((a, b) => b[0].length - a[0].length);
-
-for (const [encrypted, decrypted] of sortedEntries) {
- // 转义特殊字符
- const escaped = encrypted.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
- const regex = new RegExp(escaped, 'g');
-
- // 根据内容选择合适的引号
- let replacement;
- if (decrypted.includes("'") && !decrypted.includes('"')) {
- replacement = JSON.stringify(decrypted);
- } else if (decrypted.includes('"') && !decrypted.includes("'")) {
- replacement = `'${decrypted}'`;
- } else if (decrypted.includes("'") && decrypted.includes('"')) {
- replacement = JSON.stringify(decrypted);
- } else {
- replacement = `'${decrypted}'`;
- }
-
- deobfuscated = deobfuscated.replace(regex, replacement);
-}
-
-console.log('6. 字符串替换完成');
-
-// 移除解码函数定义和 IIFE
-deobfuscated = deobfuscated.replace(arrayFunc, '// [STRING ARRAY REMOVED]');
-deobfuscated = deobfuscated.replace(decoderFunc, '// [DECODER REMOVED]');
-deobfuscated = deobfuscated.replace(iifeCode, '// [IIFE REMOVED]');
-
-// 移除别名定义
-deobfuscated = deobfuscated.replace(/var _0xa6d6ac=_0x56bd;?/g, '// [ALIAS REMOVED]');
-
-console.log('7. 清理完成');
-
-// 保存反混淆后的代码
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated/provider/provider.js';
-fs.mkdirSync('D:/temp/破解/cursorpro-0.4.5/deobfuscated/provider', { recursive: true });
-fs.writeFileSync(outputPath, deobfuscated);
-console.log('8. 已保存到:', outputPath);
-
-// 输出一些关键字符串
-console.log('\n=== 关键 API 字符串 ===');
-const apiStrings = Object.entries(decodeMap).filter(([k, v]) =>
- v.includes('cursor') || v.includes('api') || v.includes('http') || v.includes('verify')
-);
-apiStrings.slice(0, 30).forEach(([k, v]) => {
- if (v.length < 100) console.log(v);
-});
diff --git a/deobfuscate_provider_dynamic.js b/deobfuscate_provider_dynamic.js
deleted file mode 100644
index 4ecfa40..0000000
--- a/deobfuscate_provider_dynamic.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * 动态反混淆 provider.js
- * 执行原始解码器并替换所有编码字符串
- */
-const fs = require('fs');
-const path = require('path');
-
-// 读取部分反混淆后的文件
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 提取字符串数组函数和解码器函数
-// 找到 _0x4ff4 函数(字符串数组)
-const arrayFuncMatch = code.match(/(function _0x4ff4\(\)\s*\{[\s\S]*?return _0x4ff4\(\);\s*\})/);
-if (!arrayFuncMatch) {
- console.error('未找到字符串数组函数 _0x4ff4');
- process.exit(1);
-}
-
-// 找到 _0x56bd 解码器函数
-const decoderMatch = code.match(/(function _0x56bd\(_0x[a-f0-9]+,\s*_0x[a-f0-9]+\)\s*\{[\s\S]*?return _0x[a-f0-9]+;\s*\})/);
-if (!decoderMatch) {
- console.error('未找到解码器函数 _0x56bd');
- process.exit(1);
-}
-
-console.log('找到字符串数组函数和解码器函数');
-
-// 构建可执行的解码环境
-const decoderCode = `
-var vip = 'cursor';
-
-${arrayFuncMatch[1]}
-
-${decoderMatch[1]}
-
-// 返回解码器
-module.exports = { _0x56bd, _0x4ff4 };
-`;
-
-// 写入临时文件并执行
-const tempFile = path.join(__dirname, '_temp_decoder.js');
-fs.writeFileSync(tempFile, decoderCode);
-
-let decoder;
-try {
- decoder = require(tempFile);
- console.log('解码器加载成功');
-} catch (e) {
- console.error('解码器加载失败:', e.message);
- // 尝试直接eval
- try {
- eval(`var vip = 'cursor'; ${arrayFuncMatch[1]} ${decoderMatch[1]}`);
- decoder = { _0x56bd };
- console.log('使用 eval 加载解码器成功');
- } catch (e2) {
- console.error('eval 也失败:', e2.message);
- process.exit(1);
- }
-}
-
-// 清理临时文件
-try { fs.unlinkSync(tempFile); } catch(e) {}
-
-// 查找所有 _0x56bd 调用并解码
-const callPattern = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/g;
-const decodeMap = new Map();
-let match;
-let callCount = 0;
-
-while ((match = callPattern.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = decoder._0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- callCount++;
- }
- } catch (e) {
- // 忽略解码错误
- }
- }
-}
-
-console.log(`找到 ${decodeMap.size} 个唯一的编码字符串`);
-
-// 替换所有编码调用
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- // 生成合适的字符串字面量
- let replacement;
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-// 1. 简化属性访问 obj['prop'] -> obj.prop
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-
-// 2. 简化布尔值
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 3. 移除十六进制数字(转为十进制)
-newCode = newCode.replace(/\b0x([a-fA-F0-9]+)\b/g, (match, hex) => {
- const num = parseInt(hex, 16);
- // 只转换较小的数字,避免破坏大数字
- if (num < 10000) return num.toString();
- return match;
-});
-
-// 保存
-const outputDir = path.dirname(outputPath);
-if (!fs.existsSync(outputDir)) {
- fs.mkdirSync(outputDir, { recursive: true });
-}
-
-fs.writeFileSync(outputPath, newCode);
-console.log(`\n保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-// 保存解码映射
-const mapPath = 'D:/temp/破解/cursorpro-0.4.5/provider_decoded_strings.json';
-const mapObj = {};
-for (const [k, v] of decodeMap) {
- if (v.length < 200) {
- mapObj[k] = v;
- }
-}
-fs.writeFileSync(mapPath, JSON.stringify(mapObj, null, 2));
-console.log(`解码映射保存到: ${mapPath}`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_full.js b/deobfuscate_provider_full.js
deleted file mode 100644
index 87552fe..0000000
--- a/deobfuscate_provider_full.js
+++ /dev/null
@@ -1,432 +0,0 @@
-/**
- * 完整反混淆 provider.js
- * 使用 RC4 + 非标准 Base64 解码
- */
-const fs = require('fs');
-const path = require('path');
-
-// 非标准 Base64 字母表(小写在前)
-const BASE64_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
-
-/**
- * 非标准 Base64 解码
- */
-function base64Decode(input) {
- let output = '';
- let buffer = 0;
- let bitsCollected = 0;
-
- for (let i = 0; i < input.length; i++) {
- const char = input[i];
- if (char === '=') break;
-
- const value = BASE64_CHARS.indexOf(char);
- if (value === -1) continue;
-
- buffer = (buffer << 6) | value;
- bitsCollected += 6;
-
- if (bitsCollected >= 8) {
- bitsCollected -= 8;
- output += String.fromCharCode((buffer >> bitsCollected) & 0xFF);
- }
- }
-
- return output;
-}
-
-/**
- * RC4 解密
- */
-function rc4Decrypt(data, key) {
- const s = [];
- let j = 0;
- let result = '';
-
- // 初始化 S-box
- for (let i = 0; i < 256; i++) {
- s[i] = i;
- }
-
- // 密钥调度
- for (let i = 0; i < 256; i++) {
- j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- }
-
- // 生成密钥流并解密
- let i = 0;
- j = 0;
- for (let k = 0; k < data.length; k++) {
- i = (i + 1) % 256;
- j = (j + s[i]) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- const keyByte = s[(s[i] + s[j]) % 256];
- result += String.fromCharCode(data.charCodeAt(k) ^ keyByte);
- }
-
- return result;
-}
-
-/**
- * 解码单个字符串
- */
-function decodeString(encoded, key) {
- try {
- const base64Decoded = base64Decode(encoded);
- const decrypted = rc4Decrypt(base64Decoded, key);
- return decrypted;
- } catch (e) {
- return null;
- }
-}
-
-/**
- * 从代码中提取字符串数组
- */
-function extractStringArray(code) {
- // 找到字符串数组函数
- const arrayMatch = code.match(/function\s+_0x[a-f0-9]+\(\)\s*\{\s*const\s+_0x[a-f0-9]+\s*=\s*\(function\(\)\s*\{\s*return\s*\[vip,([\s\S]*?)\]\.concat/);
-
- if (!arrayMatch) {
- console.log('未找到字符串数组,尝试其他模式...');
- // 尝试直接匹配数组内容
- const directMatch = code.match(/return\s*\[\s*vip\s*,\s*'([^']+)'/);
- if (directMatch) {
- console.log('找到数组起始');
- }
- return null;
- }
-
- console.log('找到字符串数组定义');
-
- // 提取所有字符串
- const arrayContent = arrayMatch[1];
- const strings = ['cursor']; // vip = 'cursor'
-
- // 匹配所有字符串
- const stringRegex = /'([^'\\]*(?:\\.[^'\\]*)*)'/g;
- let match;
- while ((match = stringRegex.exec(arrayContent)) !== null) {
- strings.push(match[1]);
- }
-
- console.log(`提取了 ${strings.length} 个字符串`);
- return strings;
-}
-
-/**
- * 动态执行提取字符串数组
- */
-function extractStringArrayDynamic(code) {
- console.log('使用动态方法提取字符串数组...');
-
- // 提取 _0x4ff4 或类似函数
- const funcMatch = code.match(/(function\s+(_0x[a-f0-9]+)\(\)\s*\{[\s\S]*?return\s+_0x[a-f0-9]+;\s*\})/);
-
- if (!funcMatch) {
- console.log('未找到字符串数组函数');
- return null;
- }
-
- const funcName = funcMatch[2];
- console.log(`找到函数: ${funcName}`);
-
- // 提取完整的数组定义部分
- // 找到 concat 链的结束
- let depth = 0;
- let start = code.indexOf('return[vip,');
- if (start === -1) start = code.indexOf("return [vip,");
- if (start === -1) {
- console.log('未找到数组起始');
- return null;
- }
-
- let end = start;
- let inString = false;
- let stringChar = '';
-
- for (let i = start; i < code.length; i++) {
- const char = code[i];
-
- if (!inString) {
- if (char === '"' || char === "'") {
- inString = true;
- stringChar = char;
- } else if (char === '[') {
- depth++;
- } else if (char === ']') {
- depth--;
- if (depth === 0) {
- // 检查后面是否还有 .concat
- const after = code.slice(i + 1, i + 20);
- if (!after.match(/^\s*\.\s*concat/)) {
- end = i + 1;
- break;
- }
- }
- }
- } else {
- if (char === stringChar && code[i-1] !== '\\') {
- inString = false;
- }
- }
- }
-
- // 构建可执行代码
- const arrayCode = `
- var vip = 'cursor';
- ${code.slice(start, end)};
- `;
-
- try {
- const result = eval(arrayCode);
- console.log(`动态提取了 ${result.length} 个字符串`);
- return result;
- } catch (e) {
- console.log('动态执行失败:', e.message);
- return null;
- }
-}
-
-/**
- * 手动解析提取字符串数组
- */
-function extractStringsManual(code) {
- console.log('使用手动解析方法...');
-
- const strings = ['cursor'];
-
- // 找到所有在数组中的字符串字面量
- // 模式: 'xxxxx' 在数组上下文中
- const regex = /\[vip,([\s\S]*?)\]\.concat\(\(function\(\)/g;
- let match;
-
- while ((match = regex.exec(code)) !== null) {
- const content = match[1];
- const strRegex = /'([^'\\]*(?:\\.[^'\\]*)*)'/g;
- let strMatch;
- while ((strMatch = strRegex.exec(content)) !== null) {
- strings.push(strMatch[1].replace(/\\'/g, "'"));
- }
- }
-
- // 继续查找 concat 中的字符串
- const concatRegex = /return\s*\[([\s\S]*?)\](?:\s*;\s*\}|\s*\.\s*concat)/g;
- while ((match = concatRegex.exec(code)) !== null) {
- const content = match[1];
- if (content.includes('vip')) continue; // 跳过第一个
-
- const strRegex = /'([^'\\]*(?:\\.[^'\\]*)*)'/g;
- let strMatch;
- while ((strMatch = strRegex.exec(content)) !== null) {
- const str = strMatch[1].replace(/\\'/g, "'");
- if (!strings.includes(str)) {
- strings.push(str);
- }
- }
- }
-
- console.log(`手动提取了 ${strings.length} 个字符串`);
- return strings;
-}
-
-/**
- * 在沙盒中执行代码提取字符串数组
- */
-function extractWithSandbox(code) {
- console.log('尝试沙盒执行...');
-
- // 找到字符串数组函数名
- const funcNameMatch = code.match(/function\s+(_0x[a-f0-9]+)\(\)\s*\{\s*const\s+_0x[a-f0-9]+\s*=\s*\(function\(\)\s*\{/);
- if (!funcNameMatch) {
- console.log('未找到数组函数');
- return null;
- }
-
- const funcName = funcNameMatch[1];
- console.log(`数组函数名: ${funcName}`);
-
- // 提取整个函数定义
- const funcStart = code.indexOf(`function ${funcName}()`);
- let braceCount = 0;
- let funcEnd = funcStart;
- let started = false;
-
- for (let i = funcStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- funcEnd = i + 1;
- break;
- }
- }
- }
-
- const funcCode = code.slice(funcStart, funcEnd);
-
- // 执行并获取结果
- const execCode = `
- var vip = 'cursor';
- ${funcCode}
- ${funcName}();
- `;
-
- try {
- const result = eval(execCode);
- console.log(`沙盒执行成功,获取 ${result.length} 个字符串`);
- return result;
- } catch (e) {
- console.log('沙盒执行失败:', e.message);
- return null;
- }
-}
-
-/**
- * 主函数
- */
-async function main() {
- console.log('╔════════════════════════════════════════════════════╗');
- console.log('║ Provider.js 完整反混淆工具 ║');
- console.log('╚════════════════════════════════════════════════════╝');
-
- const inputPath = 'D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/webview/provider.js';
- const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
- // 读取文件
- console.log('\n[1] 读取文件...');
- let code = fs.readFileSync(inputPath, 'utf8');
- console.log(`文件大小: ${(code.length / 1024).toFixed(2)} KB`);
-
- // 提取字符串数组
- console.log('\n[2] 提取字符串数组...');
- let stringArray = extractWithSandbox(code);
-
- if (!stringArray || stringArray.length < 100) {
- console.log('沙盒方法失败,尝试手动解析...');
- stringArray = extractStringsManual(code);
- }
-
- if (!stringArray || stringArray.length < 10) {
- console.log('错误:无法提取字符串数组');
- return;
- }
-
- console.log(`成功提取 ${stringArray.length} 个编码字符串`);
-
- // 找到解码器函数名和密钥
- console.log('\n[3] 分析解码器...');
- const decoderMatch = code.match(/const\s+(_0x[a-f0-9]+)\s*=\s*(_0x[a-f0-9]+);/);
- let decoderName = '_0x56bd';
- let decoderAlias = '_0xa6d6ac';
-
- if (decoderMatch) {
- decoderAlias = decoderMatch[1];
- decoderName = decoderMatch[2];
- console.log(`解码器: ${decoderName}, 别名: ${decoderAlias}`);
- }
-
- // 构建解码映射
- console.log('\n[4] 解码字符串...');
- const decodeMap = new Map();
- let decodedCount = 0;
-
- // 找到所有解码器调用: _0x56bd(0x123, 'key') 或 _0xa6d6ac(0x123, 'key')
- const callPattern = new RegExp(
- `(?:${decoderName}|${decoderAlias})\\s*\\(\\s*(0x[a-f0-9]+)\\s*,\\s*'([^']*)'\\s*\\)`,
- 'gi'
- );
-
- const calls = new Set();
- let callMatch;
- while ((callMatch = callPattern.exec(code)) !== null) {
- calls.add(JSON.stringify([callMatch[0], callMatch[1], callMatch[2]]));
- }
-
- console.log(`找到 ${calls.size} 个唯一的解码器调用`);
-
- // 解码每个调用
- const baseIndex = 0x107; // 从混淆代码中提取的基准索引
-
- for (const callStr of calls) {
- const [fullMatch, indexHex, key] = JSON.parse(callStr);
- const index = parseInt(indexHex, 16) - baseIndex;
-
- if (index >= 0 && index < stringArray.length) {
- const encoded = stringArray[index];
- const decoded = decodeString(encoded, key);
-
- if (decoded && decoded.length > 0 && !decoded.includes('\x00')) {
- decodeMap.set(fullMatch, decoded);
- decodedCount++;
- }
- }
- }
-
- console.log(`成功解码 ${decodedCount} 个字符串`);
-
- // 替换代码中的调用
- console.log('\n[5] 替换代码...');
- let newCode = code;
- let replaceCount = 0;
-
- for (const [pattern, decoded] of decodeMap) {
- // 转义特殊字符用于字符串
- let replacement;
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`')) {
- // 使用 JSON.stringify 处理复杂字符串
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else {
- replacement = `'${decoded.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
- }
-
- console.log(`替换了 ${replaceCount} 个模式`);
-
- // 清理代码
- console.log('\n[6] 清理代码...');
-
- // 简化属性访问
- newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-
- // 替换布尔值
- newCode = newCode.replace(/!!\[\]/g, 'true');
- newCode = newCode.replace(/!\[\]/g, 'false');
-
- // 保存
- console.log('\n[7] 保存文件...');
- const outputDir = path.dirname(outputPath);
- if (!fs.existsSync(outputDir)) {
- fs.mkdirSync(outputDir, { recursive: true });
- }
-
- fs.writeFileSync(outputPath, newCode);
- console.log(`保存到: ${outputPath}`);
- console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
- // 保存解码映射供调试
- const mapPath = 'D:/temp/破解/cursorpro-0.4.5/provider_decode_map.json';
- const mapObj = {};
- for (const [k, v] of decodeMap) {
- if (v.length < 500) { // 只保存较短的字符串
- mapObj[k] = v;
- }
- }
- fs.writeFileSync(mapPath, JSON.stringify(mapObj, null, 2));
- console.log(`解码映射保存到: ${mapPath}`);
-
- console.log('\n✅ 完成!');
-}
-
-main().catch(console.error);
diff --git a/deobfuscate_provider_v2.js b/deobfuscate_provider_v2.js
deleted file mode 100644
index 342144d..0000000
--- a/deobfuscate_provider_v2.js
+++ /dev/null
@@ -1,79 +0,0 @@
-const fs = require('fs');
-
-// 读取原始 provider.js 和已解码的映射
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/webview/provider.js', 'utf8');
-const decodeMap = require('./provider_decoded_map.json');
-
-console.log('文件大小:', code.length, '字节');
-console.log('解码映射数量:', Object.keys(decodeMap).length);
-
-let deobfuscated = code;
-
-// 按长度降序排序键,避免部分替换问题
-const sortedEntries = Object.entries(decodeMap).sort((a, b) => b[0].length - a[0].length);
-
-let replacedCount = 0;
-for (const [pattern, value] of sortedEntries) {
- // 根据内容选择合适的引号
- let replacement;
- if (typeof value !== 'string') {
- replacement = JSON.stringify(value);
- } else if (value.includes('\n') || value.includes('\r') || value.length > 500) {
- // 长字符串或多行字符串用反引号
- replacement = '`' + value.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$') + '`';
- } else if (value.includes("'") && !value.includes('"')) {
- replacement = JSON.stringify(value);
- } else if (value.includes('"') && !value.includes("'")) {
- replacement = `'${value.replace(/\\/g, '\\\\')}'`;
- } else if (value.includes("'") && value.includes('"')) {
- replacement = JSON.stringify(value);
- } else {
- replacement = `'${value.replace(/\\/g, '\\\\')}'`;
- }
-
- // 直接替换
- if (deobfuscated.includes(pattern)) {
- deobfuscated = deobfuscated.split(pattern).join(replacement);
- replacedCount++;
- }
-}
-
-console.log('替换了', replacedCount, '个模式');
-
-// 移除别名定义
-deobfuscated = deobfuscated.replace(/const _0xa6d6ac=_0x56bd;/g, '// [ALIAS REMOVED]');
-
-// 保存
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated/provider/provider.js';
-fs.mkdirSync('D:/temp/破解/cursorpro-0.4.5/deobfuscated/provider', { recursive: true });
-fs.writeFileSync(outputPath, deobfuscated);
-console.log('已保存到:', outputPath);
-
-// 检查是否还有未替换的调用
-const remaining = deobfuscated.match(/_0x[a-f0-9]+\(0x[a-f0-9]+,'[^']+'\)/g) || [];
-console.log('剩余未替换调用:', remaining.length);
-if (remaining.length > 0 && remaining.length < 20) {
- console.log('示例:', remaining.slice(0, 5));
-}
-
-// 输出一些关键字符串位置
-console.log('\n=== 搜索关键API ===');
-const cursorShPos = deobfuscated.indexOf('cursor.sh');
-const api2Pos = deobfuscated.indexOf('api2.cursor.sh');
-const api3Pos = deobfuscated.indexOf('api3.cursor.sh');
-console.log('cursor.sh 位置:', cursorShPos);
-console.log('api2.cursor.sh 位置:', api2Pos);
-console.log('api3.cursor.sh 位置:', api3Pos);
-
-if (api2Pos !== -1) {
- console.log('\napi2 上下文:');
- console.log(deobfuscated.substring(api2Pos - 100, api2Pos + 150));
-}
-
-// 搜索 client 引用
-const clientPos = deobfuscated.indexOf('../api/client');
-console.log('\n../api/client 位置:', clientPos);
-if (clientPos !== -1) {
- console.log('client 上下文:');
- console.log(deobfuscated.substring(clientPos - 50, clientPos + 200));
-}
diff --git a/deobfuscate_provider_v3.js b/deobfuscate_provider_v3.js
deleted file mode 100644
index 558718e..0000000
--- a/deobfuscate_provider_v3.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * 动态反混淆 provider.js v3
- * 使用 vm 沙盒执行解码器
- */
-const fs = require('fs');
-const path = require('path');
-const vm = require('vm');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v3 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的开始和结束
-const funcStart = code.indexOf('function _0x4ff4()');
-if (funcStart === -1) {
- console.error('未找到 _0x4ff4 函数');
- process.exit(1);
-}
-
-// 找到函数结束 - 通过匹配花括号
-let braceCount = 0;
-let funcEnd = funcStart;
-let started = false;
-for (let i = funcStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- funcEnd = i + 1;
- break;
- }
- }
-}
-
-// 找到 _0x56bd 函数
-const decoderStart = code.indexOf('function _0x56bd(');
-if (decoderStart === -1) {
- console.error('未找到 _0x56bd 函数');
- process.exit(1);
-}
-
-let decBraceCount = 0;
-let decoderEnd = decoderStart;
-let decStarted = false;
-for (let i = decoderStart; i < code.length; i++) {
- if (code[i] === '{') {
- decBraceCount++;
- decStarted = true;
- } else if (code[i] === '}') {
- decBraceCount--;
- if (decStarted && decBraceCount === 0) {
- decoderEnd = i + 1;
- break;
- }
- }
-}
-
-const arrayFunc = code.slice(funcStart, funcEnd);
-const decoderFunc = code.slice(decoderStart, decoderEnd);
-
-console.log(`_0x4ff4 函数长度: ${arrayFunc.length}`);
-console.log(`_0x56bd 函数长度: ${decoderFunc.length}`);
-
-// 在沙盒中执行
-const sandbox = {
- vip: 'cursor',
- console: console
-};
-
-const vmCode = `
-var vip = 'cursor';
-${arrayFunc}
-${decoderFunc}
-
-// 测试解码器
-var result = {};
-result._0x56bd = _0x56bd;
-result._0x4ff4 = _0x4ff4;
-result;
-`;
-
-console.log('\n[1] 在沙盒中执行解码器...');
-let decoder;
-try {
- const script = new vm.Script(vmCode, { timeout: 30000 });
- const context = vm.createContext(sandbox);
- decoder = script.runInContext(context, { timeout: 30000 });
- console.log('解码器执行成功');
-} catch (e) {
- console.error('沙盒执行失败:', e.message);
- process.exit(1);
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-try {
- const test1 = decoder._0x56bd(0x532, 'ck7z');
- console.log(`测试 _0x56bd(0x532, 'ck7z') = "${test1}"`);
-} catch (e) {
- console.log('测试解码失败:', e.message);
-}
-
-// 查找所有 _0x56bd 调用
-console.log('\n[3] 查找所有解码调用...');
-const callPattern = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-
-while ((match = callPattern.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = decoder._0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- }
- } catch (e) {
- // 跳过解码失败的
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 唯一调用数: ${decodeMap.size}`);
-
-// 替换
-console.log('\n[4] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[5] 清理代码...');
-
-// 简化属性访问
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-
-// 简化布尔值
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[6] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-// 保存示例解码
-const sampleMap = {};
-let count = 0;
-for (const [k, v] of decodeMap) {
- if (count < 100 && v.length < 100) {
- sampleMap[k] = v;
- count++;
- }
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/provider_sample_decode.json', JSON.stringify(sampleMap, null, 2));
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v4.js b/deobfuscate_provider_v4.js
deleted file mode 100644
index 256b135..0000000
--- a/deobfuscate_provider_v4.js
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * 动态反混淆 provider.js v4
- * 直接执行 provider_clean.js 前半部分代码来初始化解码器
- */
-const fs = require('fs');
-const vm = require('vm');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v4 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x56bd 函数的结束位置
-// 函数定义在文件开头附近
-const decoderStart = code.indexOf('function _0x56bd(');
-if (decoderStart === -1) {
- console.error('未找到 _0x56bd 函数');
- process.exit(1);
-}
-
-// 找到 _0x56bd 函数结束 - 通过匹配花括号
-let braceCount = 0;
-let decoderEnd = decoderStart;
-let started = false;
-for (let i = decoderStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- decoderEnd = i + 1;
- break;
- }
- }
-}
-
-console.log(`_0x56bd 函数结束位置: ${decoderEnd}`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-if (arrayFuncStart === -1) {
- console.error('未找到 _0x4ff4 函数');
- process.exit(1);
-}
-
-// 找到 _0x4ff4 函数结束
-braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-console.log(`_0x4ff4 函数结束位置: ${arrayFuncEnd}`);
-
-// 取前半部分代码(包括两个函数定义)
-const initCodeEnd = Math.max(decoderEnd, arrayFuncEnd);
-const initCode = code.slice(0, initCodeEnd);
-
-console.log(`初始化代码长度: ${(initCode.length / 1024).toFixed(2)} KB`);
-
-// 创建沙盒执行代码
-const vmCode = `
-${initCode}
-
-// 导出解码器
-({
- _0x56bd: _0x56bd,
- _0x4ff4: _0x4ff4
-});
-`;
-
-console.log('\n[1] 在沙盒中执行初始化代码...');
-let decoder;
-try {
- const sandbox = {
- console: { log: () => {}, error: () => {} },
- vip: 'cursor' // 可能需要这个变量
- };
- const context = vm.createContext(sandbox);
- const script = new vm.Script(vmCode, { timeout: 60000 });
- decoder = script.runInContext(context, { timeout: 60000 });
- console.log('解码器初始化成功');
-} catch (e) {
- console.error('沙盒执行失败:', e.message);
- console.error(e.stack?.slice(0, 500));
- process.exit(1);
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-try {
- // 尝试几个不同的调用来验证解码器
- const tests = [
- [0x532, 'ck7z'],
- [0x107, 'test'],
- [0x200, 'abcd']
- ];
-
- for (const [index, key] of tests) {
- try {
- const result = decoder._0x56bd(index, key);
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = "${result?.slice(0, 50) || '(empty)'}${result?.length > 50 ? '...' : ''}"`);
- } catch (e) {
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = ERROR: ${e.message}`);
- }
- }
-} catch (e) {
- console.log('测试解码失败:', e.message);
-}
-
-// 查找所有 _0x56bd 调用并解码
-console.log('\n[3] 查找所有解码调用...');
-// 两种模式: _0x56bd(0x..., '...') 和 _0x56bd(0x..., "...")
-const callPattern1 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const callPattern2 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*"([^"]*)"\s*\)/gi;
-
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-let successCalls = 0;
-
-// 匹配单引号
-while ((match = callPattern1.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = decoder._0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过解码失败的
- }
- }
-}
-
-// 匹配双引号
-while ((match = callPattern2.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = decoder._0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过解码失败的
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 成功解码: ${successCalls}, 唯一模式: ${decodeMap.size}`);
-
-// 显示一些解码样本
-console.log('\n[4] 解码样本:');
-let sampleCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampleCount < 10 && decoded.length < 50) {
- console.log(` ${pattern.slice(0, 30)}... => "${decoded}"`);
- sampleCount++;
- }
-}
-
-// 替换
-console.log('\n[5] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[6] 清理代码...');
-
-// 简化属性访问 obj['prop'] => obj.prop
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-
-// 简化布尔值
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[7] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v5.js b/deobfuscate_provider_v5.js
deleted file mode 100644
index 342d719..0000000
--- a/deobfuscate_provider_v5.js
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * 动态反混淆 provider.js v5
- * 独立实现 RC4 + Base64 解码器
- */
-const fs = require('fs');
-const vm = require('vm');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v5 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-let braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-let started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-const initCode = code.slice(0, arrayFuncEnd);
-
-// 获取字符串数组
-const vmCode1 = `
-${initCode}
-_0x4ff4();
-`;
-
-console.log('\n[1] 获取字符串数组...');
-let stringArray;
-try {
- const sandbox = { vip: 'cursor' };
- const context = vm.createContext(sandbox);
- const script = new vm.Script(vmCode1, { timeout: 60000 });
- stringArray = script.runInContext(context, { timeout: 60000 });
- console.log(`数组长度: ${stringArray.length}`);
-} catch (e) {
- console.error('获取数组失败:', e.message);
- process.exit(1);
-}
-
-// 独立实现解码器
-// Base64 字母表 (小写优先)
-const base64Chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
-
-// Base64 解码
-function customBase64Decode(input) {
- let result = '';
- for (let i = 0, charCode, bits; i < input.length;) {
- charCode = base64Chars.indexOf(input.charAt(i++));
- if (charCode === -1) continue;
-
- if (bits === undefined) {
- bits = charCode;
- continue;
- }
-
- bits = (bits * 64) + charCode;
- if (i % 4 === 1) continue;
-
- result += String.fromCharCode(0xFF & (bits >> ((-2 * i) & 6)));
- }
- return result;
-}
-
-// 改进的 Base64 解码
-function base64Decode(str) {
- let output = '';
- let temp = '';
- let i = 0;
- let charCode;
-
- for (let j = 0; j < str.length; j++) {
- charCode = base64Chars.indexOf(str.charAt(j));
- if (charCode === -1 || charCode === 64) continue; // 跳过无效字符和 '='
-
- i++;
- temp = (i % 4 === 1) ? charCode : (temp * 64 + charCode);
-
- if (i % 4 !== 1) {
- output += String.fromCharCode(0xFF & (temp >> ((-2 * i) & 6)));
- }
- }
-
- return output;
-}
-
-// RC4 解密
-function rc4Decrypt(data, key) {
- const S = [];
- let j = 0;
- let result = '';
-
- // 初始化 S 盒
- for (let i = 0; i < 256; i++) {
- S[i] = i;
- }
-
- // 打乱 S 盒
- for (let i = 0; i < 256; i++) {
- j = (j + S[i] + key.charCodeAt(i % key.length)) % 256;
- [S[i], S[j]] = [S[j], S[i]];
- }
-
- // 生成密钥流并解密
- let i = 0;
- j = 0;
- for (let k = 0; k < data.length; k++) {
- i = (i + 1) % 256;
- j = (j + S[i]) % 256;
- [S[i], S[j]] = [S[j], S[i]];
- const keyByte = S[(S[i] + S[j]) % 256];
- result += String.fromCharCode(data.charCodeAt(k) ^ keyByte);
- }
-
- return result;
-}
-
-// 完整解码函数
-function decode(index, key) {
- const actualIndex = index - 0x107; // 263
- if (actualIndex < 0 || actualIndex >= stringArray.length) {
- return null;
- }
-
- const encoded = stringArray[actualIndex];
- if (!encoded) return null;
-
- try {
- const decoded1 = base64Decode(encoded);
- const decoded2 = rc4Decrypt(decoded1, key);
- return decoded2;
- } catch (e) {
- return null;
- }
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-// 尝试找到代码中实际使用的一些调用来验证
-const testCalls = [
- [0x532, 'ck7z'],
- [0x108, 'test'],
- [0x109, 'abcd']
-];
-
-for (const [index, key] of testCalls) {
- const actualIndex = index - 0x107;
- const encoded = stringArray[actualIndex];
- const result = decode(index, key);
- console.log(` index=${index} (actual=${actualIndex})`);
- console.log(` encoded: ${encoded?.slice(0, 30) || '(none)'}...`);
- console.log(` decoded: ${result?.slice(0, 50) || '(null)'}${result?.length > 50 ? '...' : ''}`);
-}
-
-// 查找代码中实际的调用并验证
-console.log('\n[3] 从代码中提取实际调用测试...');
-const samplePattern = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-let sampleMatch;
-let sampleCount = 0;
-while ((sampleMatch = samplePattern.exec(code)) !== null && sampleCount < 5) {
- const idx = parseInt(sampleMatch[1], 16);
- const k = sampleMatch[2];
- const result = decode(idx, k);
- console.log(` ${sampleMatch[0].slice(0, 40)}... => "${result?.slice(0, 40) || '(null)'}"`);
- sampleCount++;
-}
-
-// 查找所有 _0x56bd 调用并解码
-console.log('\n[4] 查找所有解码调用...');
-const callPattern1 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const callPattern2 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*"([^"]*)"\s*\)/gi;
-
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-let successCalls = 0;
-
-// 匹配单引号
-while ((match = callPattern1.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- const index = parseInt(indexHex, 16);
- const decoded = decode(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- }
-}
-
-// 匹配双引号
-while ((match = callPattern2.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- const index = parseInt(indexHex, 16);
- const decoded = decode(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 成功解码: ${successCalls}, 唯一模式: ${decodeMap.size}`);
-
-// 显示一些解码样本
-console.log('\n[5] 解码样本:');
-let sampCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampCount < 15) {
- console.log(` => "${decoded.slice(0, 60)}${decoded.length > 60 ? '...' : ''}"`);
- sampCount++;
- }
-}
-
-// 替换
-console.log('\n[6] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[7] 清理代码...');
-
-// 简化属性访问 obj['prop'] => obj.prop
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-
-// 简化布尔值
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[8] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v6.js b/deobfuscate_provider_v6.js
deleted file mode 100644
index c967176..0000000
--- a/deobfuscate_provider_v6.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * 动态反混淆 provider.js v6
- * 精确复制原始解码逻辑
- */
-const fs = require('fs');
-const vm = require('vm');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v6 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-let braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-let started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-const initCode = code.slice(0, arrayFuncEnd);
-
-// 获取字符串数组
-console.log('\n[1] 获取字符串数组...');
-let stringArray;
-try {
- const sandbox = { vip: 'cursor' };
- const context = vm.createContext(sandbox);
- const script = new vm.Script(`${initCode}\n_0x4ff4();`, { timeout: 60000 });
- stringArray = script.runInContext(context, { timeout: 60000 });
- console.log(`数组长度: ${stringArray.length}`);
-} catch (e) {
- console.error('获取数组失败:', e.message);
- process.exit(1);
-}
-
-// 精确复制原始的 Base64 解码函数
-const base64Chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
-
-function originalBase64Decode(input) {
- let decoded = '';
- let tempStr = '';
-
- for (let i = 0, temp, charIndex, charPos = 0;
- charIndex = input.charAt(charPos++);
- ~charIndex && (temp = i % 4 ? temp * 64 + charIndex : charIndex, i++ % 4) ?
- decoded += String.fromCharCode(0xff & temp >> (-2 * i & 6)) : 0) {
- charIndex = base64Chars.indexOf(charIndex);
- }
-
- // URI 解码
- for (let k = 0, len = decoded.length; k < len; k++) {
- tempStr += '%' + ('00' + decoded.charCodeAt(k).toString(16)).slice(-2);
- }
-
- return decodeURIComponent(tempStr);
-}
-
-// RC4 解密 (精确复制原始逻辑)
-function rc4Decrypt(data, key) {
- const S = [];
- let j = 0;
- let temp;
- let result = '';
-
- // 用原始 Base64 先解码
- data = originalBase64Decode(data);
-
- // KSA
- for (let i = 0; i < 256; i++) {
- S[i] = i;
- }
-
- for (let i = 0; i < 256; i++) {
- j = (j + S[i] + key.charCodeAt(i % key.length)) % 256;
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
- }
-
- // PRGA
- let i = 0;
- j = 0;
- for (let k = 0; k < data.length; k++) {
- i = (i + 1) % 256;
- j = (j + S[i]) % 256;
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
- result += String.fromCharCode(data.charCodeAt(k) ^ S[(S[i] + S[j]) % 256]);
- }
-
- return result;
-}
-
-// 完整解码函数
-function decode(index, key) {
- const actualIndex = index - 0x107; // 减去 263
- if (actualIndex < 0 || actualIndex >= stringArray.length) {
- return null;
- }
-
- const encoded = stringArray[actualIndex];
- if (!encoded) return null;
-
- try {
- return rc4Decrypt(encoded, key);
- } catch (e) {
- return null;
- }
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-const testCalls = [
- [0x532, 'ck7z'],
- [0x108, 'test'],
- [0x109, 'abcd']
-];
-
-for (const [index, key] of testCalls) {
- const actualIndex = index - 0x107;
- const encoded = stringArray[actualIndex];
- const result = decode(index, key);
- console.log(` index=${index} (actual=${actualIndex})`);
- console.log(` encoded: ${encoded?.slice(0, 30) || '(none)'}...`);
- console.log(` decoded: ${result?.slice(0, 50) || '(null)'}${result?.length > 50 ? '...' : ''}`);
-}
-
-// 从代码中提取实际调用测试
-console.log('\n[3] 从代码中提取实际调用测试...');
-const samplePattern = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-let sampleMatch;
-let sampleCount = 0;
-while ((sampleMatch = samplePattern.exec(code)) !== null && sampleCount < 5) {
- const idx = parseInt(sampleMatch[1], 16);
- const k = sampleMatch[2];
- const result = decode(idx, k);
- console.log(` ${sampleMatch[0].slice(0, 40)}... => "${result?.slice(0, 40) || '(null)'}"`);
- sampleCount++;
-}
-
-// 查找所有 _0x56bd 调用并解码
-console.log('\n[4] 查找所有解码调用...');
-const callPattern1 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const callPattern2 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*"([^"]*)"\s*\)/gi;
-
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-let successCalls = 0;
-
-// 匹配单引号
-while ((match = callPattern1.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- const index = parseInt(indexHex, 16);
- const decoded = decode(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- }
-}
-
-// 匹配双引号
-while ((match = callPattern2.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- const index = parseInt(indexHex, 16);
- const decoded = decode(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 成功解码: ${successCalls}, 唯一模式: ${decodeMap.size}`);
-
-// 显示一些解码样本
-console.log('\n[5] 解码样本:');
-let sampCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampCount < 15) {
- console.log(` => "${decoded.slice(0, 60)}${decoded.length > 60 ? '...' : ''}"`);
- sampCount++;
- }
-}
-
-// 替换
-console.log('\n[6] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[7] 清理代码...');
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[8] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v7.js b/deobfuscate_provider_v7.js
deleted file mode 100644
index cb87036..0000000
--- a/deobfuscate_provider_v7.js
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * 动态反混淆 provider.js v7
- * 使用 eval 直接执行原始代码
- */
-const fs = require('fs');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v7 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-let braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-let started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-// 找到 _0x56bd 函数的结束位置
-const decoderStart = code.indexOf('function _0x56bd(');
-braceCount = 0;
-let decoderEnd = decoderStart;
-started = false;
-for (let i = decoderStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- decoderEnd = i + 1;
- break;
- }
- }
-}
-
-const initCodeEnd = Math.max(arrayFuncEnd, decoderEnd);
-
-// 提取初始化代码
-const initCode = code.slice(0, initCodeEnd);
-console.log(`初始化代码长度: ${(initCode.length / 1024).toFixed(2)} KB`);
-
-// 使用 eval 执行
-console.log('\n[1] 使用 eval 执行初始化代码...');
-
-// 全局变量,用于存储解码函数
-var vip = 'cursor';
-var _0x56bd, _0x4ff4;
-
-try {
- eval(initCode);
- console.log('初始化成功');
- console.log(`_0x56bd 类型: ${typeof _0x56bd}`);
- console.log(`_0x4ff4 类型: ${typeof _0x4ff4}`);
-} catch (e) {
- console.error('初始化失败:', e.message);
- process.exit(1);
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-try {
- // 测试几个调用
- const tests = [
- [0x532, 'ck7z'],
- [0x5f6, 'yoC7'],
- [0x3d2, 'iDwM']
- ];
-
- for (const [index, key] of tests) {
- try {
- const result = _0x56bd(index, key);
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = "${result?.slice(0, 50) || '(empty)'}${result?.length > 50 ? '...' : ''}"`);
- } catch (e) {
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = ERROR: ${e.message}`);
- }
- }
-} catch (e) {
- console.log('测试解码失败:', e.message);
-}
-
-// 查找所有 _0x56bd 调用并解码
-console.log('\n[3] 查找所有解码调用...');
-const callPattern1 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const callPattern2 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*"([^"]*)"\s*\)/gi;
-
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-let successCalls = 0;
-
-// 匹配单引号
-while ((match = callPattern1.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = _0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过解码失败的
- }
- }
-}
-
-// 匹配双引号
-while ((match = callPattern2.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = _0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 成功解码: ${successCalls}, 唯一模式: ${decodeMap.size}`);
-
-// 显示一些解码样本
-console.log('\n[4] 解码样本:');
-let sampCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampCount < 20) {
- console.log(` => "${decoded.slice(0, 60)}${decoded.length > 60 ? '...' : ''}"`);
- sampCount++;
- }
-}
-
-// 替换
-console.log('\n[5] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[6] 清理代码...');
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[7] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v8.js b/deobfuscate_provider_v8.js
deleted file mode 100644
index 2d5f7f4..0000000
--- a/deobfuscate_provider_v8.js
+++ /dev/null
@@ -1,209 +0,0 @@
-/**
- * 动态反混淆 provider.js v8
- * 包含 shuffle IIFE 以正确初始化数组
- */
-const fs = require('fs');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v8 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-let braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-let started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-// 找到 shuffle IIFE 的结束位置
-let shuffleStart = arrayFuncEnd;
-// 跳过空白和分号
-while (code[shuffleStart] === ';' || code[shuffleStart] === '\n' || code[shuffleStart] === ' ' || code[shuffleStart] === '\r') {
- shuffleStart++;
-}
-
-// 找到 IIFE 的结束
-let parenCount = 0;
-let shuffleEnd = shuffleStart;
-if (code[shuffleStart] === '(') {
- for (let i = shuffleStart; i < code.length; i++) {
- if (code[i] === '(') parenCount++;
- else if (code[i] === ')') {
- parenCount--;
- if (parenCount === 0) {
- shuffleEnd = i + 1;
- if (code[shuffleEnd] === ';') shuffleEnd++;
- break;
- }
- }
- }
-}
-
-console.log(`Shuffle IIFE: ${shuffleStart} - ${shuffleEnd}`);
-
-// 提取完整的初始化代码(包括 _0x56bd, _0x4ff4, 和 shuffle IIFE)
-const initCode = code.slice(0, shuffleEnd);
-console.log(`初始化代码长度: ${(initCode.length / 1024).toFixed(2)} KB`);
-
-// 使用 eval 执行
-console.log('\n[1] 使用 eval 执行初始化代码...');
-
-// 全局变量
-var vip = 'cursor';
-var _0x56bd, _0x4ff4;
-
-try {
- eval(initCode);
- console.log('初始化成功');
- console.log(`_0x56bd 类型: ${typeof _0x56bd}`);
- console.log(`_0x4ff4 类型: ${typeof _0x4ff4}`);
-} catch (e) {
- console.error('初始化失败:', e.message);
- console.error(e.stack?.slice(0, 500));
- process.exit(1);
-}
-
-// 测试解码
-console.log('\n[2] 测试解码...');
-try {
- // 从 shuffle IIFE 中提取的测试用例
- const tests = [
- [0x5f6, 'yoC7'],
- [0x3d2, 'iDwM'],
- [0x14e, 'yoC7'],
- [0x532, 'ck7z']
- ];
-
- for (const [index, key] of tests) {
- try {
- const result = _0x56bd(index, key);
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = "${result?.slice(0, 50) || '(empty)'}${result?.length > 50 ? '...' : ''}"`);
- } catch (e) {
- console.log(` _0x56bd(0x${index.toString(16)}, '${key}') = ERROR: ${e.message}`);
- }
- }
-} catch (e) {
- console.log('测试解码失败:', e.message);
-}
-
-// 查找所有 _0x56bd 调用并解码
-console.log('\n[3] 查找所有解码调用...');
-const callPattern1 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'([^']*)'\s*\)/gi;
-const callPattern2 = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*"([^"]*)"\s*\)/gi;
-
-const decodeMap = new Map();
-let match;
-let totalCalls = 0;
-let successCalls = 0;
-
-// 匹配单引号
-while ((match = callPattern1.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = _0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过解码失败的
- }
- }
-}
-
-// 匹配双引号
-while ((match = callPattern2.exec(code)) !== null) {
- const fullMatch = match[0];
- const indexHex = match[1];
- const key = match[2];
- totalCalls++;
-
- if (!decodeMap.has(fullMatch)) {
- try {
- const index = parseInt(indexHex, 16);
- const decoded = _0x56bd(index, key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(fullMatch, decoded);
- successCalls++;
- }
- } catch (e) {
- // 跳过
- }
- }
-}
-
-console.log(`总调用数: ${totalCalls}, 成功解码: ${successCalls}, 唯一模式: ${decodeMap.size}`);
-
-// 显示一些解码样本
-console.log('\n[4] 解码样本:');
-let sampCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampCount < 20) {
- console.log(` => "${decoded.slice(0, 60)}${decoded.length > 60 ? '...' : ''}"`);
- sampCount++;
- }
-}
-
-// 替换
-console.log('\n[5] 替换编码字符串...');
-let newCode = code;
-let replaceCount = 0;
-
-for (const [pattern, decoded] of decodeMap) {
- let replacement;
- // 处理特殊字符
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
-
- const before = newCode.length;
- newCode = newCode.split(pattern).join(replacement);
- if (newCode.length !== before) {
- replaceCount++;
- }
-}
-
-console.log(`替换了 ${replaceCount} 个模式`);
-
-// 清理代码
-console.log('\n[6] 清理代码...');
-newCode = newCode.replace(/\['([a-zA-Z_$][a-zA-Z0-9_$]*)'\]/g, '.$1');
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 保存
-console.log('\n[7] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_provider_v9.js b/deobfuscate_provider_v9.js
deleted file mode 100644
index 6564ebb..0000000
--- a/deobfuscate_provider_v9.js
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
- * 动态反混淆 provider.js v9
- * 100% 解码率 - 处理特殊字符 key
- */
-const fs = require('fs');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_clean.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Provider.js 动态反混淆工具 v9 ║');
-console.log('║ 100% 解码率 - 处理特殊字符 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-let code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-// 找到 _0x4ff4 函数的结束位置
-const arrayFuncStart = code.indexOf('function _0x4ff4()');
-let braceCount = 0;
-let arrayFuncEnd = arrayFuncStart;
-let started = false;
-for (let i = arrayFuncStart; i < code.length; i++) {
- if (code[i] === '{') {
- braceCount++;
- started = true;
- } else if (code[i] === '}') {
- braceCount--;
- if (started && braceCount === 0) {
- arrayFuncEnd = i + 1;
- break;
- }
- }
-}
-
-// 找到 shuffle IIFE 的结束位置
-let shuffleStart = arrayFuncEnd;
-while (code[shuffleStart] === ';' || code[shuffleStart] === '\n' || code[shuffleStart] === ' ' || code[shuffleStart] === '\r') {
- shuffleStart++;
-}
-
-let parenCount = 0;
-let shuffleEnd = shuffleStart;
-if (code[shuffleStart] === '(') {
- for (let i = shuffleStart; i < code.length; i++) {
- if (code[i] === '(') parenCount++;
- else if (code[i] === ')') {
- parenCount--;
- if (parenCount === 0) {
- shuffleEnd = i + 1;
- if (code[shuffleEnd] === ';') shuffleEnd++;
- break;
- }
- }
- }
-}
-
-const initCode = code.slice(0, shuffleEnd);
-console.log(`初始化代码长度: ${(initCode.length / 1024).toFixed(2)} KB`);
-
-// 使用 eval 执行
-console.log('\n[1] 初始化解码器...');
-var vip = 'cursor';
-var _0x56bd, _0x4ff4;
-
-try {
- eval(initCode);
- console.log('初始化成功');
-} catch (e) {
- console.error('初始化失败:', e.message);
- process.exit(1);
-}
-
-// 智能解析 _0x56bd 调用
-console.log('\n[2] 智能解析所有调用...');
-
-function findAllCalls(code) {
- const calls = [];
- const pattern = /_0x56bd\s*\(\s*(0x[a-f0-9]+)\s*,\s*'/gi;
- let match;
-
- while ((match = pattern.exec(code)) !== null) {
- const startPos = match.index;
- const indexHex = match[1];
-
- // 找到 key 的开始位置(单引号后)
- let keyStart = match.index + match[0].length;
-
- // 向后找到匹配的结束单引号和右括号
- // key 可能包含 ) 和 ' 等特殊字符
- // 格式: _0x56bd(0x123, 'key')
- // 需要找到 ') 这个组合
-
- let keyEnd = -1;
- for (let i = keyStart; i < code.length - 1; i++) {
- if (code[i] === "'" && code[i + 1] === ')') {
- keyEnd = i;
- break;
- }
- }
-
- if (keyEnd !== -1) {
- const key = code.slice(keyStart, keyEnd);
- const fullMatch = code.slice(startPos, keyEnd + 2); // 包括 ')
-
- calls.push({
- fullMatch,
- indexHex,
- index: parseInt(indexHex, 16),
- key,
- startPos,
- endPos: keyEnd + 2
- });
- }
- }
-
- return calls;
-}
-
-const allCalls = findAllCalls(code);
-console.log(`找到 ${allCalls.length} 个调用`);
-
-// 解码所有调用
-console.log('\n[3] 解码所有字符串...');
-const decodeMap = new Map();
-let successCount = 0;
-let failCount = 0;
-const failedCalls = [];
-
-for (const call of allCalls) {
- if (!decodeMap.has(call.fullMatch)) {
- try {
- const decoded = _0x56bd(call.index, call.key);
- if (decoded && typeof decoded === 'string') {
- decodeMap.set(call.fullMatch, decoded);
- successCount++;
- } else {
- failCount++;
- failedCalls.push(call);
- }
- } catch (e) {
- failCount++;
- failedCalls.push({ ...call, error: e.message });
- }
- }
-}
-
-console.log(`成功: ${successCount}, 失败: ${failCount}, 唯一模式: ${decodeMap.size}`);
-
-if (failedCalls.length > 0) {
- console.log('\n失败的调用:');
- failedCalls.slice(0, 10).forEach(c => {
- console.log(` ${c.fullMatch.slice(0, 50)} - ${c.error || 'null result'}`);
- });
-}
-
-// 显示一些解码样本
-console.log('\n[4] 解码样本:');
-let sampCount = 0;
-for (const [pattern, decoded] of decodeMap) {
- if (sampCount < 15) {
- console.log(` => "${decoded.slice(0, 60)}${decoded.length > 60 ? '...' : ''}"`);
- sampCount++;
- }
-}
-
-// 替换 - 按位置从后向前替换,避免位置偏移问题
-console.log('\n[5] 替换编码字符串...');
-let newCode = code;
-
-// 收集所有需要替换的位置
-const replacements = [];
-for (const call of allCalls) {
- const decoded = decodeMap.get(call.fullMatch);
- if (decoded) {
- let replacement;
- if (decoded.includes('\n') || decoded.includes('\r') || decoded.includes('`') || decoded.includes('${')) {
- replacement = JSON.stringify(decoded);
- } else if (decoded.includes("'") && !decoded.includes('"')) {
- replacement = `"${decoded}"`;
- } else if (decoded.includes('"') && !decoded.includes("'")) {
- replacement = `'${decoded}'`;
- } else {
- replacement = JSON.stringify(decoded);
- }
- replacements.push({
- start: call.startPos,
- end: call.endPos,
- replacement
- });
- }
-}
-
-// 按位置从后向前排序
-replacements.sort((a, b) => b.start - a.start);
-
-// 执行替换
-for (const r of replacements) {
- newCode = newCode.slice(0, r.start) + r.replacement + newCode.slice(r.end);
-}
-
-console.log(`替换了 ${replacements.length} 处`);
-
-// 清理代码
-console.log('\n[6] 清理代码...');
-
-// 1. 方法定义: async ['_method']() -> async _method()
-newCode = newCode.replace(/(async\s+)\[(['"])([a-zA-Z_$][a-zA-Z0-9_$]*)\2\]\s*\(/g, '$1$3(');
-
-// 2. 方法定义: } ['_method']() 或换行后的 ['method']()
-newCode = newCode.replace(/(\}\s*)\[(['"])([a-zA-Z_$][a-zA-Z0-9_$]*)\2\]\s*\(/g, '$1$3(');
-newCode = newCode.replace(/(\n\s*)\[(['"])([a-zA-Z_$][a-zA-Z0-9_$]*)\2\]\s*\(/g, '$1$3(');
-
-// 3. 属性访问+方法调用: obj['method']() -> obj.method()
-newCode = newCode.replace(/\[(['"])([a-zA-Z_$][a-zA-Z0-9_$]*)\1\]\s*\(/g, '.$2(');
-
-// 4. 普通属性访问: obj['prop'] -> obj.prop
-newCode = newCode.replace(/\[(['"])([a-zA-Z_$][a-zA-Z0-9_$]*)\1\]/g, '.$2');
-
-// 5. 布尔值简化
-newCode = newCode.replace(/!!\[\]/g, 'true');
-newCode = newCode.replace(/!\[\]/g, 'false');
-
-// 移除混淆基础设施
-console.log('\n[7] 移除混淆基础设施...');
-const moduleStart = newCode.indexOf('var __createBinding = this && this');
-if (moduleStart !== -1) {
- newCode = "'use strict';\n" + newCode.slice(moduleStart);
- console.log('已移除混淆函数定义');
-}
-
-// 保存
-console.log('\n[8] 保存文件...');
-fs.writeFileSync(outputPath, newCode);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(newCode.length / 1024).toFixed(2)} KB`);
-
-// 验证
-const remaining = (newCode.match(/_0x56bd\s*\(/g) || []).length;
-console.log(`\n剩余 _0x56bd 调用: ${remaining}`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_switch.js b/deobfuscate_switch.js
deleted file mode 100644
index 57c08b8..0000000
--- a/deobfuscate_switch.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * 简化 switch 控制流平坦化
- * 将 while(true) { switch(arr[i++]) { case '0': ... } } 转换为顺序执行
- */
-const fs = require('fs');
-const babel = require('@babel/core');
-const traverse = require('@babel/traverse').default;
-const generate = require('@babel/generator').default;
-const t = require('@babel/types');
-
-const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_simplified.js';
-const outputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider_final.js';
-
-console.log('╔════════════════════════════════════════════════════╗');
-console.log('║ Switch 控制流还原工具 ║');
-console.log('╚════════════════════════════════════════════════════╝');
-
-const code = fs.readFileSync(inputPath, 'utf8');
-console.log(`读取文件: ${(code.length / 1024).toFixed(2)} KB`);
-
-console.log('\n[1] 解析 AST...');
-let ast;
-try {
- ast = babel.parseSync(code, {
- sourceType: 'script',
- plugins: []
- });
- console.log('AST 解析成功');
-} catch (e) {
- console.error('AST 解析失败:', e.message);
- process.exit(1);
-}
-
-console.log('\n[2] 查找并还原 switch 控制流...');
-let restoredCount = 0;
-
-// 查找并收集变量定义
-function findVariableValue(path, varName) {
- let value = null;
-
- // 在当前作用域向上查找
- const binding = path.scope.getBinding(varName);
- if (binding && binding.path.isVariableDeclarator()) {
- const init = binding.path.node.init;
- if (t.isCallExpression(init) &&
- t.isMemberExpression(init.callee) &&
- t.isStringLiteral(init.callee.object) &&
- t.isIdentifier(init.callee.property, { name: 'split' })) {
- // "1|4|0|3|2".split('|')
- value = init.callee.object.value.split('|');
- }
- }
-
- return value;
-}
-
-traverse(ast, {
- WhileStatement(path) {
- // 检查是否是 while(true) 或 while(1)
- const test = path.node.test;
- if (!t.isBooleanLiteral(test, { value: true }) &&
- !t.isNumericLiteral(test, { value: 1 })) {
- return;
- }
-
- const body = path.node.body;
- if (!t.isBlockStatement(body)) return;
-
- // 查找 switch 语句
- const switchStmt = body.body.find(stmt => t.isSwitchStatement(stmt));
- if (!switchStmt) return;
-
- // 检查 discriminant 是否是 arr[i++] 形式
- const disc = switchStmt.discriminant;
- if (!t.isMemberExpression(disc)) return;
- if (!t.isUpdateExpression(disc.property) || disc.property.operator !== '++') return;
-
- const arrName = disc.object.name;
- const indexName = disc.property.argument.name;
-
- // 获取顺序数组
- const order = findVariableValue(path, arrName);
- if (!order) return;
-
- // 收集 case 语句
- const cases = new Map();
- for (const caseStmt of switchStmt.cases) {
- if (!caseStmt.test) continue; // default case
-
- let caseValue;
- if (t.isStringLiteral(caseStmt.test)) {
- caseValue = caseStmt.test.value;
- } else if (t.isNumericLiteral(caseStmt.test)) {
- caseValue = String(caseStmt.test.value);
- } else {
- continue;
- }
-
- // 过滤掉 continue 和 break
- const consequent = caseStmt.consequent.filter(stmt =>
- !t.isContinueStatement(stmt) && !t.isBreakStatement(stmt)
- );
-
- cases.set(caseValue, consequent);
- }
-
- // 按顺序组装语句
- const newStatements = [];
- for (const key of order) {
- const stmts = cases.get(key);
- if (stmts) {
- newStatements.push(...stmts);
- }
- }
-
- if (newStatements.length > 0) {
- // 查找并移除相关变量声明
- const parentBody = path.parentPath;
- if (t.isBlockStatement(parentBody.node) || t.isProgram(parentBody.node)) {
- // 替换 while 语句
- path.replaceWithMultiple(newStatements);
- restoredCount++;
- }
- }
- }
-});
-
-console.log(`还原了 ${restoredCount} 处 switch 控制流`);
-
-console.log('\n[3] 清理冗余变量...');
-
-// 清理只用于 switch 控制流的变量
-let cleanedVars = 0;
-traverse(ast, {
- VariableDeclarator(path) {
- if (!t.isIdentifier(path.node.id)) return;
- const name = path.node.id.name;
- const init = path.node.init;
-
- // 检查是否是 "x|x|x".split('|') 形式
- if (t.isCallExpression(init) &&
- t.isMemberExpression(init.callee) &&
- t.isStringLiteral(init.callee.object) &&
- /^\d+(\|\d+)+$/.test(init.callee.object.value)) {
-
- // 检查是否还在使用
- const binding = path.scope.getBinding(name);
- if (binding && binding.references === 0) {
- path.remove();
- cleanedVars++;
- }
- }
-
- // 检查是否是用于索引的变量 (初始化为 0)
- if (t.isNumericLiteral(init, { value: 0 })) {
- const binding = path.scope.getBinding(name);
- if (binding && binding.references === 0) {
- path.remove();
- cleanedVars++;
- }
- }
- }
-});
-
-console.log(`清理了 ${cleanedVars} 个冗余变量`);
-
-console.log('\n[4] 生成代码...');
-const output = generate(ast, {
- comments: false,
- compact: false,
- concise: false
-}, code);
-
-console.log('\n[5] 保存文件...');
-fs.writeFileSync(outputPath, output.code);
-console.log(`保存到: ${outputPath}`);
-console.log(`新文件大小: ${(output.code.length / 1024).toFixed(2)} KB`);
-
-console.log('\n✅ 完成!');
diff --git a/deobfuscate_v12.js b/deobfuscate_v12.js
deleted file mode 100644
index 3466bdb..0000000
--- a/deobfuscate_v12.js
+++ /dev/null
@@ -1,680 +0,0 @@
-/**
- * CursorPro Deobfuscator v12
- *
- * 用于反混淆 obfuscator.io 混淆的 JavaScript 代码
- * 特点:
- * - 字符串感知的括号匹配(跳过字符串字面量中的括号)
- * - 支持解密函数别名和基础偏移量
- * - 处理嵌套 concat() 字符串数组
- * - 100% 成功率
- *
- * 使用方法:
- * node deobfuscate_v12.js [input_dir] [output_dir]
- * node deobfuscate_v12.js # 使用默认目录
- * node deobfuscate_v12.js ./src ./out # 指定输入输出目录
- */
-
-const fs = require('fs');
-const path = require('path');
-const vm = require('vm');
-
-// 默认目录
-const DEFAULT_INPUT_DIR = './extension/out';
-const DEFAULT_OUTPUT_DIR = './deobfuscated_full';
-
-// 自定义 Base64 字母表 (obfuscator.io 标准)
-const BASE64_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
-
-/**
- * 字符串感知的括号匹配
- * 跳过字符串字面量中的括号字符,避免误匹配
- */
-function findMatchingParen(code, startIdx) {
- let depth = 0;
- let i = startIdx;
- let inString = false;
- let stringChar = '';
-
- while (i < code.length) {
- const char = code[i];
-
- // 处理字符串开始
- if (!inString && (char === "'" || char === '"' || char === '`')) {
- inString = true;
- stringChar = char;
- i++;
- continue;
- }
-
- // 在字符串内部
- if (inString) {
- // 处理转义字符
- if (char === '\\' && i + 1 < code.length) {
- i += 2;
- continue;
- }
- // 字符串结束
- if (char === stringChar) {
- inString = false;
- stringChar = '';
- }
- i++;
- continue;
- }
-
- // 不在字符串内,计数括号
- if (char === '(') {
- depth++;
- } else if (char === ')') {
- depth--;
- if (depth === 0) {
- return i;
- }
- }
- i++;
- }
-
- return -1;
-}
-
-/**
- * 字符串感知的方括号匹配
- */
-function findMatchingBracket(code, startIdx) {
- let depth = 0;
- let i = startIdx;
- let inString = false;
- let stringChar = '';
-
- while (i < code.length) {
- const char = code[i];
-
- if (!inString && (char === "'" || char === '"' || char === '`')) {
- inString = true;
- stringChar = char;
- i++;
- continue;
- }
-
- if (inString) {
- if (char === '\\' && i + 1 < code.length) {
- i += 2;
- continue;
- }
- if (char === stringChar) {
- inString = false;
- stringChar = '';
- }
- i++;
- continue;
- }
-
- if (char === '[') {
- depth++;
- } else if (char === ']') {
- depth--;
- if (depth === 0) {
- return i;
- }
- }
- i++;
- }
-
- return -1;
-}
-
-/**
- * 自定义 Base64 解码
- */
-function customBase64Decode(input) {
- let result = '';
- let buffer = '';
-
- for (let i = 0; i < input.length; i++) {
- const charCode = BASE64_ALPHABET.indexOf(input[i]);
- if (charCode === -1) continue;
-
- buffer += charCode.toString(2).padStart(6, '0');
-
- while (buffer.length >= 8) {
- const byte = buffer.slice(0, 8);
- buffer = buffer.slice(8);
- const charCodeNum = parseInt(byte, 2);
- if (charCodeNum !== 0) {
- result += String.fromCharCode(charCodeNum);
- }
- }
- }
-
- // 处理 UTF-8 编码
- try {
- return decodeURIComponent(
- result.split('').map(c =>
- '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
- ).join('')
- );
- } catch (e) {
- return result;
- }
-}
-
-/**
- * RC4 解密
- */
-function rc4Decrypt(str, key) {
- const s = [];
- let j = 0;
- let result = '';
-
- // KSA
- for (let i = 0; i < 256; i++) {
- s[i] = i;
- }
-
- for (let i = 0; i < 256; i++) {
- j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- }
-
- // PRGA
- let i = 0;
- j = 0;
-
- for (let k = 0; k < str.length; k++) {
- i = (i + 1) % 256;
- j = (j + s[i]) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- result += String.fromCharCode(str.charCodeAt(k) ^ s[(s[i] + s[j]) % 256]);
- }
-
- return result;
-}
-
-/**
- * 完整字符串解密(Base64 + RC4)
- */
-function decryptString(encoded, key) {
- try {
- const decoded = customBase64Decode(encoded);
- return rc4Decrypt(decoded, key);
- } catch (e) {
- return null;
- }
-}
-
-/**
- * 解析字符串(处理转义)
- */
-function parseString(str) {
- let result = str;
- // 处理十六进制转义
- result = result.replace(/\\x([0-9a-fA-F]{2})/g, (_, hex) =>
- String.fromCharCode(parseInt(hex, 16))
- );
- // 处理 Unicode 转义
- result = result.replace(/\\u([0-9a-fA-F]{4})/g, (_, hex) =>
- String.fromCharCode(parseInt(hex, 16))
- );
- // 处理常见转义
- result = result.replace(/\\n/g, '\n');
- result = result.replace(/\\r/g, '\r');
- result = result.replace(/\\t/g, '\t');
- result = result.replace(/\\'/g, "'");
- result = result.replace(/\\"/g, '"');
- result = result.replace(/\\\\/g, '\\');
- return result;
-}
-
-/**
- * 从代码中提取所有字符串
- */
-function extractStringsFromCode(code) {
- const strings = [];
- const stringRegex = /'([^'\\]|\\.)*'|"([^"\\]|\\.)*"/g;
- let match;
-
- while ((match = stringRegex.exec(code)) !== null) {
- const str = match[0].slice(1, -1);
- strings.push(parseString(str));
- }
-
- return strings;
-}
-
-/**
- * 提取字符串数组(处理嵌套 concat)
- */
-function extractStringArray(code) {
- // 查找字符串数组函数: function _0xXXXX() { ... return [...] }
- const pattern = /function\s+(_0x[a-f0-9]+)\s*\(\s*\)\s*\{[^]*?return\s*\[/;
- const arrayFuncMatch = code.match(pattern);
-
- if (!arrayFuncMatch) return null;
-
- const funcName = arrayFuncMatch[1];
- const funcStartIdx = arrayFuncMatch.index;
-
- // 找到函数体结束位置
- const funcBodyStart = code.indexOf('{', funcStartIdx);
- let braceDepth = 1;
- let funcEnd = funcBodyStart + 1;
- let inString = false;
- let stringChar = '';
-
- while (funcEnd < code.length && braceDepth > 0) {
- const char = code[funcEnd];
-
- if (!inString && (char === "'" || char === '"' || char === '`')) {
- inString = true;
- stringChar = char;
- } else if (inString) {
- if (char === '\\' && funcEnd + 1 < code.length) {
- funcEnd++;
- } else if (char === stringChar) {
- inString = false;
- }
- } else {
- if (char === '{') braceDepth++;
- else if (char === '}') braceDepth--;
- }
- funcEnd++;
- }
-
- // 提取完整函数体
- const funcBody = code.slice(funcStartIdx, funcEnd);
-
- // 提取 vip 变量(如果存在)
- const vipMatch = code.match(/var\s+vip\s*=\s*['"]([^'"]*)['"]/);
- const vipValue = vipMatch ? vipMatch[1] : 'cursor';
-
- // 在 VM 中执行函数获取完整数组
- try {
- const sandbox = { vip: vipValue };
- const context = vm.createContext(sandbox);
-
- // 执行函数定义并调用
- const execCode = `(${funcBody.replace(/^function\s+_0x[a-f0-9]+/, 'function')})()`;
- const result = vm.runInContext(execCode, context, { timeout: 5000 });
-
- if (Array.isArray(result)) {
- return { funcName, strings: result, funcEnd };
- }
- } catch (e) {
- console.error(' Array extraction VM error:', e.message);
- }
-
- // 备用方案:手动解析所有字符串
- const returnMatch = funcBody.match(/return\s*\[/);
- if (!returnMatch) return null;
-
- const returnIdx = returnMatch.index;
- const bracketStart = funcBody.indexOf('[', returnIdx);
- const strings = extractStringsFromCode(funcBody.slice(bracketStart));
-
- return { funcName, strings, funcEnd };
-}
-
-/**
- * 提取基础偏移量
- */
-function extractBaseOffset(code, decryptFuncName) {
- // 查找模式: _0xXXXX = _0xXXXX - 0xYYY
- const pattern = new RegExp(
- `${decryptFuncName}[^}]*?_0x[a-f0-9]+\\s*=\\s*_0x[a-f0-9]+\\s*-\\s*(0x[a-f0-9]+|\\d+)`
- );
- const match = code.match(pattern);
-
- if (match) {
- return parseInt(match[1]);
- }
-
- // 备用模式
- const pattern2 = new RegExp(
- `_0x[a-f0-9]+\\s*-\\s*(0x[a-f0-9]+)`
- );
- const funcStart = code.indexOf(`function ${decryptFuncName}`);
- if (funcStart !== -1) {
- const funcEnd = code.indexOf('}', funcStart + 100);
- const funcBody = code.slice(funcStart, funcEnd + 1);
- const match2 = funcBody.match(pattern2);
- if (match2) {
- return parseInt(match2[1]);
- }
- }
-
- return 0;
-}
-
-/**
- * 提取并执行 shuffle IIFE
- */
-function extractAndRunShuffle(code, stringArray, arrayFuncName) {
- // 查找 shuffle IIFE
- const shufflePattern = /\(function\s*\(\s*_0x[a-f0-9]+(?:\s*,\s*_0x[a-f0-9]+)+\s*\)\s*\{/g;
- let shuffleMatch;
- let shuffleCode = null;
-
- while ((shuffleMatch = shufflePattern.exec(code)) !== null) {
- const potentialStart = shuffleMatch.index;
- const potentialEnd = findMatchingParen(code, potentialStart);
-
- if (potentialEnd === -1) continue;
-
- const potentialCode = code.slice(potentialStart, potentialEnd + 1);
-
- // 验证这是 shuffle 代码
- if (potentialCode.includes(arrayFuncName) &&
- (potentialCode.includes('shift') || potentialCode.includes('push')) &&
- !potentialCode.includes('return[vip,')) {
- shuffleCode = potentialCode;
- break;
- }
- }
-
- if (!shuffleCode) return stringArray;
-
- // 从主解密函数提取偏移量(重要!不是从 shuffle 中提取)
- const mainOffsetMatch = code.match(/function\s+_0x[a-f0-9]+\s*\([^)]+\)\s*\{[^}]*_0x[a-f0-9]+\s*=\s*_0x[a-f0-9]+\s*-\s*(0x[a-f0-9]+)/);
- const baseOffset = mainOffsetMatch ? parseInt(mainOffsetMatch[1]) : 0;
-
- // 使用同一个数组引用
- const shuffledArray = [...stringArray];
-
- // 创建解密函数(不缓存,因为数组内容在变化)
- function createDecryptFunc() {
- return function(index, key) {
- const actualIndex = index - baseOffset;
-
- if (actualIndex < 0 || actualIndex >= shuffledArray.length) {
- return undefined;
- }
-
- const value = shuffledArray[actualIndex];
- if (value === undefined) return undefined;
-
- try {
- const decoded = customBase64Decode(value);
- const decrypted = rc4Decrypt(decoded, key);
- return decrypted;
- } catch (e) {
- return value;
- }
- };
- }
-
- const decryptFunc = createDecryptFunc();
-
- // 查找 shuffle 中使用的所有函数名
- const decryptFuncNames = new Set();
- const callMatches = shuffleCode.matchAll(/(_0x[a-f0-9]+)\s*\(\s*0x[a-f0-9]+\s*,\s*['"][^'"]*['"]\s*\)/g);
- for (const m of callMatches) {
- decryptFuncNames.add(m[1]);
- }
-
- const aliasMatches = shuffleCode.matchAll(/const\s+(_0x[a-f0-9]+)\s*=\s*(_0x[a-f0-9]+)/g);
- for (const m of aliasMatches) {
- decryptFuncNames.add(m[1]);
- decryptFuncNames.add(m[2]);
- }
-
- // 创建 sandbox
- const sandbox = {
- [arrayFuncName]: function() {
- return shuffledArray;
- },
- parseInt: parseInt,
- String: String
- };
-
- for (const name of decryptFuncNames) {
- sandbox[name] = decryptFunc;
- }
-
- // 添加主解密函数
- const mainDecryptMatch = code.match(/function\s+(_0x[a-f0-9]+)\s*\(\s*_0x[a-f0-9]+\s*,\s*_0x[a-f0-9]+\s*\)\s*\{[^]*?const\s+_0x[a-f0-9]+\s*=\s*[a-zA-Z_$][a-zA-Z0-9_$]*\s*\(\s*\)/);
- if (mainDecryptMatch && !sandbox[mainDecryptMatch[1]]) {
- sandbox[mainDecryptMatch[1]] = decryptFunc;
- }
-
- try {
- const context = vm.createContext(sandbox);
- vm.runInContext(shuffleCode, context, { timeout: 10000 });
- return shuffledArray;
- } catch (e) {
- console.error(' Shuffle execution error:', e.message);
- return stringArray;
- }
-}
-
-/**
- * 查找所有解密函数名称(包括别名,递归查找)
- */
-function findDecryptFuncInfo(code, arrayFuncName) {
- const result = { names: [], baseOffset: 0 };
-
- // 查找主解密函数
- // 模式: function _0xXXXX(_0xYYYY, _0xZZZZ) { ... _0xArrayFunc() ... }
- const mainPattern = new RegExp(
- `function\\s+(_0x[a-f0-9]+)\\s*\\(\\s*(_0x[a-f0-9]+)\\s*,\\s*(_0x[a-f0-9]+)\\s*\\)\\s*\\{[^]*?${arrayFuncName}`,
- 'g'
- );
-
- let mainMatch;
- while ((mainMatch = mainPattern.exec(code)) !== null) {
- const funcName = mainMatch[1];
- if (!result.names.includes(funcName)) {
- result.names.push(funcName);
-
- // 提取基础偏移量
- const funcStart = mainMatch.index;
- const funcBodyStart = code.indexOf('{', funcStart);
- let depth = 1;
- let funcEnd = funcBodyStart + 1;
-
- while (funcEnd < code.length && depth > 0) {
- if (code[funcEnd] === '{') depth++;
- else if (code[funcEnd] === '}') depth--;
- funcEnd++;
- }
-
- const funcBody = code.slice(funcStart, funcEnd);
-
- // 查找偏移量: _0xXXXX = _0xXXXX - 0xYYY
- const offsetMatch = funcBody.match(/_0x[a-f0-9]+\s*=\s*_0x[a-f0-9]+\s*-\s*(0x[a-f0-9]+|\d+)/);
- if (offsetMatch && result.baseOffset === 0) {
- result.baseOffset = parseInt(offsetMatch[1]);
- }
- }
- }
-
- // 递归查找所有别名
- // 模式: const/var/let _0xXXXX = _0xKnownFunc
- let foundNew = true;
- while (foundNew) {
- foundNew = false;
- for (const knownName of [...result.names]) {
- const aliasPattern = new RegExp(
- `(?:const|var|let)\\s+(_0x[a-f0-9]+)\\s*=\\s*${knownName}\\s*[;,\\)]`,
- 'g'
- );
- let aliasMatch;
- while ((aliasMatch = aliasPattern.exec(code)) !== null) {
- if (!result.names.includes(aliasMatch[1])) {
- result.names.push(aliasMatch[1]);
- foundNew = true;
- }
- }
- }
- }
-
- // 还要查找所有实际使用的解密函数名(从调用模式中提取)
- // 这能捕获内联定义的别名
- const callPattern = /(_0x[a-f0-9]+)\s*\(\s*0x[a-f0-9]+\s*,\s*['"][^'"]*['"]\s*\)/g;
- let callMatch;
- while ((callMatch = callPattern.exec(code)) !== null) {
- if (!result.names.includes(callMatch[1])) {
- result.names.push(callMatch[1]);
- }
- }
-
- return result;
-}
-
-/**
- * 替换所有加密字符串调用
- */
-function replaceEncryptedStrings(code, shuffledArray, decryptFuncNames, baseOffset) {
- let result = code;
- let totalReplaced = 0;
-
- for (const funcName of decryptFuncNames) {
- // 匹配解密函数调用: _0xFunc(0xIndex, 'key')
- const callPattern = new RegExp(
- `${funcName}\\s*\\(\\s*(0x[a-f0-9]+|\\d+)\\s*,\\s*(['"])([^'"]*?)\\2\\s*\\)`,
- 'gi'
- );
-
- let match;
- const replacements = [];
-
- while ((match = callPattern.exec(result)) !== null) {
- const indexStr = match[1];
- const key = match[3];
- const rawIndex = parseInt(indexStr);
- const index = rawIndex - baseOffset;
-
- if (index >= 0 && index < shuffledArray.length) {
- const encrypted = shuffledArray[index];
- const decrypted = decryptString(encrypted, key);
-
- if (decrypted !== null) {
- replacements.push({
- start: match.index,
- end: match.index + match[0].length,
- original: match[0],
- replacement: JSON.stringify(decrypted)
- });
- }
- }
- }
-
- // 从后向前替换
- for (let i = replacements.length - 1; i >= 0; i--) {
- const r = replacements[i];
- result = result.slice(0, r.start) + r.replacement + result.slice(r.end);
- }
-
- totalReplaced += replacements.length;
- }
-
- return { result, totalReplaced };
-}
-
-/**
- * 反混淆单个文件
- */
-function deobfuscateFile(code, filename) {
- console.log(`\n处理: ${filename}`);
-
- // 1. 提取字符串数组
- const arrayInfo = extractStringArray(code);
- if (!arrayInfo) {
- console.log(' 未找到字符串数组');
- return { code, stats: { found: 0, replaced: 0 } };
- }
-
- console.log(` 字符串数组: ${arrayInfo.funcName} (${arrayInfo.strings.length} 个)`);
-
- // 2. 执行 shuffle
- const shuffledArray = extractAndRunShuffle(code, arrayInfo.strings, arrayInfo.funcName);
- console.log(` Shuffle 后: ${shuffledArray.length} 个`);
-
- // 3. 找到解密函数和偏移量
- const decryptInfo = findDecryptFuncInfo(code, arrayInfo.funcName);
- console.log(` 解密函数: ${decryptInfo.names.join(', ')}`);
- console.log(` 基础偏移: 0x${decryptInfo.baseOffset.toString(16)} (${decryptInfo.baseOffset})`);
-
- // 4. 替换加密字符串
- const { result, totalReplaced } = replaceEncryptedStrings(
- code,
- shuffledArray,
- decryptInfo.names,
- decryptInfo.baseOffset
- );
- console.log(` 替换: ${totalReplaced} 个字符串`);
-
- return {
- code: result,
- stats: {
- found: arrayInfo.strings.length,
- replaced: totalReplaced
- }
- };
-}
-
-/**
- * 递归处理目录
- */
-function processDirectory(inputDir, outputDir) {
- if (!fs.existsSync(outputDir)) {
- fs.mkdirSync(outputDir, { recursive: true });
- }
-
- const entries = fs.readdirSync(inputDir, { withFileTypes: true });
- let totalStats = { files: 0, found: 0, replaced: 0 };
-
- for (const entry of entries) {
- const inputPath = path.join(inputDir, entry.name);
- const outputPath = path.join(outputDir, entry.name);
-
- if (entry.isDirectory()) {
- const subStats = processDirectory(inputPath, outputPath);
- totalStats.files += subStats.files;
- totalStats.found += subStats.found;
- totalStats.replaced += subStats.replaced;
- } else if (entry.name.endsWith('.js')) {
- const code = fs.readFileSync(inputPath, 'utf-8');
- const { code: deobfuscated, stats } = deobfuscateFile(code, entry.name);
-
- fs.writeFileSync(outputPath, deobfuscated, 'utf-8');
-
- totalStats.files++;
- totalStats.found += stats.found;
- totalStats.replaced += stats.replaced;
- }
- }
-
- return totalStats;
-}
-
-/**
- * 主函数
- */
-function main() {
- const args = process.argv.slice(2);
- const inputDir = args[0] || DEFAULT_INPUT_DIR;
- const outputDir = args[1] || DEFAULT_OUTPUT_DIR;
-
- console.log('='.repeat(60));
- console.log('CursorPro Deobfuscator v12');
- console.log('='.repeat(60));
- console.log(`输入目录: ${inputDir}`);
- console.log(`输出目录: ${outputDir}`);
-
- if (!fs.existsSync(inputDir)) {
- console.error(`错误: 输入目录不存在: ${inputDir}`);
- process.exit(1);
- }
-
- const stats = processDirectory(inputDir, outputDir);
-
- console.log('\n' + '='.repeat(60));
- console.log('完成!');
- console.log(` 处理文件: ${stats.files}`);
- console.log(` 字符串总数: ${stats.found}`);
- console.log(` 成功替换: ${stats.replaced}`);
- console.log(` 成功率: ${stats.found > 0 ? (stats.replaced / stats.found * 100).toFixed(1) : 0}%`);
- console.log('='.repeat(60));
-}
-
-main();
diff --git a/deobfuscate_v3.js b/deobfuscate_v3.js
deleted file mode 100644
index 6052330..0000000
--- a/deobfuscate_v3.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * 原版 CursorPro 反编译脚本
- * 完整解码混淆代码
- */
-const fs = require('fs');
-
-// 原版代码字符串数组 (从原版代码中提取)
-const stringArray = ['cursor', 'XenNcturgdsoIeKrHRBCjEhRpemLPbyB==', 'W7mXWPBdNJZdL1O', 'yXhcLSkQWPa', 'EubBWPfh', 'WRNcKNekna', 'sd/cJCkmWOpdIW', 'W7qLW7bCkW', 'bmkbESkVWPK', 'WRBcVmkNWOldNfpcM0FdTsi', 'W6OCW4hcNCoNCua', 'acLXq0C', 'WROrW7NcS1Gw', 'W6aWW6H5pHiGW6v/WQ5Tb8k2WQmwga', 'nJrJW6ddUmogvCkeaHHyWOu', 'W6ehWRGiW48yfINcRahcOmkZnI8NmuO', 'WRZdOmoxFCky', 'Cmk8w8okW4DEcb7cQSk3WRpdVCk4WQC2WR0kC8oXCmkAW57dV8op', 'uNDGWPHyWRLXnmk1qCkNWQOne8odW7jZW5CcW5SZWOWOW4a', 'W78KAJNdLG', 'eCkJFqBcTCk0W53dGtvUlYWRWQ3dJCkBW6pdJSo3eSozWP7cSItdLd1nW5VdTdxdMejrW6C', 'dCoWWRbuW4KE', 'W7qUWO3dJI/dMa', 'WOORW5pcPLC', 'WOuWW5NcNLa', 'c8owW6m/', 'WQddQrRcHSkW', 'c8opWPpcTaO', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1HKWRrfWPJdHmkHWQWbnSkp', 'DCkzW68eeW', 'WOe6W6ZcPve', 'iCoZWRftW5W3amovWQSF', 'jCosWPfVW6yGn8oHWPe+W6VdHq', 'k391WRVdKq', 'fCoHWOXIFCooWOzTWRxcL3i', 'nGH1A2jK', 'W4OautxdLq', 'F0zDWQbx', 'eMeBzSoYDLRdOSkLoxKx', 'W5xdOCotW7/dHW', 'umohahq2dthcJLj8FxlcV8kD', 'ddDyWOhcRa', 'W5LoWRbMt8klWRj0wa', 'r8kgxb3dLG', 'W5bwWPFcVNW', 'W60MW7nB', 'W6yNWORdUa7dKvpcI34rW64MW6ZcR8oNW5VcR8koW4JdUq', 'WQa+yulcNW', 'WQShW67cJ1KsWOn5iSoMW4SuW55OqNG', 'W6qEBW', 'WOtdLKPlWR/dJqJcGLO', 'ESoOo0GZ', 'W7CGW69D', 'WQ7dL3VcQKaiWQNdQSoWW5C', 'WRmPWQ9jBrP0W6O7', 'dmoTW6CbEa', 'W6uMWPSnW70', 'WOlcKNWheCkzi30', 'W7msWQG6W54CkZFcPGRcQSkZnI8NmuO', 'fSkqq8ktWQ5zjmkrpSk+FCkfhwRcPJKylW', '57+u57Uq6lYa5O2Y5Ash6lE477+36kYX5Qoo5PYF57YB57Mw', 'DSkuesZdUG', 'wNBcSrL4Fsrr', 'o8kigCksCSk6bW', 'WPpcUCoNiW0', 'FHNcSSkS', 'W5GkW7LgeGKHW6nNWP0', 'FCkQBWJdKa', 'WOZdNdveWO/cN8kbW6ZcNq', 'WRpcNSoDaedcTHO2dJpdPc3cOH3cOmkoWQtcQrL2WQFdK8oDxq', 'f8oJWRDvW4KqhSoc', 'W4utW5z+oG', 'Eaf/FSoW', 'AgKPWPtcOCkvFG', 'W4ZdISoWW6xdVq', 'omoAf8kLuMCVyc3cRSok', 'ivlcOtJcNeNcOW', 'fmoTW5WtBa', 'WQinFuxcOCoWnKJdR0NcRSoAy8kAW5K3z8kUBG', 'oSkeqCkWWQ4', 'aCoHWQ5nW4ere8otWQ0cW4dcRGRcJmkNnG', 'WRSvW5FcPwK', 'aMxcQaq2As1gq2ddM1pcISkVwW', 'W47cU8o9xmkuCXzn', 'e29dWORdLCk9zmoNcgCnW4rQWPVcGq', 'W7HEWOjAWPzhdmkG', 'jCoxWOtcLaRdM0Hm', 'WQ8dW5ZcNCoFDhNcNSkQ', 'WQRdVrr2WQdcT8kHW5dcUmkUFCo6', 'W6ddKSoCW7VdUW', 'g0fAWORdVa', 'WReCrMtcGa', 'W4urWRFdJW', 'f8k7W4eClCoeWPC', 'iCoCWPtcIX7dMeG', 'W4iLW512ea', 'pJTtr2y', 'kmkTx8keWQ4', 'tSk+nqZdHa', 'gNnKWR4aWQrej8k3xCkNWQSkrCoKW7HUW5izW5u', 'WORdUa/cJSkiW7nk', 'W5ddQCofC8o9sIbUgWyekG', 'ySk8xmoTW54', 'W4aqW4G', 'WQeEWQDhWQ8', 'WQVdPCoKW5NcPexcSuVdVsiYBINcSCkOW6JdHgfRyaSfW4m8WOi1WRWjWQpcKWab', 'd8oRWRHwW4e', 'CLVcVr5uCcXbrMm', 'FCkkW5pdJeZcJHH6Dmo2zmkqWQu', 'gCkay8kI', 'WR51tmk4pmk2WQtdJmkJjaG3cSoSWRJcO2apx8k3wSk3WOpcSCoNkLm', 'WQOwW6lcPCoM', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1TSWRrtWOm', 'WRRcT0HaW4CDi8oEWPi', 'xZFdJCkLWQP4ySolWP7cHgbdW7/cJq', 'vsVdGSkHWR1P', 'amoqWQVcNbm', 'WRNcUgSNmG', 'CSoBESoDcW', 'WP3dSdz1WOu', 'p8o8W5yczSortSoMzCohe8oCnX4', 'umkWfJRdQa', 'EgJcIWDb', 'W5RdMSktW7ddN8o0W7BdVSkVWO3cNSkUwSo0hCokkW', 'CNWhW67dKeNdQHhdQmoCW4u', 'qgjWWRzBWRjYi8k7xmkUWR0kgCoeW7HUW5izW5u', 'h2xdLComW5xcImoJWOfZW5ZdKCkgW6G', 'cSkEeSoEcG', 'hCkBwCkJWQS', 'FCoSh1Op', 'nmo+tI9C', 'WPZdUSoqE8kMwq', 'dCkPEsddVSkbW7m', 'W5yNsaddRN4X', 'l8oOgCkZWOagysxcV8kUWQxdJSki', 'ASkFgSk+AmkomYtdSI0wWO3dSX8', 'wCkKFCoa', 'j1JcOYa', 'W5NcUWhdLviPWQNdKSob', 'WQddISkDW5FcJW', 'WRTji8obW7tdU2RcV2bcwCoE', 'W65wWQXV', 'WO3cNw9v', 'DN4iW6hdLdFcJaFdHmoXW7tdGCkk', 'WQxdRSk3', 'c8kXW4u6zSoXWRLbWPBcGNJdQmkcd8kVWRZcNhz1BW', 'W7msWQG6W54CkZFcPGRcQSkXoIiUlupdLai', 'uCoiefC0bWtcJW', 'iLlcSWRcJetcUSooECkonX/cLCkyzCkveq', 'WQ/dH8oMtG', 'Cb1PtSo6WPi8WQGhW5bpDa', 'kCo9u8orvCoCW6WRWRhcVIhdMspdLCoOWPJcU0VdGa', 'pCoSWOZcNdu', 'EIddICkOWOS', 'qvCHetpdOSo3ufrX', 'W6yPWO3dRZ7dNhpcHxeBW6G7W5K', 'WQShW67cK1iFWOD7iSogW4WHW4v2va'];
-
-// Base64 解码
-function base64Decode(str) {
- const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
- let output = '';
- let buffer = 0;
- let bits = 0;
-
- for (let i = 0; i < str.length; i++) {
- const charIndex = chars.indexOf(str[i]);
- if (charIndex === -1) continue;
-
- buffer = (buffer << 6) | charIndex;
- bits += 6;
-
- if (bits >= 8) {
- bits -= 8;
- output += String.fromCharCode((buffer >> bits) & 0xFF);
- }
- }
-
- try {
- return decodeURIComponent(escape(output));
- } catch (e) {
- return output;
- }
-}
-
-// RC4 解密
-function rc4Decrypt(str, key) {
- let s = [];
- let j = 0;
- let result = '';
-
- // 初始化 S 盒
- for (let i = 0; i < 256; i++) {
- s[i] = i;
- }
-
- // 密钥调度算法 (KSA)
- for (let i = 0; i < 256; i++) {
- j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- }
-
- // 伪随机生成算法 (PRGA)
- let i = 0;
- j = 0;
- for (let k = 0; k < str.length; k++) {
- i = (i + 1) % 256;
- j = (j + s[i]) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- result += String.fromCharCode(str.charCodeAt(k) ^ s[(s[i] + s[j]) % 256]);
- }
-
- return result;
-}
-
-// 解码函数 - 模拟 _0x3fbb
-function decode(index, key) {
- const baseIndex = 0x12e; // 302
- const arrayIndex = index - baseIndex;
-
- if (arrayIndex < 0 || arrayIndex >= stringArray.length) {
- return `[UNKNOWN:${index}]`;
- }
-
- const encoded = stringArray[arrayIndex];
- const decoded = base64Decode(encoded);
- const result = rc4Decrypt(decoded, key);
-
- return result;
-}
-
-// 测试解码 - 从原版代码中提取的调用
-const testCases = [
- [0x18a, 'yC20', 'DEFAULT_API_URL'],
- [0x151, 'pIfk', 'vscode require'],
- [0x177, ']8Ci', 'workspace'],
- [0x15b, 'j#7G', 'apiUrl config'],
- [0x197, 'Kfdi', '/api/verify'],
- [0x186, 'dpeu', 'POST'],
- [0x141, 'z&uV', '/api/switch'],
- [0x144, '*1hl', '__esModule'],
- [0x1b6, 'mBo%', 'getApiUrl export'],
- [0x146, 'pIfk', 'getOnlineStatus export'],
- [0x145, 'j#7G', 'switchAccount export'],
- [0x154, 'fjkd', 'updateProxyConfig export'],
- [0x13e, '3nFX', 'getSeamlessStatus export'],
- [0x193, 'HShS', 'getUserSwitchStatus export'],
- [0x17f, 'fjkd', 'getSeamlessConfig export'],
- [0x1c2, '0hHe', 'updateSeamlessConfig export'],
- [0x1b7, 'csY!', 'injectSeamless export'],
- [0x13c, 'fjkd', 'getSeamlessAccounts export'],
- [0x173, 'j#7G', 'syncSeamlessAccounts export'],
- [0x175, 'pIfk', 'getSeamlessToken export'],
- [0x152, ')0X3', 'getLatestVersion export'],
-];
-
-console.log('=== CursorPro 原版代码解码结果 ===\n');
-
-const results = {};
-for (const [index, key, desc] of testCases) {
- const decoded = decode(index, key);
- results[desc] = decoded;
- console.log(`${desc}: "${decoded}"`);
-}
-
-console.log('\n=== 关键信息 ===');
-console.log('原版 API 地址:', results['DEFAULT_API_URL']);
diff --git a/deobfuscate_v4.js b/deobfuscate_v4.js
deleted file mode 100644
index d7a6782..0000000
--- a/deobfuscate_v4.js
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * CursorPro 反编译脚本 v4
- * 直接执行原版解码逻辑
- */
-const fs = require('fs');
-
-// 读取原版代码
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 字符串数组 - 直接从原版代码提取
-var vip = 'cursor';
-const _0x81f8 = function() {
- const _0xb6f8e4 = (function() {
- return [vip, 'XenNcturgdsoIeKrHRBCjEhRpemLPbyB==', 'W7mXWPBdNJZdL1O', 'yXhcLSkQWPa', 'EubBWPfh', 'WRNcKNekna', 'sd/cJCkmWOpdIW', 'W7qLW7bCkW', 'bmkbESkVWPK', 'WRBcVmkNWOldNfpcM0FdTsi', 'W6OCW4hcNCoNCua', 'acLXq0C', 'WROrW7NcS1Gw', 'W6aWW6H5pHiGW6v/WQ5Tb8k2WQmwga', 'nJrJW6ddUmogvCkeaHHyWOu', 'W6ehWRGiW48yfINcRahcOmkZnI8NmuO', 'WRZdOmoxFCky', 'Cmk8w8okW4DEcb7cQSk3WRpdVCk4WQC2WR0kC8oXCmkAW57dV8op', 'uNDGWPHyWRLXnmk1qCkNWQOne8odW7jZW5CcW5SZWOWOW4a', 'W78KAJNdLG', 'eCkJFqBcTCk0W53dGtvUlYWRWQ3dJCkBW6pdJSo3eSozWP7cSItdLd1nW5VdTdxdMejrW6C', 'dCoWWRbuW4KE', 'W7qUWO3dJI/dMa', 'WOORW5pcPLC', 'WOuWW5NcNLa', 'c8owW6m/', 'WQddQrRcHSkW', 'c8opWPpcTaO', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1HKWRrfWPJdHmkHWQWbnSkp', 'DCkzW68eeW', 'WOe6W6ZcPve', 'iCoZWRftW5W3amovWQSF', 'jCosWPfVW6yGn8oHWPe+W6VdHq', 'k391WRVdKq', 'fCoHWOXIFCooWOzTWRxcL3i', 'nGH1A2jK', 'W4OautxdLq', 'F0zDWQbx', 'eMeBzSoYDLRdOSkLoxKx', 'W5xdOCotW7/dHW', 'umohahq2dthcJLj8FxlcV8kD', 'ddDyWOhcRa', 'W5LoWRbMt8klWRj0wa', 'r8kgxb3dLG', 'W5bwWPFcVNW', 'W60MW7nB', 'W6yNWORdUa7dKvpcI34rW64MW6ZcR8oNW5VcR8koW4JdUq', 'WQa+yulcNW', 'WQShW67cJ1KsWOn5iSoMW4SuW55OqNG', 'W6qEBW', 'WOtdLKPlWR/dJqJcGLO', 'ESoOo0GZ', 'W7CGW69D', 'WQ7dL3VcQKaiWQNdQSoWW5C', 'WRmPWQ9jBrP0W6O7', 'dmoTW6CbEa', 'W6uMWPSnW70', 'WOlcKNWheCkzi30', 'W7msWQG6W54CkZFcPGRcQSkZnI8NmuO', 'fSkqq8ktWQ5zjmkrpSk+FCkfhwRcPJKylW', '57+u57Uq6lYa5O2Y5Ash6lE477+36kYX5Qoo5PYF57YB57Mw', 'DSkuesZdUG', 'wNBcSrL4Fsrr', 'o8kigCksCSk6bW', 'WPpcUCoNiW0', 'FHNcSSkS', 'W5GkW7LgeGKHW6nNWP0', 'FCkQBWJdKa', 'WOZdNdveWO/cN8kbW6ZcNq', 'WRpcNSoDaedcTHO2dJpdPc3cOH3cOmkoWQtcQrL2WQFdK8oDxq', 'f8oJWRDvW4KqhSoc', 'W4utW5z+oG', 'Eaf/FSoW', 'AgKPWPtcOCkvFG', 'W4ZdISoWW6xdVq', 'omoAf8kLuMCVyc3cRSok', 'ivlcOtJcNeNcOW', 'fmoTW5WtBa', 'WQinFuxcOCoWnKJdR0NcRSoAy8kAW5K3z8kUBG', 'oSkeqCkWWQ4', 'aCoHWQ5nW4ere8otWQ0cW4dcRGRcJmkNnG', 'WRSvW5FcPwK', 'aMxcQaq2As1gq2ddM1pcISkVwW', 'W47cU8o9xmkuCXzn', 'e29dWORdLCk9zmoNcgCnW4rQWPVcGq', 'W7HEWOjAWPzhdmkG', 'jCoxWOtcLaRdM0Hm', 'WQ8dW5ZcNCoFDhNcNSkQ', 'WQRdVrr2WQdcT8kHW5dcUmkUFCo6', 'W6ddKSoCW7VdUW', 'g0fAWORdVa', 'WReCrMtcGa', 'W4urWRFdJW', 'f8k7W4eClCoeWPC', 'iCoCWPtcIX7dMeG', 'W4iLW512ea', 'pJTtr2y', 'kmkTx8keWQ4', 'tSk+nqZdHa', 'gNnKWR4aWQrej8k3xCkNWQSkrCoKW7HUW5izW5u', 'WORdUa/cJSkiW7nk', 'W5ddQCofC8o9sIbUgWyekG', 'ySk8xmoTW54', 'W4aqW4G', 'WQeEWQDhWQ8', 'WQVdPCoKW5NcPexcSuVdVsiYBINcSCkOW6JdHgfRyaSfW4m8WOi1WRWjWQpcKWab', 'd8oRWRHwW4e', 'CLVcVr5uCcXbrMm', 'FCkkW5pdJeZcJHH6Dmo2zmkqWQu', 'gCkay8kI', 'WR51tmk4pmk2WQtdJmkJjaG3cSoSWRJcO2apx8k3wSk3WOpcSCoNkLm', 'WQOwW6lcPCoM', 'W4tcNw8cs8koi281W4/dMX0TW5VdU1TSWRrtWOm', 'WRRcT0HaW4CDi8oEWPi', 'xZFdJCkLWQP4ySolWP7cHgbdW7/cJq', 'vsVdGSkHWR1P', 'amoqWQVcNbm', 'WRNcUgSNmG', 'CSoBESoDcW', 'WP3dSdz1WOu', 'p8o8W5yczSortSoMzCohe8oCnX4', 'umkWfJRdQa', 'EgJcIWDb', 'W5RdMSktW7ddN8o0W7BdVSkVWO3cNSkUwSo0hCokkW', 'CNWhW67dKeNdQHhdQmoCW4u', 'qgjWWRzBWRjYi8k7xmkUWR0kgCoeW7HUW5izW5u', 'h2xdLComW5xcImoJWOfZW5ZdKCkgW6G', 'cSkEeSoEcG', 'hCkBwCkJWQS', 'FCoSh1Op', 'nmo+tI9C', 'WPZdUSoqE8kMwq', 'dCkPEsddVSkbW7m', 'W5yNsaddRN4X', 'l8oOgCkZWOagysxcV8kUWQxdJSki', 'ASkFgSk+AmkomYtdSI0wWO3dSX8', 'wCkKFCoa', 'j1JcOYa', 'W5NcUWhdLviPWQNdKSob', 'WQddISkDW5FcJW', 'WRTji8obW7tdU2RcV2bcwCoE', 'W65wWQXV', 'WO3cNw9v', 'DN4iW6hdLdFcJaFdHmoXW7tdGCkk', 'WQxdRSk3', 'c8kXW4u6zSoXWRLbWPBcGNJdQmkcd8kVWRZcNhz1BW', 'W7msWQG6W54CkZFcPGRcQSkXoIiUlupdLai', 'uCoiefC0bWtcJW', 'iLlcSWRcJetcUSooECkonX/cLCkyzCkveq', 'WQ/dH8oMtG', 'Cb1PtSo6WPi8WQGhW5bpDa', 'kCo9u8orvCoCW6WRWRhcVIhdMspdLCoOWPJcU0VdGa', 'pCoSWOZcNdu', 'EIddICkOWOS', 'qvCHetpdOSo3ufrX', 'W6yPWO3dRZ7dNhpcHxeBW6G7W5K', 'WQShW67cK1iFWOD7iSogW4WHW4v2va'];
- })();
- return _0xb6f8e4;
-};
-
-// Base64解码 - 使用原版的非标准字母表
-function base64Decode(str) {
- const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';
- let output = '';
- let buffer = '';
-
- for (let i = 0, charIndex; (charIndex = str.charAt(i++)); ~charIndex && (buffer = i % 4 ? buffer * 64 + charIndex : charIndex, i % 4) ? output += String.fromCharCode(0xff & buffer >> (-2 * i & 6)) : 0) {
- charIndex = chars.indexOf(charIndex);
- }
-
- // URL decode
- let result = '';
- for (let i = 0; i < output.length; i++) {
- result += '%' + ('00' + output.charCodeAt(i).toString(16)).slice(-2);
- }
-
- try {
- return decodeURIComponent(result);
- } catch (e) {
- return output;
- }
-}
-
-// RC4解密
-function rc4Decrypt(str, key) {
- let s = [];
- let j = 0;
- let result = '';
-
- // 初始化 S盒
- for (let i = 0; i < 256; i++) {
- s[i] = i;
- }
-
- // KSA
- for (let i = 0; i < 256; i++) {
- j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
- [s[i], s[j]] = [s[j], s[i]];
- }
-
- // PRGA
- let x = 0;
- j = 0;
- for (let k = 0; k < str.length; k++) {
- x = (x + 1) % 256;
- j = (j + s[x]) % 256;
- [s[x], s[j]] = [s[j], s[x]];
- result += String.fromCharCode(str.charCodeAt(k) ^ s[(s[x] + s[j]) % 256]);
- }
-
- return result;
-}
-
-// 解码函数 - 模拟 _0x3fbb
-function decode(index, key) {
- const array = _0x81f8();
- const arrayIndex = index - 0x12e; // 302
-
- if (arrayIndex < 0 || arrayIndex >= array.length) {
- return `[OUT_OF_RANGE:${index}]`;
- }
-
- const encoded = array[arrayIndex];
- const decoded = base64Decode(encoded);
- const result = rc4Decrypt(decoded, key);
-
- return result;
-}
-
-// 从代码中提取所有 _0x1ede40 和 _0x3fbb 调用
-const callPattern = /_0x(?:1ede40|3fbb|355e79|4eb85c|182fa9|aaa62a|2df000|4fbc9f|de3d97|1b24d0|507ce6|36d9c0|15748f|1acc63|da86de|42cb20|3f99ea|eb43df|ac9b59|15aadd|12dfcf|42b4f6|1bebfa|5b4aa0|530ea9|207d6a|517f75)\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-
-console.log('=== CursorPro 原版代码解码 ===\n');
-
-// 测试常用调用
-const testCases = [
- [0x18a, 'yC20', 'DEFAULT_API_URL'],
- [0x151, 'pIfk', 'vscode require'],
- [0x177, ']8Ci', 'workspace'],
- [0x15b, 'j#7G', 'apiUrl config'],
- [0x197, 'Kfdi', '/api/verify'],
- [0x186, 'dpeu', 'POST'],
- [0x141, 'z&uV', '/api/switch'],
- [0x144, '*1hl', '__esModule'],
- [0x1b6, 'mBo%', 'getApiUrl export'],
- [0x146, 'pIfk', 'getOnlineStatus export'],
- [0x145, 'j#7G', 'switchAccount export'],
- [0x154, 'fjkd', 'updateProxyConfig export'],
- [0x13e, '3nFX', 'getSeamlessStatus export'],
- [0x193, 'HShS', 'getUserSwitchStatus export'],
- [0x17f, 'fjkd', 'getSeamlessConfig export'],
- [0x1c2, '0hHe', 'updateSeamlessConfig export'],
- [0x1b7, 'csY!', 'injectSeamless export'],
- [0x13c, 'fjkd', 'getSeamlessAccounts export'],
- [0x173, 'j#7G', 'syncSeamlessAccounts export'],
- [0x175, 'pIfk', 'getSeamlessToken export'],
- [0x152, ')0X3', 'getLatestVersion export'],
- [0x133, '3nFX', 'body'],
- [0x19c, ']$%b', 'stringify'],
- [0x172, ')0X3', 'json'],
- [0x185, 'yC20', 'Content-Type'],
- [0x181, '^UhV', 'offline message'],
-];
-
-const results = {};
-for (const [index, key, desc] of testCases) {
- try {
- const decoded = decode(index, key);
- results[desc] = decoded;
- console.log(`${desc} (0x${index.toString(16)}, '${key}'): "${decoded}"`);
- } catch (e) {
- console.log(`${desc}: ERROR - ${e.message}`);
- }
-}
-
-console.log('\n=== 关键解码信息 ===');
-console.log('API 地址:', results['DEFAULT_API_URL']);
-console.log('验证端点:', results['/api/verify']);
-console.log('切换端点:', results['/api/switch']);
-
-// 找出所有调用并解码
-console.log('\n=== 扫描代码中的所有调用 ===');
-let match;
-const allDecoded = {};
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-
-while ((match = regex.exec(code)) !== null) {
- const index = parseInt(match[1], 16);
- const key = match[2];
- const callStr = `${match[1]},'${key}'`;
-
- if (!allDecoded[callStr]) {
- try {
- const decoded = decode(index, key);
- allDecoded[callStr] = decoded;
- } catch (e) {
- allDecoded[callStr] = `ERROR: ${e.message}`;
- }
- }
-}
-
-console.log('\n所有解码结果:');
-for (const [call, decoded] of Object.entries(allDecoded)) {
- console.log(` (${call}) => "${decoded}"`);
-}
diff --git a/deobfuscate_v5.js b/deobfuscate_v5.js
deleted file mode 100644
index b4b0eeb..0000000
--- a/deobfuscate_v5.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * CursorPro 反编译脚本 v5
- * 直接执行原版解码器
- */
-const fs = require('fs');
-
-// 读取原版代码
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 设置 vip 变量
-var vip = 'cursor';
-
-// 从代码中提取 _0x81f8 函数 - 找到从 function _0x81f8 到最后的 return _0x81f8();}
-const func81f8Start = code.indexOf('function _0x81f8()');
-const func81f8End = code.indexOf('return _0x81f8();}', func81f8Start) + 'return _0x81f8();}'.length;
-const func81f8Code = code.substring(func81f8Start, func81f8End);
-
-// 从代码中提取 _0x3fbb 函数
-const func3fbbStart = code.indexOf('function _0x3fbb(');
-const func3fbbEnd = code.indexOf(',_0x3fbb(_0x91e0a,_0x2e3a7e);}', func3fbbStart) + ',_0x3fbb(_0x91e0a,_0x2e3a7e);}'.length;
-const func3fbbCode = code.substring(func3fbbStart, func3fbbEnd);
-
-console.log('找到 _0x81f8 函数,长度:', func81f8Code.length);
-console.log('找到 _0x3fbb 函数,长度:', func3fbbCode.length);
-
-// 执行解码器
-eval(func81f8Code);
-eval(func3fbbCode);
-
-const decode = _0x3fbb;
-
-console.log('\n=== CursorPro 原版代码解码 ===\n');
-
-// 测试解码
-const testCases = [
- [0x18a, 'yC20', 'DEFAULT_API_URL'],
- [0x151, 'pIfk', 'vscode require'],
- [0x177, ']8Ci', 'workspace'],
- [0x15b, 'j#7G', 'apiUrl config'],
- [0x197, 'Kfdi', '/api/verify'],
- [0x186, 'dpeu', 'POST'],
- [0x141, 'z&uV', '/api/switch'],
- [0x144, '*1hl', '__esModule'],
- [0x1b6, 'mBo%', 'getApiUrl'],
- [0x146, 'pIfk', 'getOnlineStatus'],
- [0x145, 'j#7G', 'switchAccount'],
- [0x133, '3nFX', 'body'],
- [0x19c, ']$%b', 'stringify'],
- [0x172, ')0X3', 'json'],
- [0x185, 'yC20', 'application/json'],
- [0x181, '^UhV', 'offline'],
- [0x1a6, 'H%&^', 'abort'],
- [0x179, ')0X3', 'push'],
- [0x14b, 'dpeu', 'filter'],
- [0x147, 'j#7G', 'forEach'],
-];
-
-const results = {};
-for (const [index, key, desc] of testCases) {
- try {
- const decoded = decode(index, key);
- results[desc] = decoded;
- console.log(`${desc} (0x${index.toString(16)}, '${key}'): "${decoded}"`);
- } catch (e) {
- console.log(`${desc}: ERROR - ${e.message}`);
- }
-}
-
-console.log('\n=== 关键解码信息 ===');
-console.log('API 地址 DEFAULT_API_URL:', results['DEFAULT_API_URL']);
-
-// 扫描所有调用
-console.log('\n=== 扫描代码中的所有调用 ===');
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-const allDecoded = new Map();
-
-let match;
-while ((match = regex.exec(code)) !== null) {
- const index = parseInt(match[1], 16);
- const key = match[2];
- const callStr = `${match[1]},'${key}'`;
-
- if (!allDecoded.has(callStr)) {
- try {
- const decoded = decode(index, key);
- allDecoded.set(callStr, decoded);
- } catch (e) {
- allDecoded.set(callStr, `ERROR: ${e.message}`);
- }
- }
-}
-
-console.log('\n所有唯一解码结果:');
-for (const [call, decoded] of allDecoded) {
- console.log(` (${call}) => "${decoded}"`);
-}
-
-// 保存解码映射表
-const decodedMap = {};
-for (const [call, decoded] of allDecoded) {
- decodedMap[call] = decoded;
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/decoded_strings.json', JSON.stringify(decodedMap, null, 2));
-console.log('\n解码映射已保存到 decoded_strings.json');
diff --git a/deobfuscate_v6.js b/deobfuscate_v6.js
deleted file mode 100644
index 98df487..0000000
--- a/deobfuscate_v6.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * CursorPro 反编译脚本 v6
- * 执行完整的初始化代码包括数组混淆
- */
-const fs = require('fs');
-
-// 读取原版代码
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 找到第一个 var __createBinding 的位置,这是混淆初始化代码的结束位置
-const initEndPos = code.indexOf('var __createBinding');
-
-// 提取初始化代码 (包括 vip, 数组混淆IIFE, _0x81f8, _0x3fbb)
-let initCode = code.substring(0, initEndPos);
-
-// 还需要 _0x3fbb 函数
-const func3fbbStart = code.indexOf('function _0x3fbb(');
-const func3fbbEnd = code.indexOf(',_0x3fbb(_0x91e0a,_0x2e3a7e);}', func3fbbStart) + ',_0x3fbb(_0x91e0a,_0x2e3a7e);}'.length;
-const func3fbbCode = code.substring(func3fbbStart, func3fbbEnd);
-
-// 还需要 _0x81f8 函数
-const func81f8Start = code.indexOf('function _0x81f8()');
-const func81f8End = code.indexOf('return _0x81f8();}', func81f8Start) + 'return _0x81f8();}'.length;
-const func81f8Code = code.substring(func81f8Start, func81f8End);
-
-console.log('初始化代码长度:', initCode.length);
-console.log('_0x81f8 函数长度:', func81f8Code.length);
-console.log('_0x3fbb 函数长度:', func3fbbCode.length);
-
-// 执行代码
-try {
- eval(initCode);
- console.log('初始化代码执行成功');
- console.log('vip 变量值:', typeof vip !== 'undefined' ? vip : 'undefined');
-} catch (e) {
- console.log('初始化代码执行失败:', e.message);
-}
-
-// 执行 _0x81f8 和 _0x3fbb
-try {
- eval(func81f8Code);
- console.log('_0x81f8 函数执行成功');
-} catch (e) {
- console.log('_0x81f8 执行失败:', e.message);
-}
-
-try {
- eval(func3fbbCode);
- console.log('_0x3fbb 函数执行成功');
-} catch (e) {
- console.log('_0x3fbb 执行失败:', e.message);
-}
-
-// 检查数组内容
-const arr = _0x81f8();
-console.log('\n字符串数组前5项:', arr.slice(0, 5));
-console.log('字符串数组长度:', arr.length);
-
-const decode = _0x3fbb;
-
-console.log('\n=== CursorPro 原版代码解码 ===\n');
-
-// 测试解码
-const testCases = [
- [0x18a, 'yC20', 'DEFAULT_API_URL'],
- [0x151, 'pIfk', 'vscode require'],
- [0x177, ']8Ci', 'workspace'],
- [0x15b, 'j#7G', 'apiUrl config'],
- [0x197, 'Kfdi', '/api/verify'],
- [0x186, 'dpeu', 'POST'],
- [0x141, 'z&uV', '/api/switch'],
- [0x144, '*1hl', '__esModule'],
- [0x1b6, 'mBo%', 'getApiUrl'],
- [0x146, 'pIfk', 'getOnlineStatus'],
- [0x145, 'j#7G', 'switchAccount'],
- [0x133, '3nFX', 'body'],
- [0x19c, ']$%b', 'stringify'],
- [0x172, ')0X3', 'json'],
- [0x185, 'yC20', 'application/json'],
- [0x181, '^UhV', 'offline'],
-];
-
-const results = {};
-for (const [index, key, desc] of testCases) {
- try {
- const decoded = decode(index, key);
- results[desc] = decoded;
- console.log(`${desc} (0x${index.toString(16)}, '${key}'): "${decoded}"`);
- } catch (e) {
- console.log(`${desc}: ERROR - ${e.message}`);
- }
-}
-
-console.log('\n=== 关键解码信息 ===');
-console.log('API 地址 DEFAULT_API_URL:', results['DEFAULT_API_URL']);
-
-// 扫描所有调用
-console.log('\n=== 扫描代码中的所有调用 ===');
-const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
-const allDecoded = new Map();
-
-let match;
-while ((match = regex.exec(code)) !== null) {
- const index = parseInt(match[1], 16);
- const key = match[2];
- const callStr = `${match[1]},'${key}'`;
-
- if (!allDecoded.has(callStr)) {
- try {
- const decoded = decode(index, key);
- allDecoded.set(callStr, decoded);
- } catch (e) {
- allDecoded.set(callStr, `ERROR: ${e.message}`);
- }
- }
-}
-
-console.log('\n所有唯一解码结果:');
-for (const [call, decoded] of allDecoded) {
- console.log(` (${call}) => "${decoded}"`);
-}
-
-// 保存解码映射表
-const decodedMap = {};
-for (const [call, decoded] of allDecoded) {
- decodedMap[call] = decoded;
-}
-fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/decoded_strings.json', JSON.stringify(decodedMap, null, 2));
-console.log('\n解码映射已保存到 decoded_strings.json');
diff --git a/deobfuscate_v7.js b/deobfuscate_v7.js
deleted file mode 100644
index ed1b4dd..0000000
--- a/deobfuscate_v7.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * CursorPro 反编译脚本 v7
- * 正确的执行顺序
- */
-const fs = require('fs');
-
-// 读取原版代码
-const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
-
-// 设置 vip
-var vip = 'cursor';
-
-// 1. 首先执行 _0x81f8 函数定义
-const func81f8Start = code.indexOf('function _0x81f8()');
-const func81f8End = code.indexOf('return _0x81f8();}', func81f8Start) + 'return _0x81f8();}'.length;
-const func81f8Code = code.substring(func81f8Start, func81f8End);
-eval(func81f8Code);
-console.log('1. _0x81f8 已定义');
-
-// 2. 然后执行 _0x3fbb 函数定义
-const func3fbbStart = code.indexOf('function _0x3fbb(');
-const func3fbbEnd = code.indexOf(',_0x3fbb(_0x91e0a,_0x2e3a7e);}', func3fbbStart) + ',_0x3fbb(_0x91e0a,_0x2e3a7e);}'.length;
-const func3fbbCode = code.substring(func3fbbStart, func3fbbEnd);
-eval(func3fbbCode);
-console.log('2. _0x3fbb 已定义');
-
-// 3. 提取并执行混淆IIFE
-// 从 const _0x1ede40=_0x3fbb; 开始到 &&(vip=`\xf42`); 结束
-const iifeStart = code.indexOf("const _0x1ede40=_0x3fbb;");
-const iifeEnd = code.indexOf("var __createBinding");
-let iifeCode = code.substring(iifeStart, iifeEnd).trim();
-// 移除最后的分号
-if (iifeCode.endsWith(';')) {
- iifeCode = iifeCode.slice(0, -1);
-}
-
-console.log('3. IIFE 代码长度:', iifeCode.length);
-console.log('IIFE 开头:', iifeCode.substring(0, 100));
-
-// 执行IIFE
-try {
- eval(iifeCode);
- console.log('4. IIFE 执行成功');
- console.log(' vip =', vip);
-} catch (e) {
- console.log('4. IIFE 执行失败:', e.message);
-}
-
-// 查看数组变化
-const arr = _0x81f8();
-console.log('\n字符串数组前5项:', arr.slice(0, 5));
-
-// 测试解码
-console.log('\n=== 测试解码 ===');
-const decode = _0x3fbb;
-
-const testCases = [
- [0x18a, 'yC20', 'DEFAULT_API_URL'],
- [0x151, 'pIfk', 'vscode'],
- [0x177, ']8Ci', 'workspace'],
- [0x15b, 'j#7G', 'apiUrl'],
- [0x197, 'Kfdi', '/api/verify'],
- [0x186, 'dpeu', 'POST'],
- [0x141, 'z&uV', '/api/switch'],
- [0x144, '*1hl', '__esModule'],
-];
-
-for (const [index, key, desc] of testCases) {
- try {
- const decoded = decode(index, key);
- console.log(`${desc}: "${decoded}"`);
- } catch (e) {
- console.log(`${desc}: ERROR - ${e.message}`);
- }
-}
diff --git a/deobfuscated/ANALYSIS.md b/deobfuscated/ANALYSIS.md
deleted file mode 100644
index 5fe10e0..0000000
--- a/deobfuscated/ANALYSIS.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# CursorPro 反混淆分析报告
-
-## 项目结构
-
-```
-deobfuscated/
-├── extension.js # 扩展主入口
-├── api/
-│ └── client.js # API 客户端
-├── utils/
-│ ├── account.js # 账号管理工具
-│ └── sqlite.js # SQLite 数据库操作
-└── webview/
- └── provider.js # Webview 提供者
-```
-
-## 功能分析
-
-### 1. extension.js - 扩展入口
-- **cleanServiceWorkerCache()**: 清理 Cursor 的 Service Worker 缓存
-- **activate()**: 注册 webview provider 和状态栏
-- **updateUsageStatusBar()**: 更新状态栏显示使用量
-
-### 2. api/client.js - API 客户端
-与远程服务器通信,主要 API:
-
-| 函数 | 端点 | 说明 |
-|------|------|------|
-| `verifyKey()` | POST /api/verify | 验证激活码 |
-| `switchAccount()` | POST /api/switch | 切换账号 |
-| `getSeamlessStatus()` | GET /api/seamless/status | 获取无缝模式状态 |
-| `injectSeamless()` | POST /api/seamless/inject | 注入无缝模式 |
-| `getProxyConfig()` | GET /api/proxy-config | 获取代理配置 |
-
-**默认 API 服务器**: `https://api.cursorpro.com` (从混淆代码中提取)
-
-### 3. utils/account.js - 账号管理
-
-**getCursorPaths()** - 返回 Cursor 配置路径:
-
-| 平台 | 数据库路径 |
-|------|-----------|
-| Windows | `%APPDATA%/Cursor/User/globalStorage/state.vscdb` |
-| macOS | `~/Library/Application Support/Cursor/User/globalStorage/state.vscdb` |
-| Linux | `~/.config/Cursor/User/globalStorage/state.vscdb` |
-
-**writeAccountToLocal()** - 写入账号数据到本地:
-- 修改 SQLite 数据库中的认证 token
-- 更新 storage.json 中的设备 ID
-- 写入 machineid 文件
-- Windows: 写入注册表
-
-**关键数据库字段**:
-```
-cursorAuth/accessToken - 访问令牌
-cursorAuth/refreshToken - 刷新令牌
-cursorAuth/WorkosCursorSessionToken - WorkOS 会话令牌
-cursorAuth/cachedEmail - 缓存邮箱
-cursorAuth/stripeMembershipType - 会员类型
-telemetry.serviceMachineId - 服务机器ID
-telemetry.devDeviceId - 设备ID
-```
-
-### 4. utils/sqlite.js - SQLite 操作
-通过 `sqlite3` 命令行工具直接操作 Cursor 的 VSCode 状态数据库:
-- `sqliteGet()` - 读取单个值
-- `sqliteSet()` - 写入单个值
-- `sqliteSetBatch()` - 批量写入 (使用事务)
-
-### 5. webview/provider.js - Webview 界面
-实现侧边栏 UI,提供:
-- 激活码验证界面
-- 使用统计显示
-- 无缝模式配置
-- 代理设置
-- 账号切换功能
-
-## 工作原理
-
-```
-┌─────────────────────────────────────────────────────────────┐
-│ CursorPro 工作流程 │
-├─────────────────────────────────────────────────────────────┤
-│ │
-│ 1. 用户输入激活码 │
-│ ↓ │
-│ 2. 发送到远程 API 服务器验证 │
-│ ↓ │
-│ 3. 服务器返回账号数据 (token, email, 设备ID等) │
-│ ↓ │
-│ 4. 写入本地 Cursor 配置文件: │
-│ - state.vscdb (SQLite 数据库) │
-│ - storage.json │
-│ - machineid │
-│ ↓ │
-│ 5. 提示重启 Cursor 生效 │
-│ │
-└─────────────────────────────────────────────────────────────┘
-```
-
-## 安全风险分析
-
-1. **远程服务器控制**: 所有账号数据来自 `api.cursorpro.com`
-2. **本地文件修改**: 直接操作 Cursor 数据库和配置文件
-3. **设备指纹伪造**: 替换 machineId, devDeviceId 等标识
-4. **进程控制**: 可强制关闭 Cursor 进程
-
-## 混淆技术分析
-
-原代码使用了以下混淆技术:
-
-1. **字符串数组 + 解密函数**: 所有字符串存储在数组中,通过 RC4 算法解密
-2. **十六进制变量名**: `_0x50c5e9`, `_0x2b0b` 等
-3. **控制流平坦化**: 使用 switch-case 打乱代码执行顺序
-4. **死代码注入**: 插入无用的条件分支
-5. **Base64 + RC4 双重编码**: 字符串先 Base64 再 RC4 加密
-
----
-
-*此分析仅供安全研究和学习目的*
diff --git a/deobfuscated/api/client.js b/deobfuscated/api/client.js
deleted file mode 100644
index 731b098..0000000
--- a/deobfuscated/api/client.js
+++ /dev/null
@@ -1,257 +0,0 @@
-'use strict';
-
-// ============================================
-// CursorPro API Client - 反混淆版本
-// ============================================
-
-const vscode = require('vscode');
-
-// 默认 API 地址 (原代码中被混淆)
-const DEFAULT_API_URL = 'https://api.cursorpro.com';
-const REQUEST_TIMEOUT = 15000; // 15秒超时
-
-let isOnline = true;
-let onlineStatusCallbacks = [];
-
-/**
- * 获取 API URL (从配置或使用默认值)
- */
-function getApiUrl() {
- const config = vscode.workspace.getConfiguration('cursorpro');
- return config.get('apiUrl') || DEFAULT_API_URL;
-}
-exports.getApiUrl = getApiUrl;
-
-/**
- * 获取在线状态
- */
-function getOnlineStatus() {
- return isOnline;
-}
-exports.getOnlineStatus = getOnlineStatus;
-
-/**
- * 监听在线状态变化
- */
-function onOnlineStatusChange(callback) {
- onlineStatusCallbacks.push(callback);
- return () => {
- onlineStatusCallbacks = onlineStatusCallbacks.filter(cb => cb !== callback);
- };
-}
-exports.onOnlineStatusChange = onOnlineStatusChange;
-
-/**
- * 设置在线状态
- */
-function setOnlineStatus(status) {
- if (isOnline !== status) {
- isOnline = status;
- onlineStatusCallbacks.forEach(callback => callback(status));
- }
-}
-
-/**
- * 带超时的 fetch
- */
-async function fetchWithTimeout(url, options, timeout) {
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), timeout);
-
- try {
- const response = await fetch(url, {
- ...options,
- signal: controller.signal
- });
- clearTimeout(timeoutId);
- return response;
- } catch (error) {
- clearTimeout(timeoutId);
- throw error;
- }
-}
-
-/**
- * 通用请求函数
- */
-async function request(endpoint, method = 'GET', body) {
- const url = `${getApiUrl()}${endpoint}`;
- const options = {
- method: method,
- headers: {
- 'Content-Type': 'application/json'
- }
- };
-
- if (body) {
- options.body = JSON.stringify(body);
- }
-
- try {
- const response = await fetchWithTimeout(url, options, REQUEST_TIMEOUT);
- const data = await response.json();
-
- setOnlineStatus(true);
-
- if (!response.ok && data.error) {
- data.success = false;
- data.message = data.error;
- }
-
- return data;
- } catch (error) {
- // 检查是否是网络错误
- const isNetworkError = error.name === 'AbortError' ||
- error.name === 'fetch' ||
- error.message?.includes('network') ||
- error.message?.includes('fetch') ||
- error.message?.includes('ENOTFOUND') ||
- error.message?.includes('ETIMEDOUT') ||
- error.message?.includes('ECONNREFUSED');
-
- if (isNetworkError) {
- setOnlineStatus(false);
- return {
- success: false,
- error: '网络连接失败,请检查网络',
- isOffline: true
- };
- }
-
- throw error;
- }
-}
-
-/**
- * 验证 Key
- */
-async function verifyKey(key) {
- return request('/api/verify', 'POST', { key });
-}
-exports.verifyKey = verifyKey;
-
-/**
- * 切换账号
- */
-async function switchAccount(key) {
- return request('/api/switch', 'POST', { key });
-}
-exports.switchAccount = switchAccount;
-
-/**
- * 获取代理配置
- */
-async function getProxyConfig() {
- return request('/api/proxy-config', 'GET');
-}
-exports.getProxyConfig = getProxyConfig;
-
-/**
- * 更新代理配置
- */
-async function updateProxyConfig(isEnabled, proxyUrl) {
- return request('/api/proxy-config', 'POST', {
- is_enabled: isEnabled,
- proxy_url: proxyUrl
- });
-}
-exports.updateProxyConfig = updateProxyConfig;
-
-// ============================================
-// 无感换号 (Seamless Mode) API
-// ============================================
-
-/**
- * 获取无缝模式状态
- * 检查用户是否有权使用无感换号功能
- */
-async function getSeamlessStatus() {
- return request('/api/seamless/status');
-}
-exports.getSeamlessStatus = getSeamlessStatus;
-
-/**
- * 获取用户切换状态
- */
-async function getUserSwitchStatus(userKey) {
- return request('/api/seamless/user-status?key=' + encodeURIComponent(userKey));
-}
-exports.getUserSwitchStatus = getUserSwitchStatus;
-
-/**
- * 获取无缝配置
- */
-async function getSeamlessConfig() {
- return request('/api/seamless/config');
-}
-exports.getSeamlessConfig = getSeamlessConfig;
-
-/**
- * 更新无缝配置
- */
-async function updateSeamlessConfig(config) {
- return request('/api/seamless/config', 'POST', config);
-}
-exports.updateSeamlessConfig = updateSeamlessConfig;
-
-/**
- * 注入无缝模式
- */
-async function injectSeamless(apiUrl, userKey) {
- return request('/api/seamless/inject', 'POST', {
- api_url: apiUrl,
- user_key: userKey
- });
-}
-exports.injectSeamless = injectSeamless;
-
-/**
- * 恢复无缝模式
- */
-async function restoreSeamless() {
- return request('/api/seamless/restore', 'POST');
-}
-exports.restoreSeamless = restoreSeamless;
-
-/**
- * 获取无缝账号列表
- */
-async function getSeamlessAccounts() {
- return request('/api/seamless/accounts');
-}
-exports.getSeamlessAccounts = getSeamlessAccounts;
-
-/**
- * 同步无缝账号
- */
-async function syncSeamlessAccounts(accounts) {
- return request('/api/seamless/accounts', 'POST', { accounts });
-}
-exports.syncSeamlessAccounts = syncSeamlessAccounts;
-
-/**
- * 获取无缝 Token
- */
-async function getSeamlessToken(userKey) {
- return request('/api/seamless/token?key=' + encodeURIComponent(userKey));
-}
-exports.getSeamlessToken = getSeamlessToken;
-
-/**
- * 切换无缝 Token
- */
-async function switchSeamlessToken(userKey) {
- return request('/api/seamless/switch', 'POST', {
- mode: 'seamless',
- userKey: userKey
- });
-}
-exports.switchSeamlessToken = switchSeamlessToken;
-
-/**
- * 获取最新版本
- */
-async function getLatestVersion() {
- return request('/api/version');
-}
-exports.getLatestVersion = getLatestVersion;
diff --git a/deobfuscated/client/deobfuscated.js b/deobfuscated/client/deobfuscated.js
deleted file mode 100644
index f712f7a..0000000
--- a/deobfuscated/client/deobfuscated.js
+++ /dev/null
@@ -1,585 +0,0 @@
-var vip = "cursor";
-"use strict";
-const _0x1ede40 = _0x3fbb;
-(function (_0x36e498, _0x2a46a3, _0x291f27, _0x32f529, _0x3fc117, _0x48bbae, _0x451ef0) {
- _0x36e498 = _0x36e498 >> 6;
- _0x48bbae = "hs";
- _0x451ef0 = "hs";
- return function (_0x552ac9, _0x3e93ff, _0x1901af, _0x2a30e1, _0x1a70d0) {
- const _0x355e79 = _0x3fbb;
- _0x2a30e1 = "tfi";
- _0x48bbae = _0x2a30e1 + _0x48bbae;
- _0x1a70d0 = "up";
- _0x451ef0 += _0x1a70d0;
- _0x48bbae = _0x1901af(_0x48bbae);
- _0x451ef0 = _0x1901af(_0x451ef0);
- _0x1901af = 0;
- const _0x35033e = _0x552ac9();
- while (true && --_0x32f529 + _0x3e93ff) {
- try {
- _0x2a30e1 = parseInt(_0x355e79(388, "egez")) / 1 * (-parseInt(_0x355e79(449, "%x%T")) / 2) + parseInt(_0x355e79(302, "1I3q")) / 3 * (-parseInt(_0x355e79(363, "4%)S")) / 4) + -parseInt(_0x355e79(433, "zF^s")) / 5 * (parseInt(_0x355e79(335, "]$%b")) / 6) + -parseInt(_0x355e79(359, "nS#0")) / 7 * (-parseInt(_0x355e79(334, "CAFj")) / 8) + parseInt(_0x355e79(304, "i9F1")) / 9 + -parseInt(_0x355e79(313, "%x%T")) / 10 * (parseInt(_0x355e79(410, "FaV!")) / 11) + parseInt(_0x355e79(339, "xDiN")) / 12 * (parseInt(_0x355e79(408, "@Xc6")) / 13);
- } catch (_0x172f5c) {
- _0x2a30e1 = _0x1901af;
- } finally {
- _0x1a70d0 = _0x35033e[_0x48bbae]();
- if (_0x36e498 <= _0x32f529) {
- if (_0x1901af) {
- if (_0x3fc117) {
- _0x2a30e1 = _0x1a70d0;
- } else {
- _0x3fc117 = _0x1a70d0;
- }
- } else {
- _0x1901af = _0x1a70d0;
- }
- } else if (_0x1901af == _0x3fc117.replace(/[gHIXKNEPtybCpeLhRnjBmd=]/g, "")) {
- if (_0x2a30e1 === _0x3e93ff) {
- _0x35033e["un" + _0x48bbae](_0x1a70d0);
- break;
- }
- _0x35033e[_0x451ef0](_0x1a70d0);
- }
- }
- }
- }(_0x291f27, _0x2a46a3, function (_0x34f043, _0x40921f, _0x2823d2, _0x2b5cc4, _0x253c14, _0x577a2c, _0x1ecae3) {
- _0x40921f = "split";
- _0x34f043 = arguments[0];
- _0x34f043 = _0x34f043[_0x40921f]("");
- _0x2823d2 = "reverse";
- _0x34f043 = _0x34f043[_0x2823d2]("v");
- _0x2b5cc4 = "join";
- 1855058;
- return _0x34f043[_0x2b5cc4]("");
- });
-})(12544, 473701, _0x81f8, 198);
-if (_0x81f8) {
- vip = `\xf42`;
-}
-var __createBinding = this && this[_0x1ede40(409, "!D4Z")] || (Object[_0x1ede40(456, "@Xc6")] ? function (_0x3e1b0f, _0xb59403, _0x20de4d, _0x218c01) {
- const _0x4eb85c = _0x1ede40;
- const _0xbca2d = {
- HNdUv: function (_0x295f25, _0x22e2a4) {
- return _0x295f25 === _0x22e2a4;
- }
- };
- if (_0xbca2d[_0x4eb85c(399, "CAFj")](_0x218c01, undefined)) {
- _0x218c01 = _0x20de4d;
- }
- var _0x350502 = Object[_0x4eb85c(342, "i9F1")](_0xb59403, _0x20de4d);
- if (!_0x350502 || ("get" in _0x350502 ? !_0xb59403[_0x4eb85c(391, ")0X3")] : _0x350502[_0x4eb85c(387, "Kfdi")] || _0x350502[_0x4eb85c(413, "kp3(")])) {
- _0x350502 = {
- enumerable: true,
- get: function () {
- return _0xb59403[_0x20de4d];
- }
- };
- }
- Object.defineProperty(_0x3e1b0f, _0x218c01, _0x350502);
-} : function (_0x1a00e9, _0x491e2e, _0x1a820a, _0x4989a8 = _0x1a820a) {
- _0x1a00e9[_0x4989a8] = _0x491e2e[_0x1a820a];
-});
-var __setModuleDefault = this && this[_0x1ede40(384, "H%&^")] || (Object[_0x1ede40(440, "csY!")] ? function (_0x29c4c5, _0x32ace2) {
- const _0x182fa9 = _0x1ede40;
- const _0x4cf4ff = {
- RDtLV: _0x182fa9(425, "Tn!E")
- };
- Object[_0x182fa9(305, "egez")](_0x29c4c5, _0x4cf4ff[_0x182fa9(442, "E$^%")], {
- enumerable: true,
- value: _0x32ace2
- });
-} : function (_0x52f038, _0x328d91) {
- const _0xaaa62a = _0x1ede40;
- const _0xd5699c = {
- UDNOD: _0xaaa62a(401, "3nFX")
- };
- _0x52f038[_0xd5699c[_0xaaa62a(423, "wvYe")]] = _0x328d91;
-});
-var __importStar = this && this.__importStar || function () {
- const _0x2df000 = _0x1ede40;
- const _0x1c3c71 = {
- lTDeF: function (_0x433649, _0x107638) {
- return _0x433649 !== _0x107638;
- },
- LynhB: function (_0x115f72, _0x2be46b) {
- return _0x115f72 === _0x2be46b;
- },
- qBjFZ: _0x2df000(392, "1I3q"),
- EpACO: _0x2df000(379, ")0X3"),
- QIZWZ: function (_0x577f98, _0x42790c, _0x5d0b9b) {
- return _0x577f98(_0x42790c, _0x5d0b9b);
- },
- cedxp: function (_0x1669d8, _0x4b8dec) {
- return _0x1669d8 < _0x4b8dec;
- },
- KJmyh: function (_0x33bfc2, _0x157ade) {
- return _0x33bfc2 !== _0x157ade;
- },
- Otlxd: function (_0x5c2307, _0x59b029, _0x5e4312, _0x223386) {
- return _0x5c2307(_0x59b029, _0x5e4312, _0x223386);
- }
- };
- function _0x40485b(_0x332d56) {
- _0x40485b = Object.getOwnPropertyNames || function (_0x293b06) {
- const _0xde3d97 = _0x3fbb;
- var _0x2ba725 = [];
- for (var _0x200cc6 in _0x293b06) {
- if (Object.prototype[_0xde3d97(365, "gtUF")][_0xde3d97(311, "P#LQ")](_0x293b06, _0x200cc6)) {
- _0x2ba725[_0x2ba725[_0xde3d97(360, "g547")]] = _0x200cc6;
- }
- }
- return _0x2ba725;
- };
- return _0x40485b(_0x332d56);
- }
- return function (_0x2d0d88) {
- const _0x4fbc9f = _0x2df000;
- if (_0x1c3c71[_0x4fbc9f(323, "csY!")](_0x1c3c71[_0x4fbc9f(361, "CMPY")], _0x4fbc9f(341, "@Xc6"))) {
- const _0xe4ab1a = _0x1c3c71[_0x4fbc9f(420, ")0X3")][_0x4fbc9f(332, ")0X3")]("|");
- let _0x4f03d1 = 0;
- while (true) {
- switch (_0xe4ab1a[_0x4f03d1++]) {
- case "0":
- return _0x5114f9;
- case "1":
- _0x1c3c71[_0x4fbc9f(354, "nS#0")](__setModuleDefault, _0x5114f9, _0x2d0d88);
- continue;
- case "2":
- if (_0x2d0d88 != null) {
- for (var _0x2719f1 = _0x40485b(_0x2d0d88), _0x391d88 = 0; _0x1c3c71.cedxp(_0x391d88, _0x2719f1.length); _0x391d88++) {
- if (_0x1c3c71[_0x4fbc9f(446, "wvYe")](_0x2719f1[_0x391d88], "default")) {
- _0x1c3c71[_0x4fbc9f(402, "cY2P")](__createBinding, _0x5114f9, _0x2d0d88, _0x2719f1[_0x391d88]);
- }
- }
- }
- continue;
- case "3":
- var _0x5114f9 = {};
- continue;
- case "4":
- if (_0x2d0d88 && _0x2d0d88.__esModule) {
- return _0x2d0d88;
- }
- continue;
- }
- break;
- }
- } else if (_0x1c3c71.lTDeF(_0x3b93cb, _0x285669)) {
- _0x1b3ce4 = _0x4f8670;
- _0x2bfedd[_0x4fbc9f(398, "xDiN")](_0x1988cb => _0x1988cb(_0x4056de));
- }
- };
-}();
-Object.defineProperty(exports, _0x1ede40(324, "*1hl"), {
- value: true
-});
-exports[_0x1ede40(438, "mBo%")] = getApiUrl;
-exports[_0x1ede40(326, "pIfk")] = getOnlineStatus;
-exports.onOnlineStatusChange = onOnlineStatusChange;
-exports.verifyKey = verifyKey;
-exports[_0x1ede40(325, "j#7G")] = switchAccount;
-exports.getProxyConfig = getProxyConfig;
-exports[_0x1ede40(340, "fjkd")] = updateProxyConfig;
-exports[_0x1ede40(318, "3nFX")] = getSeamlessStatus;
-exports[_0x1ede40(403, "HShS")] = getUserSwitchStatus;
-exports[_0x1ede40(383, "fjkd")] = getSeamlessConfig;
-exports[_0x1ede40(450, "0hHe")] = updateSeamlessConfig;
-exports[_0x1ede40(439, "csY!")] = injectSeamless;
-exports.restoreSeamless = restoreSeamless;
-exports[_0x1ede40(316, "fjkd")] = getSeamlessAccounts;
-exports[_0x1ede40(371, "j#7G")] = syncSeamlessAccounts;
-exports[_0x1ede40(373, "pIfk")] = getSeamlessToken;
-exports.switchSeamlessToken = switchSeamlessToken;
-exports[_0x1ede40(338, ")0X3")] = getLatestVersion;
-const vscode = __importStar(require(_0x1ede40(337, "pIfk")));
-const DEFAULT_API_URL = _0x1ede40(394, "yC20");
-const REQUEST_TIMEOUT = 15000;
-let isOnline = true;
-let onlineStatusCallbacks = [];
-function getApiUrl() {
- const _0x517f75 = _0x1ede40;
- const _0x1ef38a = {
- sKqFt: "cursorpro"
- };
- const _0x4896a2 = vscode[_0x517f75(375, "]8Ci")].getConfiguration(_0x1ef38a[_0x517f75(404, "H%&^")]);
- return _0x4896a2.get(_0x517f75(347, "j#7G")) || DEFAULT_API_URL;
-}
-function getOnlineStatus() {
- return isOnline;
-}
-function onOnlineStatusChange(_0x5437a2) {
- const _0x4c36cf = _0x1ede40;
- onlineStatusCallbacks[_0x4c36cf(377, ")0X3")](_0x5437a2);
- return () => {
- const _0x1977a2 = _0x4c36cf;
- onlineStatusCallbacks = onlineStatusCallbacks[_0x1977a2(331, "dpeu")](_0x5f2c05 => _0x5f2c05 !== _0x5437a2);
- };
-}
-function setOnlineStatus(_0x85a407) {
- const _0x5afdbb = _0x1ede40;
- const _0x198bf3 = {
- LiLdl: function (_0x41d862, _0x4b32ad) {
- return _0x41d862 !== _0x4b32ad;
- }
- };
- if (_0x198bf3[_0x5afdbb(441, "zF^s")](isOnline, _0x85a407)) {
- isOnline = _0x85a407;
- onlineStatusCallbacks[_0x5afdbb(327, "j#7G")](_0x3d7640 => _0x3d7640(_0x85a407));
- }
-}
-async function fetchWithTimeout(_0x17ebeb, _0x493671, _0x52d2e1) {
- const _0x507ce6 = _0x1ede40;
- const _0xe51b9b = {
- MXvym: function (_0x537a9a, _0x5e5823) {
- return _0x537a9a(_0x5e5823);
- }
- };
- const _0x1b91f1 = new AbortController();
- const _0x2dacf7 = setTimeout(() => _0x1b91f1[_0x507ce6(422, "H%&^")](), _0x52d2e1);
- try {
- const _0x21e977 = await fetch(_0x17ebeb, {
- ..._0x493671,
- signal: _0x1b91f1.signal
- });
- _0xe51b9b[_0x507ce6(355, "pIfk")](clearTimeout, _0x2dacf7);
- return _0x21e977;
- } catch (_0x5d29f1) {
- _0xe51b9b.MXvym(clearTimeout, _0x2dacf7);
- throw _0x5d29f1;
- }
-}
-async function request(_0x293593, _0x47ac75 = "GET", _0x6f6be7) {
- const _0x1b24d0 = _0x1ede40;
- const _0xad9ae1 = {
- BNHsr: function (_0x10bf01, _0x16f1c2) {
- return _0x10bf01(_0x16f1c2);
- },
- vWrbX: function (_0x1c8834, _0xdd25eb) {
- return _0x1c8834 === _0xdd25eb;
- },
- QeGOL: function (_0x565697, _0x1c8232) {
- return _0x565697 in _0x1c8232;
- },
- JTIwx: function (_0x2ab795) {
- return _0x2ab795();
- },
- HSNSw: _0x1b24d0(405, "rI*M"),
- aJNrt: "TbLeL",
- hqoir: function (_0x1fa4e8, _0x223d94, _0x3412d5, _0x3d3de1) {
- return _0x1fa4e8(_0x223d94, _0x3412d5, _0x3d3de1);
- },
- UlSjX: function (_0x2577b0, _0x1c619f) {
- return _0x2577b0(_0x1c619f);
- },
- dVHKp: _0x1b24d0(406, "pIfk"),
- ttOtR: _0x1b24d0(356, "rI*M"),
- MNJYC: function (_0x57fe62, _0x4f5ad6) {
- return _0x57fe62 === _0x4f5ad6;
- },
- vaLQW: _0x1b24d0(367, "P#LQ"),
- NtsiM: "fetch",
- qUkdJ: "network",
- UhPHK: _0x1b24d0(357, "rI*M"),
- EJlaN: _0x1b24d0(393, "kp3("),
- ztjks: _0x1b24d0(308, "N$(9"),
- RnnaP: function (_0x1d9a14, _0x1565b6) {
- return _0x1d9a14(_0x1565b6);
- }
- };
- const _0x4879af = "" + _0xad9ae1[_0x1b24d0(362, "0hHe")](getApiUrl) + _0x293593;
- const _0x4dbc6b = {
- method: _0x47ac75,
- headers: {
- "Content-Type": _0xad9ae1[_0x1b24d0(389, "yC20")]
- }
- };
- if (_0x6f6be7) {
- _0x4dbc6b[_0x1b24d0(307, "3nFX")] = JSON[_0x1b24d0(412, "]$%b")](_0x6f6be7);
- }
- try {
- if (_0xad9ae1.vWrbX(_0x1b24d0(444, "kp3("), _0xad9ae1.aJNrt)) {
- const _0x2625e8 = await _0xad9ae1[_0x1b24d0(429, "FaV!")](fetchWithTimeout, _0x4879af, _0x4dbc6b, REQUEST_TIMEOUT);
- const _0x43f5ea = await _0x2625e8[_0x1b24d0(370, ")0X3")]();
- _0xad9ae1[_0x1b24d0(447, "Kfdi")](setOnlineStatus, true);
- if (!_0x2625e8.ok && _0x43f5ea.error) {
- if (_0xad9ae1[_0x1b24d0(421, "g547")] !== _0xad9ae1[_0x1b24d0(414, "CAFj")]) {
- _0xad9ae1[_0x1b24d0(376, "gtUF")](_0x51896e, _0x3d20bc);
- throw _0x3902c6;
- } else {
- _0x43f5ea.success = false;
- _0x43f5ea.message = _0x43f5ea.error;
- }
- }
- return _0x43f5ea;
- } else {
- if (_0xad9ae1.vWrbX(_0x50a88d, _0x3c7316)) {
- _0xf926c6 = _0x44d71d;
- }
- var _0x229dad = _0x5c9dd8[_0x1b24d0(343, "0hHe")](_0x2683bc, _0x123a83);
- if (!_0x229dad || (_0xad9ae1[_0x1b24d0(364, "CAFj")](_0x1b24d0(374, "T3[u"), _0x229dad) ? !_0x28b288[_0x1b24d0(432, "Kfdi")] : _0x229dad[_0x1b24d0(395, "rI*M")] || _0x229dad[_0x1b24d0(320, "lC$h")])) {
- _0x229dad = {
- enumerable: true,
- get: function () {
- return _0x115262[_0x437497];
- }
- };
- }
- _0x2596a6[_0x1b24d0(445, "cY2P")](_0x4b73ec, _0x1bfdba, _0x229dad);
- }
- } catch (_0x8301bb) {
- const _0x2da852 = _0x8301bb.name === _0xad9ae1[_0x1b24d0(416, "HShS")] || _0xad9ae1[_0x1b24d0(333, "H%&^")](_0x8301bb.name, _0xad9ae1[_0x1b24d0(436, "]$%b")]) || _0x8301bb.message?.[_0x1b24d0(411, "zF^s")](_0xad9ae1[_0x1b24d0(351, "Tn!E")]) || _0x8301bb[_0x1b24d0(419, "zF^s")]?.[_0x1b24d0(382, "E$^%")](_0xad9ae1[_0x1b24d0(322, "zF^s")]) || _0x8301bb[_0x1b24d0(303, "CMPY")]?.[_0x1b24d0(317, "gtUF")](_0xad9ae1.UhPHK) || _0x8301bb.message?.includes(_0xad9ae1[_0x1b24d0(454, "gtUF")]) || _0x8301bb.message?.includes(_0xad9ae1[_0x1b24d0(309, "2T[v")]);
- if (_0x2da852) {
- _0xad9ae1[_0x1b24d0(330, "E$^%")](setOnlineStatus, false);
- return {
- success: false,
- error: _0x1b24d0(385, "^UhV"),
- isOffline: true
- };
- }
- throw _0x8301bb;
- }
-}
-async function verifyKey(_0x5a4ca) {
- const _0x36d9c0 = _0x1ede40;
- const _0x5a0926 = {
- ZDjOQ: function (_0x17f546, _0x305330, _0xc0721f, _0x125b9e) {
- return _0x17f546(_0x305330, _0xc0721f, _0x125b9e);
- },
- WqzrL: _0x36d9c0(407, "Kfdi"),
- obRAG: _0x36d9c0(390, "dpeu")
- };
- return _0x5a0926[_0x36d9c0(336, "g547")](request, _0x5a0926[_0x36d9c0(415, "!D4Z")], _0x5a0926.obRAG, {
- key: _0x5a4ca
- });
-}
-function _0x81f8() {
- const _0xb6f8e4 = function () {
- return [vip, "XenNcturgdsoIeKrHRBCjEhRpemLPbyB==", "W7mXWPBdNJZdL1O", "yXhcLSkQWPa", "EubBWPfh", "WRNcKNekna", "sd/cJCkmWOpdIW", "W7qLW7bCkW", "bmkbESkVWPK", "WRBcVmkNWOldNfpcM0FdTsi", "W6OCW4hcNCoNCua", "acLXq0C", "WROrW7NcS1Gw", "W6aWW6H5pHiGW6v/WQ5Tb8k2WQmwga", "nJrJW6ddUmogvCkeaHHyWOu", "W6ehWRGiW48yfINcRahcOmkZnI8NmuO", "WRZdOmoxFCky", "Cmk8w8okW4DEcb7cQSk3WRpdVCk4WQC2WR0kC8oXCmkAW57dV8op", "uNDGWPHyWRLXnmk1qCkNWQOne8odW7jZW5CcW5SZWOWOW4a", "W78KAJNdLG", "eCkJFqBcTCk0W53dGtvUlYWRWQ3dJCkBW6pdJSo3eSozWP7cSItdLd1nW5VdTdxdMejrW6C", "dCoWWRbuW4KE", "W7qUWO3dJI/dMa", "WOORW5pcPLC", "WOuWW5NcNLa", "c8owW6m/", "WQddQrRcHSkW"].concat(function () {
- return ["c8opWPpcTaO", "W4tcNw8cs8koi281W4/dMX0TW5VdU1HKWRrfWPJdHmkHWQWbnSkp", "DCkzW68eeW", "WOe6W6ZcPve", "iCoZWRftW5W3amovWQSF", "jCosWPfVW6yGn8oHWPe+W6VdHq", "k391WRVdKq", "fCoHWOXIFCooWOzTWRxcL3i", "nGH1A2jK", "W4OautxdLq", "F0zDWQbx", "eMeBzSoYDLRdOSkLoxKx", "W5xdOCotW7/dHW", "umohahq2dthcJLj8FxlcV8kD", "ddDyWOhcRa", "W5LoWRbMt8klWRj0wa", "r8kgxb3dLG", "W5bwWPFcVNW", "W60MW7nB", "W6yNWORdUa7dKvpcI34rW64MW6ZcR8oNW5VcR8koW4JdUq", "WQa+yulcNW", "WQShW67cJ1KsWOn5iSoMW4SuW55OqNG", "W6qEBW", "WOtdLKPlWR/dJqJcGLO", "ESoOo0GZ", "W7CGW69D", "WQ7dL3VcQKaiWQNdQSoWW5C"].concat(function () {
- return ["WRmPWQ9jBrP0W6O7", "dmoTW6CbEa", "W6uMWPSnW70", "WOlcKNWheCkzi30", "W7msWQG6W54CkZFcPGRcQSkZnI8NmuO", "fSkqq8ktWQ5zjmkrpSk+FCkfhwRcPJKylW", "57+u57Uq6lYa5O2Y5Ash6lE477+36kYX5Qoo5PYF57YB57Mw", "DSkuesZdUG", "wNBcSrL4Fsrr", "o8kigCksCSk6bW", "WPpcUCoNiW0", "FHNcSSkS", "W5GkW7LgeGKHW6nNWP0", "FCkQBWJdKa", "WOZdNdveWO/cN8kbW6ZcNq", "WRpcNSoDaedcTHO2dJpdPc3cOH3cOmkoWQtcQrL2WQFdK8oDxq", "f8oJWRDvW4KqhSoc", "W4utW5z+oG", "Eaf/FSoW", "AgKPWPtcOCkvFG", "W4ZdISoWW6xdVq", "omoAf8kLuMCVyc3cRSok", "ivlcOtJcNeNcOW", "fmoTW5WtBa", "WQinFuxcOCoWnKJdR0NcRSoAy8kAW5K3z8kUBG", "oSkeqCkWWQ4", "aCoHWQ5nW4ere8otWQ0cW4dcRGRcJmkNnG"].concat(function () {
- return ["WRSvW5FcPwK", "aMxcQaq2As1gq2ddM1pcISkVwW", "W47cU8o9xmkuCXzn", "e29dWORdLCk9zmoNcgCnW4rQWPVcGq", "W7HEWOjAWPzhdmkG", "jCoxWOtcLaRdM0Hm", "WQ8dW5ZcNCoFDhNcNSkQ", "WQRdVrr2WQdcT8kHW5dcUmkUFCo6", "W6ddKSoCW7VdUW", "g0fAWORdVa", "WReCrMtcGa", "W4urWRFdJW", "f8k7W4eClCoeWPC", "iCoCWPtcIX7dMeG", "W4iLW512ea", "pJTtr2y", "kmkTx8keWQ4", "tSk+nqZdHa", "gNnKWR4aWQrej8k3xCkNWQSkrCoKW7HUW5izW5u", "WORdUa/cJSkiW7nk", "W5ddQCofC8o9sIbUgWyekG", "ySk8xmoTW54", "W4aqW4G", "WQeEWQDhWQ8", "WQVdPCoKW5NcPexcSuVdVsiYBINcSCkOW6JdHgfRyaSfW4m8WOi1WRWjWQpcKWab", "d8oRWRHwW4e", "CLVcVr5uCcXbrMm"].concat(function () {
- return ["FCkkW5pdJeZcJHH6Dmo2zmkqWQu", "gCkay8kI", "WR51tmk4pmk2WQtdJmkJjaG3cSoSWRJcO2apx8k3wSk3WOpcSCoNkLm", "WQOwW6lcPCoM", "W4tcNw8cs8koi281W4/dMX0TW5VdU1TSWRrtWOm", "WRRcT0HaW4CDi8oEWPi", "xZFdJCkLWQP4ySolWP7cHgbdW7/cJq", "vsVdGSkHWR1P", "amoqWQVcNbm", "WRNcUgSNmG", "CSoBESoDcW", "WP3dSdz1WOu", "p8o8W5yczSortSoMzCohe8oCnX4", "umkWfJRdQa", "EgJcIWDb", "W5RdMSktW7ddN8o0W7BdVSkVWO3cNSkUwSo0hCokkW", "CNWhW67dKeNdQHhdQmoCW4u", "qgjWWRzBWRjYi8k7xmkUWR0kgCoeW7HUW5izW5u", "h2xdLComW5xcImoJWOfZW5ZdKCkgW6G", "cSkEeSoEcG", "hCkBwCkJWQS", "FCoSh1Op", "nmo+tI9C", "WPZdUSoqE8kMwq", "dCkPEsddVSkbW7m", "W5yNsaddRN4X", "l8oOgCkZWOagysxcV8kUWQxdJSki"].concat(function () {
- return ["ASkFgSk+AmkomYtdSI0wWO3dSX8", "wCkKFCoa", "j1JcOYa", "W5NcUWhdLviPWQNdKSob", "WQddISkDW5FcJW", "WRTji8obW7tdU2RcV2bcwCoE", "W65wWQXV", "WO3cNw9v", "DN4iW6hdLdFcJaFdHmoXW7tdGCkk", "WQxdRSk3", "c8kXW4u6zSoXWRLbWPBcGNJdQmkcd8kVWRZcNhz1BW", "W7msWQG6W54CkZFcPGRcQSkXoIiUlupdLai", "uCoiefC0bWtcJW", "iLlcSWRcJetcUSooECkonX/cLCkyzCkveq", "WQ/dH8oMtG", "Cb1PtSo6WPi8WQGhW5bpDa", "kCo9u8orvCoCW6WRWRhcVIhdMspdLCoOWPJcU0VdGa", "pCoSWOZcNdu", "EIddICkOWOS", "qvCHetpdOSo3ufrX", "W6yPWO3dRZ7dNhpcHxeBW6G7W5K", "WQShW67cK1iFWOD7iSogW4WHW4v2va"];
- }());
- }());
- }());
- }());
- }());
- }();
- _0x81f8 = function () {
- return _0xb6f8e4;
- };
- return _0x81f8();
-}
-;
-async function switchAccount(_0x577fd6) {
- const _0x15748f = _0x1ede40;
- const _0x38858e = {
- UZIiJ: function (_0x4be17e, _0x461bfe, _0x37a5d1, _0x2b8616) {
- return _0x4be17e(_0x461bfe, _0x37a5d1, _0x2b8616);
- },
- BFJKe: _0x15748f(321, "z&uV"),
- mnjoz: _0x15748f(350, "cY2P")
- };
- return _0x38858e[_0x15748f(369, "^UhV")](request, _0x38858e[_0x15748f(396, ")0X3")], _0x38858e[_0x15748f(386, "wvYe")], {
- key: _0x577fd6
- });
-}
-async function getProxyConfig() {
- const _0x1acc63 = _0x1ede40;
- const _0x53f294 = {
- tGYeq: function (_0x295e04, _0x5e6e4d, _0x181a1b) {
- return _0x295e04(_0x5e6e4d, _0x181a1b);
- },
- gOUCa: "/api/proxy-config",
- qAfDy: _0x1acc63(428, ")0X3")
- };
- return _0x53f294[_0x1acc63(443, "z&uV")](request, _0x53f294[_0x1acc63(358, "!D4Z")], _0x53f294[_0x1acc63(455, "FKQ]")]);
-}
-async function updateProxyConfig(_0x5f0bbe, _0x177139) {
- const _0xda86de = _0x1ede40;
- const _0x5cbec3 = {
- yDQrL: function (_0x5e0abb, _0x388d0b, _0x2513f4, _0x495f0d) {
- return _0x5e0abb(_0x388d0b, _0x2513f4, _0x495f0d);
- }
- };
- return _0x5cbec3[_0xda86de(368, "1I3q")](request, _0xda86de(448, "h^2B"), _0xda86de(314, "h^2B"), {
- is_enabled: _0x5f0bbe,
- proxy_url: _0x177139
- });
-}
-async function getSeamlessStatus() {
- const _0x42cb20 = _0x1ede40;
- const _0x1db932 = {
- FIIzk: function (_0x414e05, _0x20c82d) {
- return _0x414e05(_0x20c82d);
- }
- };
- return _0x1db932[_0x42cb20(348, "pIfk")](request, _0x42cb20(437, "E$^%"));
-}
-async function getUserSwitchStatus(_0x11efc8) {
- const _0x3f99ea = _0x1ede40;
- const _0x494ac5 = {
- MGwRv: function (_0x58ed8f, _0x151655) {
- return _0x58ed8f(_0x151655);
- }
- };
- return _0x494ac5[_0x3f99ea(328, "dpeu")](request, _0x3f99ea(345, "1I3q") + _0x494ac5.MGwRv(encodeURIComponent, _0x11efc8));
-}
-async function getSeamlessConfig() {
- const _0xeb43df = _0x1ede40;
- const _0x11b858 = {
- DfQJY: function (_0x3ff223, _0x515685) {
- return _0x3ff223(_0x515685);
- },
- WtWjp: "/api/seamless/config"
- };
- return _0x11b858[_0xeb43df(344, "CMPY")](request, _0x11b858[_0xeb43df(380, "cY2P")]);
-}
-async function updateSeamlessConfig(_0x4e91f5) {
- const _0xac9b59 = _0x1ede40;
- const _0xae283 = {
- eVhRM: function (_0x302e6d, _0x1b29d1, _0xfc2c0f, _0x27bd4c) {
- return _0x302e6d(_0x1b29d1, _0xfc2c0f, _0x27bd4c);
- },
- ksxVc: _0xac9b59(424, "0hHe"),
- LROFh: _0xac9b59(306, "3)@J")
- };
- return _0xae283[_0xac9b59(372, "HShS")](request, _0xae283[_0xac9b59(397, "lC$h")], _0xae283[_0xac9b59(329, "0hHe")], _0x4e91f5);
-}
-async function injectSeamless(_0x585c33, _0x5e920e) {
- const _0x15aadd = _0x1ede40;
- const _0x3480b6 = {
- ozfwi: function (_0x496feb, _0x3db5af, _0x41caae, _0x109bfc) {
- return _0x496feb(_0x3db5af, _0x41caae, _0x109bfc);
- },
- qQGdF: _0x15aadd(315, "nS#0"),
- edilS: _0x15aadd(417, "j#7G")
- };
- return _0x3480b6[_0x15aadd(431, "rI*M")](request, _0x3480b6[_0x15aadd(381, "fjkd")], _0x3480b6.edilS, {
- api_url: _0x585c33,
- user_key: _0x5e920e
- });
-}
-async function restoreSeamless() {
- const _0x12dfcf = _0x1ede40;
- const _0x1df6e7 = {
- baHAv: function (_0x57c4ec, _0x1d11b1, _0x36cd49) {
- return _0x57c4ec(_0x1d11b1, _0x36cd49);
- },
- sndsx: "/api/seamless/restore",
- ueshn: _0x12dfcf(319, "@Xc6")
- };
- return _0x1df6e7.baHAv(request, _0x1df6e7.sndsx, _0x1df6e7[_0x12dfcf(427, "i9F1")]);
-}
-async function getSeamlessAccounts() {
- const _0x42b4f6 = _0x1ede40;
- const _0x4ac511 = {
- LxhXL: function (_0x53c82d, _0x3b3e63) {
- return _0x53c82d(_0x3b3e63);
- },
- MbXwB: "/api/seamless/accounts"
- };
- return _0x4ac511[_0x42b4f6(366, "%x%T")](request, _0x4ac511.MbXwB);
-}
-async function syncSeamlessAccounts(_0x8eab80) {
- const _0x1bebfa = _0x1ede40;
- return request(_0x1bebfa(435, "T8iJ"), _0x1bebfa(434, "H%&^"), {
- accounts: _0x8eab80
- });
-}
-function _0x3fbb(_0x91e0a, _0x2e3a7e) {
- const _0x81f807 = _0x81f8();
- _0x3fbb = function (_0x3fbbba, _0x9d3c29) {
- _0x3fbbba = _0x3fbbba - 302;
- let _0x54f284 = _0x81f807[_0x3fbbba];
- if (_0x3fbb.VKdPFb === undefined) {
- function _0x150010(_0x44bb15) {
- const _0x1757ec = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";
- let _0x59a345 = "";
- let _0x20995f = "";
- for (let _0x4d4001 = 0, _0x16ea18, _0xc3818f, _0x14ada7 = 0; _0xc3818f = _0x44bb15.charAt(_0x14ada7++); ~_0xc3818f && (_0x16ea18 = _0x4d4001 % 4 ? _0x16ea18 * 64 + _0xc3818f : _0xc3818f, _0x4d4001++ % 4) ? _0x59a345 += String.fromCharCode(_0x16ea18 >> (_0x4d4001 * -2 & 6) & 255) : 0) {
- _0xc3818f = _0x1757ec.indexOf(_0xc3818f);
- }
- for (let _0x278428 = 0, _0x291cae = _0x59a345.length; _0x278428 < _0x291cae; _0x278428++) {
- _0x20995f += "%" + ("00" + _0x59a345.charCodeAt(_0x278428).toString(16)).slice(-2);
- }
- return decodeURIComponent(_0x20995f);
- }
- const _0x35b6f4 = function (_0x5cccfb, _0x200ec4) {
- let _0x50a88d = [];
- let _0x3c7316 = 0;
- let _0xf926c6;
- let _0x44d71d = "";
- _0x5cccfb = _0x150010(_0x5cccfb);
- let _0x5c9dd8;
- for (_0x5c9dd8 = 0; _0x5c9dd8 < 256; _0x5c9dd8++) {
- _0x50a88d[_0x5c9dd8] = _0x5c9dd8;
- }
- for (_0x5c9dd8 = 0; _0x5c9dd8 < 256; _0x5c9dd8++) {
- _0x3c7316 = (_0x3c7316 + _0x50a88d[_0x5c9dd8] + _0x200ec4.charCodeAt(_0x5c9dd8 % _0x200ec4.length)) % 256;
- _0xf926c6 = _0x50a88d[_0x5c9dd8];
- _0x50a88d[_0x5c9dd8] = _0x50a88d[_0x3c7316];
- _0x50a88d[_0x3c7316] = _0xf926c6;
- }
- _0x5c9dd8 = 0;
- _0x3c7316 = 0;
- for (let _0x2683bc = 0; _0x2683bc < _0x5cccfb.length; _0x2683bc++) {
- _0x5c9dd8 = (_0x5c9dd8 + 1) % 256;
- _0x3c7316 = (_0x3c7316 + _0x50a88d[_0x5c9dd8]) % 256;
- _0xf926c6 = _0x50a88d[_0x5c9dd8];
- _0x50a88d[_0x5c9dd8] = _0x50a88d[_0x3c7316];
- _0x50a88d[_0x3c7316] = _0xf926c6;
- _0x44d71d += String.fromCharCode(_0x5cccfb.charCodeAt(_0x2683bc) ^ _0x50a88d[(_0x50a88d[_0x5c9dd8] + _0x50a88d[_0x3c7316]) % 256]);
- }
- return _0x44d71d;
- };
- _0x3fbb.HlOQbT = _0x35b6f4;
- _0x91e0a = arguments;
- _0x3fbb.VKdPFb = true;
- }
- const _0x572ba4 = _0x81f807[0];
- const _0x1344b3 = _0x3fbbba + _0x572ba4;
- const _0x1c8a1f = _0x91e0a[_0x1344b3];
- if (!_0x1c8a1f) {
- if (_0x3fbb.RnJDPN === undefined) {
- _0x3fbb.RnJDPN = true;
- }
- _0x54f284 = _0x3fbb.HlOQbT(_0x54f284, _0x9d3c29);
- _0x91e0a[_0x1344b3] = _0x54f284;
- } else {
- _0x54f284 = _0x1c8a1f;
- }
- return _0x54f284;
- };
- return _0x3fbb(_0x91e0a, _0x2e3a7e);
-}
-async function getSeamlessToken(_0x3d9506) {
- const _0x5b4aa0 = _0x1ede40;
- const _0x47d5c8 = {
- tWyAu: function (_0x2630d5, _0x8f24b0) {
- return _0x2630d5(_0x8f24b0);
- }
- };
- return request(_0x5b4aa0(430, "CAFj") + _0x47d5c8[_0x5b4aa0(452, "7*qP")](encodeURIComponent, _0x3d9506));
-}
-async function switchSeamlessToken(_0x45b49c) {
- const _0x530ea9 = _0x1ede40;
- const _0x25fd60 = {
- TTiUq: function (_0x12885e, _0x9ff48a, _0x48600c, _0xfe1be7) {
- return _0x12885e(_0x9ff48a, _0x48600c, _0xfe1be7);
- },
- zZNHr: _0x530ea9(353, "E$^%"),
- IRCBl: _0x530ea9(346, "rI*M")
- };
- return _0x25fd60[_0x530ea9(453, "H%&^")](request, _0x25fd60.zZNHr, _0x530ea9(312, "mBo%"), {
- mode: _0x25fd60[_0x530ea9(349, "pIfk")],
- userKey: _0x45b49c
- });
-}
-async function getLatestVersion() {
- const _0x207d6a = _0x1ede40;
- const _0x3450ac = {
- GvtLu: _0x207d6a(426, "@Xc6")
- };
- return request(_0x3450ac[_0x207d6a(352, "zF^s")]);
-}
\ No newline at end of file
diff --git a/deobfuscated/extension.js b/deobfuscated/extension.js
deleted file mode 100644
index 7d63fbf..0000000
--- a/deobfuscated/extension.js
+++ /dev/null
@@ -1,179 +0,0 @@
-'use strict';
-
-// ============================================
-// CursorPro Extension - 反混淆版本
-// ============================================
-
-const vscode = require('vscode');
-const { CursorProProvider } = require('./webview/provider');
-const fs = require('fs');
-const path = require('path');
-
-let usageStatusBarItem;
-
-// 创建输出通道
-const outputChannel = vscode.window.createOutputChannel('CursorPro');
-exports.outputChannel = outputChannel;
-
-/**
- * 日志输出函数
- */
-function log(message) {
- const timestamp = new Date().toLocaleTimeString();
- outputChannel.appendLine(`[${timestamp}] ${message}`);
- console.log(`[CursorPro] ${message}`);
-}
-exports.log = log;
-
-/**
- * 清理 Service Worker 缓存
- */
-function cleanServiceWorkerCache() {
- try {
- const platform = process.platform;
- const cachePaths = [];
-
- if (platform === 'win32') {
- const appData = process.env.APPDATA || '';
- const localAppData = process.env.LOCALAPPDATA || '';
- cachePaths.push(
- path.join(appData, 'Cursor', 'Cache'),
- path.join(localAppData, 'Cursor', 'Cache'),
- path.join(appData, 'Cursor', 'GPUCache'),
- path.join(localAppData, 'Cursor', 'GPUCache')
- );
- } else if (platform === 'darwin') {
- const home = process.env.HOME || '';
- cachePaths.push(
- path.join(home, 'Library', 'Application Support', 'Cursor', 'Cache'),
- path.join(home, 'Library', 'Application Support', 'Cursor', 'GPUCache')
- );
- } else {
- const home = process.env.HOME || '';
- cachePaths.push(
- path.join(home, '.config', 'Cursor', 'Cache'),
- path.join(home, '.config', 'Cursor', 'Service Worker')
- );
- }
-
- for (const cachePath of cachePaths) {
- if (!fs.existsSync(cachePath)) continue;
-
- const cachesDir = path.join(cachePath, 'Caches');
- if (fs.existsSync(cachesDir)) {
- try {
- const files = fs.readdirSync(cachesDir);
- for (const file of files) {
- try { fs.unlinkSync(path.join(cachesDir, file)); } catch (e) {}
- }
- console.log('[CursorPro] Caches 已清理:', cachesDir);
- } catch (e) {}
- }
-
- const cacheStorageDir = path.join(cachePath, 'CacheStorage');
- if (fs.existsSync(cacheStorageDir)) {
- try {
- deleteFolderRecursive(cacheStorageDir);
- console.log('[CursorPro] CacheStorage 已清理:', cacheStorageDir);
- } catch (e) {}
- }
-
- const databaseDir = path.join(cachePath, 'Database');
- if (fs.existsSync(databaseDir)) {
- try {
- deleteFolderRecursive(databaseDir);
- console.log('[CursorPro] Database 已清理:', databaseDir);
- } catch (e) {}
- }
- }
- } catch (error) {
- console.log('[CursorPro] 清理缓存出错:', error);
- }
-}
-
-function deleteFolderRecursive(folderPath) {
- if (fs.existsSync(folderPath)) {
- fs.readdirSync(folderPath).forEach((file) => {
- const curPath = path.join(folderPath, file);
- if (fs.lstatSync(curPath).isDirectory()) {
- deleteFolderRecursive(curPath);
- } else {
- try { fs.unlinkSync(curPath); } catch (e) {}
- }
- });
- try { fs.rmdirSync(folderPath); } catch (e) {}
- }
-}
-
-/**
- * 扩展激活入口
- */
-function activate(context) {
- cleanServiceWorkerCache();
-
- const provider = new CursorProProvider(context.extensionUri, context);
- context.subscriptions.push(
- vscode.window.registerWebviewViewProvider('cursorpro.sidebar', provider)
- );
-
- usageStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
- usageStatusBarItem.text = '$(dashboard) CursorPro';
- usageStatusBarItem.tooltip = 'CursorPro 使用情况';
- usageStatusBarItem.command = 'cursorpro.showUsage';
- usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
-
- const hasKey = context.globalState.get('cursorpro.key');
- if (hasKey) usageStatusBarItem.show();
-
- context.subscriptions.push(usageStatusBarItem);
- context.subscriptions.setKeysForSync(['cursorpro.key']);
-
- context.subscriptions.push(
- vscode.commands.registerCommand('cursorpro.showUsage', () => {
- vscode.commands.executeCommand('cursorpro.sidebar.focus');
- })
- );
-}
-exports.activate = activate;
-
-function deactivate() {
- console.log('[CursorPro] 扩展已停用');
-}
-exports.deactivate = deactivate;
-
-function showStatusBar() {
- if (usageStatusBarItem) usageStatusBarItem.show();
-}
-exports.showStatusBar = showStatusBar;
-
-function hideStatusBar() {
- if (usageStatusBarItem) usageStatusBarItem.hide();
-}
-exports.hideStatusBar = hideStatusBar;
-
-function updateUsageStatusBar(requestCount, usageAmount) {
- if (usageStatusBarItem) {
- const count = requestCount;
- const amount = typeof usageAmount === 'number'
- ? usageAmount
- : parseFloat(usageAmount.toString().replace('$', '')) || 0;
- const displayAmount = typeof usageAmount === 'number'
- ? '$' + usageAmount.toFixed(2)
- : usageAmount;
-
- usageStatusBarItem.text = `$(dashboard) ${count} | ${displayAmount}`;
- usageStatusBarItem.tooltip = `请求次数: ${count}\n已用额度: ${displayAmount}\n点击查看详情`;
-
- if (amount >= 10) {
- usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
- usageStatusBarItem.color = undefined;
- } else if (amount >= 5) {
- usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
- usageStatusBarItem.color = undefined;
- } else {
- usageStatusBarItem.backgroundColor = undefined;
- usageStatusBarItem.color = 'statusBarItem.warningBackground';
- }
- }
-}
-exports.updateUsageStatusBar = updateUsageStatusBar;
diff --git a/deobfuscated/provider/provider.js b/deobfuscated/provider/provider.js
deleted file mode 100644
index 49e5101..0000000
--- a/deobfuscated/provider/provider.js
+++ /dev/null
@@ -1,2952 +0,0 @@
-var vip='cursor';'use strict';// [ALIAS REMOVED]function _0x56bd(_0x5c6adf,_0x2aec85){const _0x4ff48f=_0x4ff4();return _0x56bd=function(_0x56bd90,_0x412597){_0x56bd90=_0x56bd90-0x107;let _0x4776f4=_0x4ff48f[_0x56bd90];if(_0x56bd['ZJZefS']===undefined){var _0x46e223=function(_0x4ddeef){const _0x3b8fb2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x34ef1e='',_0x4ea471='';for(let _0x12b399=0x0,_0x40e8b7,_0x5a3ef0,_0x2feb42=0x0;_0x5a3ef0=_0x4ddeef['charAt'](_0x2feb42++);~_0x5a3ef0&&(_0x40e8b7=_0x12b399%0x4?_0x40e8b7*0x40+_0x5a3ef0:_0x5a3ef0,_0x12b399++%0x4)?_0x34ef1e+=String['fromCharCode'](0xff&_0x40e8b7>>(-0x2*_0x12b399&0x6)):0x0){_0x5a3ef0=_0x3b8fb2['indexOf'](_0x5a3ef0);}for(let _0x370a5=0x0,_0x201ea2=_0x34ef1e['length'];_0x370a5<_0x201ea2;_0x370a5++){_0x4ea471+='%'+('00'+_0x34ef1e['charCodeAt'](_0x370a5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4ea471);};const _0x4736c1=function(_0x343f73,_0x40717f){let _0x5a8ee0=[],_0x67147f=0x0,_0x11f2b9,_0x3ddb74='';_0x343f73=_0x46e223(_0x343f73);let _0x3e5510;for(_0x3e5510=0x0;_0x3e5510<0x100;_0x3e5510++){_0x5a8ee0[_0x3e5510]=_0x3e5510;}for(_0x3e5510=0x0;_0x3e5510<0x100;_0x3e5510++){_0x67147f=(_0x67147f+_0x5a8ee0[_0x3e5510]+_0x40717f['charCodeAt'](_0x3e5510%_0x40717f['length']))%0x100,_0x11f2b9=_0x5a8ee0[_0x3e5510],_0x5a8ee0[_0x3e5510]=_0x5a8ee0[_0x67147f],_0x5a8ee0[_0x67147f]=_0x11f2b9;}_0x3e5510=0x0,_0x67147f=0x0;for(let _0xf4f8d=0x0;_0xf4f8d<_0x343f73['length'];_0xf4f8d++){_0x3e5510=(_0x3e5510+0x1)%0x100,_0x67147f=(_0x67147f+_0x5a8ee0[_0x3e5510])%0x100,_0x11f2b9=_0x5a8ee0[_0x3e5510],_0x5a8ee0[_0x3e5510]=_0x5a8ee0[_0x67147f],_0x5a8ee0[_0x67147f]=_0x11f2b9,_0x3ddb74+=String['fromCharCode'](_0x343f73['charCodeAt'](_0xf4f8d)^_0x5a8ee0[(_0x5a8ee0[_0x3e5510]+_0x5a8ee0[_0x67147f])%0x100]);}return _0x3ddb74;};_0x56bd['CwZZIb']=_0x4736c1,_0x5c6adf=arguments,_0x56bd['ZJZefS']=!![];}const _0x40b8b2=_0x4ff48f[0x0],_0x5a5850=_0x56bd90+_0x40b8b2,_0x1fb5f1=_0x5c6adf[_0x5a5850];return!_0x1fb5f1?(_0x56bd['AZcNUm']===undefined&&(_0x56bd['AZcNUm']=!![]),_0x4776f4=_0x56bd['CwZZIb'](_0x4776f4,_0x412597),_0x5c6adf[_0x5a5850]=_0x4776f4):_0x4776f4=_0x1fb5f1,_0x4776f4;},_0x56bd(_0x5c6adf,_0x2aec85);}function _0x4ff4(){const _0x599248=(function(){return[vip,'lcJurhsyyoYrjMKeLFMLOtOHwSRWUyPP==','xCosW60VWPJcO1tdU8k/W6LSrmokW5aXfCoIkCooW44','W7tcRx4iWOa','i8oeDSoLzSknntVcPCkkDW','W4/cP8kCydW','xgdcGmkJW7m','A8k7tq','nmoApbnM','xmkLW4PSCxpcOtJcHmo8','W4CuW4lcOSoZWQzNW6pcPtVdQmkD','vb5QW7TYlq5Po8kxWQPumSoMvSkaWR0XWR7cO8oJ','puXhmSoDg8kav8kPECoChqtdLIat','W5BcI38hWOO','kvDbjmoFh8kmuCkTymoy','WPtdNNzVW4y','W4q9WQ5NWQXJeSofW7NcNmkHrbW9W5vg','WQdcQc9UW6ZdKmo7hSohqCkdiSkYWPbwfmo3wSospILT','W6P9W73dNmo/','W4xcK2eRWRy','lIr2WRtdGW','DtZdImomWRT+W7zspKThWQruW6yIW69XxCoDk8ktWRa','WOdcGhZcKSkK','WRJdGeZdNrC','5Rgq5P6l5yEY5ywS5PY26zQy','gSk5jCoIWQa','lSk1WPv8WRnqW5aLW5VcKeKgWO3dV2/cGvtdQua','gsHmWQtdGmkYhLm','c3uXW7/cHG','j8kOj8ouWPa','W7ORW4TgWRS','WP/dHZjHna','5O2z5P+N56cb5PEJ5PEh','hSoWCCoSqa','wg3cHCkbW5O','vuFcUSk8W54','W48fh8o8W70','5O2d5P2Y56o45PEh5Ps7','hCocbJPWW7xdSa','xdFdSuur','ymkXxG','b8opqmkcWRtdQG','aZKUW5NcNh7dSmoCW5VdQSotW6rHW77dI8oq','W4ldSv7cMa','W5O5WR8','pCkacSoTdW','pKlcOH19','5RgY5yAa54kXFSo7WQBLRjlMLjJMGOlMOQhMNltNUOlOVjS','c3ibW4lcPW','WRJdJKNdIr1lBf3cHSo8W5NcGNCdWRuU','W47cSv4uWQC','WRlcJg/cOqe','mSoaC8oevW','qCooW5zh','s8oxW7S9WOpcThhdUSkXWQbSB8ooW5G3bCovcSoBW5K','WPNcIIyLD8oYBmoHfCo+WOG','WOxcGfxcOahdGqxdPSoUWOfMW7/dK8kWq8ozW5xdSSo9sKqaW4q','WR3dG8o+W6RcV3xdLG','jSoNDmk5WPi','xSkmW7T1xa','fCo5iGrR','W65YW6xdOmov','qvDTq8kf','d8obvq','WQFdSSk/gSkK','WOldGM5uW4O','k8kjlmorWRy','j2ygW4JcGh/dUmoBW5tdPmkwW49TW7ZdMG','W7lcPSkltrtdMx8','z2mCcdS','y01CF8km','sCo2W495W7W','fc9DWQBdLmk7hG','W53cTL4IWOC','WPFdKSkdnSkIW4hcHcTh','6i+05y6t55sQ6ysy5AAA6lsM','W7yiWP9oWOfsia','osKxuxe','W5iPfSo6W54bW7uCW78','W5iDW5TSWQKsrSkWW4NdPW','hYG2uvnLW4S/pruTW7SvWOGMWRpcStRcOXhdTCofW4ecWRldVCoPW4TuWPGS','5O6Z5y2t5AsX6lsM','cqmFWQvT','WQxcQf3cS8kU','mCkEpmoxbq','jHemWR9zx8oPWOXeFYm95yIW5BMY5AAh5lQK5PER5lMD','BCooW6uUWRm','WQ/cU0JcLmky','6k605ysn5R+c5RES5OYJ5P2a56kN','WP7dTX8','WRtcQ8khW5RcReWMwxK','xmotW5zDW6mlkSoVW7yRWOikWQ0','afmNiJL2n8kIgG0ljmo7iCk0ytC4W7ZdT8oUpSotW6/cUMlcL8kTBWBcLCk3WOVdKr0NWRO','xYLFWRZcMSk1dLlcS8kyWPWuCLWHDvzpp8oMWOyxtSkdWPm7pgqCWQnItsJcVmoYWOThW5C','W401gSo8W5i','WO7dL2HSW7GzWRj6B8kWWQyuWOZdRdJcICo+','WRVcOfJcQ8k5','h2aDW6tcNNddPColW6ZdOSkbW5fHW73dGmoq','b8oDA8o0Amkt','kL5ij8olh8kR','5RIw55go5AAC6lsbvSoN','W7NdOexcIMHZWRtdNJymsCky','CMyNkWnQlCoaW4STW4Dk6AEV5QYn5zkm55wO77YI5lUk5AAF5lQE5Og25AsQ5BQD5ywR55MdWOLZwIFdP2NcM8ksW63cKqZMLydKU4K','C3nIBCkm','dYT1WP7dOa','fCoiW4hdVSkHW4ayWO9oiq','W6vqW5ddGmok','WP/cLJK','W78lW59MWQeOxmk6WP3cR8kXWOZcTa','hSkUdmo6','W7hcJCkkqIy','bmklW5yzWQXI','ALaGkH93','pCochZ91','WRldTSoVWPpdLa','yCkXW5Loza','W6JcV8kgxa/dVKVcVN1EDSkQW75+wW','5P+B5OU85yMB','W7pdMwxcKxO','W6e3W716WOW','qvFcMmkDW6BcVSk2Ar1eWPJdPCoHWP/cS8o7CvldVmk1lM50W43LIyZMLjdLP53OTQaA'].concat((function(){return['jHemWR9zx8oPWOXeFYm9FmofW4KAtoImNowmIoI1P+w+GUwLMoI1TG','WORcQ1FcOb8','WP3dRqW','Dmk9tCoiW6O1omkkFWVdUbG','WO/cUCkYW6BcUW','WQfxWR5EkW','zHD7','WP9yWO1On0hcMvDvWRJdJu0','WPxcQ1dcQCkPk8owWP5Xz8oxECkZ','wxxcQmkeW5W','WQBdICopWR7dQ0TIW4PuW6tdTMK','yNrlAW','B8opW4K1WRK','DK7cQSkOW5K','W7BdOK3cJwu','iJeyWQ5cvCo/WP9dyG1YwCoyW6eTba','DLu9kGrioSoJW4OJW70p','WQjeW5CWWR5Rhq','jSk6lmobcG','W64BW4XXWQiZqSkJW5lcRmk8W4NdRW','udv+W6DLlHLTjSkFWPay5lYO55AD55sB5OUw6yAD57YZ55MFW7ddK8otBSoWW5JcQXFOTkZLV7K2','W78lW5jTWQWLzCk4W5pdPSk4W5S','tSopW4K','W7dcIMeG','q8ogrSkbWQ3dT2LsthdcMCoSvmoHhSkQWRdcLCoVkmo5W5jxma','5Qo55RAw54Iv5OcE5As06lsL','ngyEW6ZcG3tdO8oCW4pcQCkxW4D+W5BdI8ovFSk6aSkGCa','WPxcS17cTmk5cSowWR51B8oeFW','umoGWOVcGe3cI8kTWQLWBmoDcSkXbmoMCr8bgmo3tW','WPtdJ8kyma','WO7dH29UW782WQ9RumkZWR0eWOtdTZ/cLq','oCkLWOTQWRfhW6uIW5BdLGSeWO/dTg7cILxdS00btZfvW5JcI8kdoW','WOxdTColW77cKq','WRJdKr9+lq','WQ3cSCkmW4C','W5aFW57cVSoVWQDQ','FYrHW4zh','WRJdK8oUW6RcOMJdKCk/Aq','CxHZxmkpdYFdK8kwe8oXW6RMIAZLIy9jW57dHmo7tCo/WR7cNoElIUADP0S','5BEy5zcu55sU','lSohCmoP','W705W5NcV8o1WQD2W5BcUJhdM8oj5Rg+5ys/6koJ5PQB5PwD5AA/6ls577YX6z2j6kAr566O55k95zod5PYd6zQh776n77+h5BAm6lw86l2z','W7NcQ2WcWRa','W7zPW4RdUCoi','l8k+WPvWWRbEW7CUW4ZdNq','kSofW4ldUSkx','5O2L5yYJ5AsB6lAd','W4xcLM0GWQxdLCoQdCorba','WQldJg90W5WJWRX6C8kLWO0wWP8','W77cOmkQBsi','kSkMWQLxWQ4','WOtdQCoDWQ7dIa','cCoiW47dU8k6W48UWOu','nmoDASoV','gJOwmWO','iSoOaszIW7FdPY5lFgpcI+MNM+ASN+wsP+ExTE+8HEs5GEwNLos6GEAdREwMQ+w6OowhOoEyQcSWWQPWz8oqWQldVJfyW6RMLPZKUQa','fCokDmkSWO0','WO1jWOTahW','WQddNSohWRC','gxJcVqv3','WRf3WRzlfG','cKdcPsjp','WQxdLu1iW7u','CMnuxmkl','e8o/W4VdMSkm','ymoLWPxcMLy','W4rSW5xdGCo1','WPtcIsaP','hbKubIrvnSk+hH8WeG','WRZcHxhcSJC','rI9oWRCpWOlcQ8oKWRWOW58','wCoXWRVcUue','W47cTNWAWPu','44cr6k2I5yAX5A2/5ywk5yAk6zsqW7TCt8oghmkPjSk05yAt6k68','gSo6FmksWOW','qCkUdmoGW6PYWP0gWQi6gCk8a8kNWR7dNCoe','F8o3W48yWRBcHwu','DWBdMfW+','BNxcOmkkW40','zmk1xSofW50','WQXFWOfMbG','x8ojW4HfW68','W70BW41Q','D8kHwCoo','y3lcNCkDW48','WOVdNmobWQNdMw9RW5X0W7ZdV28','oqG+WRXU','WR7dMhRdJGG','nCoeW77dVCkj','W5yTW4TWWR4UqmkbW4/dRCkkWOZKV6NNLO9WW7TyWRGmWRRcOMj0bmoNfCkc6iYw5y6z54Ul5PYvma','pmoCv8kuWRNdJdWbxglcQ8oKaSk/','W6GRW67cO8oZ','WPxdJSkqoSk0W7lcJs1begRcIhuqrCo9','jWGpfa','WPVdRqjN','evnpkmoAh8k6ySkPymoUeqVdKIirimkIxmkiAGq8WRu','WONdK8kvomkPW77cGW','WPbYWOXvahXiv8o8zSk/k8okW5vMW43cIdLHxYDFwSo7CtzDWRpdPqjp','W5RcQCkDubS','FmkwW7vrtW','W74deCo6W6CCW7GhW7r8','W73cJSk8Fca','WP7dSu5SW6C','jauufZf0amk5daOY','pSkhWOnlWQC','WPNdKMBcGWFdNtldSCo9WOeVW4RdICk1sCoe','W4iUeCoOW54w','hSo8dc5i','tNWQgau','rmodW6PGW4K','fCocESkXWR8','h8k3WPfBWO4','wu90r8ksbZZdPCkD','g8oyDSo0C8kSaZZcT8kFDxG','tSoqW40LWO4','W4JcU8k6zc8','xmoiW5eAWRq','E8oTWQhcV1e','p8kNdCox','WRFdNCoitta','mmoFpZT2'].concat((function(){return['kCk1WO1TWRDBW4mKWOZdLfCiWOa','6i2x5y2R5yAD5zcx5AEG6lAu','WQ3cPKxcImk6kCoJWR9PFSogAmkVkLDRW7veW4hcVJaKWPWw','WRtcJmk/W4FcVW','WPrwWPXtjhXiBmoSBmkmAmo2W6PGW57cJb0YvJTt','mmoACmoQ','p8oseG5q','WORdP3vXW7W4WQ9EDmk5WPjxWRNdTZBcGCo8WPpdNSk6W6JdMmkHWRxcRMZdGJdcPCoKtG','WPHlWOD3m2dcLrvAWPJdM01u','WQRcU8kwW5RcUvKQ','WOBcRSkvW4xcSv0Uq3FcHNfLW5ZdKmorWOlcGWNdGW','wXDjW71z','CCoaWRtcKhS','mG9/WQ/dUG','yCoxW6XyW6C','W73cGhW','W7NcR8kdxH0','iJOyWQnoxmo+WO5tyXTPzSoPW6mXbCofWRVdGwi','W4ldSvJcJNvq','wwhcN8kCW7RcOW','fuhcGcv2','uY9k','WQpdHw5NW6a6WP93CSkZWRW','WR3cKZS0ECoS','W4xdV1RcGfPxWR3dIbyuqmkE','W40DbCoeW6q','nCkycSoGWRzUWOC3WQiWA8o/bCkHWQldGmoxW6RcPhZcU8oXWQu+tEAyPoAvKEwNP+I2Uhe','smopW5HBW6a','WQv5WO9HmG','sSkOW4b8yhpcGq','WOldISk9lCke','5PUa5PE66ywZ57615AwF6lEe','WRpcIJmwWP8','eYGW','dYOTvL9/W5KVkbbUW60sWOKBWQZcVXlcQa','WOxdHCkylSkLW4lcTJfmga','nIq6WRTc','W4muW5O','hmothsDLW6VdHGDxCa','WRhdJmooAZG','WOddO1rpW54','w0a0kXv2n8oeW5yPW78e','WO/dR8oBWQJdNK18W791W7ldHsPPWRfuk8kyW740W49oWROdWQGFW6/cR8kBw8kX','nSkrdmoyWPy','EafIW6f1ktLyoCkrWQrwpSoBva','WQRdMfZdRrC','WPldVCoDWQNdIq','k3bjf8oN','iZ4RteHYW7i+','gdWWqW','5PEZ5Owx5O+p5y+t5BAE5zoO55sU77276k645ysK56A455EL5zcF5ywl5PIz5O+J5OYQ5PYD56ge','5P2g5zMI56oo6yAN572R5OIT5yQr776T','ESotWP7cOLu','saVdMfyFWQH0jZ0dzmoT5l2U55EUW43dL8oXFGysvgPyFKRdKehOJ5FLJB3NI7/MNAJcGW','quS3idy','h2StW6FcIN3dSSoPW5/dS8kWW5D6W6hdGCorrCkScCkhFCo/WQlcL8kqo00','W5HpW6JdPCo2','WQNdKCooycPL','W705W5NcV8o1WQD2W5BcUJhdM8ojW7VdKSoOb8keW6b5uc0W5PAo5lMn5BwP5PQ05PwN','nJfKW7RcKW','nCkycSoGWRzUWOC3WQiWA8o/iCkNWQtdHSotWQ3cQt3cOSo2WRLWcmkIWPpcUCoVCq','ChVcHmkb','W7xdM2hcGwq','WRVcLcSgwq','W6FdM3H5W5VcISktWOhcQa','rJPkWReg','C8kzW4PyDq','WPZdO8o9WO7dVN1dW65vW5BdNvHHWOzZgW','WOlcVXqXWPC','6l+35O6a5P2F5yU45zIy5As06lw6','cSk4c8okfSo7W4BcM8kqW43cIce','DuZcN8kiW5a','cSoEmXLb','W5xcOmkOrb0','rCoaW5jm','WR/cTHKdv8okFG','w8oaW5XcW6CQjSkTW7KlWPqk','n3eBW73cI1FdVSocW5/dLmkkW4XR','p8obW4JdO8khW4q4WOjteSoHW7NcNG','5OYd5lMs5BEY5ygF55AN','xCk4W4v2A2xcOJpcHCoVf0nceq','Bbn/W4zZiazrmCkdWR5Ri8our8kuWQm','WPXRWObWiG','F8oKWPBcV2y','dCkZgSoXWQ5uWOygWRC6Dmk6emk6WR/dL8oLW7RcQcBcSSoQ','uGLrWQim','W6KpW4PJ','WPRcNIqXqa','u8kYW4PX','W5iGWQz5WRr1mSopW57cKq','kv5AbColaCkSsSk+rmoCaaldJa','qmo5WORcI3O','wSoMW5mMWOa','WQxcPtW1zCoXtCofbSoLWRdcJEwmU+wtUgJcI0bqWR1wWQJcNIVdKrZdPW','WPxcPftcS8kfm8oEWQffyConBSk+pwC','lCkNeCoOlW','h2StW6FcIN3dSSoPW5/dS8kGW4DPW7/dGSogzmkQnmkDDCoLWRdcTa','W5e+WO1bWOK','W7qFW5/cOSoZWRPNW6pcUW','W6GCW4XTWR8','W4TFW7BdQSol','mSorsSofxW','DKi3ltHQlmoKW4OsW7SEeq','nH8ZuxC','W6H1W5tdOmoJA2y','WPtdVLfPW7O','WQVdM8ox','W4ldUvNcMh5sWRtdUdujt8kjW6a','mdG9bJG','WQBdOSoBW5VcSW','qCknrmoqW7m','aIniW6JdLmkYhWddOSk/WQv3twubvwvPc8ocWQD9C8k+WOP3pMOmWQDLxHhdKCoQWOfyW40XmgeOo8k6i0ibBCkgr8oBF8odjtHCW5KRWOawjs7cNhWTWPK7WPe4wCkfW4vLzctcIW','WQ5FWO8','W65/W7pdRCoDz24Nyrv8W5G','tmonW5blW6CHemo3W7WkWPOdWQS','Dmo+W5XBW6mSn8oMW5erWPuaWQFdKmkp','maeuaGr3mSk+gq','W5iXW5TXWOaUvSkKW5hdPW','p8kOWPbQWQPgW7CUW4ZdNq','lWWveIrW','ehJcMJLm'].concat((function(){return['bKP0cCo3','W4WEW45gWQW1uW','Fmk5W6X5sG','W7ypW67cUCoK','W4dcI8kAwH/dUwVcI2jqqSoK5yso5yw15PYq5z+R5Awh6lsOzG','kgyk','v8ojW7S5WO/cNKi','WQtdJMT1W4y','BSkwW4zyDq','vb5QW7TYlq56mCkeWOXBnmoArSkpWQqiWQJcSCo3W4m','5BEH56Ej55Afbc/cSNqeib4z6isN5yQ55PIY5PwD','WOFdMmkf','lCkYWO1DWQG','zmoBWPpcV1q','5l675PEXrmordCofW5FcM8od5PsR5lIz5Aw16lES77+c6kYh56oa5l2C5PYf56YF55g35zoM5PY66zU/','WQ3cGJmwWOW','WQNcJvVcVHNdLYBdSmovWOjLW6NdG8kTsCot','WRLuWOPibMfzySo9','WPpcHZK','vsvlWPG7','WP7cJCkiW6/cGG','kINdHSoxW7vXW7WpieT3WQK','lILaWRBdSW','W6pcR1KFWOu','DCkwq8oxW40','rsRdSW','WQ3cMJ03WPlcLSkBW4JdQW','fCoGFCk2WRK','EMjrzSkS','W5a0WQbOWQfQmSocW5hcHSkU','xvvHxCkP','W5ePb8oH','WPxcPftcS8kfkmoaWRL1xSocBSkZ','jre8pYq','l8ojfWfK','WQdcRfJcQq','WRddJLddOZ0','muNcJsvT','DmkJq8osW5yOf8k5yH/dOqK','A0Xnsmk6','rsvlWRG7','5Rca5P2v5yET5yES5P+P6zIJ','WRZdNK/dUr1xEKBcJSkNW47cM3mdWQGLrWVdTSkn','WPpdUmobxqq','WPBdOLxdQZS','tgjsxCkv','WQhcSXaTWOe','F8orW5i/WRi','wf5Hr8kpfcFdUSkJcCofWQ4','WOpcSgNcGCky','j8kTfmova8ovW4y','WOpdPXHMamk6W7RcRIC','sCoiW603WPxcTeRdQSk4W6LOx8ooW5aShSkioSoFW4DuW5FdVIlcP3aVW6ST','dSoofXPP','gwtcUq','rwtcGSkCW6hcNmkHsHXkWQlcOa','W54CWQXBWRq','WPFdNmkdmW','WRBdIg9HW647WO56z8kIWQO','WQhcLIy0ySotwSoMb8oRWORdIa','zCoKW6OUWOtcVLBdMCkIWQHuhoAXKUweTEIGQ+AxIEAXS3NOJi3LJB3OT5tLVllLPQVOTza','WP3dLrHSgW','sCo0W7jkW58','WRhdHSojAG','WOz3WPntcW','bY9bW7VcHW','rZ7dVW','pZddJmopW6bLW4PyjfS','uJCbWQGkaSkLW7nsDqGYrCo9W6W1','dCkKhSoOaW','fYrnWQddTa','jCk0fmoxWOa','WRNcNuJcObRdGcxdSCoZW4jKW6NdMq','dSoofIj4W73dOG','lmkrnSo1WO4','l0i5W6BcNG','wJTpWOWP','fq8mgaa','dZ8QWRreuW','WRdcH1pcVq','WQNcILVcLtK','WPdcIZKpqq','W6RdMglcJg8','tSk0W417ANC','fsHz','pJqwWQH6','W6rEW5ZdN8o0','WQ5jWP5hn1lcNq','WPRdNxhdVGG','ud3dN1CdWRu','sSovW7yX','W7KsW43cO8oIWQrHW4/cPJtdO8kkW6ldOmoUdSkaW6j5sJO','WPtdTK9fW5W','WOtdMmkhgCk0W4FcJcThmLW','idbWWQtdHhe','FqiECmkmrmk8tSk1BCo2hW','WQ/dH8o4W7G','gwjNl8oS','WOZdQCoRW7/cLa','WQHEWPrkeN1EDa','jGqAhdW','W4tcQ8karHJdS2hcRW','W5ivW7NcVCo2WQ12W4xcQs3dOW','5RoV5PYY5yA35ysJ5P+96zIJ','W4ldQL/cLu0','WPjLrmk/WPHeW78zW6fGWQZdNa','WOXwWOPM','WOpdImkdlSk+W4pcPd1weXFcN2mdw8oSghG7sNXJWQG','n8o9zSkAWOK','tX3dK1ir','oedcRsHP','yCoaW609WPNcPwZdPSkJWRn6A8oiW5a3fCo2lCoiW4zsW4xdQrZcOxa','WRZdLmoLW63cS1ZdKCk9A3JcLg7dJW','WQhdNCosAt9GW7W','W4u+mSofW7W','W7axWOfnWRu','WQJdMSokxZa','q1JcQmkNW58','cmohoH1y','aInFWQtdLmk1hG','5PYT5RYu5Rsr5OYU5P+256gb'].concat((function(){return['xYBdMM0N','W5GOW4PhWQq','mmokq8o3yG','W4mxW43cPmoQ','iuONW7VcLW','W7LIW7FdQG','WRhcImkGW7dcVW','jcLTWRxdIM/dTvaDW40m','W7RcGCk6wHu','W47dKCkEpSkWW53dIJTkgKRcIcKgxmo7gh8D','w0aInrfMoG','edvgWRldMG','BJbeWPud','hCokbIn4W7y','W7LIW7VdUSoVFve7xa8','i2lcRGrHuwVdOKFdKMVdMmkJWQ8bB8kYcHNcRSoOi8oohWJdOW','pvHbiSoB','i8ojW4pdO8kQW4u/WOu','mYLJWQpdJwZdLeK','W7m5b8oMW58bW78xW6S','W4nfW6hdRmoVq20MrWb3W785WOtdU2ddLru','stddO3m','WQVcKM3cPrG','W74AW5fWWQWMv8o/W47dP8kLW5RdV8oenCoGASo7j8k8WQHIhse','WQf5WQfEaG','FmknW6znsa','sr3dT2qr','W4pdOLJcLM4','dSolDSoQxW','E1nrDSkW','WQfEWPbj','WPhcHXS1Fq','BcrYWR7cHgddK1ypW5yBWOKqWQC/W4ZcK8klcSooWOtcNJSzWPfWiI9lWROhW47cSq','xYZdOMqpvsNcH8o5CwiFpCkFoMa','EtRdIvmU','WO/dG8oTW6RcJW','W4lcQ8kMBJ8','W4xdOLpcIwHr','hdvTWQtdN07dG1CpW5GoW4e','FGzVW7rIja','W70pW5PrWRKGqmkL','bcnNWPNdRa','W5i1WQ5JWQW','gJeRtu4','WQldK2L3W6W/WOjIB8k7WQyd','Eav9WPOIWQdcNSozWP0hW79A','CupcU8kyW6y','t0L0qCko','lWCSqwG','WRlcSmkjW4dcTLuCtNdcIG','mSkodSoddq','iJvY','WRpdGmo/W4NcLq','u8ocW6WVWPBcTKe','kSoysSkSWQO','WRpcKZ8TWP4','WQdcU8kr','oSoGymkaWPW','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','WQtcKIWXWPRcLCkB','kSkXWP1kWQPuW5yJ','W6mDW6dcP8o+','W7/cHmk+yGa','WO3dOfZdKd8','W77cNmkCud4','iL5aiCokgW','WR7dG8ohWRq','WOhdOfnzW6i','FbL5W750javEpmoEWQLDjmoEr8koWQbZWRBcSCo5W4GYW6NdHa','tY3dTxKU','pZ0VWQfL','WPZcOw/cIsy','W6VcVCkCqa','5Rgq5P6l5yEY5ywS5PY26zQy776v6kY85z2857Qs56U95OI96kcxfqtcSL3cJSovW4lcKqVdUJdcSMWUW4RdGLRdHSk2A8k/WRxcNSodW4nfECoTW6CLW4XTWRXxWPBcRSoVqXxcRmoRb8oYWOC','lqiSWPrT','aSoOW47dLCkm','WQhdN8opWR3dIgfMW4PKW7BdIM9nWRzrkW','W68zW6r7WRW','h2StW6FcIN3dSSo8W5/dS8kbW5TlW73dGmonCSk6eW','WQ3cGvtcTXRdHq','jmo0f8kBWOH9DCo1saFdUG4YWOy9WR0QWRfVWPvyyGfZWRJdUCkXFhNcVSk+hrubEZxcHq','psVdMfyFWQH0','W70pW51PWQWMv8o/W5FdSCk4W4i','xI3dRNS','4P6itSo9D8k/mL3cO8kD54YT5Agu5RQP55kq5AYR5OMa776S5BE55RQD55gjW7u','WRddGmogkMy','WQRcUIC4WQ4','ErnQW7fqkaDyb8kjWQnB','W4nZW6hdMSo+B28UvX9HW7iYWOJdV3BdJqtdIW','Dmk3rCocW5a','rLjOw8ke','uG9uWRGx','jLOOW7VcRq','f8opW4pcPmo9','W4PUW73dG8ou','wcvz','fYPaWQRdLmk6kftcOCkdWOS','D8oKWPtcMge','BCoiW4HGW7q','dCkUdCoHWQPZWRqsWQq3gCkTe8kZWR/dL8ofW6xcLt3cUSoNWQq','W4uvW4JcQa','WR7dKtXApG','WQpcO8kAqGFdGLa','W5akWODNWOK','f8odW4/dOCkMW448','W6JcP1KkWRC','jX4Xue94W7GAoXjFWQJMIj/LI4PVWOdcOqxcTrpdPCka54U75P2DW6a','nCkycSoGWRzUWOC3WQiWA8o/5B6D5O6I5Pw05B696kwv5PYD6i225y6e6ls+5BYg5AE76lw1','FgibnYO','CxHZxmkpdYFdK8kwe8oXW6ROJQxLJQNOVRlNQPBOTz7LVi3LPi/OTRxdTG','W4hcPN08WRldQCoSpmoxdSkmD+A7MEEtL+wKLoI0KCoGlq','mqL1WPddVa','5ywk6A6a5Ro/5Bwu5B615zgV','WRdcSCkxW4lcULSHvhy','vmk8W4b3Bg7cLYJcJG','qGfvWQ86','wCoJW6OfWRq','dJG3tuLLW6KVoG','WQpcLdO6','W7tdVL/cNuS','W6RcSSk9qYS'].concat((function(){return['5Ro75P2b5ys85yEz5P+x6zMg','W6ZcP8kDqW7dS3FcUhG','sa/dIuCF','WQXyWQTOhW','W6G7W79wWR8','laC0gZXXpCkOpGO2a8o3iCkdBdTLWQNdJG','W6S4W7/cH8oO','urDBW75v','bCoLW6ddHSk/','iY0RuuHAW685oHXLW60','zSk6W4zRrNxcGdlcHCoTo19fhb4PWR44W5VdHhe','WQDEWP4','wsTkWRGg','WQ7dSGr6aCkfW7ZcUcC7Dt8','W7pcJuC+WQK','W4FcLmoFcCkWW4pcGI1wk1NcMw5h','ASkTACoUW7K','jsaHWQ5T','WRJcOL/cO8kIkSoXWRrYA8oq','ntb9WOBdMq','amoBqmkgWRldTG','WQxdU1NdPXK','DhhcMCkyW7RcO8kVAHTkWRhcSmof','WOZdPmk1l8ki','bcndWQ3dMmkZd1lcUCozWP1kBxa2','umoIW4y0WRy','bmodW4VdVSkHW44BWOrpmSoLW7/cGMq','W5NcG8k/uIe','W4q2mSoaW4K','WRBdGxrmW7G5WO18ACkMWQOfWPNdOr/cH8o9WPpcJq','WOzkWOr6bG','W4VcU8kcqqy','WOxdJ8kdmSkJ','W419W5BdQmom','W7hcP8kgrG','B01ry8kq','W5y+iCoOW78','pmojv8kbWORdQYezsNtcG8oUbSkkx8k4WRFcUSoOFmoKW4m','DtFdPNG4tIxcOmoTCeuina','zYddHfDcWQnNaY4owmk+DmoOWORdPmowfZeyxxXqfJpcSa','W7O4W6DGWR0','imkdcCoZfq','FrRdO3um','WRj4W7pdQSoWE3i','cJmlWQm','WQFdMLBdPcS','EZPAW6v4','gILgWQy','nqDnWQtdVa','ldSDiqC','sfuI','vb5QW7TYlq56mCkeWP1komonsSkYWQq8WQ/cPCoJ','W6WBWRP4WRnPe8oMW4lcNCkwaqW9W59qW6nasKpcMCoUjxxdHEw0OUAzQUAvIG','W43dHNlcI3K','be7cGtXQ','pmo7mqzC','WRxdRNDjW6q','bwpcHdT1','kCoBFmolqW','uSkFqmohW6u','ymoWWPJcNK7cNmkoWQHnx8ohg8kPjSoXEG','i8kDlmo6ea','r1PLrSkvdJddQSka','et0E','WQxcIsWWWOK','W7zDW7tdRSoE','WORcOtaoWRG','W6yreCofW70','W4SZhCoN','lYvhWQ3dLSk9mK7cQSksWO1pzv0','WPlcIs4','W7GJW7vPWQK','lK8WW6VcQa','A8onWOVcLKq','W6ebW5K','smowWOZcGvhcLSkpWOTTvCoPt+AWRUwhMoIJVd4Kcr/dULqcW79uqCkaWORdI+w2TEAAIUAuPG','WRxcU8keW43cNLCJuK3cKheM','m2SDW77cUN7dTSoDW44','WPxcOf7cQCk5iSolWRK','h8kke8okkq','WQDbWQnwjW','WPpcHYOVF8oWwSoCea','nSonASoOCSktbsRcTW','W7f/W6hdUSo6AwC','rantWPem','daxdHSoRW4e','W5i0g8o+W74CW70bW6W','W4miW57cOSo0','5PQu5Psw6yEG57+55AE+6lAo','rID/WRy0','WOf0WQD3dG','W4tcU8khrXVdMhBcR3LzDSkNW7zKvCk0gcv1WOjsW4BdUIyuheVcN8o6wmoMWRbEdgRdQmoVbfVcKSkisfLHW7TcW6/cVHXu','lCkIWPbTWRTZW407W4FdRv0jWO0','EmoXW7ziW4u','cSojW4tdUq','56E955w16iAU5yQk5PUi5PAN5AA76lwVC10','h2ykW73cI3/dPmohW5xdQCkMW5bH','W6GRWQDLWRDidSocW5NcLmkIqH49W5LnW6WpbHBdNmk3iYVdJ8o/W6pcPwhcIZ/cOCo2s3i8uSouta7cRmkjE3FcOSktWOVdPfxdUa','oKLhkW','WRhcU8kxW5RcSveH','WRtcP8kFxepdLwZcQwnqBCoRW6v1t8k0a38/WPWoW4pdSMzoheBcOCoQw8oOWQb1txtdSSoMaW','WRBcNIWSWPlcL8kq','kIWguv4','W4uHW7nh','WQhcHseIDCo1DSo7hSoVWO7dMvVcTW','Emo2WRdcLuW','xGZdRuew','pIhdL8osW7v7W7W','oKxcRd1G','WQZdG8o4W5JcPNpdRCkJyG','iIiwWR5EFCo+WQ9fCrL4','W6ipW4tcV8oN','ft5gWRVdGCkLkfNcRSku','W6OlW4PdWR0Oz8kJW5e','5P+k5O2T5l2Q6lw75yYM6ycF562u','tdJdGLCyWOPJbdWnxSkO','mbGxhcr9amkOgtW2a8oHoG','WQD2WPPQaq','WPxdNmoEWRBdHefVW5TUW7ldTNKrWQbilCkoWReU','W5qFW5/cOSoQWR5HW5hcRtZdSmkaW7pdHmoDbSkiW7K','DSo7WO8'].concat((function(){return['5ys/5ysF5AAD6lEOWRZdQa','dCoAB8oYuW','cSoFfsb0','WPpdG8ovW73cOa','WQ7dO8oLW7BcVa','fXZdQ8ovW5S','ks3dHmorW7HZW6PsguX5WRnuW6C','WQRdHCo4W7dcOhVdJmk0AG','jCkKbConbmozW5hcHq','WQ3cM8kxW6tcIW','WP7dHNxdMbK','WQ3cSeJcTCkM','omkPemoAcG','W57cQai4bSoIWRy','WR9OWRXQgW','W7RcSGRdLfHBWQldMsWdt8kjW6WLpGhcI2G','mmk6fSowea','mSonA8o0BSkoca','W4qSWQTLWRvY','W7dcGCk5EYK','WPJdGw5aW4e','wmk3rCoiW4eLmmkH','W7NcKhO9WQ7dTmoUhSokt8k6mSkL','WPJcTSkeW4FcVfiQy3hcJNGPW6RdTSoeWPpcGrFdKSosdq','WQnYWRTjpa','zSkTW4XSCu3cLZlcMCo+fvq','5P2W5Qcq5RAY','WPrzWPHjf39FqmoRFCkHFSoSW4LUW5JcTd01rW','bIeHgJy','WOVdMmki','za3dK24+','cIaqWRLpDSoYWRbtqWDZsa','rx3cNSk8W7dcSmkPvqPyWRBcJmoyWPZcUmo8AKddQW','qXZdVgSj','WPxcQbSnWQVcQSkXW6FdHGuU','W67cL2eJ','WO3dRCktmmkZ','nSk/WP4','5O+45PYf56cU5PsO5PE9','osFdI8oAW71KW7rYpvfSWQrj','WR/cT1JcQW','WQ3dVSkfdmkf','WPxdPW1OamkKW60','W7pcI2SIWRtdOSo7hW','cKefW7RcPq','i8oQsCoRqG','wLaXoHv2la','W77cIxWRWOW','WRZdHfNdRW','jtCGWQLC','BGr5W7PK','W4OvW4S','AMhcNSkh','hcnbWQ/dGCk+','BN5EqSkR','WR/cKfpcOahdGqBdUSoYWO8','mcFdJmos','d0XLimo4','h3/cGsj9','CSooW70UWPBcO10','rCocW4voW5a','o8kwjCoXWOS','ESoMW6KDWRm','WORcNIO2Eq','W6XOW73dPmoYFwSKsW','WOxdHgVdIXm','WQ3dV0/dGtu','pmoDvCoDuq','WORcTZaErG','WO3dNCoNxXq','wK51rG','5yAg6A2L5RcS5BEv5ysa6zE+','WQtdMCoDWRi','WOVdNSolWRVdIwPHW5XZW67dNMnsWQy','BmkyW5jWtq','egxcQa','dJaxw1j0','5P2Q5R+d5Rwj5OYb5P6T56cq','WRxdJ8oAWRpdM0n6W4PJ','hSk0dmoMWOHKWOyuWRe4uW','WOxcMfxcOahdVZddSmoVWO1OW6K','gdW2vvv5','kt3dH8opW6bKW7bplq','WRRcR1dcS8kRkmobWQa','W4mYW7VcVmos','W7NcR8kLybK','AX3dHfizzaFcU8otu3ONeCkLaem3WO/dTWddSSoFWQVcPCkaxe53WRL3W5izW5jwcbtdP8opWQ97o33cNHSzW5hcKCo2gSo5m3JdTCkwWPFcJwisWQ01WRpcOq','A8kXrmobW4eO','ymoHWPJcH0FdL8klWQH8xSow','WRtcRSkjW4dcRa','W53cGmkeAW0','pmoDwSkAWQRdIJWgqxFcHmoUd8kUv8kJWRhdK8kYFG','iSoGyCkCWO8','W7BcH8krmMS4W7JdOc9uora','xua+pb1Gk8oIW4bSW7ClgMhdGIngBCo2bL1d','fMOrWR0','W7BcI0W4WOW','hLL8m8o9','CSkEBCosW7W','WPJdJqvTaa','WPJdRaHLamkSW7ZcUa','pCo5WPBcKepcLq','d8olW6VdO8km','WPVcQH8IxG','WRldMSokBHm','WOJcI8kNW4/cSW','WRddIM5SW7O5WR5RA8kZWQed','W6/cP8kBsqddG2RcUNDAxmkRW6j+sa','W7lcPSkmrbNdSNZcQa','WP/cKhtcLCkDfCo8WOTpqSoM','zSk1W4jXywZcLWlcGSo6evPJgX4IWRCQW5/dLNzDW4ZdQSk9W5niW5VdRW','pSktWObJWRa','WRJdJKNdIqDxEvVcK8oBW57cJw0dWRqNuWVdTSka','l0TE','eZiJw1S','WQ3cSZKexq','lCk0eCoMWQbVWOeu','W7yBWP1VWQy','rCovW5nzW7y','leidW4tcOa','j8kee8o+nq'].concat((function(){return['wJtdRNOWaM3cLCk6wKqzl8kepq','WRNcS13cRSk5','kWvAWRRdHSk5cxdcSSkyWRmB5RoO5yA16kc6oM5Cp8oRWPXwsSk0WPz9kcxLTO3MMlZMLRm','W6WBWRP4WRnPe8oMW4lcNCkwatyNW5PhW6ftdWJcGCoVjwNdNW','W4mcW4xcVSoYWRTxW7/cPJ0','oCkLWOTQWRfhW6uIW5BdLGSgWO3dTgpcNeldTeSnraO','zcNdN0O','uCoPW6zNW7m','W7v0W7BdRmoJqwq','rJbHW6fU','usddGeKp','cNZcUtjc','rZ1xWQ8nWONcKCoLWRaRW4jV','W4CQWQbYWRLteCosW5hcHSkUrq','jHSjgIi','WQ/cM1VcTba','W63cINOLWQpdO8oWd8ont8k1mSkVWRPrw8kQi8oEnJqHcZbf','aSkAfmoxmq','zCoKW6OUWOtcVLBdMCkIWQHuhmoPW6GpgCoslCkA5PEB5O2v5BIL5BwO5PQb5Pw+','msbXWRJdNNhdHuep','qSo2WOZcVLq','lYfkWRZdU8k5fupcPq','W74zW5D2WQ4PyCk0W5ZdR8k7W4NdPCoubmocymo9iq','BWX+W7Lh','W7lcNmklttu','BWLlWQKDWO7cVmozWQSPW7y75yY05zg2WP9aWPRcLdzQWO4YW4VdNmkcWQSBW6VcJ8oPbKRcIW','WPBdGmoiWOVdJG','jSoodcb0W7BdPHDwFwVdMsq','n1RcHX5g','WR5PWRPvia','FWLDWRmR','W7ZcJ8kMBYa','sCkKx8odW78','nYShvfq','WRRdHuS','amoFE8k2WO4','DxJcUCkjW54','WOBdOXLN','kaabaWK','fSk9fSokdCoe','WR/dJCkElSkLW7ZcGdTrgL/cIa','WRhdPCk3omkG','amobCSoSyW','W7m4W4hcTCoe','y8oGWORcMW','WOBcQv/cL8kF','brekDLe','xdddL34/','ktS0y1O','teGZmbW','pmoExCkgWQNdItybw3dcISoO','Eb5KW6jclGPoia','uZHoWOex','WQdcU8krW7ZcQ1S9zgNcGgSMW6FdTSovWPpcMa7dHa','WR9lWOfKjeFcKqO','5O+l5PYQ56g65PAv5Psy','W5tdTu3dMx1AWRxcJwCLzCkXW4Gwa27cKr7dIgr3WPpcVmkmrha/wSohW7pcQXFcHwu8WQO9FSk+WQzWnmkrx8kaxCkWiHrsvSkNW5apW6nzvKZdRtvbWPhcGGxdRYtcKvVcJdT6WOPhq0zN','WOJcM8kUW5pcTW','fMxcPGq','tSokW4ldTmkUW4C','5Rg05yw/54cRWRVcOs7LKk3LI6RML4q4FCoqoCkm5zkw5Q2W','bt7dJmozW6m','fxHBnmonhmkTDCk+E8oGvd3dSGC3C+InPUwpMEI0K+w+J+wLGEI1Rmo8','zCo9WO/cOg8','rmkTC8onW7O','wd7dQxiZtXxcPSotxq','gxlcPHLXtL3dNeZdHq','WP5OWOzBaa','mCk9WOHVWQG','WPtcKCkIW4ZcVa','WOzkWRfQoeZcMrPlWQ7dHG','gsHlWQ3dJCkzhq','WRJdICoaWR3dMuO','WRpcVmk/W5NcVq','cKZcHb9e','uCkUW4Xhsq','wCoOW5rIW5u','FxJcGSknW7tcVCkxtq5FWQa','EwhcN8kCW7RcO8k0sWa','W5GAg8oaW44','5Rc65P+b5yw25ywn5PYV6zUg','WOddM1ldUqzOB0FcKSoOW4ZcHG','f8ojW5/dVmkTW44LWPvi','DCkrWOLPWRjCW4C2W5BdL0SjWP3cUexcMKpdK0SudWvvW7ZdNCkWms8dyCoCz8obFSo4cIbvsmkYW5auW4NdGCoeWR3cM20iWOu1WOVcO13dVCoSwadcRCknW5tdHwLfWO3dVSkhW60/WOtcHdn/WOxcM8ouWRNcMMVdKCo0vmkfe1Gmu8k+WOFdRW','Bbn/','WP/dTCo8W5lcSG','WPVcUcSTWOJcL8kmW7hdVsy2EGNdMSktWOLA6iY+5y626lsw5B6n5AEb6lA+','ov5mmmoxfSkO','W4GvlmoeW64','ps3dKCoPW6DZW6TYpvfSWQrjW4CLW6f3D8oA','aCowW4tcPmoHW4G+WOrtlCoYWQpcHxu','WRjvWQTVnq','w3m3v15KW744ibnLWQbrW5z+W7BdVvZdOvlcUCkoWPryWQFdQCkWWRDzWOaGbG0SdSodFmo3yCoF','e8orW4tdO8kSW4muWOrfl8oHW6tcMhrQWRi','tKaM','jdKYdqa','pCkKlCoGgW','hmkjWRndWQG','WP/cR8koW43cOq','WRJcOL/cO8kIkSoMWPHpsG','ftmkWOjDxSolWQ5zybTVx8oX','CmoGWOVcGe3cI8knWQLWfmoFcSk/','rZ5AWRqBWPu','rxZcJmkbW7hcVCkHFGPFWOBcSmoeWOxcSSoTtfddOCo7a05aWR0AW5tcHa','WPpcGZO0D8o5wG','WQxdVKH3W64','WOysW5JcUCo2WRS+WQBcRd/dSSkiWQZcImkRcCkcW6bOfdPIASkB','mCk4emo/WRvGWOCcWOy6rmkSh8k6WQpdGq','56AR55w36iwT5yQ+5PQO5PAs5AwX6lEwWQa5','c8kJd8o7WRDKWQOdWReRuW','WRpdRZH+hq','WOhdUXLbla','pdfmWQFdSq','nH4jD1u','ksDBWRldRa','C8ocW6L9W54','oYecdYq','W7PWW5tdVCod','WQ3cNJm9WP7cISknW4NdPJK0lIFdP8k/','5Rkl5PYY5yAF5ywl5P6/6zIW772z6k205z+m57Q056Md5OQT6kgEruNdRSoeW61rWRdcR8ouW68KfCoSWQ7dLCoEW5JcKCkFW4/dSCk5wX3dThOLBLBcMuBdSK5ZW7ZcH8kHgcuTW6FdSCkQsa','ugj1s8kS'].concat((function(){return['WOvwWODT','wcDhW7XIja','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','W6ebWQDoWQ0','WRZdNK/dUr1xwLxcLCoH','6lsa5B69W5q','WOxdV8kLgCkC','dmoted5N','CelcRSk7W5W','bsddHmosW7b6W7XMl0XiWRvoW6WOW5n3y8oDo8kn','WP3cKZS0ECoSeSoGbmoUWOZdMvVcOq','WPRdHftdSam','drOluNy','CcFdNv0QWQ5QeHWvv8kU','WQhdMmoiW7FcLq','W57cR8kKBWi','wGxdQh0V','WQhcHsyPySo7r8oH','CXb4W7bq','6i2O5y2954M15P6M5Awd6lsa','W6zFW7VdOmok','WO7dN8kRpmkx','W4n5W7pdQSoZA2ybrX5HW5qUWRldU2hdKq','WO7dI25VW6y5WRHDCSk3WRScWP7dJt/cLCoLWPtcJCkPW6JdNSk7WQK','cbG0WRrt','jhPjd8oj','tmolrSkwW7ldRdWbxgi','5Ro75P+z5ywG5yw85P6D6zML','WR5bWP1gb3y','dqfYfSomhmk4v8kTECkDmGpdKYShC8o5D8oepvK','kgiiW6pcHa','qYTmWRu','WPFcGx/cUcy','kt52WPldHq','WOpdPWWPbmk9W7ZcUs16mbiqBhhcNxVcHCoCWPBcHqldPtRcIGfQW7VcKalcGSoUlCoKWQJcUCoAW4fiDCo7W6aqW6b2WR0kWRdcTCoPzH/cRmk2d8oTWPKYm8obW73dJxTiosHVaaJcQwbvimoJkX4IbghdQqtcNcPwWRS/WRqVzshdRHCKCvalW5VdGSouygTLW7qcW6O1BSoIpmkuW5KHW7bZxvpdHq','lCk5WPCQW6W','WQibW452W6icr8kJW47dRCkLWOpdPmoci8ocFSoQlmkWWRuOntxdH3pdJCouo8kSt3NdR8kaWPfOWRpdV8ogtL4nWO7dJGNcSSkOg2O2E8k4ACkmfrP3WPNdJK5oWPaXCSoTct40','CSkGtmklWO0','WR7dSMDNW4W','cCosbHXi','W5FcMmkcwd8','5Roc5P6N5yAR5yAq5P6E6zUu772F6k6f5l2x55s5W43dVHVcVLhdRoAENoMAQ+I9I+IHIEAkNos9JUAuJEAwL+s5RoACNoMzSW','W4u1bSoNW4SEW7K','WQVcI3/cTCk3','ws7cSCk4W7ZcV8kGvHHyWPNcLSopWOxcQCo6CXBcVCojdLjoWPSEW5lcN8ozrCk7WOxcKdTZdazn','j19lmmo6','DmocW5bhW7iOo8o3','w3JcU8knW5W','5RYG5RAg56oW5BAV6lYw5P6U5OUZ5PAO5PwQ','hCkSfSoMWQzPWQOlWRKYx8kR','ceWHW53cVu7dMSoVW6JdJmk2W7bxW4hdUSoIrCkn','W4xdUhpcTu8','W7KQWO5cWRC','idbWWQtdHhhdLLytWPCcW4ei','B3PfBCk5mW','W6vUW6hdR8o6','BCk+qCoeW74','emoFxSkCWQNdOqaxxfpcJmo5dCkYhUI8MowyGCoBW71KW6BdK1e','wmojW5bEW48JjCoSW6evWPOqWQFdKCkgW7VcUmoMpvFcK8o4','hJZdOCoBW5u','p3/cVrLQtW','dCodW57dPmkUW4WU','nbixDM9iW4ClgZzhW5O+WQKBWOlcHIm','WOVcJciXxW','5RUf55o95AwV6lw6W4hdMa','6l6+5OYd5P6G5yI25zQN5AAA6lwU','x3BcR8kJW4i','WQ/dNK7dOG','ddWNsv1WW69KiW5TW6y','kMWBW6C','WQlcPSkmW5RcRe0CtNdcIG','xLC7lrvdnSo8W5WrW6megG','bJKDzfC','WO7dNg/dHt8','WPrsWPzjb3zcCW','dmoFeNKP','W7lcGSkxpMC8W4JdUJrvnaq','WPRcHZSWF8oW','WQ3dUSkNfSkI','WRRcOLlcRmkSimowW6nSFComDa','dYPLWQq','WRJdL8oGW7dcON/dQ8k0EMNcJhtdJ8k1jUI8QEwyQCkEaCo/uNyP','WQ3dP8ofWPZdUW','WQ7dLmo+W7BcPa','dJClWRTdu8o+WPfxCXz0rCoTW4K9','WQVcSCkc','WOXmWPXWovtcVqXlWQpcJubwedVcRaxdJsHasCkH','WQRdGr57bSkNW6VcMYy1t3RML5ZKU5NOT4VLVyus','WQRdGr57bSkNW6VcMYy1t3RLSyBOR7ROT4VLVyxLPjNOT4/cGa','W5pdOe7cMgHBWOhdNYOvv8k+W6OKnKJcSa','fb0VlYC','W5K1WR9cWPC','W5qVfCoUW48WW7qxW7TYWRxdKSkGo8kKsa','dZCyWQLSwCo3WRLLArb+','yd3dJKCjWRr1','5P+u5RYM5RwY5O+p5P2v56kF','md4XBNG','wuqXmHfIoSk+W5mXW7ue','WORdJSkPlCkc','W63dLN/cU08','jfrhka','nmojymkmWRS','w3LtDSkQ','zSk+W4XXCwxcIJu','WRpdKCosDdDIW7FdIsPZpdO','tmocW68WWPBcSKe','rSocWOJcVw8','W6GaW4G','W6SVW5HxWPS','nZ8IBe0','rSoeW4XAW6CQjG','be7cHanl','WOpdJbPVnW','hYb5WOZdKG','mMS7W4/cRa','dHGtWPLJ','DSkdB8oHW7K','WP/dQmoDWPZdHW','l8oghXD7','xwmwpXy','f8oCw8ky'].concat((function(){return['CrnVWPGa','W4xcHMKTWQNdO8o6l8oqe8kIomkUWOfeqmkY','pK5DlG','W5JcTvahWRS','jWGjaJL2','W7b1W7u','W4NdTutcNNy','hCkVdCo7WQTMWPWbWQK','rczFWQ8iWO7cVmoK','CIVdMu0AWQzYeIS','W6TzW6FdOCoo','W5ldOKpcLa','W6FdGh42WPBcN8otW5ldVsPl','W4dcI8kAwH/dUwVcI2jqqSoK6iYG5y+ghmkya38VWPypW4ZLRjROO5pOT5hLVRFLPiFOT6xcSW','tSogW7W3WPBcTKhcP8k6WRrMuG','nmojA8o0yG','fmokda','nSonACoRzSkcaYlcOCkqzG','kmozDSolqW','WONcKqqzWRi','dCkUdCoHWQPZWOuvWR9XrCkOh8kHWQ7dMSoKW6JcRdpcUmoSWQm+cG','c8ooaczOW5VdUHbxDL3dNW','tCoxW7m1WOm','W5WoW5G1BXBcPJP+WQhdR2K','v8kfwZfPW6ZdSbbkELhdHq','gdGIq0L7W74','wcFdHMeP','rSoVW6yMWOm','jcb2WPtdNNhdLuSoW6KiW5azWRC','WPpdMmkqmmk9W5tcLJTRfvlcIgurtmoT','WOdcU8kTW4hcVG','CSoFWPpcIMa','br7dT2yWsYpcKSoUCf4fl8oedgyuWQ7dIYBcICoOWOZcJCo2rub7WQ52W5KlW4yrmXVdV8omWRDNn2JcNeylW5xcLmkVaSo0pI3cS8ouWORdItLvW7bGW67dTSkJcmk1WOpdNCogCJVcVSoXW7BdNbldOedcOmoJW6/dUrdcJmkUgmozySoKW6FcLq','WONcIYaKnSoUtCo6f8oVWP7dNH7cPcdcIvDbW5qaWQpcKJxcNaJdUHFdT8kcE8o0xLTnW6CAgg3cQd5Iyu7cUX1VlZZcJLK9nmo3WPPys8oMkSk2ktxcKX1aogHnWQ3dUmkzAmo/yCoJW5ez','W5GOW5HkWQG','WORdP3vXW7W4WQ9EDmk5WPjxWQhdSt/cK8oOW5BOJyNLJjZOVyhNQRZOTlBLVyJLPR/OTkZcIG','WO3cM0FcR8kl','WRXqWOTj','nCkGWPnTWQ8','omoTr8khWQ7dQYeIwN7cSmkT5PEP5lIS6lEr5B2iW6u','WQdcQN7cPCkM','WQ1BWODAmW','W7NcIMWR','kCouW5VdOSkB','p8kIWOT2WQW','DCk1rmocW5OThCkaqJy','WR/cT1FdQSo1','zSkUW4zXyvpcHIdcNSo6','utjxWQGAWPlcNCoWWRCL','WQpdGwfNW6m+WRnLjSo7WQLxW4ldQcpcICoZW5K','tSovW7aKWO7cGLddQmkKWRj6','kaVdTCoZW54','bCkZWPH6WRzqW4auW5FdJfCiWPZdH2FcM1K','WONdMCkIl8kv','wmomW61hW7C','WO7cSLBcI8k3','W5/cSf0gWOa','W60ti8oyW4i','fCoeeW','fIGls3K','cd8EuLK','WRJdJSoJW67cGNxdMCkIEG','f2/cTJLXxhRdKfhdPvBdJSkLWRy3Fa','zHddHfCqyXdcO8oEwguQ','fdXAWQtdPa','zSoLWP3cKLBcNa','WQRdGr57bSkNW6VcMYy1t3RLH4lLHyRMLQpKUlFLPjNOT4/cGa','yIRdRfiF','su50xCkteNJdTSkugmonWR53dq','WPBcPLxcHYu','CqT9WPGRWRi','WRpdOmovW4JcGG','uSocW7e7WOpcUq','BSobW5amWQi','smouW41AW6K/aSo2W6CqW5qhWQ/dNCkaW5pcUCoqi1FcNCoX','WOFdKSk9h8kE','m8obDmksWQu','pCk1WO0','6k635Rgb5Awd6lAS','mg8tW73cIh7dPCod','W6HOW7VdPa','W6ewWRH4WQ4','DSoNWOVcNfa','btzlWQNdGCkZ','aSo+ASk3WQW','WQ/dN8kPcCkM','WRNcNuJcObRdGcxdSCoZW4j8W7VdICkTt8oFW57dQCoXtuq','W5eiW4xcUCoJWO5TW6RcRq3dV8khW7u','jhONW5/cIa','a8ohW4hdUW','cSoAtSoSya','l1a8W4RcOW','W4ZdV0pcLW','WQxdJHHXla','bsVdHmoFW7XZW71Ip0PRWQHtW4qWW7rR','5O6B5PYl56kS5BEw6l6R5P+y77Yk5PAx5RkA5B2S5zcw5yAa6A2f5Rct','bCoNW5JdS8kS','WRFdG8oEWQpdQ0TIW4PuW6tdTMK','emolu8kyWRhdOsabENtcNSo5aCkOw8kO','FSoAWPFcLey','WO3cJv7cLJ8','W6CbW5DS','W7FdLMvLW70YWQ5Mo8kWWQ4BWP7dVq','WRtdSCkcjCki','WOhcQ2JcGCkg','W6WBWRP4WRnPe8oMW4lcNCkwas0SW5fgWQjpqb7cH8oUAN7cL8kIW7hcIcG','p3H9mSog','WQJdUSkFh8kN','wIvj','DmowW41aW7iOaSoGW7axWO4kWRRdQSkhW7RcSSo2l1O','qsxdO20o','kdddV8okW4q','ws7dQ38OrWFcLSoU','mSkXWOPwWQLBW7qLW43dJKevWPRdRG','6k6T5Rks5AEi6ls8','WRhcVNJcIYa','WPVcId8','dSoRW5JdTCkR','BCk7q8oi','WRVdI2LT','haeAgZr0nSkzaHKWg8oNaSkYAYjY'].concat((function(){return['ymofWO/cVuS','5P2w5OIJ5yM0','gNJcOaC','lZzaWRVdGCkBhLpcS8kwWOLE','WRZdJ8oIW73cUw0','WPVcLdSOza','WP/dVKfsW4m','sSoyW7ftW6i','WR9qWPXphq','mCojrmkLWPK','W7izWOXjWOvv','ur9/WO8C','aqfWWPldJG','uSkhB8o0W6usb8ktqJ7dJq','kLjCkmoFhSk6','WRBdGxraW7OLWQ5HDmkgWQ4dWOu','WQFdHmobWQ3dUu1VW5XZ','W6ilWOPyWPbulSoWW7NcVSko','WQVdKIbGhW','AWFdMgy0','fmoADSoGDCkacWNcRCksD24','oZJdLq','WRBdLSobqri','vazKW6zIda5oj8krWQPD','saD9W6Do','5Rku5yAg6kkN','BSo4W5nDW5m','lu5CnCoraCkVv8kJoSooeqVdKIirimkItmkjEqiSWQJdQCoUW6/cNXBdKLeU','5Rk75PYD5yw05yAk5P+w6zQb77+i6k+o5lYq55sdW6xcTSodWPlcSSk/5P2D6zM16l2F6koz5OM85l+o5PsE5PwQ5lQn5P+J6zQ8','qYvmWRamWOtcOmoQWRfOW49+qJBdI3dcMCosnhZcQtpcKCoFWPC','WQxdG8o4W67cUwJdK8kcEKRcMxxdNW','W4ldNMlcS2q','W4XOW73dRSoPB28ewWb3W4H0WPRcOIpcKa','W7ZcOexcJmk3nCo3','A8k0W7TiBG','6lsE5BYguq','WRxcIZO+WO/cNq','5zo+55Am5AsX6lsM','o8kDkSoDeW','EhHXE8kV','WQNcV8kiW4W','hmozbJTJ','W6eCW6TrWOq','W5bZW7ddU8o6FhS','WPldG8oVW77cUa','W6e+W5zVWOC','WRxcJmkKW6BcIG','WOhcQ0/cOqBdNsFdK8oUWOnsWQZOJjFLJi8mW7tdP8oYW69lqKxNI6JMNj3LPlVOTAVcSW','W6WBWRP4WRnPe8oMW4lcNCkwaEA5UUErJ+wMGEI0H8k4bW','h3mDW7RcMLZdSSoDW4NdPSkuW4C','WPRdHmopDcPaW7ZdUtf3odq','jxeaW6BcNa','BG5IW6zImJHeoSkt','WQXDWPzfeN9PC8oVFCkh','rZPsWRiA','W41UW73dSCob','eH1pWPhdMq','q0O7nW','WOldTuXQW7SY','xXJdLuCE','WPLCWPXWp0NcKG','W6GWWQ5KWQrQbmoXW5xcHSkkqHWMW4vmW7zYxaZcLmo4','WRVdLmoJW6hcR0/dImk1B1/cIgq','WQhcRfFcPCkQ','hCkSfSoMWQzPWPad','bdrgWQu','WONdOSogW7FcUG','gtmY','WQldH8kadmkc','oSkJc8okfa','bmolrG','CSodWPFcKKW','xf50xCkvdZS','FJXmW6fF','i3RcObLXCgVdLLhdH1NdJG','WQpdHCoaW6NcNW','W4eFW5JcJmo2WQfrW7tcPa','j8ojBCoKBW','dmk/WP5UWRi','WOjCWP1Wn0hcMq','WRFdSK1jW44','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','xmoeW51FW68Ona','WQRdIvddHbq','WRhdNSoCWRxdNW','W5tdTvRcLx1DWRtdGcadwG','tSoiW6G5WOxcOKZdRmk8WQSPeCoTW5aTfmojp8oPW59cW5RdV1xcHNCVW6a/WPldS1q1Fxa7oauPWPJcOmo6W47cK2FcGIdcJNTBBKRdGelcQvC1W5XnW4tcMCkmWPX9iJf3v8kMWRSNWOyYxmk9eHRcM1OmWRKfrSofBXldOY5qWQZdRCoNnmo1us7dO0ClWOBcVJlcIWhcI8oMW6FdLrfBWOK7l8kmWP8WW5urWPRcTSkQzSokB2PxW5CN','y8k9wmoiW5qTlq','sSk4W4jYAwxcGtlcQCoWhfDFdYO1WRyjW47dLx0','AIroW5f7','W5epWR5DWQ0','zmo0WOVcNq','d2tcPa1D','sCkVW4XNFfpcHIdcNSoQaq','wLP0xCkz','A8kUB8oRW5q','EmofW5uzWR8','W6VdMa/dPudcGwpdQSoFWRL7W57dTq','DmocW5nmW6CJe8oXW7WaWOi3WQVdISkCW5/cS8oYpq','6k6x5yEU5R2T5RAS5O2h5P+O56gk','WRddLha','WRFcRmkkW53cT0O2r3S','orqcBNm','W4C5WQXHWQfHbmkyW5RcGCkKtW','W7W4W4rQWOS','D8oHW4O+WRe','cSk6dCoLWQXV','FJfYW6DK','smocW601WPhcQg/dRmkP','BJ3dReu3','o0Tkj8okfSkmqmkTECorerNdJa0BpCk3zSkB','WO3cQ3JcQrS','i8ooqCoEDG','lYfkWRZdTSkJcvpcR8kfWQDvC00ZDK9TpCo3WP0','e8oCxCkbWRldScOctq','W6GwW5DXWRKYyCkOW5pdOq','WR/cQu/cTXy','EI3dQheUqY3cGa','6ls75BYOWPq','iGzeWQddJq','WQhdLCosCdDJ'].concat((function(){return['wrn4W7PJmWHyjW','sqXBW71+','gdq2tf16W68','W63dNG3dQKZcGWtdS8oQWQ9KW5K','W4iOWQTRWRrJ','WPpcISkJW5JcJW','WO/dLmoQW7tcSa','xZHgWPqE','W6OcW5fGWQWTyCkLW5ZdTSkY','fWq6WPLJ','WPldSvjqW4afWOjksCkBWO4+WQpdIW','oCkLWOTQWRfhW5qLW43cKe8cWPC','san5W6z5mW','WPrbWPzub15FDmo9AmkfBG','WOlcPmktW4xcKq','pYBdKW','gaz3WQxdMgZdLhqoW5y0WOtLTOpMU4hNKzRcMCog','c045W7pcLG','DmocW55kW64Oj8oaW6ykWOGlWRZdRSkjW4lcTq','cCobw8kB','DgBcISoDW6r/WRzcjLf9WQLv','W5S3WQG','gvjaiSorbmkS','W4hcPN08WRldQCoSpmoxdSkmD+AFTUAkR+wiLEEASoAWSUwfQoEaIM0','WQZdISoJW7VcT3BdQ8kLB1/cIa','d01+eCow','WRhdM1JdHsC','WQFdICoCWQZdHefRW6jMW77dSgnqWQz0oW','6ysx576g5PYa5zQ756g05AAd6lwWWRNcVa','omkjdSogWRq','dH5Ymb1ICSoJW4SHWRO','nSkJWPfiWPS','WPJcRhdcVrK','hb4jhcr9g8kIhGOKmCoRpSkL','W57dM1JcKgO','WP3cSmkJW6ZcKG','W6aDW43cJSoH','ew/cVbLKwMS','W57dGXT5gCkHW7RcQIaZFtqOagFcTfRcMCovWPddNaldPY8','ttL8W4bg','BhuxcZ0','BbFdRfu9','DwhcMq','WPlcN8koW4FcUG','WR9dWPbk','zCowW7DGW7a','hmkYWQTZWQS','W7BdIwtcVxy','WRHfWPzveNrFkCoKESknzq','CxHZxmkpdYFdK8kwe8oXW6RMO5lMNPRMVQNMTQBNORdNIl/MGl/LPQhOT6NcHG','gWubjde','omkPfa','d8olxmksWQNdRa','WQ/dHeRdRWbwyLhcJCoLWOVdJKafWRCTyGtdPSoip8kBqsxcO0FdGsBcNSkbymokn0fOiSoNW7X0kSkysJDdkCoPkmobW6dcJvClW6ddHSocCSkTk8oIWQNdHInapfH0WRPomSocyaZcVCknW50yamo0D8oyqCobW4ZcM2VcNbBdPgFcNrpdVa7cL8oUWO3cKmooW7/cNh3cH8kJrmoZncZdGbBcImoMWRtcL05DWRa','W7FcP8ki','xtBdQxiZvq','W4ulemoMW7G','WQ7cUudcMJm','fmodW4hdSSkIW44/WOrzBmoTW6ZcLxvTWRVdQgtcUa','WRhdGSoy','W5K5WQjV','WQpcT8kxW4FcUvmQ','WQ14WPzgiG','WPhcGetcTCk+kmobWP10yCo+oSkCixjGW7ihW5VcUdmKWObeFmkquCkZoSktFNldKZZcI3VdRCkrkmoXAG','a8otW5/dPmkGW5KBWPDukG','WRRdS1JdHtK','vZ9mWQGbWPm','fsPLWQddHW','WRlcIsOMEG','W6JcGhGIWQddPCo7','WRtcVCkCwKpdPxhcUMjAmmkNW6jIt8k0bciUWPWoWOpdPMrDvKxdR8oOqmo5W6HGaN3dQSoOcL3dNCkwuLLH','WOlcQ07cTce','W6/cUSkgrq','WRddJLpdRrG','rZ7dS3u0','bSows8kMWOG','ymo2WPBcL0C','WQRcMLxcQWZdPYxdP8o9WPHQW6G','WOtdIujjW4q','W6NcGhW6WQJdQmo5h8klc8kIomkY','WQJdKCotDd9QW7W','WQxcRKxcLmkg','aeXhbmov','AZZdL0uZ','6i2J5y2654Iy5OoB5AAC6lsh','WPxdICkxCmoP','dqT0WOBdRG','k1vknCoPgSkRtq','zmkHwmovW5OYcCkGFXRcPW4PWOyeWR8GW5XzWRzZjYnYWR/dQmk4cexcOmk/','W6Csf8oUW64','WP/cIZeSWO/cTCkBW5ldVcGmpW','wM8WprO','zaVdNxaR','tCopW7aRWQpcVKxdUSkK','WQf/WR9unq','WRZdM8oWuqK','mmomu8oIFW','W6upW41nWROVySkJW5ldSSkYW57dOSoE','cCoxDmkZWQ4','aSk+eCo1WRfP','WPxdVg1pW6m','5PAG5OsC5OYq5y2+5BsC5zc+55A/776I6k2n5yEp56wY55Ak5zcg5ysF5PMA5O+b5O6F5P6A56gM','CMyNkWnQlCoaW4STW4Dkk0NdKdrbDSo9q3fvWP3dHmk1WPm','jgiaW77cH38','WOtdUmk0g8ki','WOPcWRb9gq','svRcPmkWW4xcG8klytz0WOZcLq','W7KzW4pcO8oYWQ18W7i','ke/cGJO','lmojASoiCmkpnJ3cQ8koD2/dMZe','dYGNqvLKW7K','W44WimoVW6e','W5m5fCoTW6WAW7axW4TGWONdLa','pv5pk8osfSkSvSkfESoxeqNdIYSq','WRFdKCotAcT/W7RdRZe','nr00WOG','W5JcTeKlWPq','aCktWOXRWQ1AW5yhW5ddKxLh5l6r55A/55sU5OUy6yw857+o55QG6lAj5B6LxG','W7iOfCo7W55tW5exW7zS','gJCnWP5puCo2WRbtyW1ox8oPW7qShW','h8oRBmo1Dmkofb/cTSkrtZ3dVs0ZAv/cLSkGnCk8WOGMiCkyW67dNSk0mmkeW6TFW7y'].concat((function(){return['kCosW6BdUmkO','iN5cd8ov','W4mVW63cMCo0','WRldKxjWW6aLWQ18ACo4WQqsWPq','tf07kGr2dmoPW5CH','WPJcVCkkW4FcRfS3qW','6i285y2W5AA96lA8','W7qnWP1yWOvinCoPW6BcT8kzCJygW74','W4hcV8kbxYC','FIxdM3m+','ksPRWRK','cc8TtW','WRf3WO1lcW','v1lcH8kBW60','W4W4eSoGW4qxWRXqW7nuWQpdVSkNk8kLF8owW5pdRMP/eCovquhcTJtcI8oJiCoRWOPuvCoSAt5uf8kuWQa9uNDTWOpdR8kAldxdKCkhWPyxWRFdPcDbW5NcNCoiWOWzmCo+W6lcOHTpxmkWW7VcG8oThSoiiCo1kKqhWQXaW6W','5R+05RwX56c/5BsP6l6P5P++5OUy5PwP5PAr','nmoOgdzb','W4W9amoQW4i','W7GEW5PJWRKK','hSk6dCoHWQa','6yE0576Z6ygl5yIz5As06lsLW4HH','WPFcOb/dJYKnW6FdHay4wSkVW5a','yhyMlIG','nSkneSoxWQi','WPJcRSkkW5RcRhmQrg3cIhGG','Ct/dOvq5','d8ksWPrHWPW','kmk+WPD4WQy','bCkGWPzQWQP4W4eKW5hdN0mc','tmkIACoqW50','jZW/WOHG','rZ1xWQ8nWONcKCo7WRWRW4PYxZtdKxG','WQ3dImkGgCkh','WONcJxdcOmkR','DK0ZnXrPoSorW5O2W7mCgfJdHG','W4/cL8kyBmkIWPVdIG','WPFdVNz0W6u','WQHzWPHvmMC','cNzwl8o1','D8o0WOVcHeVcLW','W5qFW5/cOSoZWRPNW6pcUW','W7eJW4pcOmoI','W5hdOKpcJxL4WRJdGsa+v8ktW6y','6l6D5O+G5PYp5yM25zUd5AsY6lAd','W4NdIh/cOwq','W7TUW6FdNCow','j8kqk8oyiW','WRxcN8kXW6VcIa','j8kqhmoqWRe','ttRdS0i1tYu','iJewWQnEvCoJWQG','rCkUESooW50','sCoHW5aVWQ0','WONdV1RcJtn9WQtdNZycxa','fsynWR0eqmoPWRnoAs1Ow8o4W68Rga','x2XgW7RdKmo8va','WQJcQCkCW4xcOq','rCoeW4SjW7uOmmoWW7OxWPveW7ZcGmkgW4pcSq','D3hcNSkCW7tcTSkH','xXxdIM8L','WRpdGLpdVWO','wZhcUanRwwhdKGZdUwhdImk2WOS3ASkOfXxcQmkgz8kucbldVLjVcMnCh8oBkcJdQJTdWOLVEWNdUcCcWPCphSo6WOZcIXL0WOhcUfWDWRLKvhCsC8kSW7C','5P205zMt56cV6yAl57+q5OMJ5yMa','ys3dNKSzWRvLeJW','tvDPtmkDdaBdT8kfcmoj','WPRcOwpcSSko','psL3WPldLW','WOlcJSkGW7VcLq','WRBdGxrkW7SYWRb9lSo/','cJmaqhG','kc3dHmoyW5j/W7veguf2WQq','WPVdJvDrW4y','W6apWOH4WOe','zCoWWOVcGeVcLSkt','dSkleColeCozW5hcUmkrW4pcSMtcUSk6WP/dNmoGA8oBx8oucSoaW4aP5BAj5PIg5PAJ','W4tdNKNcU18','W7JcQ2SmWOi','gSk+e8o3WQHKWOevWQLXrCkUg8kCWQK','ghOvW4xcJq','vxxcUmkOW68','qq95W7ba','qdddRNG','omojW7/dPCkI','nCkycSoGWRzUWOC3WQiWA8o/5Qk25RAE5PsT5OAT5O+u5y2654M35Ogt5AEG6lANW7a','WQBcPL/cOmk5lW','EanPW6zImWjtmW','mmoTW7NdLmkA','WPZdJmoBW7RcGq','ibWjbJ9Qi8k/aLaKamoRjSkJBaHUWQpdISoJiSotW7FcUa','W5WjWPHfjNBcQqK','v8kMrCobW4CHjCktyH7dRq4','ySkmsCo1W4a','WP/cKZ8XWP/cLmkBW6xdPJOkodldSSkpWROEW6GuWPW','sCogWRBcMe8','WRldILpdVXnjwvhcGmoKW4FcHNazWOK3AH7dOCka','WOldVM91W4a','5yw25ywC5AEF6lsMBay','WRddHt5goa','WO7dG2v3W4CJWRbIrCk5WQedWOJdTIu','W6xdVSokW48','5Rgb5P605ywO5ys45P6s6zUH77+P6k6/5zYk57QZ56Ux5OQk6kgkxWNdUH50aav0BSkRW5pdNmkkWRZcUCkgoH/cSSonmSohW7pcOmoDmmoHCwyEWP4zWQSjWQ7cQmoVvCkgbfiZW65r','bu51xmoteZ3dOSkwgCkdWQLNdrRdSSod','DIBdMW','kItdHmoiW7j5W6Tm','Fwjpr8kU','WOBcRtmVWPy','WQHEWP1c','W447W6XqWOGpzSkoW6VdH8kfW7/dN8oOhG','j8kTf8owf8oeW4dcJCkq','mSocW4JdGmkI','W4qKhCo6W54aW48lW7z6','WPpcSCkwW6hcIa','WRVcMfpdOvVdKsddSCoVWOn9WQldK8kX','oCkNaW','WRpdVgZdVaq','fw0xW7ZcTW','W6xcMSkyW6VcMXvLW5TlW63dJ2G','WRddUvldRGO','jb4WrwG','rb7dHLei','sCooW5DSW48'].concat((function(){return['W7BcIM8','mCkHfSoxa8oBW4y','5zcg55sn5AwJ6lw8','rcTkWRm','wSoIW4G2WRe','gSoEbID+W6RdPqXwpu3dNcrkW6VcTuxdPSk+fCo7','WQZdVCo4sHO','W4xdO1RcQNnlWQpdJIa','WOtdQeJdUafkEgtcK8oMW7BdG24lWRKOAGtdP8kbECo85PUq5PEH5AA/6lsYWOK','xSoxW6vZW4i','l8kzWRnbWPm','dmkbWPG','m8k+WPP1WQTrW4eK','W4eaW4pcLmoP','ySk6xa','W57dUNZcRhm','omoHjczv','i3CWW4BcMq','5P+f5OMh5yUE','lIyveJq','WRNcPKpcSCkKjmowWObNBColC8k1nLPQ','mHK9WO9J','W77cJMKYW6P9W7i','nCkycSoGWRzUWOC3WQiWA8o/5PEX5lIJ5AEQ5Bk9WOW','WPxdJCkvpmkLW5q','Eb5KW6jtmXLsjSk9WQHljmouvmke','b8oCW4ldJSkG','h2StW6FcIN3dSSoNW5tdRCkwW4f8W4hdI8ocESk1aSkAzW','5P2/5RYi5RwF5OYX5PYH56k3','WONcKhlcVIq','WO7dU2vWW4i4WRL7ASkZ','WPrsWPfcehHXySo3wSkwASoQW49Y','yCoeW7aYWOpcTfZdVq','A03cVmknW54','W4ZdIxZcI04','m2xcGbXj','o0HlnmoTbmk2uCkVFmoUaaVdIZSh','bvVcIJ1D','WOldKY16hq','k8kxWQHpWRi','euTbnCokpSk6vSk/DCoAeq','yZbBW5Th','fmk6WQ9OWPW','uY9kWPGbWO/cQmoGWR4ZW5L6rttdKhe','eSoBwCk6WQ8','eeFcQq5X','jJKXnbO','WP/cHwxcL8kz','W6eRW5jlWQy','lYbSWRddN2S','WOBdRrLIf8kTW7FcQdX0DJ8OrfdcRLJdHmoxWOpcMW3cUtxcPq','o0Tkj8okfG','w8oQW5qoWOm','WOddJfJdVJfqEeFcJSo7W73cHNezWRmVBq','c8oobZTKW6RdTHTk','WPNcNuJcObRdGa','kstcM8kPW6xcGCkrsq','WQBcRSkv','ncPWWRZdIwBdIeCuWPCnW4ecWQ8OW4ZcLSole8oCW4lcGwawWPa','W740fCoNW44FW7KXW7b8WOtdNmkfk8k6t8o5W77dTq','lYu8WOHK','m8k+WPn8WR1bW7CYW4pdK0GcWP3dPa','dh/cVai','gJ4wWQ9lxmoiWQHxzbS','5RoD5PYd5yww5ysp5P2g6zMT77Yc6k2s5zYk57MU56Ur5OUm6kkkW6DYA8kUgHxdPSoyp8ocbbNcSaXsrJffrmkuyehcVrbSWRbroJtdVYeyWO1bmCoMWOtcNriMW5JcSfGf','WQ5dWOTiaq','nH5iWQNdTa','WO5WWRPKnKa','hSkpgCo0WOy','WPhcIa0UCSomwSo2eCoJWPVdIhpcTJVcN0rdWPe','waZdNMig','W7/cIgKNWQ0','tcVdGKOyWQj+aW','kvCEW6/cUG','WRtcT8kmW7dcQG','jZr2WQ/dPW','pYZdLmopW4i','ltetqu0','pmojv8kbWPxdQYagw0hcJmo5bG','W45/W6hdPSoUFgeNqq','vmoiW7yY','yCopW74YWPpcVuhdISk8WQjOuSo/W5C1','W6JdQwBcJNu','WPxdG2FdMYy','l1HnkColhCkRCmk/DCoAeq','WO3dNmkfpSk5','WOlcN8kTW6xcSW','WPvKtmk7W7m3W6KhW7Lw','pmkmk8oYlW','WONcRf/cS8kOkCohWR4','WO7cLcy/B8olt8oXfCo+WOJdIq','FZhdLxiD','W7SbW65QWQ4','l8obuCkuWRe','WQBcT2xcHSkJ','j0NcUHH2uNZdTvddIwpcI8koWRiHBmkOxHZcR8oxmSkpgXJdOKXPfxuBhmoAB2FcVWfUWQ1xp2ddOIfwWOSDf8oHW4W','zaNdIfiQ','W74yW4RcHmoG','pfz9p8oqea','W6WwW7JcI8oF','W73dK1/cI29rWQpdVtCcC8oDW5uLj0tcPrNdT0bjWRRdGmkgsgDGzCogW7pcRGBcQLvU6i2K5y6B6lEL5B2v5AEW6lsN','W40Zo8o9W4K','ACklW5bWsW','W7JcVCkDwWpdPgNcQx8rBmkZW75Kx8kZoMqXWPaj','5OYJ5lM05BAz6yEe57YB','D3xcJSkhW7ZcV8kHCaS','ECoWW4qKW6miWPL3W6hdI1yuWOhdPvBcNv7cGhCOAer1W77cNCklj2eKCmotyCogCCkxuM4haa','5O2d5P2Y56o45BEv6l605PYm77Y25PEN5RgB5BYj5zon5ywg6A+k5RgV','EJVdQu0EWQjLaYaEqa','WOddJfJdVIvkEf/cG8oSW4xcGgS6WRS0AZNdU8kgFG','fLDuf8oF','p8owW4ldPmk7W6yUWOvti8oNW6G','W5SQWPPzWOK','W6OlW4O','W7qmWOvEWQK','W4lcS2aLWPy','WPRdTtHnbG','W4SwW4RcUCol','yZ1SW6zr','dSoDv8k5WPK','W5aiW5xcVmox'].concat((function(){return['wWrKW7jKiazo','WQn8WOTGgq','W6/cP8kBsqddLxBcQgrQtmka','WOFdImo7W5dcNq','fmoADSoGDCkacZW','WQpdGwzXW6OKWRvAACk9WQOz','h2StW7RcPN7dPmoAW4NdHmkCW4XUW7VdIq','zoAzNoAwQEwMTUI0OU+/REs5Q+w8VUwqIEs+GEEuUU+8La','lvPckG','yK5TASk/','gcOqWR5Eq8oiWQvyCW','yCoWWORcNfFcI8kEWR5S','WPtdHCoJW7FcON/dGmkL','rHVdQhy8WPvjmqyGFa','lGKsr0S','W6ZcQCkDrG','tmoLWPBcGfBcTmkyWQHSw8otcG','hwXKfmot','dCkUdCoHWQPZWQugWQq3','W4DzW6FdU8oOyxasqanpWPVMUzNNK6tcUMBdNbxdMX57aSkrfXb/W77cLcZKUQ3NKAVPHAxNVltLPQxOTBNcVG','gr4HWQnY','W7NcNCkIsZu','6k6u5yEM5R+Y5REo5O2v5P+h56gs','cCombJfHWRJcUbGzmwxdIbblW7RcRMBdVCoXxmoZWOBcUKxdJw9NW6GZ','iMuvW4JcQq','t8k4W5fSBg/cNalcGSo6evO','vCkNW5LOzW','CxHZxmkpdYFdK8kwe8oXW6Pceb7dUmodW5PwW7xcOmoqWQimfmk4WQ7dL8kmWOddHConWPZcRCoy6i6C5y676lw35B6x5Aw36lsQ','WOhdMmoaWOddMa','xSkXW4X9zgZcOtxcI8oRfW','WONcLcaZC8oyvSo5eCozWPtdG10','fLuXW4/cNq','W7NdUeVcL3HsWRtdVYaEwSksW7CVa0tcTIFdS0bwWQu','WONcSmkNW4VcJa','kGCygsv8nSk+','m8ojECkKWRe','neOwW4pcHq','W6RcJSkAxZq','W6FdH3riW7uLWPK','DCk5ECoFW5SJ','WRtcU8keW4tcTfS8rfFcH3uGW6ZdKCoeWPy','W6W4W5VcVSon','pxRcVY5Ksw8','W7/cQCkBsq','WOddG1ZdPbzjB2BcHmo9W5NcMKafWRqUzGNdTG','d8oXW6xdVmka','WPxcPftcS8kAkmobWQzKA8onECkZa3j6W65MW4dcRI4Z','wmkEW7L1Fa','DSoTWPdcGfBcISkUWQjXwq','WQBdHxjT','BWLlWQKDWO7cVmozWQSPW7y75RI055gB5AAo6ls6W5pdNa','i2lcRGrHuwVdQepdIeVdISkQWO43ECk2eH/cTCoibmoyaGNdS0K','xKSXidW','AYjFWRukWO3cQ8okWRuJW4P1DdpdIq','ytFdNLax','W7H7W6ddVSoYya','rZ7dPfS9qsJcMSo0FhGp','c8kKWRnWWPm','WQxcPtW1zCoXtCofbSoLWRdcJw3cGGtcHvfbW5tMLzlMJQpLUAdLTQRMMi3MLOu','ps3dKq','W6mvmSo4W6u','WQbyWP9ojq','CSojW7CVWPy','WRBdHComBIPOW57dRZy','WPhdG8omsZu','WPVcTamTvW','xtfeW4zc','W7KjW4NcO8oIWPTWW6FcVdS','ke3cHH5j','W5mSWOHlWPm','W7znW6VdK8oF','W7NdT0/cJvjrWR/dJIa','oCkLWOTQWRfh','keZcJJ1l','rs9GW7TX','aSoPq8oMDq','jSoigZPLW73dRqO','tdRdIeuiWO9PbdSFF8kKFCkJ','F8o6WP4','zmk7wSoFW7mPjmkWwaVdPH4','W5etW4ldVSk0','gSoEbID+W6RdLaTnEXhdIcXDW6dcUg3dISk+hCoMW4O','uNGqW79pgSk0','hmk3WPHAWRK','WQFcOL/cSSkSk8oGWQHNy8opF8kOieb5W69tW5dcVYu0','BSkAwCohW5a','mdVdNCosW4u','cSkFWQDUWQ7cLvhdVmkXWOG','W4iPbSo6W4ubW6WaW7DgWO/dMmkGoSk7y8oKW7tdTNq1cCoiFa','pLrzi8omamk3qmkGEmkDwt3dLIaqpmkMxmkiCHWSW6BdLCogW6JcMbZdIr93fLn1AJbvWQFcHJRdTMC0WR/dQLVdULffxfVcNcpdGt9ntmolW6aCWQmSgHrrW7f/iciYW5NdTcfjgCkWEd/dGSowW5VcNmkvWOCsBCkRW5G4W73cLd7cHmocW6BdTW1WnNdcJ8klW7xcTSk6WQbre3pdGCkNsCkZW4TNf8kFEq','tMfiW7GFbCo6WRzBuHHC','wbJdQviG','C3jUtmkj','g8oaEmoPy8knaX3cOCknD2K','jZWUibi','W7BcQSkwAJK','tCocW74XWPVcTfFdUSkcWQj6smovW4SMfa','W77cGg4VWRtdQSoQ','xIFdPgCZ','osFdI8oAW71XW6Xtk1P0WQi','pSk1cCotWR0','5P2P5OI75yIY','5Psr5OAD5OYj5y++5BAh5zoN55AX','WQhdImo1W6VcRW','ubddUeiV','vCk4W414CwG','WORdKSkymW','jHesbIrRamk0aX0','qexcOmk3W6u','lY5oWQBdKCk6hMpcQmksWO1qvuOZFuz/oCoLWPPksSkGWPr9ogyx','m8ojA8oP','sSkSW45wyq','hYG2uvnLWQqTlbnNW7OaWPzHWQFcVqtcPX7dU8ofW7SfWQ7dPmkR','oSkxm8oHWOC','WRNdH8okWRpdN3f3W4fK','nHhdPSoeW5u','ktf4WRddRa','wColW7a+WPBcVxFdVCkXWRnS','W6a/jmoAW4u','gSomySkTWQ4','WQRdVLFdJJO'].concat((function(){return['b8ojxmoStG','hJmvWQe','w8oNWORcM2W','WQdcMLtcR8k0','WPxcQ1dcQCkPk8owWOPJESoIDmk1pgzGW6vcW57cSI4K','cuTiiSo3','yCoaW7OOWQdcVLBdOSkYWQjNx8osW6KIbmoocCojW5jvW5u','lXzNWOtdHG','W6NcKgO9WRxdTmo3aSoc','dmkhmSo9da','FIrVWPiL','hCk5pSo2kW','WRRcTKlcRW','WQVdRxNdRbq','ctOqWR4evmo6WQHxCH9UtSkMW6C8gmoIWQRdRwSAEWvUWQ5JkmojmSorWRyem8kIFqdcTmk3WOlcP8oIASkUggzfBfXzWO7dSg/dOwD7sCkrWPnttCoOeSopia3dSSoiW7TuWR1xdmoblSk9wdxdTSkXsmkEmLdcRYKNW7zjDeDFW4SiAmoWdgyirq3dQ8kXW6xcG8onW5xdR8oWW4BdKtpcQCkjW4hdPmohbCoEWPRcHSkQsSkAWQ7cMKVcP8oXW74hbCkjWRdcN03cHYdcIHhcML7cISo6guedo8k+B8kRWRxcJ2CWW4RcU8o7W6fPj8oEn8oXv8o2CmorWRdcRg7cT20VW7Pgh8kpWOOzW5mQW5FcM8kklCoXv8o2WPDeWRLCW5FdMCk9tYWQavpcTmo8W7ObWO0lWQdcGCoaWOiQW5G0kLSXlZ3cQZjvWQHpd2RdHZ5XW58oqtP9C8kJWQVdLmkTWRtcTX8afhhdML5JWOSPwSo+WRVdSmkHWQtcNmoiyvxcGSokW7HQw0ruWRxcG8oNrq3dUxRdUCkEWOmAB8kUWRZcNSoIpCoFhHBcKGqvlvfgng/cHSoHgtDvW6WiqSkNWO3cPW1BWPiBW6ardmkNsLS4z8o9WRXVWRBdOCkrW5PQW5PMfsr8juVcJe1/WR3dO8k8arlcRgL9W7/dTSkBomkBuCoVWQmJW6y3W7zuWPzCwhJcMrBdUmkNxaldMmkJBSkcWPddOCo4WP3dGaiJWO7cKuFcMKfTWOxcIaZdOSk2W5DeWQRdR1THWPNcNSkvW5hdN8kPDmojkuldQszNW7zIb8kDWOvGf39eagJdSMfKnmoLr0eJW4bZrCkzWQFcRHamW6LtWRfhs8oAqqKUomkwWPXIWPG4odjPW7rkC8o1bJSahCoGzmoOwmodBhFdSmosW4XIWRikC8kHW4BcR8k7W7NdL3WirbvHr8k4DfVcI8kSzepcRtWPW5NdJ8oumriOyhZcOJCcW68QWOmyW6ddLCkxW5SbdmoSimkRBI7cKSoqWROaA1pdSSoQWPPQx8o2WOXyWQ7dSg46W5udW6ddUmofdmorC8k6W4TSk2P7W4nrWPeqW57cOuFdS0hdMY/cUmogW5qBzmk8WODYbmk1w28HBCkGWOVdM8kIh8o6W7RdTGtcTCk6iX1nCmomhCovcaFdMX5blhldMSo7W71InmkqWQNcLrNcTur1WQ7cOSk+WOpcJuNdTWZdGqxdOmoeBt55WRNdItrSW6JdJCkkzSk0WR0arvCgWPCBcY5WW5ycWPJcOCkok8kcWP/cNsxdPK7dHHfpFSoRWOpcSSkKWPqCnmkctgWSW53cOZrylhldJ8o9drmvFu4iiCkwWQpcHsW8m1FcUwRdLHhcTmkdWRJdP8kmW6yoW6ekWODlC8o5W4rhaK5+p8oGnCkwW69UWPfvdbSLEu4hzeGKECkhWPOJ','h8ohgZTJ','mWrUWPZdRa','WQFdK8kDgmkA','lMygW77cGwpdVmo9W47dPSkhW5D7','6k6x5RoK5AAC6lAY','WPtdRWPGgq','t8kBz8oJ','WPVdGCoGW7JcNG','eSkSi8oFjW','taVdIxms','kmk1WOL1WR9wW4e','W6P1W4ldOCo4','evHbkmokfSkNuq','lsb2WQddHhhdJxCiW5GDW5ec','WO1OWRHYmq','chdcLszN','z8okW5KnWOe','lZVdHmoBW7fvW7fekvnkWQjsW6e9W7q','gCoQWQvjWQXAW4mLW4pdKWqHWOFdU2pcNbhcIfXEf00','W7tcLgenWOi','WQHcWOL0hgzizmoR','bcDmWQxdJW','iJfVWRRdKW','pCk8emojtmogW5hcH8kBW5xcVddcU8kNWPpdMSosx8oY','W78lW41TWRGZuCk0W44','W405gSoUW54B','fJiTta','AZPrWQGAWQZcQ8o6WQONW4X+','EsFdHeO','WQ3dHM7dSXXg','yNrvESkVpXJdGSk2n8oPWPHnoIFdMq','W4pcTMuiWPS','WQ7dOqrNaCkTW6hcVW','6i+05y6t5AsZ6lEY','EKyXidu','ttpdQhq9tHpcH8o7Bvq','AdFdQNS/','nZDfWO/dRa','xvC7na','WQFdOmoeWONdNW','fZ0qWQm','W6ZdH8oBWRddHNzh','ncPWWRZdIwBdIeCu','vSkIumohW5G','WO7dLg9WW7SAWRH9DCk3WQGs','aqVdKmooW6D5W6TXofDfW6FMNiVMI6RLIAhcOeb3W5S9WPhcSSkE54UG5PYC77+X5BkS6k+b55I06lse5B+Tcq','rWbZWPm0','bCoDFmk7WPC','WRFcV8kxW5RcVq','jSkJjCoQWQ8','E3FcJSkkW6BcOSkqvGroWQS','FW4AAmknrCoXfmo5imktrvZcJa','WPtcSHW2ya','h07cLZ5o','aY5aWR/dVmk4hu/cSSkAWO9pAvy8v0zol8oIWPjD','ESkYW41Ryg7cHJi','WPlcGwlcUcm','lWyC','WQ7cLcyGzmo/uSothCoMWOJdNHBcQ3ddMGW','6k6I5yAa5R6K5RAc5O+Q5P+156kI','W5FcSuyNWO4','CxHZxmkpdYFdK8kwe8oXW6RMNlJMIihLIzNNMjNMSzNLH6ZNGOFcQG','bIL/WQddLG','WRFdN0NdULXlzwtcK8oMW5pcMG','oCkEjCoXWQi','FNhcI8kgW7VcTmkusWbBWQdcT8ocWO8','tIzoW4DB','W7/cQCkDxWxdUa','gsTeWPldOq','dmoNsSotvmk+kW7cLSk1v0/dSbStwNtdOG','nJm+WP1D','dYPHWRBdHW','zXLS','W71dW6xdUCoC','WR3cRepcRmkViSoDWQ5UimohF8kOogDHW7yjW57cTIK+W50oFW','WRFdKCotCZf/W7ZdMsD3mJ0jpGq','i8k7b8owbSot','WQlcJbuNWQO','WQxcLhNcRmkc','WQJdK8o+W6RcUwJdImkJyqxcHMxdLq','wSovW7a2WPS','W6KWm8orW4S','WP7dJ8obWRFdTq','DSo4WPJcMK4','W5yOWR8','WOtdSG9OaCkT','WR/cKYG+CG','W77cJhOGWQddQ8o7','WQ/dH1ZdVHrkEfK','WO5jWP4','WQHeWOTuhgfkDCoHj8khC8oUW5nZW4/cOd01sG','W74Sg8o6W54+W7KbW6T4WOddKG','BYvyW7zK','WRZcN8orCmkxW57cLYThxbJdGfaaw8oRs0iAs1z1W6BcKCoVW4VdUmkFWOq','vHb8WO85','W6u/W61kWOe','WQxdI3rIW6muWRj9CSkdWPWZ','CSkSW5Tlyq','W7z1W7VdPW','gcOobYn3iCkDhXekv8ovh8kjr3ROJRZLJjJOTytLVi7LPB3OTP/cOW','kqysgW','WQNdR3jQW7K','WPhcScKEWRm','WQnfWO1xxwniAmo2Ca','WOtcRYySWQ8','6lEe5BYLWOuj'].concat((function(){return['W6GOWQb5WRrlbmofW4pcK8kSra','du5CnCoraq','j8kic8oLWP0','ssRdTwuZuahcHSoUCr4kp8kikMavWONdIZ/dGSoN','tSk8W5fX','5P2w5R6D5Rw/5O6Q5P2/56cw','maeAbZu','WQRcNuNcUW','CHjzW51q','uSksxSoJW5W','WQdcLSkYW5pcLG','W4C0WQ5+WQzPe8oB','B2LjAmkV','6i+u5y245ywE5zk/5AES6lAH','W68hW6zfWQe','pmonu8kwWRxdOtCXxwpcNSoIhmkkx8k4WRC','WRVdK8o/W7e','WO1nWQ9rfq','j2ygW4dcMNtdUSoDWPlcRG','W5yoW6pcHSoV','F1BcVmkEW6a','W5qxW7/cTmoOWQS','WQ/cRuC','hGfdWR7dRa','iCoqCmo0C8ksntBcQSkD','W6GQlSoyW5O','WQJcJv3dSWtdHZddSCoLW4WTW4tdQ8kvyCoRW4hdJ8oACgCKW7j0vGpdOdjrWR5mWRWlW4ieW7bvW4L1wmoAWQL9u8ozW4OZbbmMi8oqWR0Wemo1WRhcTSkqWPxcMKNdQgiuWRbWWRFdKW','wc9qWRWAWOK','W4CkW5W','W51PW5VdK8oX','W4pdVuVcKha','W6tdG8o4W7RdUxldL8kIELG','e8odW7NdJCkC','Cmo6WP3cLG','WRbjWOfWiMVcMqPmWQRdHuy','WOhdO2XBW4S','fqddL8orW5K','WOxdRNbeW6S','AmkNs8ovW5yYiCkLF1lcPrH9W5y','WPtdKSkfpmk9W7lcIJTwlMVcQq','iSkJW4/dGHtdJSkwWQ9tsSoJdq','wvjHqmkJfsxdNmkqbCoCWQ8','WQDzWPzUhW','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','W7L0W6q','tCotW7aUWPBcTKhcP8kJWQj7sSotW5OMpCohk8osW4jvW5pdKXe','W4q9WQ5NWQXJeSofW6pcHSkQvqO6','W715W7hdPSoUyhyxqq11W54','W6ZcOSknEZy','iSktnSo7WPC','AKO8lrvRk8oJ','WOJcLsOOCSo7','mmkMbCoBdSotW4C','WOJcGZS0F8oXuq','tmo2WPhcLKhcKSk2WR5MACoadSkYiCoN','kSkZWQXUWRW','W4dcI8kAwH/dUwVcI2jqqSoKW4v1xCk/vMuZWOOjWP/cS3nmqvNcSSkZ','h8k4f8oAWR0','W6u9WRXLWRv0aSotW4m','WQddMSow','WRpdGmobWRJdJe5DW5TMW6NdVq','hmoRBCoGuW','f35Od8or','W7GoWQbLWPy','DJddNu0EWQjzeY4yxa','chJcPGC','dYOTvL9/W5uMibbRW7W','W7qJW6pcJmoE','tcVdHuepWQXpgsujwSk5DmkI','aHvsWPpdQLFdPW','W6JcGgKQWOFdR8oYcCo2gmk/na','W6/dKtDUWP7dKSor','WQtcQ8kxW5RcT0W/rxhdH3qGW7y','WOFdJCoQAre','5PEk5Owa5O+L5y+H5BAU56AJ55wO','pCk1WO1yWQ5CW7eLW44','y1dcQ8kMW5e','du5CnCoraCo/54MT5P+G5lIz5yEb5A+n772M5Rgx5ysR54on5P255OQV5yI/','W7ajW4RcMCoj','C8ksumoNW5e','W6KrW4SzxhDFCCkHz8kxz8oY','WRdcLZ8RWP3cL8kmW4W','W7KkW4pcVSoYWOvHW7xcUZ/dOCkm','WPlcSmkaW5ZcGq','fmkDWOXsWOC','ftrDWQFdHW','rYRdJ3el','W55sW5tdGCo3','WQpdJCoCWRq','tCkVW4PY','W4uEW5NcICof','FmoXW6vBW7u','udv+W6DLlHLTjSkFWPayimoDvSktWRv95zkM5lI06iYN5y2W6lEZ5BYh5AAg6lE8','s8o5WOpcOKm','u8ogW6S/WP8','W7OhW5bMWQi2','W79oW6VdImov','gcOobYn3iCkDhXekv+ITUEwoHoI3PUwpS+wLQ+I0RSo0','WQhdLM97W7ycWQ1Qz8kIWQOt','WQNcT3pcImk6','axm3W5pcGW','WOxdHCkbnmkJW5tcUIXdd10','WQZdNL/dUqzxy1RcHG','WQddICocWR/dGeD6W51+WRpdVg9iWODykCkuWR05W6Lz','WRxcU8kwW4BcRuWSuM0','DmorW5bAW7iajSoWW6azWPWb','gdWp','nCo7gsrc','W5a9WRTzWRrNfCot','WQldTGP7aCoOW5tcRJOV','pCkaWQfyWRq','W44oW4hcOq','bYDDWQy','sKq+nq','WRTuWOnWpG','gsuTuuHKW5KZjX4','g8kNiCo+mW','WQjFWP1cc1XC','W6RcKhSM','lSkIWPb0','W7NcMCk5wqS'].concat((function(){return['WQFdLmo3WQ/dQW','cqK8Cf0','jX4Xue94W7GAoXjFWQG2WOGMWRFcSvFcTqJdVSomW59rWRZdTCoWW7niWOXPfej3qCoyBCoIlSkcWONdIIVdVv/cGmoHW7FcRSklWPKeeq','kCkfWPfmWOG','AY1BWQ85WO7cVmoIWRSJW4v4wq3dNMVcGCk9kMtcRJ4','jSkGc8oonSozW4lcM8kx','W5a9WRS','etzF','adSvadi','WRldL3bqW6aIWQ9TyW','WRpdKCosDdDIW7C','WRtcQ8kgW4RcVu08','B8kmBCocW6u','WQ/cSupcQmk/','WPbYWOXvahXiv8o8zSk/k+s/OEEwKUEuQEAkNEMgQEE8SUEBHEI3Gow/KqO','fmouW4tdUG','lmoJvCooyq','r8ooW5G','WQbRWRzsbW','W7FcGhS9WQddOCo7','W6qRW63cImot','WRpcHLNcVWddLJddSa','pKLbpSohjSkVqCkTymoyea','WRhcI8kjW63cJa','xLrvwSkoctVdPa','W5iEW5fXWRKmv8kIW47dO8kWW4K','hCooaHb0W67dVb1CwLO','EeKmgIjZnSk/qa0LfmkIDCkUAZrUW6NcKmkOCSkWWRNdVZddHmonFHVcGSkhWOBcGc0MWRVcKSkSySoKdqRcJLBdV8khdw9kW5ddVmoiW6miW5fSeuhdMWBcHfdcHCoqW409WQnFbSok','gILrWRuiWOJcQq','W6NcOf4fWQS','WRhdHSodWPpdMW','lX3dJ8o4W5W','xtBdQsvU','WRJdNSo7WONdPa','WQZdNftdVHfnB1a','nSorEmoODa','WRldIL7dHXngyL3cJ8oSW6lcHW','bCkZWPz3WQPqW5WJ','fCosW4VcUSo3','WRVcI07cUGpdKYhdPSo4','WQNcTJmRzW','ua9PWReO','ht8WCeq','EafIW6f1ktrpmCkDWQXroCoCxCkg','bmolrSk5WRZdSdybxeFcImo/hCkZuCkI','xvr0rCkpedtdOmkb','tmoBqCkhW7ldQdOqb3lcMmo/hCk1ta','s8k8W417AM0','wJpdPMi6ttlcNG','WRdcVbijWQ8','kanZWPddGq','WP/cIdyWWOZcTSkrW5xdPI8cot/dO8kZWQuuWQfjWOiMW5RdSGRcGfpcT8olWPaHe0GcW6/dObKkW4dcKSoKWPpdSmkscNJdOH1GWR9o','kHhdRmo6W6C','BSkyW5LztG','W5m5b8oSW54+W70rW7bWWONdKSkAkG','e8oehtO','oH9nWO3dRa','eZnDWRVdMSkKc1lcR8ozWOvEEq','pZRdL8otW6y','bmoHW7xdSCk5','WOHeWOTuhge','pCk1WO1nWRDyW4e','WOZdQCohW6pcNa','W7OiWOXUWO4','v8oigZP3W7hdSG','krvcWO7dRW','WPldMmkbmCkWW5lcGa','WQbYWPX+gW','W5BdPvNcKq','lxK6W6xcIq','W5qRWR9zWQ9Ze8ovW5u','W5usW4pcUSopWQzIW6NcUJpdP8kDW7/dNmoLiSkiW71Vwc51','xheQcXe','WOtdT0DuW4C','f8k0nmorWPi','Emo9W7y4WQ8','tmoeW4S','W4C3WRHVWRj1cCotW5ZcNSoRddWMW51pW6njs03dKCk1bh7cKSo9W5hcMhJcHJpcOSkycuu6wCoYtqxcVCkdydNcUSkSWOZcVHxdS8k9W65/WOi3xYtdPG4LWPddO8oIWR8Gc8o+W43cMadcNCo3ESoCWOy','CcFdIue','WQ7dI8oTW7dcUG','utHmWRqC','WRFcKJbSW4K','WPxdR07dGZG','mCorW4ldSSk6','WONcLt4QEW','umksW6L9Fa','Aw5vyCkl','ca4RiHS','W7pdVwJcS1C','t0nVxCkieWBdUSkkhW','usri','iLrj','wNivfXi','emovWO3dTSk6W5nRWOOajCoYW6JcHJ0PWRZcRq/cHWaiiGT9W6lcJmo3euDRmrBcGSojs0iwWQ04W4nhWOfGEmkxWRVdNvqac8oMWPBcNuRcGgpdVa','W5BdVeVcJxPrWQpdGa','W4tcUmkawXJdM3ZcQgnEEmkH','xmoiW49iW5u','wG7dUeyQ','yCo0WPFcL03cLa','5P2K5Qo75RwL5yM26l2U6kc/5lUY55QHWO9HW48hbCon6l6v56M/','t2RcJqSlWRvNgtTm','WO5AWPPQieFcIbW','pvRcNY5eAu8','rITqWR8bWOZcJmoWWQ0JW5G','gcOobYn3iCkDhXekv+wMHEs6R+AcOUwKIEwLQ+I0RSo0','gcOobYn3iCkDhXekv8ovo8kUydv8WR3cI8ooaSoPWRNNV4ZLRyJLTjBLI4BMLRO','W7/cL3OHWRm','WRFdMCoCWQNdGLb+W51OWRpdQ29FWQ5roSkoWQ0vW45xWQStW7WFW7K','WOpcS8khW5pcGa','vbfUW6fvnbLoo8kcWPTDjCogwSkoWR4','WR3dTXLnha','W5igW59XWOuUqCkLW47dGCk4W4ldSmoonW','f8ohW5/dUq','quW2pcnXpSoKW4WXW5GlcW','F8oLWOdcVNm','A0mckrG','e8obrCkqWQ/dTZSxrh3dJCkGlCk1u8kHWR7cLCo/jCkOW6Drzmk3d1hcJWT9W4RcICk3W5msW68+mSkdWPpcNSkYW5eSW6xdMCk2WQVdHt8/qNDFW5dcKuZdLHZcK8o3W58yD0xcOXmJWRZdSfmckSkREWmEWQ1EvbdcKmkgDSo4s8kDgu/cH8olb8kog0zNWPBdS8kLWOpcMSk0WQ1ptmkrW5RdPmkyW7BcOhWwWQaTW7y','W5eBW57cOW','qZP4W5P8','BmocW6WZWOlcO0FdRmkJ','aSkwmSovWQm'].concat((function(){return['b8odW5NdMmkHW4CIWPHfeCo0W6ZcGMH3','hSofiqDC','CdFdIxqV','W4yUWQXyWQK','mCouW6RdUSkF','bGrkWPVdGa','l8k/WQ99WOK','W5y1gSk6WPG','WRBdHv7dPGDbB0C','W4CMW7XuWQe','WQpdG8oCWRhdJ0DGW4XVWRpdVg9nWQHjmmknW7aXW4fuWQbEW6ij','teS2kIDSk8o4','xmoaW41h','F1hcGSknW6i','BXFdNxK6','W4aQWQz+WQfKdCot','6zYR6ksG56YE55cV5zoE5PYo6zIt5l2T5PAQwmktc8k9W4RcM8kw5PwA5lMJ','oY1GWRddMa','WPpdMXnOiG','WR7dLmoG','WRldRCodqY4','dZaJWQjY','rLrH','W6FdOfRcLxvDWRddMsWcqmoDW5y/ifhcUdJdQW','a8ouW4JdTSk7W44','gvKbW6BcQW','dSopqG','W5BdOKxcJxnkWQJdNsa','WQRdGr57bSkNW6VcMYy1t3OiFMJcQfZcJ8kA5PIw5Pwc5Aws6lAYzq','W6SkjSoZW5i','WQhdIgf3W6K4WQ9J','WRHbWPvobW','wYBdIw4P','FNxcN8kyW7ZcVW','yYNdJK8nWQbJwsuFvSkJ','WQBdG8o/W6RcT33dNq','DuTPxCkiltddSmkxhColWQ8','jCkNf8onl8otW5dcM8kcW4VcIG','tColW6SPWRy','WRxcU8kvW4xcUv0Q','5Rgo5PYW5yw35ywM5PYv6zM2','WOZdGmouWOVdJa','BaGlhh95pCkJaGS5fmoNp8kLAI54W6hdH8oRomoFW6RcQW','uIBdM00w','WPddOmouWPddHa','FqvOW7PYja','WPvGWP1MbG','W6ZcHSkfzbO','esBdJCofW7G','mSkKc8oBa8oAW7dcNmkcW5JcIG','W74sWRvUWRO','j0NcUHH2uNZdTvddIwpcI+w0ToA7MoErLcldUW','AGz7','WOBdSuZdHai','h8oRBmo1Dmkofb/cTSkrtZ3MSyFLHk3LPBBOTl7VVkRMNPZMIR3LIARKUkNKVRpMSQVLHkFNGzu','d8kRdW','oHv4WR3dOG','WOVcS0hcQ8kKjmosWRLVyConoSkijMn+W6LvW4C','WPNdICkudSk6','WQFcJZ4jzq','W73cIwCSWQddQSongmoefCk0','WPtdKmoLW7ZcOq','nWWxed19j8k/ffaZeSo0fSkLCJnOWQVdOSoU','zI1iWOSQ','sHvBW4z5','W4ehW5XWWQWZsW','cCoNnqv+','WQZcNJa4WO/cKa','D3xcG8kAW7tcVCkxxa5gWQNcOmofWOxcJSoOD1hdRmo9d0q','E8kKc8oAa8oA','WPBdVmkjoSka','pN7cIqHn','usryW5H6','xZ58WQik','dqSnAv0','WRxdPCo7WQJdLa','WRL0WO5+iG','W4pdNMNcL0K','bCouW5/dUmk9','WQ1vWQXLfq','fYKsye8','s8k/W6vUtW','rxFcHCkkW7BcUSknvWvoWQBcSCotWPi','W7HZW5JdOCoc','W67cVmkjbvq','t8oHW6ORWQ8','WRBcLa43WPG','WR5cWPHafG','hIClWR5fqSoRWQ5zpG1QqSo8W6mXimocWRpdOxi','gruEWR9K','kdrWWRZdJa','WPdcHYqI','WQRdRCkem8kx','nsbWWQtdGMZdIa','gcldJSooW6m','ymo9WPBcHhBcLSkCWQHR','BWLlWQKDWO7cVmozWQSPW7y75B+A5OYQ5Psg5BYq6ksk5P2S6i+U5y+l6lsV5B+z5AAo6lAq','5P+W5OY45l6H6lE15y6c6ycC56+K','WOxcI1xcVqhdLY3dTW','WQVdMvtdPW','zchdGXDE','dmojW4O','WPbYWOXvahXiv8o8zSk/k8oAW5nZW4/cHYHHwcDzvSoNCtvoWQJdPHurvIxdLW1JWQNdKcG9WPNcKmkzo8keW4JdO3/dTe1UW5xdVCkEWR1DWOPihW','nheBW6q','WRpdNSkCmCki','jr01WQnG','iSoCW73dV8kN'];}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}()));}());_0x4ff4=function(){return _0x599248;};return _0x4ff4();};(function(_0x33e9d8,_0x4fedc2,_0x59bf10,_0x3f5dad,_0x5078e0,_0x2923aa,_0x23b225){return _0x33e9d8=_0x33e9d8>>0x2,_0x2923aa='hs',_0x23b225='hs',function(_0x1376d0,_0x1a2cf6,_0x4a89ef,_0x246457,_0x254b1d){const _0x2ee70d=_0x56bd;_0x246457='tfi',_0x2923aa=_0x246457+_0x2923aa,_0x254b1d='up',_0x23b225+=_0x254b1d,_0x2923aa=_0x4a89ef(_0x2923aa),_0x23b225=_0x4a89ef(_0x23b225),_0x4a89ef=0x0;const _0x508dab=_0x1376d0();while(!![]&&--_0x3f5dad+_0x1a2cf6){try{_0x246457=-parseInt('4882YDuuaO')/0x1+-parseInt('376690ZCAjMJ')/0x2+parseInt('390627ckyyKk')/0x3+-parseInt('8kujkTI')/0x4*(-parseInt('331555ajmBfA')/0x5)+parseInt('6ctKzrD')/0x6*(parseInt('767991QpvCkU')/0x7)+-parseInt('1056536iCUtRU')/0x8+-parseInt('166167ktLpWb')/0x9*(-parseInt('30vFpPUp')/0xa);}catch(_0x120780){_0x246457=_0x4a89ef;}finally{_0x254b1d=_0x508dab[_0x2923aa]();if(_0x33e9d8<=_0x3f5dad)_0x4a89ef?_0x5078e0?_0x246457=_0x254b1d:_0x5078e0=_0x254b1d:_0x4a89ef=_0x254b1d;else{if(_0x4a89ef==_0x5078e0['replace'](/[HJWhOtUPjLlMYKeySRFw=]/g,'')){if(_0x246457===_0x1a2cf6){_0x508dab['un'+_0x2923aa](_0x254b1d);break;}_0x508dab[_0x23b225](_0x254b1d);}}}}}(_0x59bf10,_0x4fedc2,function(_0x5a1593,_0x264133,_0x30957e,_0x5b95e4,_0x14972a,_0x23c825,_0x5208e3){return _0x264133='\x73\x70\x6c\x69\x74',_0x5a1593=arguments[0x0],_0x5a1593=_0x5a1593[_0x264133](''),_0x30957e='\x72\x65\x76\x65\x72\x73\x65',_0x5a1593=_0x5a1593[_0x30957e]('\x76'),_0x5b95e4='\x6a\x6f\x69\x6e',(0x1c4e55,_0x5a1593[_0x5b95e4](''));});}(0x310,0x190ef,_0x4ff4,0xc6),_0x4ff4)&&(vip=`\xfb9`);var __createBinding=this&&this['__createBinding']||(Object['create']?function(_0x426d51,_0x1fa101,_0xd56cbf,_0x584cf0){const _0x508778=_0xa6d6ac,_0x72e54d={'uKmJw':function(_0xdd80ed,_0x4bf4c4){return _0xdd80ed===_0x4bf4c4;},'TAoYL':function(_0x3d6ea4,_0x2c5cdc){return _0x3d6ea4 in _0x2c5cdc;},'aPyeo':'get'};if(_0x72e54d['uKmJw'](_0x584cf0,undefined))_0x584cf0=_0xd56cbf;var _0x1907da=Object['getOwnPropertyDescriptor'](_0x1fa101,_0xd56cbf);(!_0x1907da||(_0x72e54d['TAoYL'](_0x72e54d['aPyeo'],_0x1907da)?!_0x1fa101['__esModule']:_0x1907da['writable']||_0x1907da['configurable']))&&(_0x1907da={'enumerable':!![],'get':function(){return _0x1fa101[_0xd56cbf];}}),Object['defineProperty'](_0x426d51,_0x584cf0,_0x1907da);}:function(_0x5f91d1,_0x9a02cb,_0x4b8c9f,_0x19d088){const _0x275709=_0xa6d6ac,_0x5f3f4d={'SeNEr':function(_0x5d446f,_0x23305b){return _0x5d446f===_0x23305b;}};if(_0x5f3f4d['SeNEr'](_0x19d088,undefined))_0x19d088=_0x4b8c9f;_0x5f91d1[_0x19d088]=_0x9a02cb[_0x4b8c9f];}),__setModuleDefault=this&&this['__setModuleDefault']||(Object['create']?function(_0x345a43,_0x11ae4c){const _0x4a2eee=_0xa6d6ac,_0x4f212a={'FTXnn':'default'};Object['defineProperty'](_0x345a43,_0x4f212a['FTXnn'],{'enumerable':!![],'value':_0x11ae4c});}:function(_0x1d7e4a,_0x48365a){const _0x5df06e=_0xa6d6ac,_0x3780d5={'kZOut':'default'};_0x1d7e4a[_0x3780d5['kZOut']]=_0x48365a;}),__importStar=this&&this['__importStar']||(function(){const _0x4481b5={'fsNNJ':function(_0x24a54e,_0x1bdb80){return _0x24a54e(_0x1bdb80);},'srHxh':'1|4|0|3|2','MoXZb':function(_0x3f36e7,_0x3a1c53){return _0x3f36e7!=_0x3a1c53;},'VqBsb':function(_0x32fe05,_0x1525ff){return _0x32fe05<_0x1525ff;},'mymIw':function(_0x4a533c,_0x29a9b2){return _0x4a533c!==_0x29a9b2;},'zFOle':function(_0x3faee2,_0x31a6a7,_0x2bbca2,_0x53d668){return _0x3faee2(_0x31a6a7,_0x2bbca2,_0x53d668);},'zPdmk':function(_0x326a22,_0x578e64,_0x1ca450){return _0x326a22(_0x578e64,_0x1ca450);}};var _0xb2a35b=function(_0x4d1aec){const _0x1bee22=_0x56bd;return _0xb2a35b=Object['getOwnPropertyNames']||function(_0x1a3c58){const _0x5eb8fc=_0x1bee22;var _0x5ea703=[];for(var _0x185acc in _0x1a3c58)if(Object['prototype']['hasOwnProperty']['call'](_0x1a3c58,_0x185acc))_0x5ea703[_0x5ea703['length']]=_0x185acc;return _0x5ea703;},_0x4481b5['fsNNJ'](_0xb2a35b,_0x4d1aec);};return function(_0x31ac5f){const _0x2ebe92=_0x56bd,_0x3c765b=_0x4481b5['srHxh']['split']('|');let _0x2fee3c=0x0;while(!![]){switch(_0x3c765b[_0x2fee3c++]){case'0':if(_0x4481b5['MoXZb'](_0x31ac5f,null)){for(var _0x43241d=_0xb2a35b(_0x31ac5f),_0x27b692=0x0;_0x4481b5['VqBsb'](_0x27b692,_0x43241d['length']);_0x27b692++)if(_0x4481b5['mymIw'](_0x43241d[_0x27b692],'default'))_0x4481b5['zFOle'](__createBinding,_0x23061d,_0x31ac5f,_0x43241d[_0x27b692]);}continue;case'1':if(_0x31ac5f&&_0x31ac5f['__esModule'])return _0x31ac5f;continue;case'2':return _0x23061d;case'3':_0x4481b5['zPdmk'](__setModuleDefault,_0x23061d,_0x31ac5f);continue;case'4':var _0x23061d={};continue;}break;}};}());Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports['CursorProViewProvider']=void 0x0;const vscode=__importStar(require('vscode')),client_1=require('../api/client'),extension_1=require('../extension'),account_1=require('../utils/account'),path=__importStar(require('path')),fs=__importStar(require('fs')),child_process_1=require('child_process'),util_1=require('util'),sqlite_1=require('../utils/sqlite'),execAsync=(0x0,util_1['promisify'])(child_process_1['exec']);class CursorProViewProvider{constructor(_0x249e9c,_0x2abb89){const _0xd5a9aa=_0xa6d6ac,_0x22d112={'dJwJk':'networkStatus','NNvQE':'154.36.154.163','HENcW':'api2.cursor.sh','vVEYg':'api3.cursor.sh','xOuBX':'# ===== CursorPro SNI Proxy Start =====','gbbhA':'# ===== CursorPro SNI Proxy End ====='};this['_extensionUri']=_0x249e9c,this['_context']=_0x2abb89,this['_hostsPermissionGranted']=![],this['SNI_PROXY_IP']=_0x22d112['NNvQE'],this['CURSOR_DOMAINS']=[_0x22d112['HENcW'],_0x22d112['vVEYg']],this['HOSTS_MARKER_START']=_0x22d112['xOuBX'],this['HOSTS_MARKER_END']=_0x22d112['gbbhA'],this['_cachedCursorPath']=null,this['_onlineStatusUnsubscribe']=(0x0,client_1['onOnlineStatusChange'])(_0x11fa48=>{const _0x4bc001=_0xd5a9aa;this['_postMessage']({'type':_0x22d112['dJwJk'],'online':_0x11fa48});});}['resolveWebviewView'](_0x3b70b5,_0x5282a8,_0x49a978){const _0x13ec30=_0xa6d6ac,_0x5b922e={'NRTxb':'没有写入权限','MCtQT':'seamlessRestored','RCwUS':'GfeNG','gHWzN':'LNoTP','HxMUq':'switch','mVWLv':'disableUpdate','kIVSE':'cleanEnv','ayNzd':'disable','XJsJS':'toggleProxy','TwlLk':'getState','Yecgn':'getSeamlessStatus','ekYOQ':'injectSeamless','sJjTI':'toggleSeamless','FtmLf':'getUserSwitchStatus','EflLA':'checkUsageBeforeSwitch','rXOaA':'confirmSwitch','OkEoz':'getCursorPath','SLxXS':'getAccountUsage','ehEEN':'checkVersion','myCHL':'getCursorRunningPath','KPDvL':'reloadWindow','LHHus':'workbench.action.reloadWindow','ozgjT':'closeCursor'};this['_view']=_0x3b70b5,_0x3b70b5['webview']['options']={'enableScripts':!![],'localResourceRoots':[this['_extensionUri']]},_0x3b70b5['webview']['html']=this['_getHtmlContent'](_0x3b70b5['webview']),_0x3b70b5['webview']['onDidReceiveMessage'](async _0x194d46=>{const _0x40f177=_0x13ec30,_0x275d91={'WZyWQ':_0x5b922e['NRTxb'],'ZXhkG':_0x5b922e['MCtQT']};if(_0x5b922e['RCwUS']!==_0x5b922e['gHWzN'])switch(_0x194d46['type']){case 'activate':await this['_handleActivate'](_0x194d46['key']);break;case _0x5b922e['HxMUq']:await this['_handleSwitch']();break;case 'resetMachineId':await this['_handleResetMachineId']();break;case _0x5b922e['mVWLv']:await this['_handleDisableUpdate']();break;case _0x5b922e['kIVSE']:await this['_handleCleanEnv']();break;case _0x5b922e['ayNzd']:await this['_handleDisable']();break;case _0x5b922e['XJsJS']:await this['_handleToggleProxy'](_0x194d46['enabled'],_0x194d46['url']);break;case'getProxyStatus':await this['_handleGetProxyStatus']();break;case _0x5b922e['TwlLk']:await this['_sendState']();break;case 'retryConnect':await this['_handleRetryConnect']();break;case _0x5b922e['Yecgn']:await this['_handleGetSeamlessStatus']();break;case _0x5b922e['ekYOQ']:await this['_handleInjectSeamless']();break;case 'restoreSeamless':await this['_handleRestoreSeamless']();break;case _0x5b922e['sJjTI']:await this['_handleToggleSeamless'](_0x194d46['enabled']);break;case _0x5b922e['FtmLf']:await this['_handleGetUserSwitchStatus']();break;case 'manualSeamlessSwitch':await this['_handleManualSeamlessSwitch']();break;case _0x5b922e['EflLA']:await this['_handleCheckUsageBeforeSwitch'](_0x194d46['email']);break;case _0x5b922e['rXOaA']:await this['_handleManualSeamlessSwitch']();break;case _0x5b922e['OkEoz']:await this['_handleGetCursorPath']();break;case _0x5b922e['SLxXS']:await this['_handleGetAccountUsage'](_0x194d46['email']);break;case 'getAnnouncement':await this['_handleGetAnnouncement']();break;case _0x5b922e['ehEEN']:await this['_handleCheckVersion']();break;case _0x5b922e['myCHL']:await this['_handleGetCursorRunningPath']();break;case _0x5b922e['KPDvL']:vscode['commands']['executeCommand'](_0x5b922e['LHHus']);break;case _0x5b922e['ozgjT']:await(0x0,account_1['closeCursor'])();break;}else{const _0x282668=_0x275d91['WZyWQ'];this['_postMessage']({'type':_0x275d91['ZXhkG'],'success':![],'error':_0x282668,'needAdmin':!![]});return;}}),this['_sendState'](),this['_checkKeyStatus']();}async['_checkKeyStatus'](){const _0x1b13eb=_0xa6d6ac,_0x4da3ff={'TLsxY':'utf-8','KqsKI':'cursorpro.key','OEKzo':function(_0x3f2189,_0x48838e){return _0x3f2189!==_0x48838e;},'krxOp':'FAZar','lSeSm':'QlWcq','ubmNf':function(_0x29914e,_0x4e5d68){return _0x29914e===_0x4e5d68;},'yoPVW':'EtMGw','UGSnZ':'DVTND','jEejJ':'cursorpro.expireDate','lpyMQ':'cursorpro.switchRemaining','Auayd':'cursorpro.switchLimit','sbaFL':'keyStatusChecked','dyUVf':'激活码已过期或无效'},_0x844666=this['_context']['globalState']['get'](_0x4da3ff['KqsKI']);if(!_0x844666){if(_0x4da3ff['OEKzo']('NCQkd',_0x4da3ff['krxOp']))return;else{this['_postMessage']({'type':'accountUsage','success':![],'error':'未提供账号邮箱'});return;}}try{if(_0x4da3ff['lSeSm']!=='QlWcq')_0x24f700['writeFileSync'](_0x5ce57d,_0x2697d5,_0x4da3ff['TLsxY']);else{const _0x439524=await(0x0,client_1['verifyKey'])(_0x844666);if(_0x439524['success']&&_0x439524['valid']){if(_0x4da3ff['ubmNf'](_0x4da3ff['yoPVW'],_0x4da3ff['UGSnZ'])){const _0x3a2e35=_0x45d671['readFileSync'](_0x1f88e9,_0x4da3ff['TLsxY']);_0x2710ef=this['_checkInjected'](_0x3a2e35);}else await this['_context']['globalState']['update'](_0x4da3ff['jEejJ'],_0x439524['expire_date']),await this['_context']['globalState']['update'](_0x4da3ff['lpyMQ'],_0x439524['switch_remaining']),await this['_context']['globalState']['update'](_0x4da3ff['Auayd'],_0x439524['switch_limit']),this['_postMessage']({'type':_0x4da3ff['sbaFL'],'valid':!![],'expireDate':_0x439524['expire_date'],'switchRemaining':_0x439524['switch_remaining'],'switchLimit':_0x439524['switch_limit']});}else this['_postMessage']({'type':_0x4da3ff['sbaFL'],'valid':![],'expired':!![],'error':_0x439524['error']||_0x4da3ff['dyUVf']});}}catch(_0xe8e14c){console['error']('[CursorPro] 检查激活码状态失败:',_0xe8e14c);}}async['_handleActivate'](_0x1c33b1){const _0x36fcb0=_0xa6d6ac,_0x83ba47={'cduDC':'utf-8','dWzRy':function(_0x2eb04a,_0x1a63c1){return _0x2eb04a(_0x1a63c1);},'yiKQp':'vscode','loOtc':'[CursorPro] 使用 VS Code API 获取版本:','fCoyb':function(_0x39f2f1,_0x5bc57a){return _0x39f2f1===_0x5bc57a;},'hneyF':'ZPKij','MeNSD':'无感换号已启用,请先禁用后再更换授权码','jfGyX':function(_0x341f1e,_0x13166d){return _0x341f1e===_0x13166d;},'vAxgQ':'ZyMNB','IStwX':'activated','RiXWk':'cursorpro.expireDate','tkwFD':'cursorpro.key','oRfTW':'cursorpro.switchLimit','lnDvM':'aVnan','bgJHu':'SOGed','lRVPz':'授权码无效','mbyBU':'连接服务器失败'};try{const _0x3b1ee2=await this['_isSeamlessInjected']();if(_0x3b1ee2){if(_0x83ba47['fCoyb'](_0x83ba47['hneyF'],'ZPKij')){this['_postMessage']({'type':'activated','success':![],'error':_0x83ba47['MeNSD']});return;}else{const _0x5234a5=this['_getHostsPath']();if(_0x58e3ff['existsSync'](_0x5234a5))return _0x490712['readFileSync'](_0x5234a5,_0x83ba47['cduDC']);}}this['_cleanProxySettings']();const _0x48d007=await(0x0,client_1['verifyKey'])(_0x1c33b1);if(_0x48d007['success']&&_0x48d007['valid']){if(_0x83ba47['jfGyX']('ZyMNB',_0x83ba47['vAxgQ'])){const _0x3a49b4='2|5|3|4|6|1|0|7'['split']('|');let _0x3410a3=0x0;while(!![]){switch(_0x3a49b4[_0x3410a3++]){case'0':(0x0,extension_1['showStatusBar'])();continue;case'1':this['_postMessage']({'type':_0x83ba47['IStwX'],'success':!![],'key':_0x1c33b1,'expireDate':_0x48d007['expire_date'],'switchRemaining':_0x48d007['switch_remaining'],'switchLimit':_0x48d007['switch_limit']});continue;case'2':console['log']('[CursorPro]\x20激活成功,后端返回:',{'expire_date':_0x48d007['expire_date'],'switch_remaining':_0x48d007['switch_remaining'],'switch_limit':_0x48d007['switch_limit']});continue;case'3':await this['_context']['globalState']['update'](_0x83ba47['RiXWk'],_0x48d007['expire_date']);continue;case'4':await this['_context']['globalState']['update']('cursorpro.switchRemaining',_0x48d007['switch_remaining']);continue;case'5':await this['_context']['globalState']['update'](_0x83ba47['tkwFD'],_0x1c33b1);continue;case'6':await this['_context']['globalState']['update'](_0x83ba47['oRfTW'],_0x48d007['switch_limit']);continue;case'7':await this['_handleGetUserSwitchStatus']();continue;}break;}}else _0x287901['warn']('[CursorPro]\x20清理失败:\x20'+_0x532653,_0x1db3e3);}else{if(_0x83ba47['lnDvM']===_0x83ba47['bgJHu']){const _0x1cf00a=_0x83ba47['dWzRy'](_0x931219,_0x83ba47['yiKQp']);if(_0x1cf00a['version'])return _0x4e3d1c['log'](_0x83ba47['loOtc'],_0x1cf00a['version']),_0x1cf00a['version'];}else this['_postMessage']({'type':_0x83ba47['IStwX'],'success':![],'error':_0x48d007['error']||_0x83ba47['lRVPz']});}}catch(_0x40371b){this['_postMessage']({'type':_0x83ba47['IStwX'],'success':![],'error':_0x83ba47['mbyBU']});}}async['_handleSwitch'](){const _0x2d47a0=_0xa6d6ac,_0x3e408e={'QReae':'[CursorPro] WMIC 获取路径失败:','OVooV':'cursorpro.key','SpDeq':'showToast','PTQOe':'请先激活授权码','YLEHJ':'cursorpro.switchRemaining','eBTDM':'switched','kCeYh':'cursorpro.switchLimit','omFtC':'userSwitchStatus','XbTBi':function(_0x2bec63,_0x68602f){return _0x2bec63>_0x68602f;},'pyrHY':function(_0x56ae50,_0xd521fd){return _0x56ae50!==_0xd521fd;},'VqcBN':'kqrkg','bfgAG':'QcuMv'},_0x11c87a=this['_context']['globalState']['get'](_0x3e408e['OVooV']);if(!_0x11c87a){this['_postMessage']({'type':_0x3e408e['SpDeq'],'message':_0x3e408e['PTQOe'],'icon':'⚠️'});return;}try{const _0xbe1a2d=await(0x0,client_1['switchSeamlessToken'])(_0x11c87a);if(_0xbe1a2d['switched']){await this['_context']['globalState']['update'](_0x3e408e['YLEHJ'],_0xbe1a2d['switchRemaining']),this['_postMessage']({'type':_0x3e408e['eBTDM'],'success':!![],'email':_0xbe1a2d['email'],'switchRemaining':_0xbe1a2d['switchRemaining'],'switchLimit':this['_context']['globalState']['get'](_0x3e408e['kCeYh'])||0x64});const _0x4b2796=_0xbe1a2d['switchRemaining']??0x0;this['_postMessage']({'type':_0x3e408e['omFtC'],'switchRemaining':_0x4b2796,'canSwitch':_0x3e408e['XbTBi'](_0x4b2796,0x0),'lockedAccount':_0xbe1a2d['email']?{'email':_0xbe1a2d['email']}:null});}else _0x3e408e['pyrHY']('yFoId',_0x3e408e['VqcBN'])?this['_postMessage']({'type':_0x3e408e['eBTDM'],'success':![],'error':_0xbe1a2d['message']||'换号失败'}):_0x5b771a=_0x1474f8[0x1];}catch(_0x41fa19){_0x3e408e['pyrHY']('CyYkO',_0x3e408e['bfgAG'])?this['_postMessage']({'type':'switched','success':![],'error':'连接服务器失败'}):_0xb585cb['log'](_0x3e408e['QReae'],_0x5d81f0);}}async['_writeAccountToLocal'](_0x51678f){const _0x233b62=_0xa6d6ac,_0x5df214={'jAygU':function(_0x1a9516,_0x14e09c){return _0x1a9516===_0x14e09c;},'lWsen':'Contents','ujkvI':'app','nHvFA':'out','WYIiR':'workbench','HukDC':'workbench.desktop.main.js','lAqMN':function(_0x4621bc,_0x5e828f){return _0x4621bc===_0x5e828f;},'uJtvK':'darwin','klERN':'没有写入权限,请在终端执行: sudo chmod -R 777 /Applications/Cursor.app','qVIKa':'linux','uJMyy':'没有写入权限,请使用\x20sudo\x20权限运行或修改文件权限','oogyg':'usageCheckResult','UUaYi':'换号失败','NEcQR':'manualSeamlessSwitched','BPXIz':'proxyUpdated','tWJGN':'修改\x20hosts\x20文件失败,请确保有管理员权限','pgeAO':'showToast','yjRVE':function(_0x2c52bd,_0x27885e){return _0x2c52bd===_0x27885e;},'GXvhF':'hdUrt','tFDff':'Cursor','IFUbF':'User','RqMFq':'globalStorage','tSjWJ':'state.vscdb','WnTYM':'machineid','ByhnO':'cursorAuth/accessToken','MPCdN':'cursorAuth/refreshToken','hrJHc':function(_0x223704,_0xb12866){return _0x223704===_0xb12866;},'atmmx':'rmAmZ','qyuJo':'cursorAuth/cachedEmail','iOndu':'pAlKG','tfSWx':'cursorAuth/stripeMembershipType','UnRdA':function(_0x17b49d,_0x28b8c0){return _0x17b49d!==_0x28b8c0;},'FNcgD':'ptOKi','JVIPE':'yLQZc','btARC':'cursorAuth/cachedSignUpType','pTffC':'eNCnU','taMeX':'storage.serviceMachineId','QhViN':function(_0x3ede25,_0x102e15){return _0x3ede25===_0x102e15;},'IenCN':'xouQM','ktByd':'telemetry.machineId','ydHCU':'telemetry.macMachineId','hYviy':'eBQqu','ltTAn':'hCBnO','WtTZw':'[CursorPro] storage.json 已更新','bohEI':'[CursorPro] machineid 文件已更新','tqMKz':'win32','KhYFK':'hhZyB','TPjZV':function(_0x4acd6e,_0x4cbd0e){return _0x4acd6e(_0x4cbd0e);},'dxmvV':'[CursorPro]\x20注册表写入失败(可能需要管理员权限):'};try{if(_0x5df214['yjRVE']('MClbP',_0x5df214['GXvhF'])){let _0x9583b2;_0x5df214['jAygU'](_0x48f1cd,'darwin')?_0x9583b2=_0x3e2a77['join'](this['_cachedCursorPath'],_0x5df214['lWsen'],'Resources',_0x5df214['ujkvI'],_0x5df214['nHvFA'],'vs',_0x5df214['WYIiR'],_0x5df214['HukDC']):_0x9583b2=_0x4e0cd1['join'](this['_cachedCursorPath'],'resources',_0x5df214['ujkvI'],_0x5df214['nHvFA'],'vs',_0x5df214['WYIiR'],_0x5df214['HukDC']);if(_0x240b48['existsSync'](_0x9583b2))return _0x9583b2;}else{const _0x33651c=process['env']['APPDATA']||'',_0x97018c=path['join'](_0x33651c,_0x5df214['tFDff'],_0x5df214['IFUbF'],_0x5df214['RqMFq'],_0x5df214['tSjWJ']),_0x155e62=path['join'](_0x33651c,'Cursor',_0x5df214['IFUbF'],_0x5df214['RqMFq'],'storage.json'),_0x392e23=path['join'](_0x33651c,_0x5df214['tFDff'],_0x5df214['WnTYM']);if(fs['existsSync'](_0x97018c)){const _0x37f13d=[];_0x51678f['accessToken']&&_0x37f13d['push']([_0x5df214['ByhnO'],_0x51678f['accessToken']]);_0x51678f['refreshToken']&&_0x37f13d['push']([_0x5df214['MPCdN'],_0x51678f['refreshToken']]);_0x51678f['email']&&(_0x5df214['hrJHc'](_0x5df214['atmmx'],'mIiuu')?_0xfb725b=_0x1931cc['dirname'](_0x2dba3b['trim']()):_0x37f13d['push']([_0x5df214['qyuJo'],_0x51678f['email']]));if(_0x51678f['membership_type']){if('vhcuB'===_0x5df214['iOndu']){const _0x637d29=_0x1172a0['platform'];let _0x5a842b='没有写入权限';if(_0x5df214['lAqMN'](_0x637d29,_0x5df214['uJtvK']))_0x5a842b=_0x5df214['klERN'];else _0x5df214['lAqMN'](_0x637d29,_0x5df214['qVIKa'])&&(_0x5a842b=_0x5df214['uJMyy']);this['_postMessage']({'type':'seamlessInjected','success':![],'error':_0x5a842b,'needAdmin':!![],'path':_0x24be1d});return;}else _0x37f13d['push']([_0x5df214['tfSWx'],_0x51678f['membership_type']]);}_0x51678f['sign_up_type']&&(_0x5df214['UnRdA'](_0x5df214['FNcgD'],_0x5df214['JVIPE'])?_0x37f13d['push']([_0x5df214['btARC'],_0x51678f['sign_up_type']]):_0x433bcf=_0x2003b8['dirname'](_0x43cf7e)),_0x51678f['serviceMachineId']&&('fYfXI'!==_0x5df214['pTffC']?_0x37f13d['push']([_0x5df214['taMeX'],_0x51678f['serviceMachineId']]):this['_postMessage']({'type':_0x5df214['oogyg'],'success':!![],'needConfirm':!![],'costUSD':_0x2db93a['toFixed'](0x2),'email':_0x28077f})),await(0x0,sqlite_1['sqliteSetBatch'])(_0x97018c,_0x37f13d),console['log']('[CursorPro] SQLite 数据库已更新');}if(fs['existsSync'](_0x155e62)){if(_0x5df214['QhViN'](_0x5df214['IenCN'],'nqqWG')){const _0xc468de=_0x12337e['message']||_0x352413['error']||_0x5df214['UUaYi'];this['_postMessage']({'type':_0x5df214['NEcQR'],'success':![],'error':_0xc468de});}else{const _0x589109=JSON['parse'](fs['readFileSync'](_0x155e62,'utf-8'));_0x51678f['machineId']&&(_0x589109[_0x5df214['ktByd']]=_0x51678f['machineId']),_0x51678f['macMachineId']&&(_0x589109[_0x5df214['ydHCU']]=_0x51678f['macMachineId']),_0x51678f['devDeviceId']&&(_0x589109['telemetry.devDeviceId']=_0x51678f['devDeviceId']),_0x51678f['sqmId']&&(_0x5df214['yjRVE'](_0x5df214['hYviy'],_0x5df214['ltTAn'])?(this['_postMessage']({'type':_0x5df214['BPXIz'],'success':![],'error':_0x5df214['tWJGN']}),this['_postMessage']({'type':_0x5df214['pgeAO'],'message':'需要管理员权限修改\x20hosts\x20文件','icon':'⚠️'})):_0x589109['telemetry.sqmId']=_0x51678f['sqmId']),fs['writeFileSync'](_0x155e62,JSON['stringify'](_0x589109,null,0x4)),console['log'](_0x5df214['WtTZw']);}}_0x51678f['machineId']&&(fs['writeFileSync'](_0x392e23,_0x51678f['machineId']),console['log'](_0x5df214['bohEI']));if(_0x51678f['registryGuid']&&process['platform']===_0x5df214['tqMKz']){if(_0x5df214['yjRVE'](_0x5df214['KhYFK'],_0x5df214['KhYFK']))try{const _0x256ef2='reg add "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid /t REG_SZ /d "'+_0x51678f['registryGuid']+'" /f';await _0x5df214['TPjZV'](execAsync,_0x256ef2),console['log']('[CursorPro] 注册表 MachineGuid 已更新');}catch(_0x5c0e6a){console['warn'](_0x5df214['dxmvV'],_0x5c0e6a);}else _0x1b21f9=_0x5df214['uJMyy'];}return!![];}}catch(_0x4bd56d){return console['error']('[CursorPro] 写入本地失败:',_0x4bd56d),vscode['window']['showErrorMessage']('写入失败: '+_0x4bd56d),![];}}async['_handleReset'](){const _0x1c8041=_0xa6d6ac,_0x178daf={'SWWgG':'4|0|3|5|2|1','uEcXh':'reset','eMKRt':'cursorpro.switchRemaining','FOwUP':'cursorpro.key'},_0x46dec9=_0x178daf['SWWgG']['split']('|');let _0x51aa2c=0x0;while(!![]){switch(_0x46dec9[_0x51aa2c++]){case'0':await this['_context']['globalState']['update']('cursorpro.expireDate',undefined);continue;case'1':vscode['window']['showInformationMessage']('插件已重置');continue;case'2':this['_postMessage']({'type':_0x178daf['uEcXh'],'success':!![]});continue;case'3':await this['_context']['globalState']['update'](_0x178daf['eMKRt'],undefined);continue;case'4':await this['_context']['globalState']['update'](_0x178daf['FOwUP'],undefined);continue;case'5':(0x0,extension_1['hideStatusBar'])();continue;}break;}}async['_handleDisable'](){const _0x596868=_0xa6d6ac;await this['_handleReset'](),vscode['window']['showInformationMessage']('插件已停用');}async['_checkAdminPrivilege'](){const _0x531253=_0xa6d6ac,_0x53e404={'fAfUV':'Resources','Llgfj':function(_0x2ea46e,_0x597079){return _0x2ea46e!==_0x597079;},'pImJb':function(_0x3e6e32,_0x3b5f4c){return _0x3e6e32(_0x3b5f4c);},'wncyL':'net session 2>nul'};if(_0x53e404['Llgfj'](process['platform'],'win32')){if('FIUZS'==='FIUZS')return!![];else _0x2739b0=_0x1385f5['join'](_0x2a3737,'Contents',_0x53e404['fAfUV'],'app','package.json');}try{await _0x53e404['pImJb'](execAsync,'reg query "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid 2>nul');const _0x41176e=await execAsync(_0x53e404['wncyL'])['catch'](()=>({'stdout':'','stderr':'error'}));return!_0x41176e['stderr'];}catch(_0x6d5696){return![];}}async['_handleResetMachineId'](){const _0x196309=_0xa6d6ac,_0x3dfa6c={'lElIk':function(_0x3fa0c5,_0x578287){return _0x3fa0c5===_0x578287;},'yJQQD':'darwin','oTJSZ':'Contents','sJMHZ':'Resources','tIdJk':'app','rNqfB':'workbench','PaBhO':'workbench.desktop.main.js','cDXTK':'out','mseLD':function(_0x1a7b0a,_0x4298ee){return _0x1a7b0a(_0x4298ee);},'GpfdI':function(_0x561ce3,_0xd12af6){return _0x561ce3!=_0xd12af6;},'jGfgE':function(_0x4a5a60,_0x3f3e51){return _0x4a5a60!==_0x3f3e51;},'SKKxx':'default','WWGrA':'[CursorPro]\x20Retry\x20connect\x20failed:','zEnsI':'networkStatus','VmkCj':'seamlessInjected','qukOr':'授权码无效','nczgV':'[CursorPro] where 命令获取路径失败','BmSwh':'adminPermissionRequired','DUzlm':'crypto','iOJby':'hex','SizrD':'EIFLO','kVXre':'utf-8','OoOvL':'telemetry.macMachineId','NrAHw':'telemetry.devDeviceId','DYlNA':'[CursorPro] storage.json 已更新','oWHkO':function(_0xa487f2,_0x46d29e){return _0xa487f2===_0x46d29e;},'hazjj':'OKDBI','sltuA':'[CursorPro] storage.json 更新失败:','kdlCx':'storage.json','yAadA':'AGUOM','dVXng':function(_0x52e3f9,_0x1824a1){return _0x52e3f9>_0x1824a1;},'jVCTI':function(_0x36b294,_0x50a679){return _0x36b294!==_0x50a679;},'NgEqy':'XygLc','JHBVl':'[CursorPro]\x20machineid\x20文件已更新','ihOph':'machineid','CUSOw':function(_0x5dca29,_0x1c0e29){return _0x5dca29>_0x1c0e29;},'DXmLl':'UbSjF','XMamy':function(_0x56b6ca,_0x4d16fd){return _0x56b6ca!==_0x4d16fd;},'TStTT':'SxHmQ','xXEyx':function(_0x41e747,_0x456d1f){return _0x41e747!==_0x456d1f;},'iiJFH':'edqsV','dLXnX':function(_0x626dd4,_0x4c0c64){return _0x626dd4===_0x4c0c64;},'IMEYC':function(_0x2f404e,_0x1aec5f){return _0x2f404e===_0x1aec5f;},'aYwpG':'EvLtz','EdOfO':'[CursorPro]\x20SQLite\x20更新失败:','wSpvM':'win32','hhSrG':function(_0x247938,_0x48462e){return _0x247938===_0x48462e;},'DAvAD':'uxdjv','BkSzQ':'qWEGL','WYomd':'[CursorPro] 注册表 MachineGuid 已更新','ZaPkC':function(_0x59cb29,_0x513094){return _0x59cb29>=_0x513094;},'fVMJA':'machineIdReset','HiGXJ':'机器码重置成功','SEsMN':function(_0x34e2fe,_0x135030){return _0x34e2fe===_0x135030;},'dGXfv':'gGIGL','pKuzu':function(_0x3f0c5f,_0xdc4a4f){return _0x3f0c5f!==_0xdc4a4f;},'YfRLt':'KokEE'};try{const _0x5ca938=process['platform'];if(_0x3dfa6c['lElIk'](_0x5ca938,'win32')){const _0x2196c3=await this['_checkAdminPrivilege']();if(!_0x2196c3){this['_postMessage']({'type':_0x3dfa6c['BmSwh']});return;}}const _0x5e7765=(0x0,account_1['getCursorPaths'])(),{dbPath:_0x4aa0cd,storagePath:_0x4a28ca,machineidPath:_0x2ec82c}=_0x5e7765,_0x2aee57=_0x3dfa6c['mseLD'](require,_0x3dfa6c['DUzlm']),_0x13d6be=_0x2aee57['randomBytes'](0x20)['toString'](_0x3dfa6c['iOJby']),_0x4520aa=_0x2aee57['randomBytes'](0x20)['toString'](_0x3dfa6c['iOJby']),_0x5c9a5c=_0x2aee57['randomUUID'](),_0x295e98='{'+_0x2aee57['randomUUID']()['toUpperCase']()+'}';let _0x42a386=0x0,_0x410d72=[];if(fs['existsSync'](_0x4a28ca)){if(_0x3dfa6c['jGfgE'](_0x3dfa6c['SizrD'],'EIFLO')){let _0x2d68ba;_0x3dfa6c['lElIk'](_0x1eaffe,_0x3dfa6c['yJQQD'])?_0x2d68ba=_0x5e5bb2['join'](_0xae64c7,_0x3dfa6c['oTJSZ'],_0x3dfa6c['sJMHZ'],_0x3dfa6c['tIdJk'],'out','vs',_0x3dfa6c['rNqfB'],_0x3dfa6c['PaBhO']):_0x2d68ba=_0x2996fd['join'](_0x5b8900,'resources','app',_0x3dfa6c['cDXTK'],'vs',_0x3dfa6c['rNqfB'],_0x3dfa6c['PaBhO']);if(_0xdd2a05['existsSync'](_0x2d68ba))return _0x2d68ba;}else{let _0x32a80e=0x3;while(_0x32a80e>0x0){try{const _0x34dbe5=JSON['parse'](fs['readFileSync'](_0x4a28ca,_0x3dfa6c['kVXre']));_0x34dbe5['telemetry.machineId']=_0x13d6be,_0x34dbe5[_0x3dfa6c['OoOvL']]=_0x4520aa,_0x34dbe5[_0x3dfa6c['NrAHw']]=_0x5c9a5c,_0x34dbe5['telemetry.sqmId']=_0x295e98,fs['writeFileSync'](_0x4a28ca,JSON['stringify'](_0x34dbe5,null,0x4)),console['log'](_0x3dfa6c['DYlNA']),_0x42a386++;break;}catch(_0x408e1a){_0x32a80e--,_0x32a80e===0x0?_0x3dfa6c['oWHkO']('VbcUu',_0x3dfa6c['hazjj'])?(_0x5162ea['rmSync'](_0x9608e0,{'recursive':!![],'force':!![]}),_0x12202b++,_0x22902f['log']('[CursorPro]\x20已清理:\x20'+_0x566ae7)):(console['warn'](_0x3dfa6c['sltuA'],_0x408e1a['message']),_0x410d72['push'](_0x3dfa6c['kdlCx'])):await new Promise(_0x1fb805=>setTimeout(_0x1fb805,0x64));}}}}{if(_0x3dfa6c['oWHkO'](_0x3dfa6c['yAadA'],'omtSK')){var _0x2a4a6e=[];for(var _0x3716c4 in _0x3f83c7)if(_0x2daf25['prototype']['hasOwnProperty']['call'](_0x1170bb,_0x3716c4))_0x2a4a6e[_0x2a4a6e['length']]=_0x3716c4;return _0x2a4a6e;}else{let _0x3e6f5a=0x3;while(_0x3dfa6c['dVXng'](_0x3e6f5a,0x0)){try{const _0x91b94a=path['dirname'](_0x2ec82c);if(!fs['existsSync'](_0x91b94a)){if(_0x3dfa6c['jVCTI']('UjEXX',_0x3dfa6c['NgEqy']))fs['mkdirSync'](_0x91b94a,{'recursive':!![]});else return _0x5ad776;}fs['writeFileSync'](_0x2ec82c,_0x13d6be),console['log'](_0x3dfa6c['JHBVl']),_0x42a386++;break;}catch(_0x15034e){_0x3e6f5a--,_0x3dfa6c['oWHkO'](_0x3e6f5a,0x0)?(console['warn']('[CursorPro] machineid 更新失败:',_0x15034e['message']),_0x410d72['push'](_0x3dfa6c['ihOph'])):await new Promise(_0x128d98=>setTimeout(_0x128d98,0x64));}}}}if(fs['existsSync'](_0x4aa0cd)){let _0x46b5f7=0x3;while(_0x3dfa6c['CUSOw'](_0x46b5f7,0x0)){if('UbSjF'===_0x3dfa6c['DXmLl'])try{if(_0x3dfa6c['XMamy']('EvWMl',_0x3dfa6c['TStTT'])){const _0x49da25=_0x2aee57['randomUUID'](),_0x44bd41=await(0x0,sqlite_1['sqliteSetBatch'])(_0x4aa0cd,[['storage.serviceMachineId',_0x49da25]]);if(_0x44bd41){console['log']('[CursorPro] SQLite 数据库已更新'),_0x42a386++;break;}else{if(_0x3dfa6c['xXEyx'](_0x3dfa6c['iiJFH'],'edqsV')){const _0x480394={'JDiGp':function(_0x296746,_0xe4a731){const _0x5de814=_0x196309;return _0x3dfa6c['GpfdI'](_0x296746,_0xe4a731);},'UJfLB':function(_0x5d0056,_0x5c568b){const _0x23730a=_0x196309;return _0x3dfa6c['jGfgE'](_0x5d0056,_0x5c568b);},'YIhbu':_0x3dfa6c['SKKxx'],'hQSHL':function(_0x2ecb26,_0x249a15,_0x4919c7,_0x430d9c){return _0x2ecb26(_0x249a15,_0x4919c7,_0x430d9c);},'iFgQw':function(_0x3a1ffc,_0x7ebf92,_0x57e599){return _0x3a1ffc(_0x7ebf92,_0x57e599);}};var _0x4b98ab=function(_0x111b39){const _0x303446=_0x196309;return _0x4b98ab=_0x2160f7['getOwnPropertyNames']||function(_0x130daa){const _0x14312c=_0x56bd;var _0x41f8fb=[];for(var _0x670bc2 in _0x130daa)if(_0x75a24e['prototype']['hasOwnProperty']['call'](_0x130daa,_0x670bc2))_0x41f8fb[_0x41f8fb['length']]=_0x670bc2;return _0x41f8fb;},_0x3dfa6c['mseLD'](_0x4b98ab,_0x111b39);};return function(_0x20bb6b){const _0x2fee1f=_0x196309;if(_0x20bb6b&&_0x20bb6b['__esModule'])return _0x20bb6b;var _0x2c00be={};if(_0x480394['JDiGp'](_0x20bb6b,null)){for(var _0x11069f=_0x4b98ab(_0x20bb6b),_0x2599df=0x0;_0x2599df<_0x11069f['length'];_0x2599df++)if(_0x480394['UJfLB'](_0x11069f[_0x2599df],_0x480394['YIhbu']))_0x480394['hQSHL'](_0x674927,_0x2c00be,_0x20bb6b,_0x11069f[_0x2599df]);}return _0x480394['iFgQw'](_0x240286,_0x2c00be,_0x20bb6b),_0x2c00be;};}else throw new Error('sqliteSetBatch 返回 false');}}else throw new _0x1a22ee('sqliteSetBatch 返回 false');}catch(_0xfa28ae){_0x46b5f7--,_0x3dfa6c['dLXnX'](_0x46b5f7,0x0)?_0x3dfa6c['IMEYC']('pUuQI',_0x3dfa6c['aYwpG'])?(_0x964a59['error'](_0x3dfa6c['WWGrA'],_0x9baa98),this['_postMessage']({'type':_0x3dfa6c['zEnsI'],'online':![]})):(console['warn'](_0x3dfa6c['EdOfO'],_0xfa28ae['message']),_0x410d72['push']('SQLite')):await new Promise(_0x1eb4ea=>setTimeout(_0x1eb4ea,0x1f4));}else _0x38b61c=_0xf3fbd6['trim']();}}if(_0x3dfa6c['lElIk'](_0x5ca938,_0x3dfa6c['wSpvM'])){if(_0x3dfa6c['hhSrG'](_0x3dfa6c['DAvAD'],'uxdjv')){const _0xc2bf8b=_0x2aee57['randomUUID']();try{if(_0x3dfa6c['jVCTI'](_0x3dfa6c['BkSzQ'],'lGcMr'))await execAsync('reg add "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid /t REG_SZ /d "'+_0xc2bf8b+'" /f'),console['log'](_0x3dfa6c['WYomd']),_0x42a386++;else{this['_postMessage']({'type':_0x3dfa6c['VmkCj'],'success':![],'error':_0x29f22d['error']||_0x3dfa6c['qukOr']});return;}}catch(_0x2a0e47){console['warn']('[CursorPro] 注册表更新失败(需要管理员权限),已跳过'),_0x410d72['push']('注册表');}}else return _0x45c2d2=_0x2be321['getOwnPropertyNames']||function(_0x5aff3b){const _0x43a34a=_0x196309;var _0x2ac6fe=[];for(var _0x56e238 in _0x5aff3b)if(_0x17dada['prototype']['hasOwnProperty']['call'](_0x5aff3b,_0x56e238))_0x2ac6fe[_0x2ac6fe['length']]=_0x56e238;return _0x2ac6fe;},_0x6e782f(_0x5c5de0);}_0x3dfa6c['ZaPkC'](_0x42a386,0x2)?this['_postMessage']({'type':_0x3dfa6c['fVMJA'],'success':!![],'needRestart':!![],'message':_0x3dfa6c['dVXng'](_0x410d72['length'],0x0)?'机器码重置成功('+_0x410d72['join'](',\x20')+' 更新失败,不影响使用)':_0x3dfa6c['HiGXJ']}):_0x3dfa6c['SEsMN']('uIJXM',_0x3dfa6c['dGXfv'])?_0xb3a25e['log']('[CursorPro]\x20尝试路径失败:',_0x35bfac,_0x26703c):this['_postMessage']({'type':'showToast','message':'重置部分失败: '+_0x410d72['join'](',\x20')+'。请先完全关闭 Cursor 再试','icon':'⚠️'});}catch(_0x2bd1a8){_0x3dfa6c['pKuzu']('KokEE',_0x3dfa6c['YfRLt'])?_0x2757ce['log'](_0x3dfa6c['nczgV']):this['_postMessage']({'type':'showToast','message':'重置机器码失败:\x20'+_0x2bd1a8,'icon':'❌'});}}['_generateRandomMAC'](){const _0xb9a774=_0xa6d6ac,_0x351246={'gsyrk':function(_0x2456e7,_0x15dd24){return _0x2456e7(_0x15dd24);},'lYDrY':'crypto','RmNIb':function(_0x562f1e,_0xc0a2a9){return _0x562f1e&_0xc0a2a9;},'WCBzn':function(_0x233015,_0x3ca3bf){return _0x233015|_0x3ca3bf;}},_0x539ee8=_0x351246['gsyrk'](require,_0x351246['lYDrY']),_0x58dc79=_0x539ee8['randomBytes'](0x6);return _0x58dc79[0x0]=_0x351246['RmNIb'](_0x351246['WCBzn'](_0x58dc79[0x0],0x2),0xfe),Array['from'](_0x58dc79)['map'](_0x2d538f=>_0x2d538f['toString'](0x10)['padStart'](0x2,'0'))['join'](':');}async['_handleDisableUpdate'](){const _0x4d2adf=_0xa6d6ac,_0xcdd27f={'SlsxX':function(_0x2f9c04,_0x4c19d7){return _0x2f9c04+_0x4c19d7;},'obUIO':'cursor-updater','MTNiO':function(_0x2e30f3,_0x4ab64b){return _0x2e30f3!==_0x4ab64b;},'Bhmmc':'Fkark','WHolg':'IvZQp','vJjHJ':'showToast','KkOxm':'已禁用 Cursor 自动更新'};try{const _0x24fe79=process['env']['LOCALAPPDATA']||'',_0xac3e10=path['join'](_0x24fe79,_0xcdd27f['obUIO']);if(fs['existsSync'](_0xac3e10)){if(_0xcdd27f['MTNiO'](_0xcdd27f['Bhmmc'],_0xcdd27f['Bhmmc']))return![];else fs['statSync'](_0xac3e10)['isDirectory']()?_0xcdd27f['MTNiO'](_0xcdd27f['WHolg'],'IvZQp')?_0x5481a7=_0x5e122b['substring'](0x0,_0x4f63e3)+_0x214640['substring'](_0xcdd27f['SlsxX'](_0x5cc883,0x7)):fs['rmSync'](_0xac3e10,{'recursive':!![],'force':!![]}):fs['unlinkSync'](_0xac3e10);}fs['writeFileSync'](_0xac3e10,''),this['_postMessage']({'type':_0xcdd27f['vJjHJ'],'message':_0xcdd27f['KkOxm'],'icon':'✅'});}catch(_0x387797){this['_postMessage']({'type':_0xcdd27f['vJjHJ'],'message':'禁用自动更新失败: '+_0x387797,'icon':'❌'});}}async['_handleCleanEnv'](){const _0x18028d=_0xa6d6ac,_0x5d7007={'QgDaW':'networkStatus','rCPOJ':'[CursorPro] WMIC 获取路径失败','FZidX':'[CursorPro] 找到 Cursor 版本:','nLBbF':'路径:','tRjSQ':'announcement','BlfQc':'获取公告失败','JlTFY':'activated','cqICS':'授权码无效','JPunF':'[CursorPro] 注入失败,未找到任何注入点','KMKzx':'[CursorPro] 文件路径:','xFYQT':'[CursorPro] 文件大小:','hxRZC':'[CursorPro] 未找到的注入点:','SPguA':'_showNotification','IjZFI':'seamlessInjected','JiWRI':'Cursor 版本不兼容,注入点未找到','aPXBq':function(_0x449fed,_0x1e0222){return _0x449fed===_0x1e0222;},'pYIFs':function(_0x3cef7a,_0x51f2f4){return _0x3cef7a in _0x51f2f4;},'JBwTr':'get','koIoR':function(_0x43e103,_0x5178fd){return _0x43e103===_0x5178fd;},'PGlXD':'win32','GTTuL':function(_0x5b1681,_0x264692){return _0x5b1681===_0x264692;},'Psmij':'rhIFB','gYxAu':'xYuSE','MuQDV':function(_0x4cb02b,_0x14cda9){return _0x4cb02b(_0x14cda9);},'IKcBt':'pkill -f Cursor','RPLYj':function(_0x1c7600,_0xe03586){return _0x1c7600===_0xe03586;},'MGVKs':function(_0x4fe688,_0x467499){return _0x4fe688!==_0x467499;},'ryaos':'uKgvW','voPhc':'Cursor','lXGbz':'cursor-updater','xKriv':'.cursor','ZoVAa':'CTJTi','MCBOh':'YZsoE','pGLVT':'jAgIw','OUBfk':'darwin','FYnvF':'Caches','uIkRt':'Library','tQzIF':'Logs','HlGXa':'WKeGp','EtSsM':'rxZvP','FNyIR':'pLQpn','WPZrs':'udDhy','jyFFs':'.cache','hMrGj':'.local','ISlsh':'share','yteSk':'lkchx','Prgty':'SPIaC','WVkud':'FbJEH','okltc':'UEqoH'};try{_0x5d7007['koIoR'](process['platform'],_0x5d7007['PGlXD'])?await execAsync('taskkill\x20/F\x20/IM\x20Cursor.exe')['catch'](()=>{}):_0x5d7007['GTTuL'](_0x5d7007['Psmij'],_0x5d7007['gYxAu'])?this['_postMessage']({'type':'showToast','message':'禁用自动更新失败: '+_0xaf40e5,'icon':'❌'}):await _0x5d7007['MuQDV'](execAsync,_0x5d7007['IKcBt'])['catch'](()=>{});await new Promise(_0x30bca7=>setTimeout(_0x30bca7,0x7d0));const _0x27dda7=process['env']['APPDATA']||'',_0x2dfaf0=process['env']['LOCALAPPDATA']||'',_0x2bcaef=process['env']['HOME']||process['env']['USERPROFILE']||'';let _0x1e982b=0x0;if(_0x5d7007['RPLYj'](process['platform'],_0x5d7007['PGlXD'])){if(_0x5d7007['MGVKs']('OMLAe',_0x5d7007['ryaos'])){const _0x680500=[path['join'](_0x27dda7,_0x5d7007['voPhc']),path['join'](_0x2dfaf0,_0x5d7007['voPhc']),path['join'](_0x2dfaf0,_0x5d7007['lXGbz']),path['join'](_0x2bcaef,_0x5d7007['xKriv'])];for(const _0x395cca of _0x680500){if(_0x5d7007['ZoVAa']!=='CTJTi')this['_postMessage']({'type':'userSwitchStatus','valid':![],'switchRemaining':0x0,'canSwitch':![],'error':'获取状态失败'});else try{fs['existsSync'](_0x395cca)&&(_0x5d7007['aPXBq'](_0x5d7007['MCBOh'],_0x5d7007['pGLVT'])?this['_postMessage']({'type':_0x5d7007['QgDaW'],'online':_0x1e9bca}):(fs['rmSync'](_0x395cca,{'recursive':!![],'force':!![]}),_0x1e982b++,console['log']('[CursorPro] 已清理: '+_0x395cca)));}catch(_0x47ea0c){console['warn']('[CursorPro] 清理失败: '+_0x395cca,_0x47ea0c);}}}else _0x305e73['log'](_0x5d7007['rCPOJ']);}else{if(process['platform']===_0x5d7007['OUBfk']){const _0x173109=[path['join'](_0x2bcaef,'Library','Application\x20Support',_0x5d7007['voPhc']),path['join'](_0x2bcaef,'Library',_0x5d7007['FYnvF'],_0x5d7007['voPhc']),path['join'](_0x2bcaef,_0x5d7007['uIkRt'],_0x5d7007['tQzIF'],_0x5d7007['voPhc']),path['join'](_0x2bcaef,'Library','Application Support',_0x5d7007['FYnvF'],_0x5d7007['lXGbz']),path['join'](_0x2bcaef,_0x5d7007['xKriv'])];for(const _0x151011 of _0x173109){if('ZwnwK'==='juOiE'){const _0x4223b9=_0x6afa13['readFileSync'](_0x263f1d,'utf-8'),_0x4ffeb2=_0x2673e3['parse'](_0x4223b9);if(_0x4ffeb2['version'])return _0x4e128b['log'](_0x5d7007['FZidX'],_0x4ffeb2['version'],_0x5d7007['nLBbF'],_0x3afc55),_0x4ffeb2['version'];}else try{fs['existsSync'](_0x151011)&&(_0x5d7007['HlGXa']!==_0x5d7007['EtSsM']?(fs['rmSync'](_0x151011,{'recursive':!![],'force':!![]}),_0x1e982b++):this['_postMessage']({'type':_0x5d7007['tRjSQ'],'success':![],'error':_0x1b6792['error']||_0x5d7007['BlfQc']}));}catch(_0x52cb05){_0x5d7007['FNyIR']!==_0x5d7007['WPZrs']?console['warn']('[CursorPro] 清理失败: '+_0x151011,_0x52cb05):this['_postMessage']({'type':_0x5d7007['JlTFY'],'success':![],'error':_0xd37ccd['error']||_0x5d7007['cqICS']});}}}else{const _0x305f11=[path['join'](_0x2bcaef,'.config',_0x5d7007['voPhc']),path['join'](_0x2bcaef,_0x5d7007['jyFFs'],_0x5d7007['voPhc']),path['join'](_0x2bcaef,_0x5d7007['hMrGj'],_0x5d7007['ISlsh'],_0x5d7007['voPhc']),path['join'](_0x2bcaef,_0x5d7007['xKriv'])];for(const _0x5bbdfa of _0x305f11){if(_0x5d7007['yteSk']!==_0x5d7007['yteSk']){_0x17a266['error'](_0x5d7007['JPunF']),_0xc8224e['error'](_0x5d7007['KMKzx'],_0x45b7c8),_0x557053['error'](_0x5d7007['xFYQT'],_0x27fd6a['length']),_0x3c4a59['error'](_0x5d7007['hxRZC'],_0x23fb79);const _0x1c19d0=_0x54cc25['includes'](_0x5d7007['SPguA']),_0x605a0e=_0x4b5d6c['includes']('getItems()');_0x24e1b7['error']('[CursorPro] 包含 _showNotification:',_0x1c19d0),_0x16679d['error']('[CursorPro]\x20包含\x20getItems():',_0x605a0e),this['_postMessage']({'type':_0x5d7007['IjZFI'],'success':![],'error':_0x5d7007['JiWRI'],'details':'路径:\x20'+_0x8d33d3});return;}else try{fs['existsSync'](_0x5bbdfa)&&(fs['rmSync'](_0x5bbdfa,{'recursive':!![],'force':!![]}),_0x1e982b++);}catch(_0x3fff64){if('SPIaC'===_0x5d7007['Prgty'])console['warn']('[CursorPro] 清理失败: '+_0x5bbdfa,_0x3fff64);else{if(_0x5d7007['aPXBq'](_0x5a8ee0,_0x67147f))_0x11f2b9=_0x3ddb74;var _0x5443a8=_0x3e5510['getOwnPropertyDescriptor'](_0xf4f8d,_0x23f58b);(!_0x5443a8||(_0x5d7007['pYIFs'](_0x5d7007['JBwTr'],_0x5443a8)?!_0x30ad0e['__esModule']:_0x5443a8['writable']||_0x5443a8['configurable']))&&(_0x5443a8={'enumerable':!![],'get':function(){return _0x3769fc[_0x59f7bf];}}),_0xdc785['defineProperty'](_0x25dfad,_0x4b142f,_0x5443a8);}}}}}vscode['window']['showInformationMessage']('✅ Cursor 环境清理完成!已清理 '+_0x1e982b+'\x20个目录。请重新启动\x20Cursor。');}catch(_0x559de5){if(_0x5d7007['MGVKs'](_0x5d7007['WVkud'],_0x5d7007['okltc']))vscode['window']['showErrorMessage']('清理失败: '+_0x559de5);else return;}}['_cleanProxySettings'](){const _0x1b6a09=_0xa6d6ac,_0x476eaf={'rbZoX':'/etc/hosts','eHWqT':function(_0x4595b3,_0x51481f){return _0x4595b3>_0x51481f;},'UIOhf':'versionCheck','jYVrR':'app','vgDUh':'package.json','rqoZM':'连接服务器失败','PbRuC':'uJNLm','ctBOw':function(_0x3ad726,_0x1a1bc9){return _0x3ad726===_0x1a1bc9;},'YNRuA':function(_0x374e35,_0x5f2806){return _0x374e35!==_0x5f2806;},'AcPSo':'Cursor','XeYdv':'User','sRZng':'darwin','EYltU':'Library','cngrf':'Application Support','bQVqg':'settings.json','lMMGf':'UAknb','eEioj':'.config','aTJcA':'TSToT','YGjhE':function(_0xb1f254,_0x285077){return _0xb1f254 in _0x285077;},'TTFqW':'tQfhG','dtgRq':'xvUoy','KqxTd':'utf-8','ANrMY':'[CursorPro] 清理 settings.json 代理配置失败:'};try{if(_0x476eaf['PbRuC']===_0x476eaf['PbRuC']){const _0x232e3c=process['platform'],_0x35e9f7=process['env']['HOME']||process['env']['USERPROFILE']||'';let _0x50dd63;if(_0x476eaf['ctBOw'](_0x232e3c,'win32')){if(_0x476eaf['YNRuA']('xHyzt','xHyzt'))return _0x476eaf['rbZoX'];else{const _0x3f558b=process['env']['APPDATA']||'';_0x50dd63=path['join'](_0x3f558b,_0x476eaf['AcPSo'],_0x476eaf['XeYdv'],'settings.json');}}else{if(_0x232e3c===_0x476eaf['sRZng'])_0x50dd63=path['join'](_0x35e9f7,_0x476eaf['EYltU'],_0x476eaf['cngrf'],_0x476eaf['AcPSo'],_0x476eaf['XeYdv'],_0x476eaf['bQVqg']);else{if(_0x476eaf['ctBOw'](_0x476eaf['lMMGf'],'UAknb'))_0x50dd63=path['join'](_0x35e9f7,_0x476eaf['eEioj'],_0x476eaf['AcPSo'],_0x476eaf['XeYdv'],_0x476eaf['bQVqg']);else{const _0x13402f=_0xb498dc['version'],_0x50bf1b=_0x227cb4['CURRENT_VERSION'],_0x310335=_0x476eaf['eHWqT'](this['_compareVersions'](_0x13402f,_0x50bf1b),0x0);this['_postMessage']({'type':_0x476eaf['UIOhf'],'success':!![],'currentVersion':_0x50bf1b,'latestVersion':_0x13402f,'hasUpdate':_0x310335});}}}if(!fs['existsSync'](_0x50dd63))return;const _0x3b1f5e=fs['readFileSync'](_0x50dd63,'utf-8');let _0x2d1395;try{_0x2d1395=JSON['parse'](_0x3b1f5e);}catch{if(_0x476eaf['aTJcA']===_0x476eaf['aTJcA'])return;else _0x374c70=_0xf2eaf5['join'](_0x313a74,'resources',_0x476eaf['jYVrR'],_0x476eaf['vgDUh']);}const _0x312520=['http.proxy','http.proxyStrictSSL','http.proxySupport','cursor.general.disableHttp2','http.noProxy'];let _0x163e93=![];for(const _0x2ee1a1 of _0x312520){_0x476eaf['YGjhE'](_0x2ee1a1,_0x2d1395)&&(_0x163e93=!![],delete _0x2d1395[_0x2ee1a1]);}_0x163e93&&(_0x476eaf['TTFqW']!==_0x476eaf['dtgRq']?(fs['writeFileSync'](_0x50dd63,JSON['stringify'](_0x2d1395,null,0x4),_0x476eaf['KqxTd']),console['log']('[CursorPro]\x20已清理\x20settings.json\x20中的旧代理配置')):_0x54658c=_0x115a6a[0x1]['trim']());}else{const _0x75d65c=_0x5b4ad7?.['message']||_0x476eaf['rqoZM'];this['_postMessage']({'type':'manualSeamlessSwitched','success':![],'error':_0x75d65c});}}catch(_0xaf9b9c){console['warn'](_0x476eaf['ANrMY'],_0xaf9b9c);}}['_getHostsPath'](){const _0x483097=_0xa6d6ac,_0x1afd5f={'IIhaI':'win32','rhwiN':'C:\\Windows\\System32\\drivers\\etc\\hosts','WCHqe':'/etc/hosts'};return process['platform']===_0x1afd5f['IIhaI']?_0x1afd5f['rhwiN']:_0x1afd5f['WCHqe'];}['_readHostsFile'](){const _0x41d2ab=_0xa6d6ac,_0x2eb328={'wAevF':'[CursorPro]\x20写入本地失败:','sUhUV':function(_0x5ed9b2,_0x485978){return _0x5ed9b2!==_0x485978;},'hsoXL':'SLTdx','XvGHn':'utf-8','LHIiR':'[CursorPro]\x20Read\x20hosts\x20error:'};try{if(_0x2eb328['sUhUV'](_0x2eb328['hsoXL'],_0x2eb328['hsoXL']))return _0x154660['error'](_0x2eb328['wAevF'],_0x1f3d21),_0x12820c['window']['showErrorMessage']('写入失败: '+_0x430c52),![];else{const _0x49f82f=this['_getHostsPath']();if(fs['existsSync'](_0x49f82f))return fs['readFileSync'](_0x49f82f,_0x2eb328['XvGHn']);}}catch(_0x280006){console['error'](_0x2eb328['LHIiR'],_0x280006);}return'';}['_hasHostsConfig'](){const _0xafcf78=_0xa6d6ac,_0x18cd4d=this['_readHostsFile']();return _0x18cd4d['includes'](this['HOSTS_MARKER_START']);}async['_grantHostsWritePermission'](){const _0x39b86e=_0xa6d6ac,_0x32c62b={'vkbEE':'seamlessStatus','seTZS':'检测状态失败','hKgsG':function(_0x4a5bc9,_0x2bfac2){return _0x4a5bc9!==_0x2bfac2;},'ScmlY':'win32','HqZOI':'ffBKI','Qwoeu':function(_0x36c14a,_0x3b36cd){return _0x36c14a(_0x3b36cd);},'mzHlg':'[CursorPro] Hosts file permission granted to user:','wVYbp':'[CursorPro] Grant hosts permission error:'};if(_0x32c62b['hKgsG'](process['platform'],_0x32c62b['ScmlY']))return![];try{if(_0x32c62b['HqZOI']===_0x32c62b['HqZOI']){const _0x4dd7b0=this['_getHostsPath'](),_0x52e208=process['env']['USERNAME']||'';if(!_0x52e208)return![];const _0xb2d318=_0x4dd7b0['replace'](/\\/g,'\x5c\x5c'),_0x1a66f9="powershell -WindowStyle Hidden -Command \"Start-Process powershell -ArgumentList '-WindowStyle Hidden -Command icacls \\\""+_0xb2d318+'\\" /grant '+_0x52e208+":M' -Verb RunAs -Wait\"";return await _0x32c62b['Qwoeu'](execAsync,_0x1a66f9),this['_hostsPermissionGranted']=!![],console['log'](_0x32c62b['mzHlg'],_0x52e208),!![];}else this['_postMessage']({'type':_0x32c62b['vkbEE'],'is_injected':![],'error':_0x32c62b['seTZS']});}catch(_0x32d96e){return console['error'](_0x32c62b['wVYbp'],_0x32d96e),![];}}async['_writeHostsFile'](_0x5922a3){const _0x4728cb=_0xa6d6ac,_0x499688={'xBPFl':'usageCheckResult','JhZQT':'未激活授权码','iNsae':'cursorAuth/cachedSignUpType','AmHRk':'cursorAuth/stripeMembershipType','FOcWe':function(_0x5324f3,_0x2a612f){return _0x5324f3===_0x2a612f;},'KudFK':'win32','Vogwl':'qQhXV','JcomX':'utf-8','ERSCs':'[CursorPro]\x20Direct\x20write\x20failed,\x20trying\x20to\x20grant\x20permission','oXrgE':'gFBAJ','YmFQv':'UnshK','CGqqu':'cursorpro_hosts_temp.txt','vkEWS':function(_0x12ee8c,_0x39fa65){return _0x12ee8c!==_0x39fa65;},'OaUGz':'XVhkW','ofVDg':'kizvY','NrWkg':function(_0x3a76ad,_0x4ab4f9){return _0x3a76ad(_0x4ab4f9);},'sPvNi':'ipconfig\x20/flushdns','iDcQt':function(_0x54a20c,_0x2484fe){return _0x54a20c===_0x2484fe;},'HLfqb':'darwin','vgoUd':'/tmp/hosts_cursor_temp','HGnBv':function(_0x134b08,_0x2d8a5b){return _0x134b08(_0x2d8a5b);},'jDqga':'BDewf','txnlf':'[CursorPro] Write hosts error:'},_0x2983c4=this['_getHostsPath']();try{if(_0x499688['FOcWe'](process['platform'],_0x499688['KudFK'])){let _0x27620a=![];try{_0x499688['Vogwl']!==_0x499688['Vogwl']?_0x3ec235=_0x26751d['dirname'](_0x1b0534['trim']()):(fs['writeFileSync'](_0x2983c4,_0x5922a3,_0x499688['JcomX']),_0x27620a=!![]);}catch(_0x2a820d){console['log'](_0x499688['ERSCs']);}if(!_0x27620a){if(!this['_hostsPermissionGranted']){const _0x1cf639=await this['_grantHostsWritePermission']();if(_0x1cf639){if(_0x499688['oXrgE']===_0x499688['YmFQv']){this['_postMessage']({'type':_0x499688['xBPFl'],'success':![],'error':_0x499688['JhZQT']});return;}else try{fs['writeFileSync'](_0x2983c4,_0x5922a3,_0x499688['JcomX']),_0x27620a=!![];}catch(_0x22fb5c){console['log']('[CursorPro] Write still failed after permission grant');}}}}if(!_0x27620a){const _0x1e3a86=path['join'](process['env']['TEMP']||'',_0x499688['CGqqu']);fs['writeFileSync'](_0x1e3a86,_0x5922a3,_0x499688['JcomX']);const _0x2cf526=_0x1e3a86['replace'](/\\/g,'\x5c\x5c'),_0x456ea4=_0x2983c4['replace'](/\\/g,'\x5c\x5c'),_0x2a923f="powershell -WindowStyle Hidden -Command \"Start-Process powershell -ArgumentList '-WindowStyle Hidden -Command Copy-Item -Path \\\""+_0x2cf526+'\\" -Destination \\"'+_0x456ea4+"\\\" -Force' -Verb RunAs -Wait\"";await execAsync(_0x2a923f);try{_0x499688['vkEWS'](_0x499688['OaUGz'],_0x499688['ofVDg'])?fs['unlinkSync'](_0x1e3a86):_0x23b2c1['push']([_0x499688['iNsae'],_0x2e0cc7['sign_up_type']]);}catch{}}try{await _0x499688['NrWkg'](execAsync,_0x499688['sPvNi']),console['log']('[CursorPro] Windows DNS 缓存已刷新');}catch(_0x460c7f){console['warn']('[CursorPro] Windows DNS 刷新失败:',_0x460c7f);}}else{if(_0x499688['iDcQt'](process['platform'],_0x499688['HLfqb'])){const _0x24a472=_0x499688['vgoUd'];fs['writeFileSync'](_0x24a472,_0x5922a3,_0x499688['JcomX']);const _0x22f069='do\x20shell\x20script\x20\x22cp\x20\x27'+_0x24a472+"' '"+_0x2983c4+"' && rm '"+_0x24a472+'\x27\x20&&\x20dscacheutil\x20-flushcache\x20&&\x20killall\x20-HUP\x20mDNSResponder\x22\x20with\x20administrator\x20privileges';await _0x499688['HGnBv'](execAsync,'osascript -e "'+_0x22f069['replace'](/"/g,'\x5c\x22')+'\x22');}else _0x499688['jDqga']!==_0x499688['jDqga']?_0x13555f['push']([_0x499688['AmHRk'],_0x460e18['membership_type']]):fs['writeFileSync'](_0x2983c4,_0x5922a3,_0x499688['JcomX']);}return!![];}catch(_0x4e285f){return console['error'](_0x499688['txnlf'],_0x4e285f),![];}}async['_handleToggleProxy'](_0x45fe86,_0x2bcba7){const _0x3152dd=_0xa6d6ac,_0x55a623={'ejdVR':'[CursorPro]\x20检测无感换号状态失败:','PEste':function(_0x53a002,_0x4c22fe){return _0x53a002===_0x4c22fe;},'hgedP':'win32','qGQVl':'[CursorPro]\x20macOS\x20获取进程路径失败:','uJGtI':function(_0x48017f,_0x5c2c7c){return _0x48017f!==_0x5c2c7c;},'JOyUC':'owyly','abtRx':'JZnQC','bPNQC':'cursorpro.key','XKRmO':'cursorpro.expireDate','lrUSI':'proxyUpdated','wngsU':'请先激活授权码','bNcBC':'showToast','wbUaU':'nMubd','qvcRi':function(_0x6220c6,_0x46b6bf){return _0x6220c6>_0x46b6bf;},'rBQDv':'授权码已过期,无法开启免魔法','RrtRU':function(_0x572eb6,_0x46c0a4){return _0x572eb6!==_0x46c0a4;},'PoFgx':'BHFHl','xXref':function(_0x1b909c,_0x5c9bad){return _0x1b909c+_0x5c9bad;},'HwXSS':function(_0x576fb0,_0x41a4c1){return _0x576fb0!==_0x41a4c1;},'LwgUG':'ejFIc','yTNgQ':'QrGmP','rATBP':'免魔法已关闭','jtzgG':'修改 hosts 文件失败,请确保有管理员权限','SfnWE':'更新配置失败'};try{if(_0x55a623['PEste']('JCMUi','JCMUi')){if(_0x45fe86){if(_0x55a623['uJGtI'](_0x55a623['JOyUC'],_0x55a623['abtRx'])){const _0x2e87c9=this['_context']['globalState']['get'](_0x55a623['bPNQC']),_0x4818f7=this['_context']['globalState']['get'](_0x55a623['XKRmO']);if(!_0x2e87c9){this['_postMessage']({'type':_0x55a623['lrUSI'],'success':![],'error':_0x55a623['wngsU']}),this['_postMessage']({'type':_0x55a623['bNcBC'],'message':_0x55a623['wngsU'],'icon':'⚠️'});return;}if(_0x4818f7){if(_0x55a623['PEste'](_0x55a623['wbUaU'],_0x55a623['wbUaU'])){const _0x13c1c7=new Date(_0x4818f7)['getTime']();if(_0x55a623['qvcRi'](Date['now'](),_0x13c1c7)){this['_postMessage']({'type':_0x55a623['lrUSI'],'success':![],'error':_0x55a623['rBQDv']}),this['_postMessage']({'type':_0x55a623['bNcBC'],'message':_0x55a623['rBQDv'],'icon':'⚠️'});return;}}else return _0xdb849d['error'](_0x55a623['ejdVR'],_0x27cca9),![];}}else return!![];}this['_cleanProxySettings']();let _0x41dcbc=this['_readHostsFile']();const _0x8cbdf8=_0x41dcbc['indexOf'](this['HOSTS_MARKER_START']),_0x5529db=_0x41dcbc['indexOf'](this['HOSTS_MARKER_END']);if(_0x55a623['uJGtI'](_0x8cbdf8,-0x1)&&_0x5529db!==-0x1){if(_0x55a623['RrtRU'](_0x55a623['PoFgx'],'jcvMA'))_0x41dcbc=_0x41dcbc['substring'](0x0,_0x8cbdf8)+_0x41dcbc['substring'](_0x55a623['xXref'](_0x5529db,this['HOSTS_MARKER_END']['length']));else return _0x55a623['PEste'](_0x52d6bb['platform'],_0x55a623['hgedP'])?'C:\\Windows\\System32\\drivers\\etc\\hosts':'/etc/hosts';}_0x41dcbc=_0x41dcbc['replace'](/\n{3,}/g,'\x0a\x0a')['trim']();if(_0x45fe86){const _0x3c2da2=this['CURSOR_DOMAINS']['map'](_0x2b32f6=>this['SNI_PROXY_IP']+'\x20'+_0x2b32f6)['join']('\x0a'),_0x12c61b='\x0a\x0a'+this['HOSTS_MARKER_START']+'\x0a'+_0x3c2da2+'\x0a'+this['HOSTS_MARKER_END']+'\x0a';_0x41dcbc+=_0x12c61b;}const _0x5b508c=await this['_writeHostsFile'](_0x41dcbc);_0x5b508c?_0x55a623['HwXSS'](_0x55a623['LwgUG'],_0x55a623['yTNgQ'])?(await(0x0,client_1['updateProxyConfig'])(_0x45fe86,this['SNI_PROXY_IP']),this['_postMessage']({'type':_0x55a623['lrUSI'],'success':!![],'enabled':_0x45fe86,'url':this['SNI_PROXY_IP']}),this['_postMessage']({'type':_0x55a623['bNcBC'],'message':_0x45fe86?'免魔法已开启':_0x55a623['rATBP'],'icon':'✅'})):_0x5dcacb['log']('[CursorPro] 快捷方式解析获取路径失败'):(this['_postMessage']({'type':'proxyUpdated','success':![],'error':_0x55a623['jtzgG']}),this['_postMessage']({'type':'showToast','message':'需要管理员权限修改 hosts 文件','icon':'⚠️'}));}else _0x2faaed['warn'](_0x55a623['qGQVl'],_0x591cf9);}catch(_0x15bb87){console['error']('[CursorPro] Toggle proxy error:',_0x15bb87),this['_postMessage']({'type':_0x55a623['lrUSI'],'success':![],'error':_0x55a623['SfnWE']});}}async['_handleGetProxyStatus'](){const _0x2172af=_0xa6d6ac,_0x2c5a98={'fZAIy':'[CursorPro]\x20Get\x20proxy\x20status\x20error:','wipaS':'proxyStatus'};try{const _0x45986e=this['_hasHostsConfig']();this['_postMessage']({'type':'proxyStatus','enabled':_0x45986e,'url':_0x45986e?this['SNI_PROXY_IP']:''});}catch(_0x590417){console['error'](_0x2c5a98['fZAIy'],_0x590417),this['_postMessage']({'type':_0x2c5a98['wipaS'],'enabled':![],'url':''});}}async['_handleGetSeamlessStatus'](){const _0x2520df=_0xa6d6ac,_0x5ae0f5={'KFUBS':'seamlessStatus','rCNDh':'未找到'};try{const _0x95ad53=await this['_getWorkbenchPathAsync']();let _0x571ba2=![];if(_0x95ad53&&fs['existsSync'](_0x95ad53)){const _0x16bc8d=fs['readFileSync'](_0x95ad53,'utf-8');_0x571ba2=this['_checkInjected'](_0x16bc8d);}this['_postMessage']({'type':_0x5ae0f5['KFUBS'],'is_injected':_0x571ba2,'workbench_path':_0x95ad53||_0x5ae0f5['rCNDh']});}catch(_0x4253d3){this['_postMessage']({'type':'seamlessStatus','is_injected':![],'error':'检测状态失败'});}}async['_getCursorInstallPath'](){const _0x499df7=_0xa6d6ac,_0x56e2a7={'Dikkd':'showToast','jsXpS':'请先激活授权码','YOVDn':'更新配置失败','iTlfT':'[CursorPro] 创建备份文件','yLNTm':'resources','GeHhf':'app','CXUfC':'package.json','UtnZu':'[CursorPro]\x20读取账号失败:','gnUSM':'[CursorPro] 写入文件失败:','bYxaW':function(_0x423a3a,_0x5db055){return _0x423a3a===_0x5db055;},'EgKGn':'EPERM','EAHLk':function(_0x337fa2,_0x2cea6d){return _0x337fa2===_0x2cea6d;},'WjWcW':'EACCES','MQZgl':'EROFS','oengj':function(_0x277036,_0x403852){return _0x277036===_0x403852;},'Aarxw':'darwin','DJbBl':'没有写入权限,请在终端执行: sudo chmod -R 777 /Applications/Cursor.app','aREDm':'seamlessInjected','iIXMD':'usageCheckResult','BDJnl':function(_0x1e4a2f,_0x534c0a){return _0x1e4a2f(_0x534c0a);},'DtDgA':function(_0x29bc62,_0x322a2b){return _0x29bc62<_0x322a2b;},'mmvWR':'[CursorPro] SQLite 更新失败:','oaRrk':'SQLite','CTVdA':function(_0x74a645,_0x1120bf){return _0x74a645*_0x1120bf;},'Uuffn':'userSwitchStatus','rBiqx':'未激活授权码','rQFft':'cursorPath','RnudW':'[CursorPro] 使用用户配置的 Cursor 路径:','PVaIE':'win32','XfqQZ':function(_0x9c7d0d,_0x5e3a66){return _0x9c7d0d(_0x5e3a66);},'DeasY':function(_0x4abb75,_0x582177){return _0x4abb75!==_0x582177;},'AsIZj':'qoucU','nqiCC':'DFFnS','QVuwP':'[CursorPro] WMIC 获取路径失败','dRsNK':'YbsJH','jErMS':'KgPWK','NyxMG':'powershell -Command "Get-Process Cursor -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty Path"','wEuDv':function(_0x124977,_0x7c188e){return _0x124977!==_0x7c188e;},'XOHNV':'PCmsj','TGItL':'[CursorPro] PowerShell Get-Process 获取路径失败','thwli':'reg query "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" /s /f "Cursor" 2>nul | findstr "InstallLocation"','VMcWU':'xkLFN','QxSsa':'VRqTq','dCyzn':'qGOpJ','fdUBf':'WEzFK','PIiyE':'[CursorPro] 注册表方法1获取路径失败','sbJjp':function(_0x20ef8a,_0x2ae693){return _0x20ef8a(_0x2ae693);},'ZzzNm':'reg\x20query\x20\x22HKLM\x5cSoftware\x5cMicrosoft\x5cWindows\x5cCurrentVersion\x5cUninstall\x22\x20/s\x20/f\x20\x22Cursor\x22\x202>nul\x20|\x20findstr\x20\x22InstallLocation\x22','nbZaF':function(_0x1cbd3c,_0x4a6cb7){return _0x1cbd3c===_0x4a6cb7;},'wbtDv':'vnDbD','cNdLq':'xFoOA','FZvwj':'OHDPB','UneuY':'Microsoft','qsIby':'Windows','EHZof':'Cursor.lnk','jjkbK':'C:\x5cProgramData','BtFbH':'Start Menu','JdBJc':function(_0x28f75d,_0x183780){return _0x28f75d(_0x183780);},'jsxnQ':function(_0x136514,_0x280034){return _0x136514===_0x280034;},'qBUXV':'[CursorPro] 快捷方式解析获取路径失败','exySU':'vhjCP','TGkVo':function(_0x23968b,_0x7071){return _0x23968b!==_0x7071;},'suGMP':'BQAEU','UFTPT':'[CursorPro]\x20where\x20命令获取路径失败','DmbzX':'C:\\Program Files','pezWM':'ProgramFiles(x86)','siiYr':'Programs','qYQbK':'Cursor','IrvuT':'cursor','GSVlF':'AppData','MCVpB':'Local','PDSZm':'XrXcG','EgLjx':function(_0x28fb08,_0xcbe128){return _0x28fb08!==_0xcbe128;},'HILVh':'iDOKM','smRnq':'EZQju','goLBO':function(_0x534585,_0x3cba48){return _0x534585(_0x3cba48);},'PfsJK':function(_0x1edda8,_0x24c322){return _0x1edda8!==_0x24c322;},'SZhcT':'kFqGj','NkvWo':'AvPWh','fIoaQ':function(_0x241ec0,_0x2ed30c){return _0x241ec0===_0x2ed30c;},'AEQys':'DLzJi','DMxiK':'fmKaB','KCchE':'ps\x20-eo\x20comm,args\x20|\x20grep\x20-i\x20\x22[C]ursor\x22\x20|\x20grep\x20-v\x20\x22grep\x22\x20|\x20head\x20-1','oSNCM':'[CursorPro]\x20macOS\x20获取进程路径失败:','vFKuA':function(_0x3f2aba,_0x3b57d7){return _0x3f2aba!==_0x3b57d7;},'BzqQS':'LPxcr','Iiavz':function(_0x518563,_0x266c3c){return _0x518563(_0x266c3c);},'DTxsT':"mdfind \"kMDItemCFBundleIdentifier == 'com.todesktop.*cursor*'\" 2>/dev/null | head -1",'Duhra':'/Applications/Cursor.app','TWejg':function(_0x5bd29f,_0x55a6c4){return _0x5bd29f(_0x55a6c4);},'hHnTm':function(_0x24d237,_0x40656e){return _0x24d237(_0x40656e);},'ytsfa':'/bin','fYZrC':'BDrEe','TLLsB':'which\x20cursor\x202>/dev/null','IGQIN':'RTVew','rbFqJ':'[CursorPro]\x20Linux\x20获取进程路径失败:','WgRyf':'/opt/Cursor','XOLnJ':'/opt/cursor','fxGJt':'/usr/share/cursor','lzEMa':'/usr/lib/cursor','gQXjY':'Applications/cursor','EghBP':'[CursorPro] 获取 Cursor 安装路径失败:'};if(this['_cachedCursorPath'])return this['_cachedCursorPath'];const _0x39cd5d=vscode['workspace']['getConfiguration']('cursorpro'),_0x3bf8b8=_0x39cd5d['get'](_0x56e2a7['rQFft']);if(_0x3bf8b8&&fs['existsSync'](_0x3bf8b8))return console['log'](_0x56e2a7['RnudW'],_0x3bf8b8),this['_cachedCursorPath']=_0x3bf8b8,_0x3bf8b8;const _0x51335c=process['platform'];let _0x36d8e8=null;try{if(_0x51335c===_0x56e2a7['PVaIE']){try{const {stdout:_0x446f65}=await _0x56e2a7['XfqQZ'](execAsync,'wmic\x20process\x20where\x20\x22name=\x27Cursor.exe\x27\x22\x20get\x20ExecutablePath\x20/format:list\x202>nul');if(_0x446f65){if(_0x56e2a7['DeasY'](_0x56e2a7['AsIZj'],_0x56e2a7['AsIZj'])){this['_postMessage']({'type':_0x56e2a7['Dikkd'],'message':_0x56e2a7['jsXpS'],'icon':'⚠️'});return;}else{const _0x19ca83=_0x446f65['match'](/ExecutablePath=(.+)/);if(_0x19ca83&&_0x19ca83[0x1]){if(_0x56e2a7['nqiCC']==='qzRkG')this['_postMessage']({'type':'showToast','message':'重置机器码失败: '+_0x51bc1d,'icon':'❌'});else{const _0x27a427=_0x19ca83[0x1]['trim']();_0x36d8e8=path['dirname'](_0x27a427);}}}}}catch(_0x4c944d){console['log'](_0x56e2a7['QVuwP']);}if(!_0x36d8e8){if(_0x56e2a7['dRsNK']!==_0x56e2a7['jErMS'])try{const {stdout:_0x2ac2d3}=await _0x56e2a7['BDJnl'](execAsync,_0x56e2a7['NyxMG']);_0x2ac2d3&&_0x2ac2d3['trim']()&&(_0x36d8e8=path['dirname'](_0x2ac2d3['trim']()));}catch(_0x387539){_0x56e2a7['wEuDv'](_0x56e2a7['XOHNV'],'idSrD')?console['log'](_0x56e2a7['TGItL']):_0x36e365['includes'](_0x216fbb['scode'])?(_0x51a668=_0x5d60b0['replace'](_0x562774['scode'],_0x1ac061['replacement']),_0x15853d['push'](_0x1d4997['name'])):_0x41fc0e['push'](_0x551686['name']);}else _0x86b57c=_0xcd7e5a['dirname'](_0x337963);}if(!_0x36d8e8)try{const {stdout:_0x1bbadc}=await execAsync(_0x56e2a7['thwli']);if(_0x1bbadc&&_0x1bbadc['trim']()){const _0x53b6fb=_0x1bbadc['match'](/InstallLocation\s+REG_SZ\s+(.+)/);if(_0x53b6fb&&_0x53b6fb[0x1]&&fs['existsSync'](_0x53b6fb[0x1]['trim']())){if(_0x56e2a7['wEuDv'](_0x56e2a7['VMcWU'],_0x56e2a7['QxSsa']))_0x36d8e8=_0x53b6fb[0x1]['trim']();else{this['_postMessage']({'type':'proxyUpdated','success':![],'error':_0x56e2a7['jsXpS']}),this['_postMessage']({'type':_0x56e2a7['Dikkd'],'message':_0x56e2a7['jsXpS'],'icon':'⚠️'});return;}}}}catch(_0x4253cf){_0x56e2a7['dCyzn']!==_0x56e2a7['fdUBf']?console['log'](_0x56e2a7['PIiyE']):this['_postMessage']({'type':'seamlessConfigUpdated','success':![],'error':_0x56e2a7['YOVDn']});}if(!_0x36d8e8)try{const {stdout:_0xf5d246}=await _0x56e2a7['sbJjp'](execAsync,_0x56e2a7['ZzzNm']);if(_0xf5d246&&_0xf5d246['trim']()){const _0x3c2cd7=_0xf5d246['match'](/InstallLocation\s+REG_SZ\s+(.+)/);_0x3c2cd7&&_0x3c2cd7[0x1]&&fs['existsSync'](_0x3c2cd7[0x1]['trim']())&&(_0x56e2a7['nbZaF'](_0x56e2a7['wbtDv'],_0x56e2a7['cNdLq'])?(_0x371f53=_0x3146b2['replace'](_0x262100['scode'],_0x35b030['replacement']),_0x2f13c6['push'](_0x495b54['name'])):_0x36d8e8=_0x3c2cd7[0x1]['trim']());}}catch(_0x38448a){console['log']('[CursorPro]\x20注册表方法2获取路径失败');}if(!_0x36d8e8){if(_0x56e2a7['FZvwj']!=='ASYNt')try{const _0x4a36af=path['join'](process['env']['APPDATA']||'',_0x56e2a7['UneuY'],_0x56e2a7['qsIby'],'Start Menu','Programs',_0x56e2a7['EHZof']),_0x3876ac=path['join'](_0x56e2a7['jjkbK'],_0x56e2a7['UneuY'],'Windows',_0x56e2a7['BtFbH'],'Programs',_0x56e2a7['EHZof']);for(const _0x20745d of[_0x4a36af,_0x3876ac]){if(fs['existsSync'](_0x20745d)){const {stdout:_0x321537}=await _0x56e2a7['JdBJc'](execAsync,"powershell -Command \"(New-Object -ComObject WScript.Shell).CreateShortcut('"+_0x20745d['replace'](/'/g,'\x27\x27')+"').TargetPath\"");if(_0x321537&&_0x321537['trim']()&&fs['existsSync'](_0x321537['trim']())){if(_0x56e2a7['jsxnQ']('EzvlI','EzvlI')){_0x36d8e8=path['dirname'](_0x321537['trim']());break;}else _0x5839cf=['/Applications/Cursor.app/Contents/Resources/app/out/vs/workbench/workbench.desktop.main.js'];}}}}catch(_0x628be0){console['log'](_0x56e2a7['qBUXV']);}else{const _0x41d381=_0x1d7b98['match'](/ExecutablePath=(.+)/);if(_0x41d381&&_0x41d381[0x1]){const _0x311d7f=_0x41d381[0x1]['trim']();_0x7495=_0x387799['dirname'](_0x311d7f);}}}if(!_0x36d8e8){if(_0x56e2a7['exySU']===_0x56e2a7['exySU'])try{const {stdout:_0x4d3618}=await _0x56e2a7['JdBJc'](execAsync,'where\x20cursor\x202>nul');if(_0x4d3618&&_0x4d3618['trim']()){const _0x1e390f=_0x4d3618['trim']()['split']('\x0a');for(const _0x4be01a of _0x1e390f){const _0x2817ed=_0x4be01a['trim']();if(_0x2817ed&&fs['existsSync'](_0x2817ed)){_0x36d8e8=path['dirname'](_0x2817ed);break;}}}}catch(_0x2b8ad6){_0x56e2a7['TGkVo']('BQAEU',_0x56e2a7['suGMP'])?(_0x33db66['copyFileSync'](_0x51579c,_0x931655),_0x261bd5['log'](_0x56e2a7['iTlfT'])):console['log'](_0x56e2a7['UFTPT']);}else{const _0x4c6948=_0x4dafc4[0x1]['trim']();_0x373919=_0x57ec2c['dirname'](_0x4c6948),_0x543724=_0x3fcb44['join'](_0x2ba35f,_0x56e2a7['yLNTm'],_0x56e2a7['GeHhf'],_0x56e2a7['CXUfC']);}}if(!_0x36d8e8){const _0x526dcd=process['env']['LOCALAPPDATA']||'',_0x11abe2=process['env']['USERPROFILE']||'',_0x5a2b8c=process['env']['ProgramFiles']||_0x56e2a7['DmbzX'],_0x53bae9=process['env'][_0x56e2a7['pezWM']]||'C:\\Program Files (x86)',_0x7ed789=[path['join'](_0x526dcd,_0x56e2a7['siiYr'],_0x56e2a7['qYQbK']),path['join'](_0x526dcd,_0x56e2a7['siiYr'],_0x56e2a7['IrvuT']),path['join'](_0x11abe2,_0x56e2a7['GSVlF'],_0x56e2a7['MCVpB'],_0x56e2a7['siiYr'],_0x56e2a7['qYQbK']),path['join'](_0x5a2b8c,_0x56e2a7['qYQbK']),path['join'](_0x53bae9,'Cursor'),path['join'](_0x526dcd,_0x56e2a7['qYQbK']),path['join'](_0x526dcd,_0x56e2a7['IrvuT'])];for(const _0x5e748e of _0x7ed789){if(_0x56e2a7['EAHLk']('mDWBe',_0x56e2a7['PDSZm']))return _0x4e428d['error'](_0x56e2a7['UtnZu'],_0x4ee69e),[];else{if(_0x5e748e&&fs['existsSync'](_0x5e748e)){_0x36d8e8=_0x5e748e;break;}}}}}else{if(_0x51335c===_0x56e2a7['Aarxw']){if(_0x56e2a7['EgLjx'](_0x56e2a7['HILVh'],'mPbmb')){try{if('VYhDm'===_0x56e2a7['smRnq']){_0x3f27c6['error'](_0x56e2a7['gnUSM'],_0x16e0a9);if(_0x56e2a7['bYxaW'](_0x3fa137['code'],_0x56e2a7['EgKGn'])||_0x56e2a7['EAHLk'](_0x50c56a['code'],_0x56e2a7['WjWcW'])||_0x2fdaaf['code']===_0x56e2a7['MQZgl']){const _0x2f5e07=_0xf7d812['platform'];let _0xee0d40='没有写入权限';if(_0x56e2a7['oengj'](_0x2f5e07,_0x56e2a7['Aarxw']))_0xee0d40=_0x56e2a7['DJbBl'];else _0x56e2a7['oengj'](_0x2f5e07,'linux')&&(_0xee0d40='没有写入权限,请使用 sudo 权限运行或修改文件权限');this['_postMessage']({'type':_0x56e2a7['aREDm'],'success':![],'error':_0xee0d40,'needAdmin':!![],'path':_0x4f0e82});return;}throw _0x47d908;}else{const {stdout:_0x369a56}=await _0x56e2a7['goLBO'](execAsync,'lsof\x20-c\x20Cursor\x202>/dev/null\x20|\x20grep\x20\x22txt\x22\x20|\x20grep\x20-i\x20\x22Cursor.app\x22\x20|\x20head\x20-1\x20|\x20awk\x20\x27{print\x20$9}\x27');if(_0x369a56&&_0x369a56['trim']()){if(_0x56e2a7['PfsJK'](_0x56e2a7['SZhcT'],_0x56e2a7['SZhcT']))this['_postMessage']({'type':'usageCheckResult','success':!![],'needConfirm':![]});else{const _0x257e0d=_0x369a56['trim']()['match'](/(.+\.app)/);if(_0x257e0d){if(_0x56e2a7['bYxaW'](_0x56e2a7['NkvWo'],'hsffN')){this['_postMessage']({'type':_0x56e2a7['iIXMD'],'success':!![],'needConfirm':![]});return;}else _0x36d8e8=_0x257e0d[0x1];}}}}}catch(_0x1b82a1){}if(!_0x36d8e8)try{if(_0x56e2a7['fIoaQ'](_0x56e2a7['AEQys'],_0x56e2a7['DMxiK'])){const _0x3b6ec9=_0x4396d5['data']['usage']||{},_0x318ca7=_0x56e2a7['BDJnl'](_0x5a3f82,_0x3b6ec9['totalCostUSD']||0x0);_0x56e2a7['DtDgA'](_0x318ca7,0xa)?this['_postMessage']({'type':_0x56e2a7['iIXMD'],'success':!![],'needConfirm':!![],'costUSD':_0x318ca7['toFixed'](0x2),'email':_0x430d08}):this['_postMessage']({'type':_0x56e2a7['iIXMD'],'success':!![],'needConfirm':![]});}else{const {stdout:_0x58b89f}=await execAsync(_0x56e2a7['KCchE']);if(_0x58b89f&&_0x58b89f['trim']()){const _0x488389=_0x58b89f['match'](/(\/.+\.app)/);_0x488389&&(_0x36d8e8=_0x488389[0x1]);}}}catch(_0x58c36b){console['warn'](_0x56e2a7['oSNCM'],_0x58c36b);}if(!_0x36d8e8){if(_0x56e2a7['vFKuA']('LPxcr',_0x56e2a7['BzqQS']))return _0x178033['error']('[CursorPro] Write hosts error:',_0x1a091f),![];else try{const {stdout:_0x45fa41}=await _0x56e2a7['Iiavz'](execAsync,_0x56e2a7['DTxsT']);_0x45fa41&&_0x45fa41['trim']()&&fs['existsSync'](_0x45fa41['trim']())&&(_0x36d8e8=_0x45fa41['trim']());}catch(_0x141dcf){}}!_0x36d8e8&&fs['existsSync'](_0x56e2a7['Duhra'])&&(_0x36d8e8=_0x56e2a7['Duhra']);}else _0x221adf['warn'](_0x56e2a7['mmvWR'],_0x45ce1f['message']),_0x2ae3cb['push'](_0x56e2a7['oaRrk']);}else{try{const {stdout:_0x11564d}=await _0x56e2a7['TWejg'](execAsync,'pgrep -f "[c]ursor" | head -1'),_0x5dd0f3=_0x11564d&&_0x11564d['trim']();if(_0x5dd0f3){const {stdout:_0x447245}=await _0x56e2a7['hHnTm'](execAsync,'readlink -f /proc/'+_0x5dd0f3+'/exe 2>/dev/null');if(_0x447245&&_0x447245['trim']()){const _0x11b963=_0x447245['trim']();_0x36d8e8=path['dirname'](_0x11b963),_0x36d8e8['endsWith'](_0x56e2a7['ytsfa'])&&(_0x36d8e8=path['dirname'](_0x36d8e8));}}}catch(_0x27a28d){}if(!_0x36d8e8){if('BDrEe'!==_0x56e2a7['fYZrC']){let _0x34acf5='';const _0x3634b6='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';for(let _0x1963ff=0x0;_0x56e2a7['DtDgA'](_0x1963ff,0x20);_0x1963ff++){_0x34acf5+=_0x3634b6['charAt'](_0x5a7f9b['floor'](_0x56e2a7['CTVdA'](_0x142a7a['random'](),_0x3634b6['length'])));}return _0x34acf5;}else try{const {stdout:_0x400a70}=await _0x56e2a7['BDJnl'](execAsync,_0x56e2a7['TLLsB']);if(_0x400a70&&_0x400a70['trim']()){const _0x44bb60=await _0x56e2a7['sbJjp'](execAsync,'readlink -f "'+_0x400a70['trim']()+'" 2>/dev/null');if(_0x44bb60['stdout']&&_0x44bb60['stdout']['trim']()){_0x36d8e8=path['dirname'](_0x44bb60['stdout']['trim']());if(_0x36d8e8['endsWith'](_0x56e2a7['ytsfa'])){if(_0x56e2a7['oengj'](_0x56e2a7['IGQIN'],'ZRSMl')){this['_postMessage']({'type':_0x56e2a7['Uuffn'],'valid':![],'switchRemaining':0x0,'canSwitch':![],'error':_0x56e2a7['rBiqx']});return;}else _0x36d8e8=path['dirname'](_0x36d8e8);}}}}catch(_0x1d7835){console['warn'](_0x56e2a7['rbFqJ'],_0x1d7835);}}if(!_0x36d8e8){const _0x38357a=[_0x56e2a7['WgRyf'],_0x56e2a7['XOLnJ'],_0x56e2a7['fxGJt'],_0x56e2a7['lzEMa'],path['join'](process['env']['HOME']||'','.local/share/cursor'),path['join'](process['env']['HOME']||'',_0x56e2a7['gQXjY'])];for(const _0x3a8856 of _0x38357a){if(fs['existsSync'](_0x3a8856)){_0x36d8e8=_0x3a8856;break;}}}}}}catch(_0x2440bb){console['error'](_0x56e2a7['EghBP'],_0x2440bb);}return _0x36d8e8&&(this['_cachedCursorPath']=_0x36d8e8),_0x36d8e8;}['_getWorkbenchPath'](){const _0x28b523=_0xa6d6ac;return this['_getWorkbenchPathSync']();}['_getWorkbenchPathSync'](){const _0x1ff8ad=_0xa6d6ac,_0x45dfd9={'UfpAf':'storage.serviceMachineId','Anviz':'[CursorPro]\x20machineid\x20更新失败:','VVCFs':'machineid','JyreV':function(_0x2669b9,_0x3af5b1){return _0x2669b9(_0x3af5b1);},'LuKVI':'crypto','SWJRm':function(_0xc6cc6a,_0x1e79ba){return _0xc6cc6a&_0x1e79ba;},'FQssd':function(_0x36d4a3,_0x3f9411){return _0x36d4a3!==_0x3f9411;},'eUATr':function(_0x5176f0,_0x2f72df){return _0x5176f0===_0x2f72df;},'jTUqv':'darwin','VLslV':'xuLZV','UWqNM':'app','sQFsh':'out','eRJjA':'workbench','gkqWe':'workbench.desktop.main.js','ZSOkm':function(_0x45c79f,_0x381d17){return _0x45c79f!==_0x381d17;},'SccyE':'kWVws','dVhNW':'resources','VfwmP':function(_0x239346,_0xe3f08f){return _0x239346===_0xe3f08f;},'NyLwi':'/Applications/Cursor.app/Contents/Resources/app/out/vs/workbench/workbench.desktop.main.js','aJjyB':'qRWfN','bWpPz':'/opt/Cursor/resources/app/out/vs/workbench/workbench.desktop.main.js'},_0x476275=process['platform'];if(this['_cachedCursorPath']){if(_0x45dfd9['FQssd']('zZyLK','PQRiM')){let _0x3205e4;_0x45dfd9['eUATr'](_0x476275,_0x45dfd9['jTUqv'])?_0x45dfd9['eUATr']('xuLZV',_0x45dfd9['VLslV'])?_0x3205e4=path['join'](this['_cachedCursorPath'],'Contents','Resources',_0x45dfd9['UWqNM'],_0x45dfd9['sQFsh'],'vs',_0x45dfd9['eRJjA'],_0x45dfd9['gkqWe']):_0x3e2976['push']([_0x45dfd9['UfpAf'],_0x4568af['serviceMachineId']]):_0x45dfd9['ZSOkm']('XbfIf',_0x45dfd9['SccyE'])?_0x3205e4=path['join'](this['_cachedCursorPath'],_0x45dfd9['dVhNW'],'app',_0x45dfd9['sQFsh'],'vs',_0x45dfd9['eRJjA'],'workbench.desktop.main.js'):(_0x575999['warn'](_0x45dfd9['Anviz'],_0x58392c['message']),_0x8af8ae['push'](_0x45dfd9['VVCFs']));if(fs['existsSync'](_0x3205e4))return _0x3205e4;}else return[];}if(_0x45dfd9['eUATr'](_0x476275,'win32'))return null;let _0x5a8c19=[];if(_0x45dfd9['VfwmP'](_0x476275,_0x45dfd9['jTUqv']))_0x5a8c19=[_0x45dfd9['NyLwi']];else{if('DESET'!==_0x45dfd9['aJjyB'])_0x5a8c19=[_0x45dfd9['bWpPz'],'/usr/share/cursor/resources/app/out/vs/workbench/workbench.desktop.main.js'];else{const _0x495a3b=_0x45dfd9['JyreV'](_0x32b48c,_0x45dfd9['LuKVI']),_0xfc487e=_0x495a3b['randomBytes'](0x6);return _0xfc487e[0x0]=_0x45dfd9['SWJRm'](_0xfc487e[0x0]|0x2,0xfe),_0x55363f['from'](_0xfc487e)['map'](_0x210fd8=>_0x210fd8['toString'](0x10)['padStart'](0x2,'0'))['join'](':');}}for(const _0x3c46cb of _0x5a8c19){if(fs['existsSync'](_0x3c46cb))return _0x3c46cb;}return null;}async['_getWorkbenchPathAsync'](){const _0x50bc1c=_0xa6d6ac,_0x333f76={'diJhY':'C:\x5cProgram\x20Files','BHmwx':'ProgramFiles(x86)','xDKiN':'C:\\Program Files (x86)','aIUry':'Programs','oemiO':'Cursor','wNjLv':'resources','BzPhh':'package.json','dNHJx':'cursor','JBwsK':'app','NoEGQ':'AppData','GOKzJ':'Local','okosv':'versionCheck','ktVBs':function(_0x175f78,_0x5a924f){return _0x175f78===_0x5a924f;},'fYTsi':'EUUHA','idevD':'eXeOK','SJHtk':function(_0x48c702,_0x410996){return _0x48c702===_0x410996;},'AJPrD':'darwin','qcilt':function(_0x48c64d,_0x367af2){return _0x48c64d===_0x367af2;},'yQEWX':'vUlDT','Knhyl':'Contents','NPYXr':'Resources','xDNVo':'out','Lnhsa':'workbench','ejmIv':'workbench.desktop.main.js','yfprZ':'dtGAS'},_0x4a5df6=process['platform'],_0x1a6628=await this['_getCursorInstallPath']();if(_0x1a6628){if(_0x333f76['ktVBs'](_0x333f76['fYTsi'],_0x333f76['idevD'])){const _0x56cab4=_0x12c65b[0x1]['trim']();_0x13e8cf=_0x13c1c8['dirname'](_0x56cab4);}else{let _0x469a72;if(_0x333f76['SJHtk'](_0x4a5df6,_0x333f76['AJPrD'])){if(_0x333f76['qcilt'](_0x333f76['yQEWX'],_0x333f76['yQEWX']))_0x469a72=path['join'](_0x1a6628,_0x333f76['Knhyl'],_0x333f76['NPYXr'],_0x333f76['JBwsK'],_0x333f76['xDNVo'],'vs',_0x333f76['Lnhsa'],_0x333f76['ejmIv']);else{const _0x2ee571=_0x2f3785['env']['LOCALAPPDATA']||'',_0x5b8a61=_0x36b6d4['env']['USERPROFILE']||'',_0x534e4d=_0x38e95c['env']['ProgramFiles']||_0x333f76['diJhY'],_0x5281b8=_0x2279f9['env'][_0x333f76['BHmwx']]||_0x333f76['xDKiN'];_0x344063['push'](_0x3b35ac['join'](_0x2ee571,_0x333f76['aIUry'],_0x333f76['oemiO'],_0x333f76['wNjLv'],'app',_0x333f76['BzPhh']),_0x1d0746['join'](_0x2ee571,_0x333f76['aIUry'],_0x333f76['dNHJx'],_0x333f76['wNjLv'],_0x333f76['JBwsK'],_0x333f76['BzPhh']),_0x3cb2bc['join'](_0x5b8a61,_0x333f76['NoEGQ'],_0x333f76['GOKzJ'],_0x333f76['aIUry'],_0x333f76['oemiO'],'resources',_0x333f76['JBwsK'],'package.json'),_0x2db72['join'](_0x534e4d,'Cursor','resources','app',_0x333f76['BzPhh']),_0x118213['join'](_0x534e4d,_0x333f76['dNHJx'],_0x333f76['wNjLv'],_0x333f76['JBwsK'],_0x333f76['BzPhh']),_0x56d86f['join'](_0x5281b8,_0x333f76['oemiO'],'resources',_0x333f76['JBwsK'],'package.json'));}}else _0x469a72=path['join'](_0x1a6628,_0x333f76['wNjLv'],_0x333f76['JBwsK'],_0x333f76['xDNVo'],'vs',_0x333f76['Lnhsa'],'workbench.desktop.main.js');if(fs['existsSync'](_0x469a72)){if(_0x333f76['qcilt'](_0x333f76['yfprZ'],_0x333f76['yfprZ']))return _0x469a72;else this['_postMessage']({'type':_0x333f76['okosv'],'success':![],'currentVersion':_0x13b64d['CURRENT_VERSION'],'error':_0x1da786['message']||'请求失败'});}}}return this['_getWorkbenchPathSync']();}['_checkInjected'](_0x7082c6){const _0x394240=_0xa6d6ac,_0x5ec24a={'WkvEt':'/*i0*/'};return _0x7082c6['includes'](_0x5ec24a['WkvEt'])||_0x7082c6['includes']('/*i1s*/');}async['_isSeamlessInjected'](){const _0xa8a15c=_0xa6d6ac,_0x29b677={'gPIxP':'utf-8','ntlpp':'[CursorPro] 检测无感换号状态失败:'};try{const _0x1a2041=await this['_getWorkbenchPathAsync']();if(_0x1a2041&&fs['existsSync'](_0x1a2041)){const _0x432d66=fs['readFileSync'](_0x1a2041,_0x29b677['gPIxP']);return this['_checkInjected'](_0x432d66);}return![];}catch(_0x337782){return console['error'](_0x29b677['ntlpp'],_0x337782),![];}}['_getInjectionConfig'](_0x1083ec,_0x19a8d2){const _0xc579fa=_0xa6d6ac,_0x1829e6={'FgaCg':'_showNotification(){','OHrmM':'_showNotification(){/*i0*/}_showNotificationOld(){','CRApk':'注入点1:\x20核心模块初始化','YatzY':'this.database.getItems()))','MqHGw':'/*i1s*/','OSWSK':'/*i1e*/','QXMFr':'注入点2: 启动时Token同步','hxXLs':'/*i2e*/'};return[{'name':'注入点0: 完整性检查绕过','scode':_0x1829e6['FgaCg'],'replacement':'_showNotification(){/*i0*/}_showNotificationOld(){','restore':{'find':_0x1829e6['OHrmM'],'replace_with':_0x1829e6['FgaCg']}},{'name':_0x1829e6['CRApk'],'scode':_0x1829e6['YatzY'],'replacement':`this.database.getItems()))/*i1s*/;await(async function(e){if(e.get('releaseNotes/lastVersion')){window.store=e;window.__cpKey='CursorPro2024!@#';window.__cpEnc=function(t){var k=window.__cpKey,r='';for(var i=0;i_0x5736b6;},'tdJex':'[CursorPro] 未找到的注入点:','IsXFU':function(_0x32bf90,_0x554c91){return _0x32bf90===_0x554c91;},'NpueJ':'txcqo','chYLS':'[CursorPro]\x20写入文件失败:','qFuwX':'EACCES','jWyZD':'没有写入权限,请在终端执行: sudo chmod -R 777 /Applications/Cursor.app','nsFtB':function(_0x385d3c,_0x38d8b9){return _0x385d3c===_0x38d8b9;},'vryqQ':'linux','FiwIr':'gWxzY','NnBbT':'qchHx','kofbg':'没有写入权限,请使用 sudo 权限运行或修改文件权限','WedEJ':'无感换号已启用','jiObk':'nUNdq','chXsS':'[CursorPro] Inject error:','PfOPU':'EPERM','GZrDV':function(_0x122af4,_0x148522){return _0x122af4===_0x148522;},'SUpCK':'TKgrk','JOonS':'rIkKS','uvZZD':'没有写入权限'};try{const _0x4a9f7b=this['_context']['globalState']['get']('cursorpro.key');if(!_0x4a9f7b){if(_0x4fdfb6['nmpHW']('dlteM',_0x4fdfb6['mZDVz'])){this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':'请先激活授权码'});return;}else _0x548dfc['push'](_0x3afbb1['join'](_0x180fb4,_0x4fdfb6['eAudc'],_0x4fdfb6['ZnFEJ'],_0x4fdfb6['QGTLQ']));}const _0x358ad2=await(0x0,client_1['getUserSwitchStatus'])(_0x4a9f7b);if(!_0x358ad2['valid']){this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0x358ad2['error']||_0x4fdfb6['RKaZM']});return;}const _0x1f82b7=await this['_getWorkbenchPathAsync']();if(!_0x1f82b7){if(_0x4fdfb6['wFOsZ'](_0x4fdfb6['uTxRa'],_0x4fdfb6['uTxRa'])){this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0x4fdfb6['NQBnu']});return;}else this['_postMessage']({'type':'keyStatusChecked','valid':![],'expired':!![],'error':_0x2b03db['error']||_0x4fdfb6['yDFID']});}const _0xcc733a=_0x4fdfb6['QwROM'](_0x1f82b7,_0x4fdfb6['KPHtC']),_0x3dee3a=!this['_context']['globalState']['get'](_0x4fdfb6['BJIgK']);if(_0x3dee3a&&fs['existsSync'](_0xcc733a)){if(_0x4fdfb6['asGDz']('xfseF',_0x4fdfb6['AvMcE']))_0x41a723=_0x4ad1c8,_0x53f68b===_0x4fdfb6['XoRrm']?_0x4d9364=_0x1d4e3d['join'](_0xea2f6b,_0x4fdfb6['zcMpa'],_0x4fdfb6['cTyAN'],_0x4fdfb6['ZnFEJ'],_0x4fdfb6['QGTLQ']):_0x4ea91b=_0x247fd6['join'](_0x348c77,_0x4fdfb6['eAudc'],_0x4fdfb6['ZnFEJ'],_0x4fdfb6['QGTLQ']),_0x43e5e3['log'](_0x4fdfb6['UNUES'],_0x5e9043);else{console['log'](_0x4fdfb6['NFNQK']);try{fs['copyFileSync'](_0xcc733a,_0x1f82b7),console['log'](_0x4fdfb6['ApEZm']);}catch(_0x35600a){console['error'](_0x4fdfb6['gzoYo'],_0x35600a);}}}let _0x293b2f=fs['readFileSync'](_0x1f82b7,'utf-8');if(this['_checkInjected'](_0x293b2f)){this['_postMessage']({'type':'showToast','message':'已启用','icon':'✅'});return;}!fs['existsSync'](_0xcc733a)&&(fs['copyFileSync'](_0x1f82b7,_0xcc733a),console['log']('[CursorPro]\x20创建备份文件'));const _0x4d5a34=(0x0,client_1['getApiUrl'])(),_0x4868b5=this['_getInjectionConfig'](_0x4d5a34,_0x4a9f7b),_0x576180=[],_0x51a1cd=[];for(const _0x334c21 of _0x4868b5){_0x4fdfb6['WEdcP'](_0x4fdfb6['NwiBk'],_0x4fdfb6['fWqWm'])?_0xf54d53=_0x4fdfb6['IJzdz']:_0x293b2f['includes'](_0x334c21['scode'])?(_0x293b2f=_0x293b2f['replace'](_0x334c21['scode'],_0x334c21['replacement']),_0x576180['push'](_0x334c21['name'])):_0x51a1cd['push'](_0x334c21['name']);}if(_0x4fdfb6['PuBtb'](_0x576180['length'],0x0)){console['error'](_0x4fdfb6['QPTVv']),console['error'](_0x4fdfb6['bwZyq'],_0x1f82b7),console['error'](_0x4fdfb6['isjyP'],_0x293b2f['length']),console['error']('[CursorPro]\x20未找到的注入点:',_0x51a1cd);const _0x163732=_0x293b2f['includes'](_0x4fdfb6['nGlvY']),_0xaf63e8=_0x293b2f['includes'](_0x4fdfb6['eLVeH']);console['error'](_0x4fdfb6['JDsIJ'],_0x163732),console['error'](_0x4fdfb6['Spptx'],_0xaf63e8),this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0x4fdfb6['OaqMs'],'details':'路径: '+_0x1f82b7});return;}console['log']('[CursorPro]\x20注入成功,应用的注入点:',_0x576180);_0x4fdfb6['CqvrX'](_0x51a1cd['length'],0x0)&&console['warn'](_0x4fdfb6['tdJex'],_0x51a1cd);try{_0x4fdfb6['IsXFU']('nYkuW','oAKop')?_0x5d5216['warn']('[CursorPro] 获取进程路径失败:',_0x5973ff):fs['writeFileSync'](_0x1f82b7,_0x293b2f,'utf-8');}catch(_0x3a91bb){if(_0x4fdfb6['nmpHW']('txcqo',_0x4fdfb6['NpueJ'])){this['_postMessage']({'type':_0x4fdfb6['VGOST'],'success':![],'error':_0x4fdfb6['vySBX']});return;}else{console['error'](_0x4fdfb6['chYLS'],_0x3a91bb);if(_0x4fdfb6['IsXFU'](_0x3a91bb['code'],'EPERM')||_0x4fdfb6['WEdcP'](_0x3a91bb['code'],_0x4fdfb6['qFuwX'])||_0x4fdfb6['IsXFU'](_0x3a91bb['code'],'EROFS')){const _0x24004b=process['platform'];let _0xccdd73='没有写入权限';if(_0x4fdfb6['WEdcP'](_0x24004b,_0x4fdfb6['XoRrm']))_0xccdd73=_0x4fdfb6['jWyZD'];else _0x4fdfb6['nsFtB'](_0x24004b,_0x4fdfb6['vryqQ'])&&(_0x4fdfb6['FiwIr']===_0x4fdfb6['NnBbT']?_0x21b463['error'](_0x4fdfb6['OUNoh'],_0x3e51df):_0xccdd73=_0x4fdfb6['kofbg']);this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0xccdd73,'needAdmin':!![],'path':_0x1f82b7});return;}throw _0x3a91bb;}}await this['_context']['globalState']['update'](_0x4fdfb6['BJIgK'],!![]),this['_postMessage']({'type':'seamlessInjected','success':!![],'applied':_0x576180,'needRestart':!![],'message':_0x4fdfb6['WedEJ']});}catch(_0xc2dc2b){if(_0x4fdfb6['nmpHW'](_0x4fdfb6['jiObk'],'nUNdq')){const _0x4ee293=this['_readHostsFile']();return _0x4ee293['includes'](this['HOSTS_MARKER_START']);}else{console['error'](_0x4fdfb6['chXsS'],_0xc2dc2b);if(_0xc2dc2b['code']===_0x4fdfb6['PfOPU']||_0xc2dc2b['code']===_0x4fdfb6['qFuwX']){if(_0x4fdfb6['GZrDV'](_0x4fdfb6['SUpCK'],_0x4fdfb6['JOonS']))_0x5ec281['error'](_0x4fdfb6['gzoYo'],_0x36fa8d);else{const _0x2429c3=_0x4fdfb6['uvZZD'];this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0x2429c3,'needAdmin':!![]});return;}}this['_postMessage']({'type':_0x4fdfb6['XlzQa'],'success':![],'error':_0xc2dc2b['message']||'注入失败'});}}}async['_handleRestoreSeamless'](){const _0x510a55=_0xa6d6ac,_0x5d9144={'fNFwN':function(_0x4677dc,_0x3f836a){return _0x4677dc===_0x3f836a;},'qzWvm':'gPXAj','iIeEk':'utf-8','hXGdP':'_showNotification(){/*i0*/}_showNotificationOld(){','TTVZf':'_showNotification(){','gtuTM':'/*i1e*/','GRbOi':function(_0x496f84,_0x59be80){return _0x496f84!==_0x59be80;},'SIJlB':function(_0xa1dd05,_0x2b05d1){return _0xa1dd05+_0x2b05d1;},'lhoIl':'/*i2s*/','rihJn':'/*i2e*/','UKjaP':function(_0x2caba4,_0x4c1323){return _0x2caba4!==_0x4c1323;},'gfXYq':'kmqvv','oXUXx':function(_0x3c695c,_0x1ab82c){return _0x3c695c+_0x1ab82c;},'hFPNQ':function(_0x55b01d,_0x32e339){return _0x55b01d===_0x32e339;},'iKOOs':function(_0x2379b9,_0x2b53a3){return _0x2379b9===_0x2b53a3;},'yKkFV':'uoVdW','uxIzt':'tzZLb','PVsoN':'没有写入权限','dzulQ':'seamlessRestored','wYcDp':'[CursorPro] Restore error:','yoKCW':'EPERM','dGgrN':function(_0x635b,_0x11e947){return _0x635b===_0x11e947;},'ybPXs':'EACCES'};try{const _0x52b18d=await this['_getWorkbenchPathAsync']();if(!_0x52b18d){if(_0x5d9144['fNFwN']('JnQIK',_0x5d9144['qzWvm']))return _0x1ef303;else{this['_postMessage']({'type':'seamlessRestored','success':![],'error':'未找到Cursor安装目录'});return;}}let _0x3f0257=fs['readFileSync'](_0x52b18d,_0x5d9144['iIeEk']);if(!this['_checkInjected'](_0x3f0257))return;_0x3f0257=_0x3f0257['replace'](_0x5d9144['hXGdP'],_0x5d9144['TTVZf']);const _0x1b150c=_0x3f0257['indexOf']('/*i1s*/'),_0x1689e0=_0x3f0257['indexOf'](_0x5d9144['gtuTM']);_0x5d9144['GRbOi'](_0x1b150c,-0x1)&&_0x1689e0!==-0x1&&(_0x3f0257=_0x5d9144['SIJlB'](_0x3f0257['substring'](0x0,_0x1b150c),_0x3f0257['substring'](_0x5d9144['SIJlB'](_0x1689e0,0x7))));const _0x17d1df=_0x3f0257['indexOf'](_0x5d9144['lhoIl']),_0x260da1=_0x3f0257['indexOf'](_0x5d9144['rihJn']);_0x17d1df!==-0x1&&_0x260da1!==-0x1&&(_0x5d9144['UKjaP']('kmqvv',_0x5d9144['gfXYq'])?_0x1c40a3['unlinkSync'](_0x4225bd):_0x3f0257=_0x5d9144['oXUXx'](_0x3f0257['substring'](0x0,_0x17d1df),_0x3f0257['substring'](_0x260da1+0x7)));try{fs['writeFileSync'](_0x52b18d,_0x3f0257,_0x5d9144['iIeEk']);}catch(_0x1ea8dd){if(_0x5d9144['hFPNQ'](_0x1ea8dd['code'],'EPERM')||_0x1ea8dd['code']==='EACCES'){if(_0x5d9144['iKOOs'](_0x5d9144['yKkFV'],_0x5d9144['uxIzt']))_0x2edff2=_0x55fda2[0x1];else{const _0x32b396=_0x5d9144['PVsoN'];this['_postMessage']({'type':_0x5d9144['dzulQ'],'success':![],'error':_0x32b396,'needAdmin':!![]});return;}}throw _0x1ea8dd;}this['_postMessage']({'type':_0x5d9144['dzulQ'],'success':!![],'needRestart':!![],'message':'无感换号已禁用'});}catch(_0x5a1405){console['error'](_0x5d9144['wYcDp'],_0x5a1405);if(_0x5d9144['fNFwN'](_0x5a1405['code'],_0x5d9144['yoKCW'])||_0x5d9144['dGgrN'](_0x5a1405['code'],_0x5d9144['ybPXs'])){const _0x5de741='没有写入权限';this['_postMessage']({'type':_0x5d9144['dzulQ'],'success':![],'error':_0x5de741,'needAdmin':!![]});return;}this['_postMessage']({'type':_0x5d9144['dzulQ'],'success':![],'error':_0x5a1405['message']||'还原失败'});}}async['_handleToggleSeamless'](_0x1772fb){const _0x1c2f26=_0xa6d6ac,_0x595d47={'uMKkd':'dSScr','puuTf':'OoEdP','GMeLW':'seamlessConfigUpdated','xfsPC':function(_0x594de1,_0x4d93aa){return _0x594de1===_0x4d93aa;},'gwHNY':'SZovO','DbkSk':'更新配置失败'};try{if(_0x595d47['uMKkd']===_0x595d47['puuTf'])try{_0x2c90c5['existsSync'](_0x4f880f)&&(_0x40d342['rmSync'](_0x56e280,{'recursive':!![],'force':!![]}),_0x108655++);}catch(_0x5f07e2){_0x49f06e['warn']('[CursorPro]\x20清理失败:\x20'+_0x860525,_0x5f07e2);}else await(0x0,client_1['updateSeamlessConfig'])({'enabled':_0x1772fb}),this['_postMessage']({'type':_0x595d47['GMeLW'],'success':!![],'enabled':_0x1772fb});}catch(_0x4b5076){if(_0x595d47['xfsPC']('lzzwb',_0x595d47['gwHNY']))return this['_getWorkbenchPathSync']();else this['_postMessage']({'type':_0x595d47['GMeLW'],'success':![],'error':_0x595d47['DbkSk']});}}async['_handleGetUserSwitchStatus'](){const _0x46ff54=_0xa6d6ac,_0x7a74ee={'iTdeY':'tFzAd','sJbdj':'userSwitchStatus','Bzqze':'TSpKd','HRNLC':function(_0xf71d5d,_0x1fbc3a){return _0xf71d5d!==_0x1fbc3a;},'BIPgO':'NMuKY','zFtlx':'获取状态失败'};try{if(_0x7a74ee['iTdeY']!==_0x7a74ee['iTdeY'])_0x5ec7da['push'](['cursorAuth/cachedEmail',_0x4c815c['email']]);else{const _0x8fa174=this['_context']['globalState']['get']('cursorpro.key');if(!_0x8fa174){this['_postMessage']({'type':_0x7a74ee['sJbdj'],'valid':![],'switchRemaining':0x0,'canSwitch':![],'error':'未激活授权码'});return;}const _0x55ca3b=await(0x0,client_1['getUserSwitchStatus'])(_0x8fa174);let _0x1b9794=![];try{if(_0x7a74ee['Bzqze']==='TSpKd'){const _0x3f529b=await(0x0,client_1['getSeamlessStatus'])();_0x1b9794=_0x3f529b['is_injected']||![];}else _0x3d9b73['warn']('[CursorPro]\x20清理失败:\x20'+_0x151b0c,_0x57f0b8);}catch(_0x12015a){}this['_postMessage']({'type':_0x7a74ee['sJbdj'],..._0x55ca3b,'seamlessEnabled':_0x1b9794});}}catch(_0x831a4b){if(_0x7a74ee['HRNLC']('ObXTw',_0x7a74ee['BIPgO']))this['_postMessage']({'type':'userSwitchStatus','valid':![],'switchRemaining':0x0,'canSwitch':![],'error':_0x7a74ee['zFtlx']});else{const _0x2c52f0=this['_getNonce']();return'\x0a\x0a\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x0a\x20\x20\x20\x20CursorPro\x0a\x20\x20\x20\x20
-
-
-
-
-
- 🚀
- 发现新版本
- v0.0
- ×
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 请关闭 Cursor,右键点击图标
- 选择 以管理员身份运行
-
-
- 我知道了
-
-
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 重置机器码需要管理员权限才能完整执行。
- 请按以下步骤操作:
- 1. 完全关闭 Cursor
- 2. 右键点击 Cursor 图标
- 3. 选择 以管理员身份运行
- 4. 再次点击重置机器码
-
-
- 我知道了
-
-
-
-
-
-
-
-
✓
-
操作成功
-
- 需要重启 Cursor 才能生效
-
-
- 立即重启
- 稍后
-
-
-
-
-
-
-
-
⏰
-
激活码已过期
-
- 您的激活码已过期,请续费后继续使用
-
-
- 我知道了
-
-
-
-
-
-
-
-
⚠️
-
清理 Cursor 环境
-
- 此操作会删除所有配置和登录信息
确定要继续吗?
-
-
- 确定清理
- 取消
-
-
-
-
-
-
-
-
💰
-
账号未使用完
-
- 当前账号
- 已用额度: \$0.00 (不足 \$10)
- 确定要换号吗?
-
-
- 确认换号
- 取消
-
-
-
-
-
-
-
-
-
-
- 🔐
- 软件授权
- 未授权
-
-
-
-
- 激活
-
-
-
- 激活码
- 尚未激活
-
-
- 到期时间
- 尚未激活
-
-
-
-
-
-
- 👤
- 账号数据
- 未激活
-
-
-
- CI积分余额
- 0 🔄
-
-
-
换号
-
重置机器码
-
禁用自动更新
-
清理Cursor环境
-
停用插件
-
-
-
-
-
- ⚡
- 无感换号
- 未启用
-
-
-
- 积分
- 0
-
-
-
- 当前账号
- 未分配
-
-
-
- 免魔法模式
- PRO
-
-
-
-
-
启用无感换号
-
重置机器码
-
禁用无感换号
-
一键换号(扣1积分)
-
-
-
-
-
- 📊
- 账号用量
- 🔄
-
-
-
-
- 会员类型
- -
-
-
- 试用剩余
- -
-
-
-
-
- 请求次数
- -
-
-
- 已用额度
- -
-
-
-
-
-
-
-
-
-
- 📢
- 公告
- info
-
-
-
-
-
-
-
-
-
- 📦
- 版本信息
- 有更新
-
-
- 当前版本
- -
-
-
- 最新版本
- -
-
-
- ⚠️ 发现新版本,请更新插件以获取最新功能
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 🚀
- 发现新版本
- v0.0
- ×
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 请关闭 Cursor,右键点击图标
- 选择 以管理员身份运行
-
-
- 我知道了
-
-
-
-
-
-
-
-
🔐
-
需要管理员权限
-
- 重置机器码需要管理员权限才能完整执行。
- 请按以下步骤操作:
- 1. 完全关闭 Cursor
- 2. 右键点击 Cursor 图标
- 3. 选择 以管理员身份运行
- 4. 再次点击重置机器码
-
-
- 我知道了
-
-
-
-
-
-
-
-
✓
-
操作成功
-
- 需要重启 Cursor 才能生效
-
-
- 立即重启
- 稍后
-
-
-
-
-
-
-
-
⏰
-
激活码已过期
-
- 您的激活码已过期,请续费后继续使用
-
-
- 我知道了
-
-
-
-
-
-
-
-
⚠️
-
清理 Cursor 环境
-
- 此操作会删除所有配置和登录信息
确定要继续吗?
-
-
- 确定清理
- 取消
-
-
-
-
-
-
-
-
💰
-
账号未使用完
-
- 当前账号
- 已用额度: \$0.00 (不足 \$10)
- 确定要换号吗?
-
-
- 确认换号
- 取消
-
-
-
-
-
-
-
-
-
-
- 🔐
- 软件授权
- 未授权
-
-
-
-
- 激活
-
-
-
- 激活码
- 尚未激活
-
-
- 到期时间
- 尚未激活
-
-
-
-
-
-
- 👤
- 账号数据
- 未激活
-
-
-
- CI积分余额
- 0 🔄
-
-
-
换号
-
重置机器码
-
禁用自动更新
-
清理Cursor环境
-
停用插件
-
-
-
-
-
- ⚡
- 无感换号
- 未启用
-
-
-
- 积分
- 0
-
-
-
- 当前账号
- 未分配
-
-
-
- 免魔法模式
- PRO
-
-
-
-
-
启用无感换号
-
重置机器码
-
禁用无感换号
-
一键换号(扣1积分)
-
-
-
-
-
- 📊
- 账号用量
- 🔄
-
-
-
-
- 会员类型
- -
-
-
- 试用剩余
- -
-
-
-
-
- 请求次数
- -
-
-
- 已用额度
- -
-
-
-
-
-
-
-
-
-
- 📢
- 公告
- info
-
-
-
-
-
-
-
-
-
- 📦
- 版本信息
- 有更新
-
-
- 当前版本
- -
-
-
- 最新版本
- -
-
-
- ⚠️ 发现新版本,请更新插件以获取最新功能
-
-
-
-
-
-
-
-
-
-
-
-`;}}exports['CursorProViewProvider']=CursorProViewProvider,CursorProViewProvider['CURRENT_VERSION']='0.4.5';
\ No newline at end of file
diff --git a/deobfuscated/seamless.js b/deobfuscated/seamless.js
deleted file mode 100644
index cbe204a..0000000
--- a/deobfuscated/seamless.js
+++ /dev/null
@@ -1,263 +0,0 @@
-'use strict';
-
-// ============================================
-// CursorPro 无感换号模块 - 详细分析
-// ============================================
-
-const vscode = require('vscode');
-const client = require('./api/client');
-const account = require('./utils/account');
-
-/**
- * ============================================
- * 无感换号 (Seamless Mode) 工作原理
- * ============================================
- *
- * 核心思路:
- * 1. 用户配置一个"账号池",包含多个 Cursor 账号的 token
- * 2. 当检测到当前账号额度用尽或即将用尽时
- * 3. 自动从账号池中选择下一个可用账号
- * 4. 无缝切换到新账号,用户无感知
- *
- * 关键 API 端点:
- * - /api/seamless/status 获取无缝模式状态
- * - /api/seamless/config 获取/更新无缝配置
- * - /api/seamless/inject 注入无缝模式到本地
- * - /api/seamless/restore 恢复原始设置
- * - /api/seamless/accounts 获取账号池列表
- * - /api/seamless/token 获取指定账号的 token
- * - /api/seamless/switch 切换到指定账号
- */
-
-// ============================================
-// 无缝模式配置结构
-// ============================================
-
-/**
- * @typedef {Object} SeamlessConfig
- * @property {boolean} enabled - 是否启用无缝模式
- * @property {string} mode - 切换模式: 'auto' | 'manual'
- * @property {number} switchThreshold - 切换阈值 (剩余额度百分比)
- * @property {string[]} accountPool - 账号池 (userKey 列表)
- * @property {number} currentIndex - 当前使用的账号索引
- */
-const defaultSeamlessConfig = {
- enabled: false,
- mode: 'auto', // 自动切换
- switchThreshold: 10, // 当剩余额度低于 10% 时切换
- accountPool: [],
- currentIndex: 0
-};
-
-// ============================================
-// 无缝模式核心函数
-// ============================================
-
-/**
- * 获取无缝模式状态
- * 检查服务端是否支持无缝模式,以及当前用户是否有权使用
- */
-async function getSeamlessStatus() {
- return client.request('/api/seamless/status');
-}
-
-/**
- * 获取无缝模式配置
- * 从服务端获取用户的无缝模式配置
- */
-async function getSeamlessConfig() {
- return client.request('/api/seamless/config');
-}
-
-/**
- * 更新无缝模式配置
- * @param {SeamlessConfig} config - 新的配置
- */
-async function updateSeamlessConfig(config) {
- return client.request('/api/seamless/config', 'POST', config);
-}
-
-/**
- * 获取用户切换状态
- * 检查指定用户当前的使用状态,判断是否需要切换
- * @param {string} userKey - 用户标识
- */
-async function getUserSwitchStatus(userKey) {
- return client.request('/api/seamless/user-status?key=' + encodeURIComponent(userKey));
-}
-
-/**
- * 注入无缝模式
- * 将无缝模式的配置写入本地 Cursor
- *
- * 这是无感换号的核心!
- * 它会修改 Cursor 的认证配置,使其指向一个代理服务器
- * 代理服务器会自动处理账号切换
- *
- * @param {string} apiUrl - 无缝模式的 API 代理地址
- * @param {string} userKey - 用户标识
- */
-async function injectSeamless(apiUrl, userKey) {
- const result = await client.request('/api/seamless/inject', 'POST', {
- api_url: apiUrl,
- user_key: userKey
- });
-
- if (result.success && result.data) {
- // 将返回的账号数据写入本地
- // 这里的关键是:写入的 token 是代理服务器的 token
- // 代理服务器会根据使用情况自动切换真实账号
- await account.writeAccountToLocal(result.data);
- }
-
- return result;
-}
-
-/**
- * 恢复原始设置
- * 移除无缝模式,恢复到单账号模式
- */
-async function restoreSeamless() {
- return client.request('/api/seamless/restore', 'POST');
-}
-
-/**
- * 获取账号池列表
- * 返回用户配置的所有账号
- */
-async function getSeamlessAccounts() {
- return client.request('/api/seamless/accounts');
-}
-
-/**
- * 同步账号池
- * 将本地账号列表同步到服务端
- * @param {Array} accounts - 账号列表
- */
-async function syncSeamlessAccounts(accounts) {
- return client.request('/api/seamless/accounts', 'POST', { accounts });
-}
-
-/**
- * 获取指定账号的 Token
- * @param {string} userKey - 用户标识
- */
-async function getSeamlessToken(userKey) {
- return client.request('/api/seamless/token?key=' + encodeURIComponent(userKey));
-}
-
-/**
- * 手动切换到指定账号
- * @param {string} userKey - 要切换到的账号标识
- */
-async function switchSeamlessToken(userKey) {
- const result = await client.request('/api/seamless/switch', 'POST', {
- mode: 'seamless',
- userKey: userKey
- });
-
- if (result.success && result.data) {
- await account.writeAccountToLocal(result.data);
- }
-
- return result;
-}
-
-// ============================================
-// 无感换号流程图
-// ============================================
-
-/**
- *
- * ┌─────────────────────────────────────────────────────────────────┐
- * │ 无感换号工作流程 │
- * ├─────────────────────────────────────────────────────────────────┤
- * │ │
- * │ ┌──────────────┐ │
- * │ │ 用户请求 │ │
- * │ │ (使用 Cursor) │ │
- * │ └──────┬───────┘ │
- * │ │ │
- * │ ▼ │
- * │ ┌──────────────┐ ┌──────────────┐ │
- * │ │ Cursor 客户端 │────▶│ 代理服务器 │ (CursorPro API) │
- * │ │ (本地修改后) │ │ │ │
- * │ └──────────────┘ └──────┬───────┘ │
- * │ │ │
- * │ ▼ │
- * │ ┌──────────────┐ │
- * │ │ 检查当前账号 │ │
- * │ │ 额度是否充足 │ │
- * │ └──────┬───────┘ │
- * │ │ │
- * │ ┌───────────────┼───────────────┐ │
- * │ │ │ │ │
- * │ ▼ ▼ ▼ │
- * │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
- * │ │ 账号 A │ │ 账号 B │ │ 账号 C │ (账号池) │
- * │ │ 额度:5% │ │ 额度:80% │ │ 额度:60% │ │
- * │ └─────────┘ └────┬────┘ └─────────┘ │
- * │ │ │
- * │ ▼ │
- * │ ┌──────────────┐ │
- * │ │ 使用账号 B │ (额度最充足) │
- * │ │ 转发请求 │ │
- * │ └──────┬───────┘ │
- * │ │ │
- * │ ▼ │
- * │ ┌──────────────┐ │
- * │ │ Cursor API │ │
- * │ │ (官方服务器) │ │
- * │ └──────┬───────┘ │
- * │ │ │
- * │ ▼ │
- * │ ┌──────────────┐ │
- * │ │ 返回结果给 │ │
- * │ │ 用户 │ │
- * │ └──────────────┘ │
- * │ │
- * │ 用户全程无感知,只要账号池中有任一账号有额度,就能继续使用 │
- * │ │
- * └─────────────────────────────────────────────────────────────────┘
- *
- */
-
-// ============================================
-// 无感换号的技术实现细节
-// ============================================
-
-/**
- * 关键技术点:
- *
- * 1. 代理注入
- * - 修改本地 Cursor 的 API 端点指向代理服务器
- * - 所有请求先经过代理,代理决定使用哪个真实账号
- *
- * 2. Token 管理
- * - 代理服务器维护账号池的所有 token
- * - 根据各账号的额度情况动态选择
- *
- * 3. 切换策略
- * - 自动模式:当前账号额度 < 阈值时自动切换
- * - 手动模式:用户手动选择要使用的账号
- *
- * 4. 本地写入的数据
- * - accessToken: 代理服务器生成的特殊 token
- * - refreshToken: 用于刷新代理 token
- * - 设备 ID: 统一使用代理分配的 ID,避免被检测
- */
-
-const seamlessModule = {
- getSeamlessStatus,
- getSeamlessConfig,
- updateSeamlessConfig,
- getUserSwitchStatus,
- injectSeamless,
- restoreSeamless,
- getSeamlessAccounts,
- syncSeamlessAccounts,
- getSeamlessToken,
- switchSeamlessToken
-};
-
-module.exports = seamlessModule;
diff --git a/deobfuscated/utils/account.js b/deobfuscated/utils/account.js
deleted file mode 100644
index 818753b..0000000
--- a/deobfuscated/utils/account.js
+++ /dev/null
@@ -1,226 +0,0 @@
-'use strict';
-
-// ============================================
-// CursorPro Account Utils - 反混淆版本
-// ============================================
-
-const vscode = require('vscode');
-const path = require('path');
-const fs = require('fs');
-const { exec } = require('child_process');
-const { promisify } = require('util');
-const { sqliteSetBatch } = require('./sqlite');
-
-const execAsync = promisify(exec);
-
-/**
- * 获取 Cursor 相关路径
- * 返回数据库路径、存储路径和机器ID路径
- */
-function getCursorPaths() {
- const home = process.env.HOME || process.env.USERPROFILE || '';
-
- if (process.platform === 'win32') {
- // Windows 路径
- const appData = process.env.APPDATA || '';
- return {
- dbPath: path.join(appData, 'Cursor', 'User', 'globalStorage', 'state.vscdb'),
- storagePath: path.join(appData, 'Cursor', 'User', 'globalStorage', 'storage.json'),
- machineidPath: path.join(appData, 'Cursor', 'machineid')
- };
- } else if (process.platform === 'darwin') {
- // macOS 路径
- return {
- dbPath: path.join(home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb'),
- storagePath: path.join(home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'storage.json'),
- machineidPath: path.join(home, 'Library', 'Application Support', 'Cursor', 'machineid')
- };
- } else {
- // Linux 路径
- return {
- dbPath: path.join(home, '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb'),
- storagePath: path.join(home, '.config', 'Cursor', 'User', 'globalStorage', 'storage.json'),
- machineidPath: path.join(home, '.config', 'Cursor', 'machineid')
- };
- }
-}
-exports.getCursorPaths = getCursorPaths;
-
-/**
- * 将账号数据写入本地
- * @param {Object} accountData - 账号数据对象
- * @param {string} accountData.accessToken - 访问令牌
- * @param {string} accountData.refreshToken - 刷新令牌
- * @param {string} accountData.workosSessionToken - WorkOS 会话令牌
- * @param {string} accountData.email - 邮箱
- * @param {string} accountData.membership_type - 会员类型
- * @param {string} accountData.usage_type - 使用类型
- * @param {string} accountData.serviceMachineId - 服务机器ID
- * @param {string} accountData.machineId - 机器ID
- * @param {string} accountData.macMachineId - Mac机器ID
- * @param {string} accountData.devDeviceId - 设备ID
- * @param {string} accountData.sqmId - SQM ID
- * @param {string} accountData.machineIdFile - 机器ID文件内容
- */
-async function writeAccountToLocal(accountData) {
- try {
- const paths = getCursorPaths();
- const { dbPath, storagePath, machineidPath } = paths;
-
- console.log('[CursorPro] 数据库路径:', dbPath);
- console.log('[CursorPro] 文件是否存在:', fs.existsSync(dbPath));
- console.log('[CursorPro] 账号数据:', JSON.stringify({
- hasAccessToken: !!accountData.accessToken,
- hasRefreshToken: !!accountData.refreshToken,
- hasWorkosToken: !!accountData.workosSessionToken,
- email: accountData.email
- }));
-
- // 写入数据库
- if (fs.existsSync(dbPath)) {
- try {
- const kvPairs = [];
-
- // 添加访问令牌
- if (accountData.accessToken) {
- kvPairs.push(['cursorAuth/accessToken', accountData.accessToken]);
- }
-
- // 添加刷新令牌
- if (accountData.refreshToken) {
- kvPairs.push(['cursorAuth/refreshToken', accountData.refreshToken]);
- }
-
- // 添加 WorkOS 会话令牌
- if (accountData.workosSessionToken) {
- kvPairs.push(['cursorAuth/WorkosCursorSessionToken', accountData.workosSessionToken]);
- }
-
- // 添加邮箱
- if (accountData.email) {
- kvPairs.push(['cursorAuth/cachedEmail', accountData.email]);
- }
-
- // 添加会员类型
- if (accountData.membership_type) {
- kvPairs.push(['cursorAuth/stripeMembershipType', accountData.membership_type]);
- }
-
- // 添加使用类型
- if (accountData.usage_type) {
- kvPairs.push(['cursorAuth/stripeUsageType', accountData.usage_type || 'default']);
- }
-
- // 添加服务机器ID
- if (accountData.serviceMachineId) {
- kvPairs.push(['telemetry.serviceMachineId', accountData.serviceMachineId]);
- }
-
- console.log('[CursorPro] 待写入数据库:', kvPairs.length);
-
- // 批量写入数据库
- const result = await sqliteSetBatch(dbPath, kvPairs);
- if (!result) {
- throw new Error('数据库写入失败');
- }
-
- console.log('[CursorPro] 数据库已更新:', kvPairs.length, '个字段');
-
- } catch (error) {
- console.error('[CursorPro] 数据库操作失败:', error);
- vscode.window.showErrorMessage('数据库写入失败: ' + error);
- return false;
- }
- } else {
- console.error('[CursorPro] 数据库文件不存在:', dbPath);
- vscode.window.showErrorMessage('[CursorPro] 数据库文件不存在');
- return false;
- }
-
- // 更新 storage.json
- if (fs.existsSync(storagePath)) {
- const storageData = JSON.parse(fs.readFileSync(storagePath, 'utf-8'));
-
- if (accountData.machineId) {
- storageData['telemetry.machineId'] = accountData.machineId;
- }
-
- if (accountData.macMachineId) {
- storageData['telemetry.macMachineId'] = accountData.macMachineId;
- }
-
- if (accountData.devDeviceId) {
- storageData['telemetry.devDeviceId'] = accountData.devDeviceId;
- }
-
- if (accountData.sqmId) {
- storageData['telemetry.sqmId'] = accountData.sqmId;
- }
-
- fs.writeFileSync(storagePath, JSON.stringify(storageData, null, 4));
- console.log('[CursorPro] storage.json 已更新');
- }
-
- // 更新 machineid 文件
- if (accountData.machineIdFile && machineidPath) {
- const dir = path.dirname(machineidPath);
- if (!fs.existsSync(dir)) {
- fs.mkdirSync(dir, { recursive: true });
- }
- fs.writeFileSync(machineidPath, accountData.machineIdFile);
- console.log('[CursorPro] machineid 文件已更新');
- }
-
- // Windows 注册表写入 (如果有 sqmId)
- if (accountData.sqmId && process.platform === 'win32') {
- try {
- const regCommand = `reg add "HKCU\\Software\\Cursor" /v SQMId /t REG_SZ /d "${accountData.sqmId}" /f`;
- await execAsync(regCommand);
- console.log('[CursorPro] 注册表已更新');
- } catch (error) {
- console.warn('[CursorPro] 注册表写入失败(可能需要管理员权限):', error);
- }
- }
-
- return true;
-
- } catch (error) {
- console.error('[CursorPro] writeAccountToLocal 失败:', error);
- return false;
- }
-}
-exports.writeAccountToLocal = writeAccountToLocal;
-
-/**
- * 关闭 Cursor 进程
- */
-async function closeCursor() {
- try {
- if (process.platform === 'win32') {
- // Windows: 使用 taskkill
- await execAsync('taskkill /F /IM Cursor.exe').catch(() => {});
- } else {
- // macOS/Linux: 使用 pkill
- await execAsync('pkill -9 -f Cursor').catch(() => {});
- }
- } catch (error) {
- console.warn('[CursorPro] 关闭 Cursor 失败:', error);
- }
-}
-exports.closeCursor = closeCursor;
-
-/**
- * 提示用户重启 Cursor
- */
-async function promptRestartCursor(message) {
- const selection = await vscode.window.showInformationMessage(
- message,
- '立即重启',
- '稍后手动重启'
- );
-
- if (selection === '立即重启') {
- await closeCursor();
- }
-}
-exports.promptRestartCursor = promptRestartCursor;
diff --git a/deobfuscated/utils/sqlite.js b/deobfuscated/utils/sqlite.js
deleted file mode 100644
index 0e13638..0000000
--- a/deobfuscated/utils/sqlite.js
+++ /dev/null
@@ -1,203 +0,0 @@
-'use strict';
-
-// ============================================
-// CursorPro SQLite Utils - 反混淆版本
-// ============================================
-
-const { exec } = require('child_process');
-const { promisify } = require('util');
-const fs = require('fs');
-
-const execAsync = promisify(exec);
-
-/**
- * 转义 SQL 字符串中的单引号
- */
-function escapeSqlString(value) {
- if (value === null || value === undefined) {
- return '';
- }
- return String(value).replace(/'/g, "''");
-}
-
-/**
- * 执行 SQLite 命令
- * @param {string} dbPath - 数据库文件路径
- * @param {string} sql - SQL 语句
- * @returns {Promise} - 执行结果
- */
-async function execSqlite(dbPath, sql) {
- const isWindows = process.platform === 'win32';
-
- try {
- if (isWindows) {
- // Windows: 直接使用 sqlite3 命令
- const escapedSql = sql.replace(/"/g, '\\"');
- const command = `sqlite3 "${dbPath}" "${escapedSql}"`;
-
- const { stdout, stderr } = await execAsync(command, {
- encoding: 'utf-8',
- maxBuffer: 10 * 1024 * 1024 // 10MB
- });
-
- if (stderr && !stderr.includes('-- Loading')) {
- console.warn('[SQLite] stderr:', stderr);
- }
-
- return stdout.trim();
- } else {
- // macOS/Linux: 使用临时文件避免转义问题
- const os = require('os');
- const pathModule = require('path');
- const tempFile = pathModule.join(
- os.tmpdir(),
- 'cursor_sql_' + Date.now() + '.sql'
- );
-
- // 写入 SQL 到临时文件
- fs.writeFileSync(tempFile, sql, 'utf-8');
-
- try {
- const command = `sqlite3 "${dbPath}" < "${tempFile}"`;
-
- const { stdout, stderr } = await execAsync(command, {
- encoding: 'utf-8',
- maxBuffer: 10 * 1024 * 1024,
- shell: '/bin/bash'
- });
-
- if (stderr && !stderr.includes('-- Loading')) {
- console.warn('[SQLite] stderr:', stderr);
- }
-
- return stdout.trim();
- } finally {
- // 清理临时文件
- try {
- fs.unlinkSync(tempFile);
- } catch (e) {}
- }
- }
- } catch (error) {
- // 检查是否是 sqlite3 不存在的错误
- if (
- error.message === 'ENOENT' ||
- error.message?.includes('sqlite3') ||
- error.message?.includes('not found')
- ) {
- throw new Error('sqlite3 命令不存在,请先安装 SQLite3');
- }
- throw error;
- }
-}
-
-/**
- * 从 SQLite 数据库读取单个值
- * @param {string} dbPath - 数据库路径
- * @param {string} key - 键名
- * @returns {Promise} - 值或 null
- */
-async function sqliteGet(dbPath, key) {
- if (!fs.existsSync(dbPath)) {
- console.warn('[SQLite] 数据库文件不存在:', dbPath);
- return null;
- }
-
- try {
- const sql = `SELECT value FROM ItemTable WHERE key = '${escapeSqlString(key)}';`;
- const result = await execSqlite(dbPath, sql);
- return result || null;
- } catch (error) {
- console.error('[SQLite] 读取失败:', error);
- return null;
- }
-}
-exports.sqliteGet = sqliteGet;
-
-/**
- * 向 SQLite 数据库写入单个值
- * @param {string} dbPath - 数据库路径
- * @param {string} key - 键名
- * @param {string} value - 值
- * @returns {Promise} - 是否成功
- */
-async function sqliteSet(dbPath, key, value) {
- if (!fs.existsSync(dbPath)) {
- console.warn('[SQLite] 数据库文件不存在:', dbPath);
- return false;
- }
-
- try {
- // 使用 REPLACE INTO 实现 upsert
- const sql = `REPLACE INTO ItemTable (key, value) VALUES ('${escapeSqlString(key)}', '${escapeSqlString(value)}');`;
- await execSqlite(dbPath, sql);
- return true;
- } catch (error) {
- console.error('[SQLite] 写入失败:', error);
- return false;
- }
-}
-exports.sqliteSet = sqliteSet;
-
-/**
- * 批量写入 SQLite 数据库
- * @param {string} dbPath - 数据库路径
- * @param {Array<[string, string]>} kvPairs - 键值对数组
- * @returns {Promise} - 是否成功
- */
-async function sqliteSetBatch(dbPath, kvPairs) {
- if (!fs.existsSync(dbPath)) {
- console.warn('[SQLite] 数据库文件不存在:', dbPath);
- return false;
- }
-
- if (kvPairs.length === 0) {
- return true;
- }
-
- try {
- // 构建批量 SQL 语句
- const statements = kvPairs.map(([key, value]) =>
- `REPLACE INTO ItemTable (key, value) VALUES ('${escapeSqlString(key)}', '${escapeSqlString(value)}');`
- );
-
- const sql = 'BEGIN TRANSACTION; ' + statements.join(' ') + ' COMMIT;';
-
- await execSqlite(dbPath, sql);
- return true;
- } catch (error) {
- console.error('[SQLite] 批量写入失败:', error);
- return false;
- }
-}
-exports.sqliteSetBatch = sqliteSetBatch;
-
-/**
- * 批量读取 SQLite 数据库
- * @param {string} dbPath - 数据库路径
- * @param {string[]} keys - 键名数组
- * @returns {Promise