├── README.md ├── astexplorer_babel.html ├── background.html ├── background.js ├── devtools.html ├── devtools.js ├── diff_text.html ├── img ├── 1.png ├── 2.png ├── 3.png └── 4.png ├── inject.js ├── manifest - 副本.json ├── manifest.json ├── new_tab_overwrite.html ├── options.html ├── options.js ├── popup.html ├── popup.js └── tools ├── _config_hook_list.js ├── aline_js.js ├── astexplorer_babel.js ├── babel_asttool.js ├── bgscript ├── get_cookie.js ├── get_html.js └── replacer.js ├── btn_utils.js ├── bytejs.js ├── cheerio.js ├── common.js ├── cryptojs.js ├── diff_text.js ├── error_front.js ├── jquery.min.js ├── js_obfuscator.js ├── jsencrypt.js ├── merge.css ├── mergeCodeMirror.min.js ├── mod_code_getter.js ├── model_funcs.js ├── myinject_enc.js ├── parse5.js ├── redirect.js ├── replacer.js ├── request.js ├── sub_logger.js ├── terser.js ├── uglify_es.js └── window_hooker.js /README.md: -------------------------------------------------------------------------------- 1 | 2025/05/20:修复了一些BUG,隐藏了一些注入时会产生的特征,使工具更难被检测到。 2 | 3 | 一,使用方式 4 | 5 | 1. 压缩包方式下载到本地 6 | 7 | ![1.png](./img/1.png) 8 | 9 | 2. 下载后的压缩包解压备用,谷歌浏览器打开插件中心:chrome://extensions/ ,打开开发者模式,加载已解压的拓展程序,将下载的解压文件导入,右上角固定插件。 10 | 11 | ![2.png](./img/2.png) 12 | 13 | 3. 右上角打开配置中心,既可查看当前所有功能配置 14 | 15 | ![3.png](./img/3.png) 16 | 17 | 二,更多功能详解 18 | 19 | 为方便广大开发者更好地了解和使用 v_jstools,我与猿人学平哥合作,我们共同建立了一个微信交流群。扫码并备注 “jstools” 即可申请加入。 20 | 21 | 在这个交流群中,我们会在群中优先分享工具的使用方法、实践案例,以及后续功能的更新与版本维护信息。同时,平哥也邀请了多位长期关注 jstools 的技术创作者加入,共同参与内容交流、经验分享以及共同对项目生态进行维护。欢迎感兴趣的朋友加入群聊,共建一个开放、实用的 v_jstools 工具交流社区。 22 | 23 | ![4.png](./img/4.png) 24 | -------------------------------------------------------------------------------- /background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /background.js: -------------------------------------------------------------------------------- 1 | // importScripts( 2 | // "./tools/babel_asttool.js", 3 | // "./tools/cheerio.js", 4 | // "./tools/replacer.js", 5 | // "./tools/error_front.js", 6 | // "./tools/sub_logger.js" 7 | // ) 8 | // chrome.contextMenus.create({ 9 | // id: "v_menu", 10 | // title: "打开 v_jstools 动态调试", 11 | // contexts: ['all'] 12 | // }); 13 | // chrome.contextMenus.onClicked.addListener(function(info, tab) { 14 | // if (info.menuItemId == "v_menu") { 15 | // AttachDebugger(); 16 | // } 17 | // }); 18 | // background.js 19 | chrome.contextMenus.create({ 20 | title: "打开 ast 动态挂钩", 21 | contexts: ['all'], 22 | onclick: function(){ 23 | ast_dyn_hook = true 24 | AttachDebugger(); 25 | } 26 | }); 27 | function add_hook_event_code(tabs, callback){ 28 | var run_code_before = ` 29 | !function(){ 30 | var toggle = true 31 | var elelist = [] 32 | var v_stringify = JSON.stringify 33 | var v_parse = JSON.parse 34 | function log_ele(name, e){ 35 | if (toggle){ 36 | if (!e.target.tagName){ 37 | var css = '' 38 | }else{ 39 | var css = e.target.tagName.toLowerCase() 40 | + (e.target.id ? '#' + e.target.id : '') 41 | + (e.target.classList.length ? '.' + e.target.classList[0] : '') 42 | } 43 | function tofixnum(dict, num){ 44 | num = num || 1 45 | var keys = Object.keys(v_parse(v_stringify(dict))) 46 | for (var i = 0; i < keys.length; i++) { 47 | if (typeof dict[keys[i]] == 'number'){ 48 | dict[keys[i]] = +dict[keys[i]].toFixed(num) 49 | } 50 | } 51 | return dict 52 | } 53 | elelist.push([name, e, 54 | v_stringify({ 55 | type:name, 56 | x: e.clientX, 57 | y: e.clientY, 58 | screenX: e.screenX, 59 | screenY: e.screenY, 60 | timeStamp: e.timeStamp, 61 | css: { 62 | selector: css, 63 | rect: tofixnum(e.target.getBoundingClientRect ? e.target.getBoundingClientRect() : {}), 64 | tagName: e.target.tagName || undefined, 65 | id: e.target.id || undefined, 66 | }, 67 | })]) 68 | } 69 | } 70 | function copyToClipboard(str, maxtime){ 71 | if (maxtime === undefined){ maxtime = 2 } 72 | const el = document.createElement('textarea'); 73 | el.value = str; 74 | el.setAttribute('readonly', ''); 75 | el.style.position = 'absolute'; 76 | el.style.left = '-9999px'; 77 | document.body.appendChild(el); 78 | const selected = 79 | document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false; 80 | el.select(); 81 | document.execCommand('copy'); 82 | document.body.removeChild(el); 83 | if (selected) { 84 | document.getSelection().removeAllRanges(); 85 | document.getSelection().addRange(selected); 86 | alert('已将代码存放到剪贴板中。') 87 | }else{ 88 | if (maxtime > 0){ 89 | return copyToClipboard(str, maxtime-1) 90 | } 91 | alert('保存至剪贴板失败。尝试直接将代码用 console.log 直接输出在控制台中。(因为可能会保存失败,可以多点几次 “生成临时环境”)') 92 | console.log(str) 93 | } 94 | }; 95 | function make_log_str(elelist){ 96 | var ret = [] 97 | for (var i = 0; i < elelist.length; i++) { 98 | ret.push(' ' + elelist[i][2] + ',') 99 | } 100 | var enter = String.fromCharCode(10) 101 | return '[' + enter + ret.join(enter) + enter + ']' 102 | } 103 | document.addEventListener('keyup',(e)=>{ 104 | if (e.keyCode===27){ 105 | if (toggle){ 106 | console.log(elelist) 107 | copyToClipboard(make_log_str(elelist), 2) 108 | elelist = [] 109 | } 110 | toggle = !toggle 111 | } 112 | }) 113 | document.addEventListener('mousemove', function(e){ 114 | var nDiv = document.createElement('div') 115 | var e = event || window.event 116 | nDiv.style.cssText = "position:absolute; width:5px; height:5px; background-color:red; border-radius:50%" 117 | nDiv.style.left = e.pageX + 5 + "px" 118 | nDiv.style.top = e.pageY + 5 + "px" 119 | document.body.appendChild(nDiv) 120 | setTimeout(function(){ nDiv.remove(); },1000) 121 | log_ele.bind(null, 'mousemove')(e) 122 | }) 123 | function log2_ele(name, e){ 124 | if (toggle){ 125 | elelist.push([name, e, v_stringify({type:name, key: e.key, keyCode: e.keyCode, code: e.code, timeStamp: e.timeStamp})]) 126 | } 127 | } 128 | document.addEventListener('mousedown', log_ele.bind(null, 'mousedown'), true) 129 | document.addEventListener('mouseup', log_ele.bind(null, 'mouseup'), true) 130 | document.addEventListener('click', log_ele.bind(null, 'click'), true) 131 | document.addEventListener('keydown', log2_ele.bind(null, 'keydown'), true) 132 | document.addEventListener('keyup', log2_ele.bind(null, 'keyup'), true) 133 | }() 134 | ` 135 | var currtab = { tabId: tabs[0].id }; 136 | chrome.debugger.attach(currtab, "1.2", function () { 137 | chrome.debugger.sendCommand(currtab, "Page.enable", function(){ 138 | chrome.debugger.sendCommand(currtab, "Page.addScriptToEvaluateOnNewDocument", { 139 | source: run_code_before 140 | }, function(){ 141 | callback() 142 | }); 143 | }); 144 | }); 145 | } 146 | function flash_page(tabs){ 147 | var codeToExec = `setTimeout(function(){ location = location }, 100); ` 148 | chrome.tabs.executeScript( tabs[0].id, {code:codeToExec}, function(result) { 149 | console.log('Result = ' + result); } 150 | ); 151 | } 152 | chrome.contextMenus.create({ 153 | title: "挂钩并记录事件", 154 | contexts: ['all'], 155 | onclick: function(){ 156 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 157 | alert(`准备开始挂钩事件记录。\n\n\n页面刷新后,所有事件都将被记录操作,直到你按下 ESC 键停止记录,并将结果保存到剪贴板里面。`) 158 | add_hook_event_code(tabs, function(){ 159 | flash_page(tabs) 160 | }) 161 | }); 162 | } 163 | }); 164 | chrome.contextMenus.create({ 165 | title: "拷贝当前页面资源", 166 | contexts: ['all'], 167 | onclick: function(){ 168 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 169 | function format_cache(){ 170 | function base64(str){ 171 | return CryptoJS.enc.Utf8.parse(str).toString(CryptoJS.enc.Base64) 172 | } 173 | var keys = Object.keys(save_cache).sort() 174 | var rets = [] 175 | for (var i = 0; i < keys.length; i++) { 176 | var s = document.createElement('a') 177 | s.href = keys[i] 178 | var url = s.href 179 | var odata = save_cache[keys[i]] 180 | if (odata.type == 'Script'|| 181 | odata.type == 'Document'|| 182 | odata.type == 'Stylesheet'){ 183 | rets.push(' ' + JSON.stringify([url, base64(odata.data), 'base64', odata.responseHeaders, odata.responseStatusCode])+',') 184 | }else{ 185 | rets.push(' ' + JSON.stringify([url, odata.data, 'null', odata.responseHeaders, odata.responseStatusCode])+',') 186 | } 187 | } 188 | return rets.join('\n').trim() 189 | } 190 | var html = format_cache() 191 | if (html && html_copy){ 192 | var url = URL.createObjectURL(new Blob(html.split(''), {type: 'text/javascript'})) 193 | chrome.downloads.download({ 194 | url: url, 195 | filename: 'clone_cache.js' 196 | }); 197 | }else{ 198 | alert(`准备打开调试拷贝。\n\n\n请在打开调试模式之后,手动刷新页面等待页面资源加载充足后,再次右键选择 "拷贝当前页面资源"`) 199 | html_copy = true 200 | AttachDebugger(); 201 | flash_page(tabs) 202 | } 203 | }); 204 | } 205 | }); 206 | chrome.contextMenus.create({ 207 | title: "拷贝当前页面", 208 | contexts: ['all'], 209 | onclick: function(){ 210 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 211 | var url = tabs[0].url 212 | var html = get_html(url) 213 | if (html && html_copy){ 214 | var url = URL.createObjectURL(new Blob(html.split(''), {type: 'text/html'})) 215 | chrome.downloads.download({ 216 | url: url, 217 | filename: 'clone_html.html' 218 | }); 219 | }else{ 220 | alert(`准备打开调试拷贝。\n\n\n请在打开调试模式之后,手动刷新页面等待页面资源加载充足后,再次右键选择 "拷贝当前页面"`) 221 | html_copy = true 222 | AttachDebugger(); 223 | flash_page(tabs) 224 | } 225 | }); 226 | } 227 | }); 228 | chrome.contextMenus.create({ 229 | title: "修改发送请求", 230 | contexts: ['all'], 231 | onclick: function(){ 232 | init_edit_function() 233 | edit_request = true 234 | AttachDebugger(); 235 | } 236 | }); 237 | 238 | function init_edit_function(){ 239 | chrome.storage.local.get(["config-request_hook"], function (res) { 240 | try{ 241 | window.eval(res["config-request_hook"]) 242 | }catch(e){ 243 | change_request = undefined; 244 | console.log('evaluate code init change_request func err.', e) 245 | } 246 | }) 247 | } 248 | 249 | var ast_dyn_hook = false 250 | var html_copy = false 251 | var edit_request = false 252 | function close_debugger(){ 253 | attached = false 254 | ast_dyn_hook = false 255 | html_copy = false 256 | edit_request = false 257 | } 258 | function sendCommand(method, params, source, chainfun){ 259 | chrome.debugger.sendCommand(source, method, params, function(result){ 260 | if (chrome.runtime.lastError) { 261 | console.error('chrome.runtime.lastError', chrome.runtime.lastError) 262 | if (chrome.runtime.lastError.message.indexOf('Cannot access a chrome://') != -1){ close_debugger() } 263 | } else { if (chainfun){ chainfun(result) } } 264 | }); 265 | } 266 | function fillresponse(params, source, body){ 267 | sendCommand("Fetch.fulfillRequest", { 268 | requestId: params.requestId, responseCode: params.responseStatusCode, responseHeaders: params.responseHeaders, 269 | body: body, // body 只能传 base64(指定代码) 270 | }, source); 271 | } 272 | var save_cache = {} 273 | chrome.debugger.onEvent.addListener(function (source, method, params){ 274 | switch(method){ 275 | case "Fetch.requestPaused": 276 | var itheaders = params.responseHeaders; 277 | if (itheaders && itheaders.find(function(v){return v.name == "Location"})) { 278 | sendCommand("Fetch.continueRequest", { requestId: params.requestId, url: itheaders.value }, source); 279 | break; } 280 | if ((params.responseStatusCode || params.responseErrorReason)) { 281 | if (params.responseErrorReason) { 282 | sendCommand("Fetch.failRequest", { requestId: params.requestId, errorReason: params.responseErrorReason }, source); 283 | break; } 284 | sendCommand("Fetch.getResponseBody", { requestId: params.requestId }, source, function(result){ 285 | var fillfunc = fillresponse.bind(null, params, source) 286 | chrome.storage.local.get(["config-fetch_hook"], function (res) { 287 | if (!result.body){ fillfunc(result.body); return } 288 | // save html 289 | if (html_copy){ 290 | if ( params.resourceType == 'Script' 291 | || params.resourceType == 'Document' 292 | || params.resourceType == 'Stylesheet' 293 | || params.resourceType == 'Image' 294 | || params.resourceType == 'Font' 295 | || params.resourceType == 'Other' 296 | ){ 297 | if (params.resourceType == 'Script'){ var save_info = decodeURIComponent(escape(atob(result.body))) } 298 | if (params.resourceType == 'Document'){ var save_info = decodeURIComponent(escape(atob(result.body))) } 299 | if (params.resourceType == 'Stylesheet'){ var save_info = decodeURIComponent(escape(atob(result.body))) } 300 | if (params.resourceType == 'Image'){ var save_info = result.body } 301 | if (params.resourceType == 'Font'){ var save_info = result.body } 302 | if (params.resourceType == 'Other'){ var save_info = result.body } 303 | function save_html_info(save_info, type, url){ 304 | save_cache[url] = {data: save_info, type: type, responseHeaders: params.responseHeaders, responseStatusCode: params.responseStatusCode} 305 | } 306 | save_html_info(save_info, params.resourceType, params.request.url) 307 | console.log(params.resourceType, params.request.url) 308 | } 309 | } 310 | // ast hook 311 | if (ast_dyn_hook){ 312 | if ( params.resourceType == 'Script' 313 | || params.resourceType == 'Document' 314 | ){ 315 | try{ 316 | var respboby = decodeURIComponent(escape(atob(result.body))) 317 | var replacer = eval((res["config-fetch_hook"]||'')+';fetch_hook') 318 | if (params.resourceType == 'Script'){ var replbody = (replacer(respboby, params.request.url)) } 319 | if (params.resourceType == 'Document'){ var replbody = (html_script_replacer(respboby, replacer, params.request.url)) } 320 | fillfunc(btoa(unescape(encodeURIComponent(replbody)))) 321 | return } 322 | catch(e){ 323 | send_error_info_to_front(e.stack, currtab.tabId, params.request.url) } 324 | } 325 | } 326 | fillfunc(result.body) // body 只能传 base64(指定代码) 327 | }) 328 | return 329 | }); 330 | break; 331 | }else{ 332 | var options = { requestId: params.requestId } 333 | if (edit_request){ 334 | var { url, method, postData, headers } = params.request 335 | var config = { url, method, postData, headers } 336 | 337 | if (typeof change_request != 'undefined'){ 338 | try{ 339 | change_request(config) 340 | }catch(e){ 341 | console.log('run change_request err.', e) 342 | } 343 | } 344 | 345 | var { url, method, postData, headers } = config 346 | 347 | function base64(str){ 348 | return CryptoJS.enc.Utf8.parse(str).toString(CryptoJS.enc.Base64) 349 | } 350 | // 这里处理更新操作 351 | try{ 352 | if (url){ 353 | options.url = url 354 | } 355 | if (method){ 356 | options.method = method 357 | } 358 | if (postData){ 359 | options.postData = base64(postData) 360 | } 361 | if (headers){ 362 | var keys = Object.keys(headers) 363 | var headers_list = [] 364 | for (var i = 0; i < keys.length; i++) { 365 | headers_list.push({name:keys[i], value:headers[keys[i]]}) 366 | } 367 | options.headers = headers_list 368 | } 369 | }catch(e){ 370 | console.log('set change request err.', e) 371 | } 372 | console.log('change request options:', options) 373 | } 374 | sendCommand("Fetch.continueRequest", options, source); 375 | break; 376 | } 377 | } 378 | }) 379 | chrome.debugger.onDetach.addListener(function(){ 380 | close_debugger() 381 | }) 382 | var attached = false 383 | var currtab; 384 | function AttachDebugger() { 385 | if (attached){ return } 386 | save_cache = {}; 387 | attached = true 388 | chrome.tabs.query( 389 | { active: true, currentWindow: true }, 390 | function (tabs) { 391 | currtab = { tabId: tabs[0].id }; 392 | chrome.debugger.attach(currtab, "1.3", function () { 393 | sendCommand("Network.enable", {}, currtab, function(){ sendCommand("Network.setCacheDisabled", {cacheDisabled: true}, currtab)} ) // 确保 Fetch.getResponseBody 一定能收到东西 394 | sendCommand("Fetch.enable", { patterns: [ 395 | // Document, Stylesheet, Image, Media, Font, Script, TextTrack, XHR, Fetch, EventSource, WebSocket, Manifest, SignedExchange, Ping, CSPViolationReport, Preflight, Other 396 | {urlPattern:"*",resourceType:"Script",requestStage:"Response"}, // 暂时先只 hook 少量携带 js 数据类型的请求 397 | {urlPattern:"*",resourceType:"Document",requestStage:"Response"}, 398 | {urlPattern:"*",resourceType:"Stylesheet",requestStage:"Response"}, 399 | {urlPattern:"*",resourceType:"Image",requestStage:"Response"}, 400 | {urlPattern:"*",resourceType:"Font",requestStage:"Response"}, 401 | {urlPattern:"*",resourceType:"Other",requestStage:"Response"}, 402 | // 403 | // {urlPattern:"*",resourceType:"XHR",requestStage:"Response"}, 404 | // {urlPattern:"*",resourceType:"Fetch",requestStage:"Response"}, 405 | // {urlPattern:"*",resourceType:"WebSocket",requestStage:"Response"}, 406 | {urlPattern:"*",resourceType:"Media",requestStage:"Response"}, 407 | {urlPattern:"*",resourceType:"Ping",requestStage:"Response"}, 408 | {urlPattern:"*",resourceType:"CSPViolationReport",requestStage:"Response"}, 409 | 410 | // {urlPattern:"*",resourceType:"TextTrack",requestStage:"Response"}, 411 | // {urlPattern:"*",resourceType:"EventSource",requestStage:"Response"}, 412 | // {urlPattern:"*",resourceType:"Manifest",requestStage:"Response"}, 413 | // {urlPattern:"*",resourceType:"SignedExchange",requestStage:"Response"}, 414 | // {urlPattern:"*",resourceType:"Preflight",requestStage:"Response"}, 415 | 416 | // {urlPattern:"*",requestStage:"request"}, 417 | ] }, currtab); 418 | }); 419 | } 420 | ); 421 | } 422 | 423 | sub_logger() 424 | 425 | -------------------------------------------------------------------------------- /devtools.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /devtools.js: -------------------------------------------------------------------------------- 1 | chrome.devtools.panels.create( 2 | 'v_opitons', 3 | null, 4 | 'options.html' 5 | ); 6 | 7 | chrome.devtools.panels.create( 8 | 'v_diff', 9 | null, 10 | 'diff_text.html' 11 | ); 12 | 13 | chrome.devtools.panels.create( 14 | 'v_ast', 15 | null, 16 | 'astexplorer_babel.html' 17 | ); -------------------------------------------------------------------------------- /diff_text.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilame/v_jstools/eddf3a8c06c00e896c70866ff2da6d4a9b924c9c/img/1.png -------------------------------------------------------------------------------- /img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilame/v_jstools/eddf3a8c06c00e896c70866ff2da6d4a9b924c9c/img/2.png -------------------------------------------------------------------------------- /img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilame/v_jstools/eddf3a8c06c00e896c70866ff2da6d4a9b924c9c/img/3.png -------------------------------------------------------------------------------- /img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cilame/v_jstools/eddf3a8c06c00e896c70866ff2da6d4a9b924c9c/img/4.png -------------------------------------------------------------------------------- /manifest - 副本.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "v_jstools", 3 | "version": "0.0.0", 4 | "description": "v_jstools js hook工具", 5 | "permissions": ["storage", "unlimitedStorage", "activeTab", "tabs", "debugger", "storage", "contextMenus"], 6 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 7 | "browser_action": { 8 | "default_popup": "popup.html" 9 | }, 10 | "background": { 11 | "page": "background.html", 12 | "persistent": true 13 | }, 14 | "content_scripts": [ 15 | { 16 | "matches": [ "file:///*", "http://*/*", "https://*/*" ], 17 | "run_at": "document_start", 18 | "js": ["inject.js"], 19 | "all_frames": true 20 | } 21 | ], 22 | "options_page": "options.html", 23 | "options_ui": { 24 | "chrome_style": false, 25 | "open_in_tab": true, 26 | "page": "options.html" 27 | }, 28 | "manifest_version": 2 29 | } 30 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | // { 2 | // "name": "v_jstools", 3 | // "version": "1.0.0", 4 | // "description": "v_jstools js hook工具", 5 | // "permissions": [ 6 | // "unlimitedStorage", 7 | // "activeTab", 8 | // "tabs", 9 | // "debugger", 10 | // "storage", 11 | // "contextMenus", 12 | // "scripting" 13 | // ], 14 | // "content_security_policy": { 15 | // // "extension_pages": "script-src 'self' 'unsafe-eval'; object-src 'self'" 16 | // }, 17 | // "action": { 18 | // "default_popup": "popup.html" 19 | // }, 20 | // "background": { 21 | // "service_worker": "background.js" 22 | // }, 23 | // "content_scripts": [ 24 | // { 25 | // "matches": [ "file:///*", "http://*/*", "https://*/*" ], 26 | // "run_at": "document_start", 27 | // "js": ["inject.js"], 28 | // "all_frames": true 29 | // } 30 | // ], 31 | // "options_page": "options.html", 32 | // "options_ui": { 33 | // // "chrome_style": false, 34 | // "open_in_tab": true, 35 | // "page": "options.html" 36 | // }, 37 | // "manifest_version": 3 38 | // } 39 | 40 | 41 | 42 | { 43 | "name": "v_jstools", 44 | "version": "0.0.0", 45 | "description": "v_jstools js hook工具", 46 | "permissions": ["unlimitedStorage", 47 | "activeTab", 48 | "webRequest", 49 | "webRequestBlocking", 50 | "tabs", 51 | "debugger", 52 | "storage", 53 | "contextMenus", 54 | "http://*/*", 55 | "https://*/*", 56 | "", 57 | "cookies", 58 | "downloads", 59 | "proxy" 60 | ], 61 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 62 | "browser_action": { 63 | "default_popup": "popup.html" 64 | }, 65 | "background": { 66 | "page": "background.html", 67 | "persistent": true 68 | }, 69 | "devtools_page": "devtools.html", 70 | "content_scripts": [ 71 | { 72 | "matches": [ "file:///*", "http://*/*", "https://*/*" ], 73 | "run_at": "document_start", 74 | "js": ["inject.js"], 75 | "all_frames": true 76 | } 77 | ], 78 | "options_page": "options.html", 79 | "options_ui": { 80 | "open_in_tab": true, 81 | "page": "options.html" 82 | }, 83 | // "chrome_url_overrides": { 84 | // "newtab": "new_tab_overwrite.html" 85 | // }, 86 | "manifest_version": 2 87 | } 88 | -------------------------------------------------------------------------------- /new_tab_overwrite.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 配置页面 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 26 |
27 |
28 |
29 |
30 | 31 | 32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 | 46 |
47 | 48 |
49 | 54 |
55 | 56 |
57 |
58 |
59 | 此处的两个配置会影响后面的全部挂钩操作 60 |
61 |
62 | 63 |
64 |
65 | 66 |
67 | 68 |
69 | 70 |
71 |
72 | 73 |
74 |
75 | 76 |
77 | 78 |
79 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 88 |
89 | 90 |
91 | 92 |
93 | 94 |
95 | 96 |
97 | 98 |
99 | 100 |
101 | 102 |
103 | 104 |
105 | 106 |
107 | 108 |
109 | 110 |
111 | 112 |
113 | 114 |
115 |
116 |
117 |
左侧两列为常用挂钩,建议常开
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | 126 |
127 | 128 |
129 |
130 | 131 |
132 |
点击注入后,会自动打开调试模式,并且对每个页面的 “刷新过程” 注入执行的代码。(关闭调式模式自动取消注入)
133 |
注意!!!如果需要让修改后的代码生效需要关闭调试模式,然后重新点击 “调试注入” 。
134 |
135 | 136 |
137 | 138 |
139 |
140 |

pac代理地址

141 | 142 |
143 | 144 | 145 |

修改匹配URL的返回值

146 | 147 |
148 |
适用的本地文件后缀:txt,html,htm,css,js,json,xml,jpg,gif,png,webp
149 |
150 | 151 |

动态修改请求包

152 | 153 |
154 | 155 | 156 |

动态修改被调试页面的所有js代码

157 |
158 |
这里的功能:在目标网页上右键菜单选择 “打开 ast 动态挂钩” 即可开启,使用用插件的方式 hook 住目标页面的所有代码,像是在 node 里面一样使用 ast 将原始的代码修改成期望的样子
159 |
这里的 hook 功能在一定的扩展之后,能 hook 住 script 链接中的 js 代码,也能 hook 到 html 内的 js 代码。
160 |
*能直接用插件的方式实现 ast 修改代码,用处还是非常大的。不过目前感觉功能稍微有点干瘪,因为暂时还在想有什么 ast 修改模板代码会更好的捕捉代码信息,让代码更方便的调试。
161 |
162 |
请定义一个名字为 fetch_hook 函数,接受参数为 1.代码 2.url,return 修改后的代码
163 |
在代码里面你可以直接使用四个对象,你可以像是在 node 里面一样用这四个对象操作和修改 ast 的结构并重新生成新的代码。对象如下:
164 |
parser = require("@babel/parser");
165 |
traverse = require("@babel/traverse").default;
166 |
t = require("@babel/types");
167 |
generator = require("@babel/generator").default;
168 |
169 |
你可以实现挂钩修改所有的 script 代码,所有 script 代码都会被下面的函数挂钩,你可以使用 ast 清除掉里面所有的 debugger。
170 |
一个使用 ast 删除代码中的 debugger 的代码示例,代码如下:
171 |
function fetch_hook(code, url){
172 |
function removedebugger(path){
173 |
path.replaceWith(t.identifier("/*debugger*/"))
174 |
}
175 |
var ast = parser.parse(code);
176 |
traverse(ast, {DebuggerStatement: removedebugger});
177 |
var { code } = generator(ast, { jsescOption: { minimal: true, } });
178 |
return code
179 |
}
180 |
181 |
code:
182 | 183 |
184 |
185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 |
199 | 200 |
201 | 202 |
203 | 204 |
205 | 206 | 207 | 208 | 209 |
210 |
211 |
RPC代码模板使用方式
212 |
(1)首先生成的server代码并执行(python和nodejs两种任选其一,建议选node,因为node版本代码已处理成免安装版,且只使用一个端口)
213 |
(2)然后用生成的hook代码自行对你需要挂钩的函数处理,在你想要挂钩的为止挂钩
214 |
(3)直接访问 http://127.0.0.1:5000/getinfo?value=test 测试代码
215 | 216 |
217 | 218 |
219 | 220 |
221 | 222 |
223 |
224 | 225 | 226 | 227 | 228 |
229 | 230 |
231 |
232 | 233 |
234 |
235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 |
244 |
245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 |
254 |
255 | 256 | 257 |
258 |
259 | 260 | 261 | 262 | 263 |
264 | 265 | 266 | 267 | 268 | 269 | 270 |
271 |
272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | -------------------------------------------------------------------------------- /options.js: -------------------------------------------------------------------------------- 1 | window.onload = function() { 2 | var nav = document.getElementById('nav'); 3 | var oNav = nav.getElementsByTagName('button'); 4 | var container = document.getElementById('container'); 5 | var oDiv = container.getElementsByClassName('tab'); 6 | for (var i = 0; i < oNav.length; i++) { 7 | oNav[i].index = i; 8 | oNav[i].onclick = function() { 9 | for (var i = 0; i < oNav.length; i++) { 10 | oNav[i].className = ''; 11 | oDiv[i].style.display = "none"; 12 | } 13 | this.className = 'act'; 14 | oDiv[this.index].style.display = "block" 15 | } 16 | for (var m = 1; m < oNav.length; m++) { 17 | oNav[m].className = ''; 18 | oDiv[m].style.display = "none"; 19 | } 20 | } 21 | } 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | // getsets_0 38 | // funcs_0 39 | // getsets_1 40 | // funcs_1 41 | 42 | function _mk_html(input, clsname, index){ 43 | var div = document.getElementById(clsname) 44 | div.innerHTML += ` 45 | 46 | ` 47 | var htmls = [] 48 | var keys = [] 49 | for (var i = 0; i < input.length; i++) { 50 | var kv = input[i] 51 | var k = kv[0] 52 | var v = kv[1] 53 | if (keys.indexOf(k) == -1){ 54 | keys.push(k) 55 | htmls.push(``) 56 | } 57 | htmls.push(` `) 58 | } 59 | div.innerHTML += htmls.join('') 60 | } 61 | 62 | _mk_html(getsets_0, 'getsets_0', 0) 63 | _mk_html(funcs_0, 'funcs_0', 0) 64 | _mk_html(getsets_1, 'getsets_1', 1) 65 | _mk_html(funcs_1, 'funcs_1', 1) 66 | 67 | document.querySelectorAll("input").forEach(function(v){ 68 | if(!v.dataset.key) return 69 | chrome.storage.local.get([v.dataset.key], function (result) { 70 | if (v.type == 'checkbox'){ 71 | v.checked = result[v.dataset.key]; 72 | } 73 | if (v.type == 'text' || v.type == 'password'){ 74 | v.value = result[v.dataset.key] || ''; 75 | } 76 | }) 77 | v.addEventListener("change", function (e) { 78 | if (v.type == 'checkbox'){ 79 | // console.log(e.target.dataset.key, e.target.checked) 80 | chrome.storage.local.set({ 81 | [e.target.dataset.key]: e.target.checked 82 | }) 83 | if (e.target.dataset.key == 'config-pac_proxy'){ 84 | if (e.target.checked){ 85 | chrome.storage.local.get(['config-proxy_config'], function(res){ 86 | if (res['config-proxy_config']){ 87 | set_my_proxy(res['config-proxy_config']) 88 | } 89 | }) 90 | }else{ 91 | set_my_proxy() 92 | } 93 | } 94 | sub_logger() 95 | } 96 | if (v.type == 'text' || v.type == 'password'){ 97 | chrome.storage.local.set({ 98 | [e.target.dataset.key]: e.target.value 99 | }) 100 | } 101 | }) 102 | }) 103 | 104 | function changer(name, index, v){ 105 | if (v.target.dataset.key.indexOf('config-hook-all-') === -1){ 106 | chrome.storage.local.set({ 107 | [v.target.dataset.key]: v.target.checked 108 | }) 109 | return 110 | } 111 | var ck = v.target.checked 112 | var wt = {} 113 | document.querySelectorAll("input").forEach(function(v){ 114 | if (v.className.indexOf(name) !== -1){ 115 | if (+v.getAttribute('vilame') == index){ 116 | v.checked = ck 117 | wt[v.dataset.key] = v.checked 118 | } 119 | } 120 | }) 121 | chrome.storage.local.set(wt) 122 | } 123 | 124 | document.getElementById('getsets_0').addEventListener("change", changer.bind(null, 'getsets_0', 0)) 125 | document.getElementById('funcs_0').addEventListener("change", changer.bind(null, 'funcs_0', 0)) 126 | document.getElementById('getsets_1').addEventListener("change", changer.bind(null, 'getsets_1', 1)) 127 | document.getElementById('funcs_1').addEventListener("change", changer.bind(null, 'funcs_1', 1)) 128 | 129 | var fetch_hook = document.getElementById('fetch_hook'); 130 | chrome.storage.local.get([fetch_hook.dataset.key], function (result) { 131 | fetch_hook.value = result[fetch_hook.dataset.key] || ''; 132 | }) 133 | function change_fetch_hook(v){ console.log('change_fetch_hook') 134 | chrome.storage.local.set({ 135 | [v.target.dataset.key]: v.target.value 136 | }) 137 | } 138 | fetch_hook.addEventListener("input", change_fetch_hook) 139 | fetch_hook.addEventListener("change", change_fetch_hook) 140 | fetch_hook.addEventListener("blur", change_fetch_hook) 141 | var request_hook = document.getElementById('request_hook') 142 | chrome.storage.local.get([request_hook.dataset.key], function (result) { 143 | request_hook.value = result[request_hook.dataset.key] || ''; 144 | }) 145 | function change_request_hook(v){ console.log('change_request_hook') 146 | chrome.storage.local.set({ 147 | [v.target.dataset.key]: v.target.value 148 | }) 149 | } 150 | request_hook.addEventListener("input", change_request_hook) 151 | request_hook.addEventListener("change", change_request_hook) 152 | request_hook.addEventListener("blur", change_request_hook) 153 | var default_code_dyn_change_request = document.getElementById('default_code_dyn_change_request') 154 | default_code_dyn_change_request.addEventListener('click', function(e){ 155 | request_hook.value = 156 | `/* 157 | * 在固定的函数名字里面编写你需要对特定参数修改的处理方式 158 | * 请勿修改下面函数的名字,需要的处理在函数内部处理即可 159 | * change_request 这个函数用于修改 Request 请求中的数据 160 | * 将修改后的值赋值给 config 就可以修改内容 161 | */ 162 | 163 | function change_request(config){ 164 | var { url, method, postData, headers } = config 165 | var new_url = url 166 | var new_method = method 167 | var new_postData = postData 168 | var new_headers = headers 169 | 170 | // do something in here. 171 | if (method == 'POST'){ 172 | console.log('new_postData', new_postData) 173 | config.postData = new_postData 174 | } 175 | }` 176 | request_hook.focus() 177 | }) 178 | 179 | var myinject = document.getElementById('myinject'); 180 | chrome.storage.local.get([myinject.dataset.key], function (result) { 181 | myinject.value = result[myinject.dataset.key] || ''; 182 | }) 183 | myinject.addEventListener("change", function(v){ 184 | chrome.storage.local.set({ 185 | [v.target.dataset.key]: v.target.value 186 | }) 187 | }) 188 | var myinject_2 = document.getElementById('myinject_2'); 189 | chrome.storage.local.get([myinject_2.dataset.key], function (result) { 190 | myinject_2.value = result[myinject_2.dataset.key] || ''; 191 | }) 192 | myinject_2.addEventListener("change", function(v){ 193 | chrome.storage.local.set({ 194 | [v.target.dataset.key]: v.target.value 195 | }) 196 | }) 197 | 198 | var get_now = document.getElementById('get_now'); 199 | get_now.addEventListener("click", function(){ 200 | var show_now = document.getElementById('show_now') 201 | show_now.value = +new Date+'' 202 | chrome.storage.local.set({ 203 | [show_now.dataset.key]: show_now.value 204 | }) 205 | }) 206 | 207 | var cookie_match = document.getElementById('cookie_match'); 208 | cookie_match.addEventListener("click", function(){ 209 | var show_now = document.getElementById('show_now') 210 | show_now.value = +new Date+'' 211 | chrome.storage.local.set({ 212 | [show_now.dataset.key]: show_now.value 213 | }) 214 | }) 215 | 216 | 217 | 218 | function clear_mode(func, is_comment){ 219 | var code = /\{([\w\W]*)\}/.exec(func+'')[1] 220 | if (is_comment){ 221 | code = code.replace(/\/\*\*([\w\W]*?)\*\//, '$1') 222 | } 223 | return code.trim() 224 | } 225 | 226 | var websocket_js = document.getElementById('websocket_js'); 227 | websocket_js.addEventListener("click", function(){ 228 | var code_model = document.getElementById('code_model') 229 | code_model.value = clear_mode(mk_websocket_js_code) 230 | }) 231 | 232 | var websocket_py = document.getElementById('websocket_py'); 233 | websocket_py.addEventListener("click", function(){ 234 | var code_model = document.getElementById('code_model') 235 | code_model.value = clear_mode(mk_websocket_py_code, true) 236 | }) 237 | 238 | var websocket_hook = document.getElementById('websocket_hook'); 239 | websocket_hook.addEventListener("click", function(){ 240 | var code_model = document.getElementById('code_model') 241 | code_model.value = clear_mode(mk_websocket_hook_code) 242 | }) 243 | 244 | var proxy_js = document.getElementById('proxy_js'); 245 | proxy_js.addEventListener("click", function(){ 246 | var code_model = document.getElementById('code_model') 247 | code_model.value = clear_mode(mk_proxy_code) 248 | }) 249 | 250 | var code_model = document.getElementById('code_model') 251 | code_model.ondragover = function(e) { 252 | e.preventDefault(); 253 | } 254 | code_model.ondrop = function(e) { 255 | e.preventDefault(); 256 | var f = e.dataTransfer.files[0]; 257 | var fr = new FileReader(); 258 | fr.readAsDataURL(f); 259 | fr.onload = function(e) { 260 | code_model.value = this.result; 261 | } 262 | } 263 | 264 | var my_code_dec = document.getElementById('my_code_dec') 265 | my_code_dec.ondragover = function(e) { 266 | e.preventDefault(); 267 | } 268 | my_code_dec.ondrop = function(e) { 269 | e.preventDefault(); 270 | var f = e.dataTransfer.files[0]; 271 | var fr = new FileReader(); 272 | fr.readAsText(f); 273 | fr.onload = function(e) { 274 | my_code_dec.value = this.result; 275 | } 276 | } 277 | 278 | var add_script_in_all_document = document.getElementById('add_script_in_all_document'); 279 | add_script_in_all_document.addEventListener("click", function(){ 280 | debug_tab = true 281 | chrome.tabs.query({}, function(tabs) { 282 | for (var i = 0; i < tabs.length; i++) { 283 | if (tabs[i].url.indexOf("chrome") == 0){ 284 | continue 285 | } 286 | attach_tab_debug(tabs[i].id) 287 | } 288 | }); 289 | }) 290 | 291 | var cache_tabid_new = {} 292 | var cache_tabid_att = {} 293 | var debug_tab = false 294 | function attach_tab_debug(tabId){ 295 | cache_tabid_new[tabId] = 1 296 | var tabids = Object.keys(cache_tabid_new) 297 | for (var i = 0; i < tabids.length; i++) { 298 | if (cache_tabid_new[tabids[i]] == 1 && !cache_tabid_att[tabids[i]]){ 299 | cache_tabid_att[tabids[i]] = 1 300 | var currtab = { tabId: +tabids[i] }; 301 | chrome.debugger.attach(currtab, "1.2", function () { 302 | chrome.debugger.sendCommand(currtab, "Page.enable", function(){}); 303 | chrome.debugger.sendCommand(currtab, "Page.addScriptToEvaluateOnNewDocument", { 304 | source: myinject_2.value 305 | }, function(){}); 306 | }); 307 | } 308 | } 309 | } 310 | function attach_tab_debug_update(tabId, changeInfo, tab) { 311 | if (tab.url.indexOf('chrome://') == 0) return 312 | if (!debug_tab) return 313 | attach_tab_debug(tabId) 314 | } 315 | chrome.tabs.onUpdated.addListener(attach_tab_debug_update); 316 | chrome.debugger.onDetach.addListener(function(){ 317 | cache_tabid_new = {} 318 | cache_tabid_att = {} 319 | debug_tab = false 320 | }) 321 | 322 | var proxy_config = document.getElementById('proxy_config') 323 | proxy_config.placeholder = `// 请在第一行输出你使用的 pac 路径例如: 324 | // 1: PROXY 127.0.0.1:8888 325 | // 2: HTTPS hk2.link.ac.cn:152;HTTPS fmt1.link.ac.cn:995 326 | ` 327 | chrome.storage.local.get([proxy_config.dataset.key], function (result) { 328 | proxy_config.value = result[proxy_config.dataset.key] || ''; 329 | }) 330 | function change_proxy_config(v){ console.log('change_proxy_config') 331 | chrome.storage.local.set({ 332 | [v.target.dataset.key]: v.target.value 333 | }) 334 | } 335 | proxy_config.addEventListener("input", change_proxy_config) 336 | proxy_config.addEventListener("change", change_proxy_config) 337 | proxy_config.addEventListener("blur", change_proxy_config) 338 | 339 | var mysec = document.getElementById('my_secret') 340 | var mycode_dec = document.getElementById('my_code_dec') 341 | document.getElementById('myenc').addEventListener('click', function(e){ 342 | try{ 343 | var md5 = CryptoJS.MD5(mysec.value)+'' 344 | var srcs = CryptoJS.enc.Utf8.parse(mycode_dec.value) 345 | var key = CryptoJS.enc.Utf8.parse(md5.slice(0, 16)); //16位 346 | var iv = CryptoJS.enc.Utf8.parse(md5.slice(16)); 347 | var encrypted = CryptoJS.AES.encrypt(srcs, key, { 348 | iv: iv, 349 | mode: CryptoJS.mode.CBC, 350 | padding: CryptoJS.pad.Pkcs7 351 | }).toString() 352 | mycode_dec.value = encrypted 353 | }catch(e){ 354 | mycode_dec.value = e 355 | } 356 | }) 357 | document.getElementById('mydec').addEventListener('click', function(e){ 358 | try{ 359 | var md5 = CryptoJS.MD5(mysec.value)+'' 360 | var key = CryptoJS.enc.Utf8.parse(md5.slice(0, 16)); //16位 361 | var iv = CryptoJS.enc.Utf8.parse(md5.slice(16)); 362 | var decrypted = CryptoJS.AES.decrypt(mycode_dec.value, key, { 363 | iv: iv, 364 | mode: CryptoJS.mode.CBC, 365 | padding: CryptoJS.pad.Pkcs7 366 | }).toString(CryptoJS.enc.Utf8) 367 | mycode_dec.value = decrypted 368 | }catch(e){ 369 | mycode_dec.value = e 370 | } 371 | }) 372 | 373 | function response_changer_init(idname, titlenames, init_data, callback) { 374 | var cid = "#" + idname 375 | var trlast = cid + " tr:last" 376 | var opindex = titlenames.length 377 | var title = "" 378 | for (var i = 0; i < titlenames.length; i++) { 379 | title += "" + titlenames[i].split('|')[0] + "" 380 | } 381 | title += "操作" 382 | title += "" 383 | title += '' 384 | $(cid).html(title) 385 | $($(trlast).find("button")[0]).click(function() { 386 | addRow() 387 | }) 388 | $($(trlast).find("button")[1]).click(function() { 389 | addRow(["baidu.com", "file:///C:/Users/Administrator/Desktop/test.html", "redirect local."]) // 这里的最后一个值不能随意修改 390 | __cache_data() 391 | }) 392 | $($(trlast).find("button")[2]).click(function() { 393 | addRow(["baidu.com", "console.log(123)", "change return data."]) // 这里的最后一个值不能随意修改 394 | __cache_data() 395 | }) 396 | init_data = init_data || [] 397 | for (var i = 0; i < init_data.length; i++) { 398 | addRow(init_data[i]) 399 | } 400 | function __cache_data(){ 401 | var data_list = [] 402 | var trs = $(cid).find("tr") 403 | for (var i = 0; i < trs.length; i++) { 404 | var tds = $(trs[i]).find("td") 405 | var data_line = [] 406 | for (var j = 0; j < tds.length; j++) { 407 | var ipt = $(tds[j]).find("input")[0] 408 | if (ipt){ 409 | data_line.push(ipt.value) 410 | } 411 | } 412 | if (data_line.length){ 413 | data_list.push(data_line) 414 | } 415 | } 416 | while(init_data.length){ init_data.pop() } 417 | while(data_list.length){ init_data.unshift(data_list.pop()) } 418 | callback(init_data) 419 | } 420 | function __add_remover(index){ 421 | $(cid).find("tr").eq(index).find("td").eq(opindex).remove(); 422 | var htmlStr = "" 423 | $(cid).find("tr").eq(index).append(htmlStr) 424 | $(cid).find("tr").eq(index).find("td").find("button").click(function(){ 425 | removeRow(index) 426 | }) 427 | } 428 | function __add_changer(index){ 429 | var tds = $(cid).find("tr").eq(index).find("td") 430 | for (var i = 0; i < tds.length; i++) { 431 | var ipt = $(tds[i]).find("input")[0] 432 | if (ipt){ 433 | $(ipt).on("input", function(){ 434 | __cache_data() 435 | }) 436 | } 437 | } 438 | } 439 | function addRow(data) { 440 | var trArray = $(cid).find("tr"); 441 | var thisIndex = trArray.length - 1; 442 | var addRowHtmlStr = "" 443 | for (var i = 0; i < titlenames.length; i++) { 444 | var [name, style, disabled] = titlenames[i].split('|') 445 | style = style || 'width: 300px' 446 | if (disabled == 'true'){ 447 | disabled = 'disabled="disabled" readonly="readonly"' 448 | }else if (disabled == 'false' || disabled == '' || disabled === undefined){ 449 | disabled = '' 450 | }else { throw Error('not in "true" or "false" string.') } 451 | addRowHtmlStr += `` 452 | } 453 | "" 454 | $(trlast).before(addRowHtmlStr); 455 | __add_changer(thisIndex) 456 | __add_remover(thisIndex) 457 | if (data){ 458 | var ctds = $(cid).find("tr").eq(thisIndex).find("td") 459 | var leng = Math.min(data.length, titlenames.length) 460 | for (var i = 0; i < leng; i++) { 461 | $(ctds[i]).find('input').val(data[i]) 462 | } 463 | } 464 | } 465 | function removeRow(index) { 466 | $(cid).find("tr").eq(index).remove(); 467 | var trArrayNow = $(cid).find("tr"); 468 | for (var i = index; i < trArrayNow.length - 1; i++) { 469 | __add_remover(i) 470 | } 471 | __cache_data() 472 | } 473 | } 474 | 475 | chrome.storage.local.get(["response_changer"], function(res){ 476 | var init_data = JSON.parse(res["response_changer"] || "[]") 477 | localStorage.webRedirect = JSON.stringify(init_data) 478 | response_changer_init("response_changer", ["(URL)字符串匹配", "重定向地址或修改的字符串", "类型|width:120px|true"], init_data, function(data){ 479 | chrome.storage.local.set({ 480 | response_changer: JSON.stringify(data) 481 | }) 482 | localStorage.webRedirect = JSON.stringify(data) 483 | }) 484 | }) 485 | 486 | normal_config.addEventListener("click", function(e){ 487 | // chrome.storage.local.set({ 488 | // 'config-hook-log-toggle': 1, 489 | // }) 490 | var openlist = [ 491 | 'config-hook-global', 492 | 'config-hook-log-toggle', 493 | 'config-hook-log-at', 494 | 'config-hook-cookie', 495 | 'config-hook-cookie-get', 496 | 'config-hook-cookie-set', 497 | 'config-hook-encrypt-normal', 498 | 'config-hook-JSON.parse', 499 | 'config-hook-JSON.stringify', 500 | 'config-hook-decodeURI', 501 | 'config-hook-decodeURIComponent', 502 | 'config-hook-encodeURI', 503 | 'config-hook-encodeURIComponent', 504 | 'config-hook-escape', 505 | 'config-hook-unescape', 506 | 'config-hook-atob', 507 | 'config-hook-btoa', 508 | 'config-hook-domobj', 509 | 'config-hook-domobj-get', 510 | 'config-hook-domobj-set', 511 | 'config-hook-domobj-func', 512 | ] 513 | var setd = {} 514 | setd['config-hook-log-toggle'] = true 515 | document.querySelectorAll("input").forEach(function(v){ 516 | if (openlist.indexOf(v.dataset.key) != -1 517 | || v.className?.indexOf('getsets_0') != -1 518 | || v.className?.indexOf('funcs_0') != -1 519 | || v.className?.indexOf('getsets_1') != -1 520 | || v.className?.indexOf('funcs_1') != -1 521 | ){ 522 | setd[v.dataset.key] = v.checked = true 523 | }else{ 524 | setd[v.dataset.key] = v.checked = false 525 | } 526 | }) 527 | chrome.storage.local.set(setd) 528 | sub_logger() 529 | }) -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 54 | 117 | 118 | 119 | 120 | 123 |
是否挂钩总开关
124 | 127 |
开关输出日志
128 | 131 |
是否注入代码
132 | 135 |
是否替换返回值
136 | 139 |
是否开启pac代理
140 |
141 | 142 | 143 | 144 | 145 | 146 |
147 | 151 |
152 | 153 | 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /popup.js: -------------------------------------------------------------------------------- 1 | document.querySelectorAll("input").forEach(function(v){ 2 | chrome.storage.local.get([v.dataset.key], function (result) { 3 | if (v.type == 'checkbox'){ 4 | v.checked = result[v.dataset.key]; 5 | } 6 | if (v.type == 'text'){ 7 | v.value = result[v.dataset.key] || ''; 8 | } 9 | }) 10 | v.addEventListener("change", function (e) { 11 | if (v.type == 'checkbox'){ 12 | // console.log(e.target.dataset.key, e.target.checked) 13 | if (e.target.dataset.key == 'config-hook-log-toggle'){ 14 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 15 | chrome.tabs.sendMessage(tabs[0].id, {action: {type:'logtoggle', info: 'logtoggle'}}, function(response) {}); 16 | }); 17 | } 18 | if (e.target.dataset.key == 'config-pac_proxy'){ 19 | if (e.target.checked){ 20 | chrome.storage.local.get(['config-proxy_config'], function(res){ 21 | if (res['config-proxy_config']){ 22 | set_my_proxy(res['config-proxy_config']) 23 | } 24 | }) 25 | }else{ 26 | set_my_proxy() 27 | } 28 | } 29 | chrome.storage.local.set({ 30 | [e.target.dataset.key]: e.target.checked 31 | }) 32 | sub_logger() 33 | } 34 | if (v.type == 'text'){ 35 | chrome.storage.local.set({ 36 | [e.target.dataset.key]: e.target.value 37 | }) 38 | } 39 | }) 40 | }) 41 | 42 | document.getElementById('showoptions').addEventListener('click', function(e){ 43 | function closePopup() { 44 | window.close(); 45 | document.body.style.opacity = 0; 46 | setTimeout(function() { history.go(0); }, 300); 47 | } 48 | closePopup() 49 | chrome.tabs.create({ 50 | url: chrome.runtime.getURL('options.html') 51 | }); 52 | }) 53 | 54 | document.getElementById('addlistener').addEventListener('click', function(e){ 55 | var check_list = [ "config-hook-global", "config-hook-domobj", "config-hook-domobj-get", "config-hook-domobj-set", "config-hook-domobj-func" ] 56 | chrome.storage.local.get(check_list, function (result) { 57 | if (!(result["config-hook-global"] && result["config-hook-domobj"] && result["config-hook-domobj-get"] && result["config-hook-domobj-set"] && result["config-hook-domobj-func"])){ 58 | var result = confirm(` 59 | 启用该功能需要让以下四个配置选中: 60 | 1: 是否启用挂钩 DOM 对象的原型的功能调试输出 61 | 2: hook-domobj-显示get输出 62 | 3: hook-domobj-显示set输出 63 | 4: hook-domobj-显示func输出 64 | 65 | 点击 “确认” 会刷新页面并自动选中所需配置, 66 | 然后重新点击 “生成临时环境” 即可生成代码。`); 67 | if(result){ 68 | function make_hook(input, name){ 69 | var ret = ['config-hook-all-'+name] 70 | for (var i = 0; i < input.length; i++) { 71 | var kv = input[i] 72 | var k = kv[0] 73 | var v = kv[1] 74 | ret.push(`config-hook-${k}-${v}`) 75 | } 76 | return ret 77 | } 78 | var all_list = ["config-hook-log-toggle"] 79 | .concat(check_list) 80 | .concat(make_hook(getsets_0, 'getsets_0')) 81 | .concat(make_hook(funcs_0, 'funcs_0')) 82 | .concat(make_hook(getsets_1, 'getsets_1')) 83 | .concat(make_hook(funcs_1, 'funcs_1')) 84 | var config_target = {} 85 | for (var i = 0; i < all_list.length; i++) { 86 | config_target[all_list[i]] = true 87 | } 88 | chrome.storage.local.set(config_target, function(e){ 89 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 90 | chrome.tabs.sendMessage(tabs[0].id, {action: {type:'run_in_page', info: ` 91 | window.open(location, '_self') 92 | `}}, function(response) {}); 93 | }); 94 | sub_logger() 95 | window.close() 96 | }) 97 | // chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 98 | // chrome.tabs.sendMessage(tabs[0].id, {action: {type:'alerterror', info: `123123`}}, function(response) {}); 99 | // }); 100 | } 101 | return 102 | } 103 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 104 | chrome.tabs.sendMessage(tabs[0].id, {action: {type:'addlistener', info: 'addlistener'}}, function(response) {}); 105 | }); 106 | }) 107 | }) 108 | 109 | 110 | document.getElementById('create_high_env').addEventListener('click', function(e){ 111 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 112 | function send(info){ 113 | chrome.tabs.sendMessage(tabs[0].id, {action: {type:'eval', info: info}}, function(response) {}); 114 | } 115 | get_file("./tools/env_maker.js", send) 116 | }); 117 | }) 118 | 119 | get_file("./tools/env_maker.js", function(){}, function(){ 120 | document.getElementById('create_high_env').remove() 121 | }) 122 | 123 | // document.getElementById('logtoggle').addEventListener('click', function(e){ 124 | // chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 125 | // chrome.tabs.sendMessage(tabs[0].id, {action: {type:'logtoggle', info: 'logtoggle'}}, function(response) {}); 126 | // }); 127 | // }) 128 | 129 | const bg = chrome.extension.getBackgroundPage() 130 | var clone_page = document.getElementById('clone_page') 131 | if (clone_page){ 132 | clone_page.addEventListener('click', function(e){ 133 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 134 | var url = tabs[0].url 135 | var html = bg.get_html(url) 136 | if (html){ 137 | var url = URL.createObjectURL(new Blob(html.split(''), {type: 'text/html'})) 138 | chrome.downloads.download({ 139 | url: url, 140 | filename: 'clone_html.html' 141 | }); 142 | }else{ 143 | alert('获取html结构失败,请右键需要拷贝的页面的空白处,选择“打开 html 调试拷贝”。刷新页面后,确保页面资源加载充足后再重新点击“拷贝当前页面”') 144 | } 145 | }); 146 | }) 147 | } 148 | 149 | var update_page = document.getElementById('update_page') 150 | if(update_page){ 151 | update_page.addEventListener('click', function(e){ 152 | function closePopup() { 153 | window.close(); 154 | document.body.style.opacity = 0; 155 | setTimeout(function() { history.go(0); }, 300); 156 | } 157 | closePopup() 158 | chrome.tabs.create({ 159 | url: 'https://github.com/cilame/v_jstools' 160 | }); 161 | }) 162 | } 163 | 164 | document.getElementById('ast_page')?.addEventListener('click', function(){ 165 | var temp = chrome.runtime.getURL('astexplorer_babel.html') 166 | chrome.tabs.create({ 167 | url: temp 168 | }); 169 | 170 | }) 171 | document.getElementById('diff_page')?.addEventListener('click', function(){ 172 | var temp = chrome.runtime.getURL('diff_text.html') 173 | chrome.tabs.create({ 174 | url: temp 175 | }); 176 | }) 177 | -------------------------------------------------------------------------------- /tools/aline_js.js: -------------------------------------------------------------------------------- 1 | eval(function(f){var e,r,n,t,a,w,y,o,s=0,p=0,i={},v="call",b=v.charAt,u=v.charCodeAt,c=v.slice,l=[].join,R=[].push,h=Math.sin,m=JSON.stringify,d=Math.random;function g(){var e,r=[],n=u[v](f,s++);for(e=0;e1<p&&1==i?"":h?(b=C(f,e,a,w,y,s,p,h,v+0),u=C(f,e,a,w,y,s,p,h,v+h),b||u?u?"if("+y+"<"+o[0](28)+"["+(((n[t=r()]=f(h+v))||r)&&t)+"]){"+(v+h>p&&1==i?"":b)+"}else{"+(v+h>p&&1==i?"":u)+"}":v+h>p&&1==i?"":b:""):w[v]?w[v][2]?"if("+w[v][4]+"){"+(f(w[v][2][0])-f(w[v][0])>0?y+"+="+o[0](28)+"["+(((n[t=r()]=f(w[v][2][0])-f(w[v][0]))||r)&&t)+"]":y+"-="+o[0](28)+"["+(((n[t=r()]=f(w[v][0])-f(w[v][2][0]))||r)&&t)+"]")+"}else{"+(f(w[v][2][1])-f(w[v][0])>0?y+"+="+o[0](28)+"["+(((n[t=r()]=f(w[v][2][1])-f(w[v][0]))||r)&&t)+"]":y+"-="+o[0](28)+"["+(((n[t=r()]=f(w[v][0])-f(w[v][2][1]))||r)&&t)+"]")+"}":w[v][4]&&"break"!==w[v][4]&&"continue"!==w[v][4]?"v v v"===w[v][4]?a?"break;":"return;":"return "==w[v][4].slice(0,7)?w[v][4]:(w[v][3]&&(c=w[v][3][0],l=w[v][3][1],R=o[0](28)+"["+(((n[t=r()]=f(s[c][l]+.1))||r)&&t)+"]",w[v][4]=w[v][4].slice(0,-1)+R+")"),w[v][4]+";"+(f(w[v][1])-f(w[v][0])>0?y+"+="+o[0](28)+"["+(((n[t=r()]=f(w[v][1])-f(w[v][0]))||r)&&t)+"]":y+"-="+o[0](28)+"["+(((n[t=r()]=f(w[v][0])-f(w[v][1]))||r)&&t)+"]")):f(w[v][1])-f(w[v][0])>0?y+"+="+o[0](28)+"["+(((n[t=r()]=f(w[v][1])-f(w[v][0]))||r)&&t)+"]":y+"-="+o[0](28)+"["+(((n[t=r()]=f(w[v][0])-f(w[v][1]))||r)&&t)+"]":""}(i,F,S,E,D,a,_,1<"==y?"this":""==y?"null":"o"==y?u[v](f,s++)?"true":"false":"i"==y?((e=u[v](f,s++))||f)&&c[v](f,s,s+=e):""==y?l[v](g(),"+"):"+"==y?u[v](f,s++)?"("+S()+"?"+S()+":"+S()+")":S()+"?"+S()+":"+S():"D"==y?(a=u[v](f,s++))<5?o[0](28)+"["+(((n[t=r()]=w[a]())||r)&&t)+"]":o[0](33)+"("+o[0](28)+"["+(((n[t=r()]=w[a]())||r)&&t)+"])":"~"==y?m(n):void 0}return r=function(){var f,e;function r(){var r,n=[];for(r=0;r<16;r++)n[r]=r;f=function(){var f,r,n;for(f=0;f>f)},function(){var f=t.pop();t.push(t.pop()<=f)},function(){var f=t.pop();t.push(t.pop()|f)},function(){var f=t.pop();t.push(t.pop()>f)},function(){var n=t.pop(),a=f[e++],w=f[e++];0==w?t.push(n,r[0][0],t.pop()?r[0][0][n]:undefined):t.push(w,r[a],t.pop()?r[a][w]:undefined)},function(){var f=t[t.length-1];t[t.length-1]=t[t.length-2],t[t.length-2]=f},function(){t.push(f[e++])},function(){var f=t.pop();t.push(t.pop()/f)},function(){t.push([])},function(){t.push(t.pop()[t.pop()])},function(){t.push(n[t.pop()])},function(){var f=t.pop();t.push(t.pop()^f)},function(){var f=t.pop(),e=t.pop(),r=t.pop();t.pop()[t.pop()]=e,f?t.push(e):t.push(r)},function(){var e=t.pop(),a=t.pop(),w=t.pop();t.push(function y(){var t,o,s=[];for(s.length=w,t=(t=arguments.length)=0;e--)(36==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)&&(n[(1|f)*(r+f)%64]=String.fromCharCode(e),r++);return n}(),r=0,n={},function(t,a){if(t){if(n[t])return n[t];var w=(13*f|1)*(r+++21*f)%262144;return n[t]=a?w:"_$"+e[(w>>12)%64]+e[(w>>6)%64]+e[w%64]}}},function(f,e){return function(r){return 1e5*(r+(3.7+(-4|~f))*h(r)+e)^0}},function(f){return function(e){var r,n,t,a=[];for(r=0;r=0?a[f]:f}}},d,w),S(f)}("Rw\0/\0\0..'Z\0\0\0\0`R?\0\0\0.\0window.\0\baline_js=w\0.}õf159y\0yforEachylengthypushy\tprototypey\btoStringycally[object Array]y[object String]ytypeymapy[object Object]yjoinyindexOfy\x0Bfunction(){y}ypopys[9][y]y(y).sys[s.s](y)()i/^function[^\\()]*\\(([^\\)]+)\\)/yexecysliceys.s(y\tstringifyy,y)y\bfunctionyparamsybodyy\nexpressiony\bargumentyify{yif(ytesty\nconsequenty\talternatey\x0BIfStatementyelse yelseyreturn yparsey\f(s(Function(yK)(),'s',(s[0]={})&&(s[0].value=Function)&&(s[0].configurable=!0)&&s[0]))&&synameysy\bFunctionyObjectyNumberyvalueyobjectyAssignmentExpressiony\bpropertyy\nIdentifiery[y\bcomputedyleftyrighty\boperatory\npropertiesysplity:y&&ykeyy\tfunction(y){ys(y,$start_placeholdery()y!sydfpy\targumentsythisy\fdeclarationsyfilteryinityabandonys[4]yidynormalyassignyfunction_assignyupdateyprefixyunshifty\x0Bexpressionsy5abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$ys.sycalleey&&s[3]ytry{y\ffunction(v){y\rmake_functiony=yconcatynew (y)(y\fForStatementyForInStatementyForOfStatementy?y:s[4]ytryyblockyhandlery\tfinalizeryfinallyyparamycatch(yshiftyreplacey;yVariableDeclarationys[6]y\fArrayPatterny\belementsy!Error ForOfStatement ArrayPatternyError ForOfStatementys(s,y&&s(s[4],s[6]=s[8])&&y\f_pop_breakery);if(s[6]==1){break}if(s[6]==2){continue}}y\r_push_breakeryfor(y ymake_for_in_for_ofyinyofywhile(ydoy\ts.s[s.s]=y\tundefinedys(s[8]=1,s.s[s.s]=1)ys(s[8]=2,s.s[s.s]=1)y\bdebuggerynullyextrayrawyquasisy+yBreakStatementyContinueStatementybreaky\bcontinueyerrorycase y\bdefault:y\bswitch (y\fdiscriminantycasesythrow ytypeofydeleteyvoidyObjectPropertyy\fObjectMethodygety\nenumerabley\fconfigurabley{}ysortyFunctionDeclarationy_mk_block_predefy\rs(s[2].s[0]([y]),s[2].s[1](s[2].s[2])())yminifyycodeylogy\nmini erroryprogramy/*y*/y//ykindyasyncyasync y\tgeneratory\nfunction* y\tfunction ysetymethody\tshorthandy@ylabely\tcontinue;y\tdebugger;y in y of y\ndecoratorsyclass y\nsuperClassy\t extends y\bextends ystaticystatic yexport default y\x0Bdeclarationyexport y\nspecifiersy\bexportedyImportSpecifieryimport y from ysourcey* asylocaly\bimportedy as y...y\rparenthesizedy\ninstanceofy.ytagyquasiySuperynew y`y${y)=>yawait y\bdelegateyyield* yyield y{...yy*\0\0\0.R.\0length-f\01!,var}.Ow\0.@\0,var}.w\0.@\0\b,var}.ww\0.@\0\t\x0B,var}.aw\0.@\0\n,var}.Nw\0.@\0\x0B,var}.?w\0.@\0\f',var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0\0Z 1,\f^*0H&\\.K@P6(\"BL.\0\targuments.q.\0concat.z.4\n,var}.\0}.#\0}.z\b\0R?\0\0\0.z.\0length=.fR?\0.=+\0*\0?.=\0\0.\0\targuments.\0length<...R?\0\0.z.#=\0.\0\targuments.#\bR?\0.#=f\00\b\t*\0.#<.\t\n\bRl\0\0.#++L`V,var}.\nw\0\0\0.F.\0pop\0`G,var}.w\0\0\0.F.\0pop\0}.*\0.Ll\0\0.++}.\0.Ll\0\0.++XRw\0\0\0.4.\0pushw\0\0\0.F.\0pop\0\nRl\0\0._++/`PRw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0&.(#`Rw\0\0\0.F.\0pushM\0!w\0\0\0.F.\0pop\0(,var}.Bw\0\0\0.F.\0pop\0}.w\0\0\0.F.\0pop\0}.fw\0\0\0.F.\0pop\0*RW\0?\0.L=w\0\0\0.L.\0slice.?\0.=f\00M`^R?\0.P=\0.F*\0\0\0.F.\0length-f\01-`4Rw\0\0\0.F.\0push.q` [Rw\0\0\0.F.\0push\0.4w\0\0\0.F.\0pop\0!Q`\"`#>,var}.2w\0\0\0.F.\0pop\0$Rw\0\0\0.F.\0pushB\0w\0\0\0\0.3.\0bind.\0apply.3w\0\0\0\b.\0concat.i\0%`R+\0*\0f\00==.Sw\0\0\0.F.\0push\0\0\0.R.7f\00.Vw\0\0\0.F.\0push\0\0.R.7.S&$Z\0\0.3.\0bind';Rw\0\0\0.F.\0push\0.Ll\0\0.++()\b,var}.l\0.Ll\0\0.++}.9w\0\0\0.F.\0pop\0*`+,var}.<w\0\0\0.F.\0pop\0,`-3,var}.8w\0\0\0.F.\0pop\0.C`/H,var}.w\0\0\0.F.\0pop\00YRW\0?\0\0\0.F.\0length-=.+\0w\0\0\0.F.\0pop\0w\0\0\0.F.\0pushw\0\0\0\0\0w\0.}f0.\0apply.\0callw\0\0\0.F.\0pop\0w\0\0\0.F.\0pop\0.$w\0\0\0.F.\0pushw\0\0\0\0\0w\0.}f1.\0apply.\0callw\0\0\0.F.\0pop\0\0.Ff\00.$1ER?\0.\"=M\0!f\002\f,var}.w\0\0\0.F.\0pop\03:Rw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0+.84_`5K6q\0,var}.qw\0.@\07T,var}.ow\0\0\0.F.\0pop\08@R?\0\0.._=*\0*\0ya[+._+y]9)`:\r`;`<`=\x0B,var}.w\0\0\0.F.\0pop\0>.Rw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0>>.2?=`@AB,var}.w\0\0\0.F.\0pop\0}..\0.Ll\0\0.++B\"R+\0*\0f\00==..?\0\0\0\0.Rf\00f\00.=w\0\0\0.F.\0pop\0?\0\0.F..=w\0\0\0.F.\0pop\0CR?\0\0.F*\0\0\0.F.\0length-f\01+=w\0\0\0.\0String.\0\ffromCharCode*\0f\085^\0.Ll\0\0.++D\tRw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0^.xEI`F,var}.(w\0\0\0.F.\0pop\0G.IRw\0\0\0.F.\0push\b\0JWRw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0*.+KSRw\0\0\0.F.\0pushw\0w\0\0\0.3.\0\x0BconstructoryF,a*\0*\0y\rreturn new F(+w\0\0\0..\0joiny,+y).3.iLJ,var}.+w\0\0\0.F.\0pop\0M?Rw\0\0\0.F.\0pushy\0N%,var}.Vw\0\0\0.F.\0pop\0}.7\0.Ll\0\0.++}.S\0.Ll\0\0.++O1`P `QD,var}.xw\0\0\0.F.\0pop\0R\0`S(T9Rw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0/.oU\nR?\0._=f\00V,Rw\0\0\0.F.\0push*\0w\0\0\0.F.\0pop\0-.\nWA`X]`Y+`ZUR?\0.=\b\0[`\\F`]R?\0.4=\b\0^N`_0,var}.w\0\0\0.F.\0pop\0}.$+\0.w\0\0\0.F.\0sliceM\0-.\b\0``\r(R?\0.=6\0.||f\00%,var}.\tw\0.@\0\"R?\0.\f=\b .-..g.W..m.0.6.H.s.\b.a.J.v.G.w..).\x0B.è.Ó.ú.Æ..N.O.Ã.?.˜.\t.Ÿ.Ý&,var}.w\0.@\0,var}.Ýw\0.@\0$\t,var}.sw\0.@\0\f,var}.Jw\0.@\0,var}.gw\0.@\0\r,var}.vw\0.@\0Rw\0\0.\f\0.Ll\0\0.++\0*,var}.w\0.@\0\b,var}.Gw\0.@\0),var}.úw\0.@\0\n,var}.w\0.@\0,var}.0w\0.@\0#,var}.èw\0.@\0,var}.˜w\0.@\0,var}.Ww\0.@\0 \b,var}.Hw\0.@\0!\x0B,var}.Ãw\0.@\0\"\rM\0!.\"#,var}.Ów\0.@\0$\t\n,var}.\bw\0.@\0%,var}.Ÿw\0.@\0&,var}.)w\0.@\0'\0,var}.-w\0.@\0(\0e.P),var}.Æw\0.@\0*,var}.mw\0.@\0\bƜf\010f\024f\023f\017f\023f\052f\023f\033f\023f\048f\09f\024f\023f\059f\023f\032f\023f\056f\023f\055f\023f\048f\023f\039f\09f\012f\018f\0376f\018f\098f\08f\01f\024f\017f\06f\024f\030f\02f\04f\08f\00f\015f\021f\091f\024f\030f\02f\04f\08f\01f\026f\021f\050f\08f\00f\024f\011f\02f\06f\031f\024f\030f\02f\06f\024f\030f\02f\03f\016f\024f\030f\02f\05f\00f\025f\031f\08f\00f\024f\011f\02f\04f\031f\024f\030f\02f\04f\08f\01f\022f\025f\031f\08f\00f\024f\011f\02f\03f\031f\024f\030f\02f\03f\024f\030f\02f\03f\016f\024f\030f\02f\05f\00f\025f\031f\018f\09f\024f\030f\02f\06f\029f\05f\05f\08f\04f\08f\03f\08f\04f\02f\024f\017f\08f\018f\0127f\024f\030f\02f\03f\024f\030f\02f\04f\016f\024f\030f\01f\04f\00f\029f\05f\05f\08f\02f\08f\02f\08f\0110f\02f\024f\017f\09f\018f\0159f\024f\030f\01f\03f\024f\030f\02f\03f\016f\08f\01f\01f\024f\030f\01f\04f\00f\029f\05f\05f\08f\01f\08f\01f\08f\0139f\02f\024f\017f\010f\018f\0213f\024f\030f\01f\08f\08f\00f\024f\030f\02f\03f\024f\030f\01f\05f\024f\030f\01f\04f\08f\03f\03f\08f\01f\013f\024f\030f\01f\03f\020f\024f\030f\01f\06f\016f\024f\030f\01f\03f\00f\029f\05f\05f\08f\01f\08f\01f\08f\0171f\02f\024f\017f\011f\08f\00f\027f\030f\00f\00f\06f\028f\08f\010f\020f\08f\010f\020f\08f\010f\020f\08f\00f\019f\08f\08f\08f\08f\016f\08f\02f\016f\08f\01f\013f\026f\024f\017f\012f\024f\030f\01f\012f\014f\021f\0283f\024f\030f\01f\011f\08f\00f\024f\030f\01f\07f\08f\01f\03f\024f\017f\013f\018f\0330f\024f\030f\01f\011f\08f\00f\024f\030f\01f\09f\08f\00f\024f\030f\01f\010f\08f\00f\08f\010f\024f\030f\01f\012f\01f\08f\01f\03f\024f\030f\01f\07f\08f\02f\03f\08f\01f\03f\08f\02f\020f\08f\00f\019f\024f\017f\013f\018f\0366f\024f\030f\02f\03f\07f\08f\01f\027f\04f\021f\0359f\024f\030f\02f\03f\024f\030f\01f\013f\020f\08f\077f\013f\029f\05f\018f\0365f\024f\030f\02f\03f\029f\05f\05f\08f\01f\08f\01f\08f\0332f\02f\029f\05f\05f\08f\012f\08f\05f\08f\02f\02f\029f\05f\05D\0DDDD,var}.}/\0\0\0ù.Ʀ.Ƿ.ƻ.NJ.Ơ.ƺ.ǣ.ǵ.ƍ.ǐ.Ƥ.ǰ.DŽ.Ɵ.DZ.Ǭ.ǝ.Ʒ.ƥ.Dz.Ƕ.ƈ.Ƭ.ž.ǖ.ƣ.ƒ.ƽ.Ʊ.Ɠ.Ƴ.ƫ.Ʃ.Ƙ.Ǖ.ǒ.ǃ.Ǝ.LJ.Ɖ.Ɨ.ǥ.ƞ.Ƶ.ǫ.ơ.ǯ.Ƽ.lj.ǡ.Ʋ.Ǫ.Ǚ.ǔ.ư.Ƨ.Ǹ.ǩ.Ə.Ǵ.Ƒ.ǚ.Ƅ.Ǻ.Ž.Ǎ.Ɲ.Ɩ.Ǘ.ƾ.dz.ƃ.ǻ.Ǥ.ſ.ǭ.ǟ.Ƃ.Ǧ.Ɔ.Ɣ.ƹ.ƀ.ǁ.ƨ.ǂ.ƛ.ƭ.ƪ.Ǔ.Ɓ.Ǜ.Ǒ.Ɯ.Ǣ.Ǩ.Ǟ.ƿ.ǜ.ƅ.ƴ.ƙ.nj.Dž.Ǯ.ƕ.ǧ.ǹ.ƚ.ǘ.ǀ.dž.Ƣ.Ʈ.Ɛ.Ƈ.ǎ.Ƌ.Ǡ.Ƹ.ƶ.Ư.ƌ.Ⱥ.ȩ.ɝ.ȫ.ɏ.ȝ.ɱ.ɮ.Ȓ.ɨ.ȅ.ɒ.ȭ.ȿ.Ɂ.ɖ.Ȃ.ȗ.Ȇ.ɞ.ɵ.ɸ.Ȋ.ɕ.ȸ.ɤ.ɺ.ȁ.ɋ.ɇ.ȇ.ɐ.ɔ.ǿ.ȶ.Ȣ.ș.ɳ.ȉ.ț.Ȕ.ɭ.ȏ.ȕ.ɡ.Ȯ.ɶ.ȍ.ə.ɑ.ɧ.ɘ.ɣ.Ȱ.ǽ.ɪ.Ȍ.ȧ.Ȅ.ɠ.Ƚ.ɍ.ȴ.Ȉ.Ɇ.ɓ.Ɉ.ɴ.ɷ.Ț.ɟ.Ʉ.ɹ.Ʌ.Ȥ.ɥ.Ɏ.ɫ.ɢ.Ȼ.Ȳ.ɦ.Ǽ.ȃ.Ƀ.ȳ.Ɋ.ɯ.Ȑ.Ȧ.ȑ.ɚ.ɗ.Ș.ȓ.Ȩ.ɰ.ȥ.Ȭ.Ȫ.ȵ.ɜ.ȼ.ȹ.ɂ.ɛ.ȋ.ɉ.Ǿ.ȯ.Ɍ.Ȗ.ɲ.Ȁ.ȷ.Ȏ.ȟ.Ⱦ.Ȝ.ȣ.ȡ.ɩ.ȱ.Ȟ.ɀ.ȠZ\0\0\0\0e.ɬf\0,var}.ɬw\0.@\0,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ʆ.ʽ.˜.ʭZfÒÒ\0\0Έ˰ƌ!,var}.ʣw\0.@\0ɷBiƑ*\0.Ʀ==f138ŀ¦\bLJ\tǘ\nǑ\x0B¯ˢ*\0.Ʀ==f0\fɰ\r͂e\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJ.Ơ\0.ʆ.ƺɱȳɓe\0\0.ʆ.Ƿ.ƻ˸ɐĉĠ5Ǡe\b.Ƿ\0.ʆ.ƻ.NJ͘bŒ*\0.Ʀ==f113ʽ͍˱źʇ͐ ̗e\b.Ƿ\0.ʆ.ƻ!ƍż*\0.Ʀ==f111\"Șe\b.Ƿ\0.ʆ.ƻ\0.ʆ.NJ+\0\0.ʆ.Ơ.ƺ.ǣ6\0\0.ʆ.Ơ||.ǣ#ƋRw\0.ɿ.ʆ$%Š&wœ*\0.Ʀ==f125'ɧe.ʍ(²)ǐe\b.˃\0.ʆ.ƍ.ː*:+ɇ,ǟ-f.Ȭ}*\0.Ʀ==f54/ʆ0Ĭ1̻2˲e\b\0.ʆ.Ƿ\0.ʆ.ƻ\0.ʆ.NJ3Ƙ4ƿew\0\0.\0t.ǣ.NJ5˷˓*\0.Ʀ==f1316›7ù8ƒ9ħe\0.ʆ.Ƿ:Ȧ;˃<ĺ·*\0.Ʀ==f126=Í,var}.˓\b\0>˞e\b.˃\0.ʆ.ǵ.ː?ɞɀ*\0.Ʀ==f26@§Aɴ!,var}.ʵw\0.@\0BɶCΆDłE˹e\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJFWe\b\0.ʆ.ǷGǞe\b*\0\0.ʆ.Ƿ+.ƻ\0.ʆ.NJHɚ!\r,var}.ʦw\0.@\0I̙J‹KƗLǩe\b.Ƿ\0.ʆ.ƻ.NJM͔e\b\0.ʆ.ƻ+\0*\0\0.ʆ.ƻ==.NJ.Ơ.ƺ\0.ʆ.ǣNƪOɤPȶe\b\0.ʆ.Ƿ\0.ʆ.ƻ\0.ʆ.NJQǹ!\0,var}.ˬw\0.@\0R˻STɫ*\0.Ʀ==f87UłVŕ,var}.ʅ.˝WƲX\0`YɛZčè*\0.Ʀ==f29[Ň\\j]ñ!\b,var}.˲w\0.@\0^_ǁƝ*\0.Ʀ==f28`īa͈bɆc̯dƹeÉfʭgƨhɎɲ*\0.Ʀ==f53i•jȝkǿląmȖRw\0\0.ʍ.NJ.˜n̞oǶ!\n,var}.ʙw\0.@\0pıʖ*\0.Ʀ==f34qm\n.˜r˻s̹tÈuŋv]!,var}.ˇw\0.@\0ẘx§yČzT{Ȓɿ*\0.Ʀ==f116|`e.Ƿ}N~ƚ€ś,var}.˞f\01Έe\b\0.ʆ.ƻ.NJ‚Ȃe\b\0.ʆ.ǷƒŤ„‰t*\0.Ʀ==f30…ɏ,var}.ˢ.ʮ†Ͱ‡òˆ͞ˊ*\0.Ʀ==f127‰ǎe\b.Ƿ\0.ʆ.ƻ.NJŠƩ‹ǖŒƅ*\0.Ʀ==f154ǻŽ͋?ke.Ƿ‘Ƙ’ɳ“Ɖ”ĸ•Ǘ–ţe.Ƿ—g˜˧˪\0.ʆ.Ƿ™ǥe\b\0.ʆ.Ƿš¹,var}.ʍ\b\0›ʼœÐ4žâŸƠ \"̅*\0.Ʀ==f52¡ɰ¢ȟ!,var}.ʼw\0.@\0£¤ǴRw\0\0.ʍ.Ƿ.ƻ¥Ĭ¦Ļ§Ķ¨æe*\0\0.ʆ.Ƿ!==.ƻ©Êª,«̫R?\0.ˌ=w\0\0.ˌ.Ƈ.ȟw\0\0.\0\ttail_body.ƒf\08M\0-f\01¬ą­Ȇ®ˡ¯ľ°ūe\0\0.ʆ.Ƿ.ƻ±²͇³ɉŨ*\0\0\0.ʆ.Ƿ.ƻ==.NJ´ȿë*\0.Ʀ==f46µŊ¶ʓe.ˌ·ʽ¸ʞ¹̓Ŏ.˜ºɽe\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJ»ſR?\0.\0a=w\0\0.Ƿ.ƻ.NJ¼ď½ĈĪ*\0.Ʀ==f67¾¿ȡ*\0.Ʀ==f21¿Òe*\0.Ƿ+\0.ʆ.ƻÀ˛!,var}.ʠw\0.@\0Á̮ÂƾÃdÄéͬ*\0.Ʀ==f84ÅĜ~*\0.Ʀ==f145Æ+Ç1e\b.Ƿ\0.ʆ.ƻÈʅÉŜŰ*\0.Ʀ==f134Ê͌ËȕÌʜR?\0\0.\0Math.Ⱦ=w\0w\0.}f155.Ȝ.ȣ.ȡf\0123Íͨ,var}.˅\b\0Îʥe\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.ƠÏ̀Ðʊȃ*\0.Ʀ==f91ÑɝÒdzÓQ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.̲.͡Z! ŒÆ Yc«µ€mŸ˜¬|¸ä‡{åìÌѰ¤=S,?dUŒ\0\0î_8,var}.͍w\0.@\0U8,var}.ͱw\0.@\0l.ʘ\f8,var}.̀w\0.@\0-e\b.Ǝw\0.˦\0.̲.Ž.Ɠ.ǝw·r,var}.ͦw\0.@\0\bBCM\0!.͡\tÂ\n²R?\0.ʘ=o\0\x0B08\n,var}.̱w\0.@\0\f(8,var}.̋w\0.@\0\rWHM\0!.̤͡³!J\0,var}.ͯw\0.@\0~µ,var}.̚*\0*\0.ƥ+.ʕ+.Dzse.̲NÍe\b.Ȼ+\0\0.̲.Ȳw\0.˦\0.̲.Ȳ.Ƿ6\0\0.̲.ɢ||.Ƿ.ǎÕ\r,var}.ʾw\0\0.ʳ.DZ.̲m8,var}.̻w\0.@\0’[q*\0.͡<*\0\0.ʆ.Ƿ-f\01”O\0.̲.ȈJ,var}.̜\0.͢f\01‹*\0w\0\0\0\0.\0Object.ƺ.ǣ.ǵ.̲===.ǐ ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.̇ZJ\0\0\x0B\new\0.˰.̇\0e.̇ew\0.˰.̇\x0B*\0w\0\0\0\0.\0Object.ƺ.ǣ.ǵ.̇===.ƍ\x0B\b*\0w\0\0\0\0.\0Object.ƺ.ǣ.ǵ.̇===.DŽ\t\n\x0B\t!î*\0w\0\0\0\0.\0Object.ƺ.ǣ.ǵ.̲===.ƍ\"’#™`$œ,var}.ʨw\0.ˋw\0.˰w\0\0.\0parser.ǯ.ʏo%*& e.ͩ'µ(28 ,var}.̍w\0.@\0)¬e.͉*­e.̲+',var}.̆*\0*\0.ƽ+w\0\0.\0JSON.Ʊ.̃+.Ƴ,¢R?\0.˖=c\n1\0.\0\nIdentifier.͜1\0.\0\rStringLiteral.ͫ1\0yMemberExpression.ͦ1\0yLogicalExpressionw\0.}\bf8.ǚ.Ƥ.Ǹ.Ƕ.Ƴ.Ƅ.Ǻ1\0.\0ObjectExpression.͏1\0.\0\bPropertyw\0.}f9.Ǘ.Ɲ.ư1\0yExpressionStatementw\0.}f10.Ǖ1\0yReturnStatementw\0.}f11.ơ.ǒ.Ƿ1\0yFunctionExpression.̪1\0yProgram.͖-@e\b+\0\0.̲.Ȍ.ȧ.Ƿ\0.̲.Ǘ.Ƕw\0.˦\0.̲.Ʃ.Ɠ.Ƴ\0.̲.Ƙ.Ì/ƒRw\0\0.˓.Ơ.̚0¸8\x0B,var}.̶w\0.@\01u\r\0,var}.͊w\0.@\02…8!,var}.̟w\0.@\03p,var}.̥w\0.˘.̲4?7,var}.͛w\0.@\05¶`6 `7Ï8,var}.̴w\0.@\08^9Te\b.ȥ\0.̲.Ɯ.Ƕw\0.˦\0.̲.ǟ.Ɠ.Ƴ?D7,var}.̧w\0.@\0@ee\b+\0\0.̲.Ȍ.ȧ.Ƿ.Ƕw\0.˦\0.̲.Ʃ.Ɠ.ȵ\0.̲.ƘA`BÓe*\0*\0.Ƭ+.̚+.žCÁe.̚DxR?\0.ʘ=oEMR?\0.˖=c/1\0yVariableDeclaration.̽1\0yVariableDeclarator.̼1\0y\nIdentifier.̏1\0yUpdateExpression.̻1\0yExpressionStatementw\0.}f13.Ǖ1\0yAssignmentExpression.̓1\0ySequenceExpression.̺1\0y\rmake_function.͋1\0yFunctionDeclaration.̬1\0yFunctionExpression.˺1\0yCallExpression.͝1\0y\rNewExpression.̱1\0yThisExpression.̶1\0yMemberExpression.͑1\0y\x0BIfStatement.̘1\0y\fTryStatement.͍1\0y\x0BCatchClause.̂1\0y\r_push_breaker.ͣ1\0y\f_pop_breaker.ͨ1\0ymake_for_in_for_of.́1\0yForInStatement.̅1\0yForOfStatement.̷1\0yWhileStatement.͕1\0yDoWhileStatement.̰1\0y\fForStatement.͟1\0yConditionalExpressionw\0.}\bf15.Ƕ.Ɖ.ƕ.Ɨ.Ɲ.ǥ.Ƴ1\0yReturnStatementw\0.}f16.ȭ.ǒ.ȿ1\0yBreakStatementw\0.}f17.Ɂ1\0yContinueStatementw\0.}f18.ɖ1\0yDebuggerStatementw\0.}f19.Ȃ1\0y\x0BNullLiteralw\0.}f20.ȗ1\0yBooleanLiteralw\0.}f21.Ƿ.ư1\0y\rStringLiteral.̴1\0yNumericLiteralw\0.}f22.ư1\0y\rRegExpLiteralw\0.}f23.Ȇ.ɞ1\0yTemplateElement.Ͱ1\0yTemplateLiteral.̫1\0yLogicalExpressionw\0.}\tf24.ǚ.Ƥ.Ǹ.Ƕ.Ƴ.Ƅ.Ə.Ǻ1\0y\nSwitchCase.ͱ1\0ySwitchStatement.͌1\0yThrowStatement.̊1\0yUnaryExpression.̀1\0.\0ObjectExpression.̋1\0yEmptyStatementw\0.}f25.Ʋ1\0y_mk_block_predef.̍1\0yProgram.̟1\0yBlockStatement.̤F%G+,var}.̃w\0\0\0.˓.͐.ƒf\011M\0-f\01Ha,var}.͉ys(***\0.ʾ-.˞<1?function() {\n return function() {}\n }:function v(s){return s}\n },\n set:function (v){\n s[!s] = v\n },\n configurable:true, \n })\n s[2] = [] // 用于保存环境堆栈\n // s[2].s = (function(){}).s\n ;s.dfp(Function.prototype, 's', {\n get:function (){\n return s[.̸y](this,.ʬy\f,((s[3]=[])[.ʁy]=s[.ͭy][.̾yڅ]())&&s[3])\n },\n configurable:true, \n })\n s[7] = [] // 用于保存字典定义的堆栈\n\n ;s.dfp(Number.prototype, 's', {\n get:function (){\n return s[9][~this]\n },\n configurable:true, \n })\n ;s.dfp(Number.prototype, 0, {\n value: [],\n configurable:true, \n })\n ;s.dfp(Number.prototype, 1, {\n set: function(v) {\n this[0].push(v)\n },\n configurable:true, \n })\n ;s.dfp(Number.prototype, 2, {\n get: function() {\n return (0)[this - 1].splice(0)\n },\n configurable:true, \n })\n\n s[2].s = [\n function(v) {\n v.map(function(v){\n (0)[1] = s[7].s[1](Number.call.bind(v.s, 0))\n })\n },\n function(v) {\n return Number.call.bind(v, 0, (1)[2])\n },\n function(v){\n while (v.length)\n v.shift()()()\n },\n ].map(function(v){\n return Number.call.bind(v,0)\n })\n\n s[7].s = [\n function(v){\n return s[s.s]((v).s)\n },\n function(v) {\n return Number.call.bind(s[7].s[0], 0, v)\n },\n ].map(function(v){\n return Number.call.bind(v,0)\n })\n\n s.dfp(s, 8, {\n get:function (){\n return s.s[0][0][0]\n },\n set:function (v){\n s.s[0][0][0] = v\n },\n configurable:true, \n })\n Y¨Z1,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.̉Z\r\0\0\0`R?\0.ͩ+=w\0.˰.̉[–Rw\0\0.ʍ.NJ.ʽ\\X,var}.̮w\0.ʅ.Ƃ]y^,var}.ʕw\0\0.˓.DZ.̚_†8,var}.̂w\0.@\0`ª8,var}.̅w\0.@\0aábcr,var}.ͫw\0.@\0d—â*\0w\0\0.ʳ.DZ.̲==M\0-f\01eVe\b\0.̲.ɟ+\0\0.̲.ɥ.Ɏ.Ƿ+\x006\0*\0\0.̲.ɪ===.ȴ&&\0\0.̲.ư.Ȍ.ȧ.Ƿ\0.̲.Ǘw\0\0w\0.˰\0.̲.ư.Ƈ.ƫ.Ƿf×:\0.̲.ȴg8\r,var}.̘w\0.@\0hwiAjÀ8,var}.͕w\0.@\0k.e.Ƿlh,var}.̚*\0*\0.Ƕ+M\0~.ʕ+.ƈm8,var}.̓w\0.@\0no,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.̖Zr# \0\0*!e.͒$`*\0\0.̖.ǡ==.Ʋ *\0\0\0.̖.Ƨ.Ƥ==.Ǹ#&,var}.̈́w\0.ʅ\0.̖.ư\b\r*\0\0\0.̖.ǩ.Ƥ==.Ə\t,var}.ͮ*\0w\0.ˋ*\0*\0.Ǭ+w\0.˰.̞+.ǝo+.Ǥ\n,var}.̦ys(.͙y)\x0B\f#\r*e.Ʋ\b,var}.͒w\0.ˋ*\0*\0*\0*\0.ƾ+w\0.˰w\0.˦\0.̖.Ʃ.Ɠ+.dz+w\0\0w\0.˰\0.̖.Ƙ.ƒf\01M\0-f\01+.ǝo%e\b.̈.Ǵw\0.ʅw\0.˰\0.̖.ǩ.Dz\0e.ͮ',var}.̈\0.̖.Ƨe\0.̖.ǡ*\0w\0\0\b.Ǫ.Ǚ.ǔ.DZ\0.̖.ǡ!==M\0-f\01(\0.̖.Ƒ)R?\0.̝=*\0w\0\0.̝.Ɵ.Ɩ+y&&s[3]\"$\0,var}.̙w\0.@\0\x0Be.̦\n,var}.͙w\0.ʅ\0.̖.ǡ ,var}.̈\b.Ƕ\0.̖.Ƨ.Ƴ!\t,var}.̞\b.ƃw\0.˦\0.̖.Ƙ.Ɠ.ǻ.Ƴ\",var}.̝w\0\0\0.̖.Ž.ǰ.̙#$,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.̔.̡Z$\0\0\0\0,var}.ͪw\0\0w\0.˰.̔.Ǎ.Ɲ\0e.϶,var}.϶*\0+*\0.̡==f\00y\n((s[3]=[])y(s[3]+y[w.ʅ\0.ͪf\00y]=w\0w\0\0.ͪ.ƒf\01.Ɵ.Ɲy)%&e.̈́'(\fe\b.̈.Ǵ\0.̖.ǩ.Dz)e\b.̝*'ocr\0,var}.͜w\0.@\0pÖ*\0\0.̥.ə===.\0\tundefinedqrKsÕt¿,var}.͘\b\0uÅ,var}.ͩ.Ƿvzw\bxÛR?\0.˖=c1\0yFunctionDeclaration.δ1\0yExpressionStatementw\0.}f3.Ǖ1\0yThrowStatement.͛1\0yBlockStatementw\0.}f4.ǃ.Ǝ.Ƙ.ǝ1\0y\x0BIfStatement.̧1\0yReturnStatementw\0.}f5.ơ.ǒ.Ƿy´z{É8\b,var}.˺w\0.@\0|æe\b.ȝw\0\0w\0.˰\0.̲.ǚ.Ƈ.ǎ.Ƿ.Ț\0.̲.Ƅ.Ƴ\0.̲.Ƙ}¹e\b+\0\0.̲.Ȍ.ȧ.Ƿ+\0\0.̲.Ȅ.ɠ.Ƚ\0.̲.ǁ.Ƕw\0.˦\0.̲.Ʃ.Ɠ.Ƴ\0.̲.Ƙ~åe\b\0.̲.Ǘ.Ɲ\0.̲.ư½8,var}.̺w\0.@\0€rRw\0\0.ʸ.Ơ.̆ã,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.όZ7\0\0\0\0e\b.LJ\0.ό.Ɖ.Ƴw\0.˰\0.ό.Ɨ.ǃ+\0\0.ό.ǥ\b+\0*\0\0\0.ό.ǥ.Ƥ===.ƞ.Ƶ.ǫ\0.ό.ǥ.Ƿe\b.ƫ.Ƕw\0.˦\0.ό.Ʃ.Ɠ.Ƴw\0.˰\0.ό.Ƙ.ƫ,var}.Ϥy\0.ϔy(w.˰\0.ό.ǒy)e.Ϥ,var}.ϔw\0.ˋyfunction(s){throw s}o‚8,var}.̏w\0.@\0ƒ„R?\0.˓=.ʸ…E8\",var}.̤w\0.@\0†Ü8,var}.ͣw\0.@\0‡78,var}.͟w\0.@\0ˆ|e\b.ȝw\0\0w\0.˰\0.̲.ǚ.Ƈ.ǎ.Ƿ.ɷ\0.̲.Ƅ.Ƴ\0.̲.Ƙ‰=e.ΦŠß‹k*\0.̲===Œºe\b*\0\0.̲.ɪ+.ɱ\0.̲.Ǘw\0\0w\0.˰\0.̲.ư.Ƈ.ƫ.ǷRw\0\0.ʍ.NJ.̲Ž8,var}.̫w\0.@\0iëRw\0\0.\0console.ɑ.ɧ.̲‘Òe\b.ȃ+\0\0\0.̲.Ȳ.NJ\b.͘+\0\0.͔.NJ\b+\0*\0\0.͘.NJ>f\00.Ɠ.Ƿ.Ǝw\0.˦.͔.Ɠ.ǝ.Ƿ.Ƀ.Ƿ\0.̲.ȳ.ǎ’è“‘Rw\0\0\0.̲.Ȳ.ƻ.˻”be\b\0.̲.ư•–—Rw\0\0.ʳ.Ơ.̲˜\tR?\0.\0title=*\0*\0.Ƽ+w\0\0.\0JSON.Ʊ*\0.ơ+.\0title+.lj™3,var}.̥w\0\0.\0\bUglifyJS.ȍ.̲c1\0.\0\bcompressc1\0.\0\rdrop_debuggero\x001\0.\0\nhoist_varso1\0.\0\nhoist_funso1\0.\0outputc1\0.\0\bbeautifyoš¦/\0.˅.NJ›Î,var}.̾w\0.ʅ.ƒœì,var}.˹w\0.ˋw\0.˰w\0\0.\0parser.ǯ.ʔoÂžÝ,var}.ϋw\0\0.Φ.ǰ.ͯŸ¼,var}.΋w\0.ˋyfunction(s){throw s}o Ê,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.Π.έZ8#FdvBēĔÓ­jÕ*!¦#sÀVĈ$Ç@ÆZĕä+©7 ]UF\0\0ĭ\"e\b.ƃ.ϐ.Ƴl,var}.ϟw\0.ʅ.ǟĄR?\0.Λ=ys[s.s](.Λy)()Š,var}.ψ\bw\0\0.˖.ɏ\0|Rw\0\0.ͼ.Ơw\0.˰\0\0.Π.ɵ\0\0.Π.Ɓ.NJĬ,var}.Ϋ.ϣ‘e\b\n.Ʈw\0.˰\0.Π.Ƣ.ƨ.Ƴ.Ǝ.ƃys.s[w.ʅ.Ϙy]=.Ϙy\0.Ɠw\0.˰\0.Π.Ƙ.Ƴ.ǝ\bˆ,var}.ͻ\b\0\tÌ\nĒRw\0\0.Θ.Ǔ.Ƕ\x0Bj\0,var}.ϣw\0.@\0\fÚã*\0\0\0.Ϫ.ǁ.Ƥ==.Ə\rĜR?\0.ύ=*\0*\0.ƃ+.ύ+.ƳN\0,var}.ϩw\0.@\0\b\0,var}.Γw\0.@\0Ħ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ς.ΗZb\0\0Rw\0\0.ͼ.Ơw\0.˰.ς\0`Rw\0\0.ͼ.Ơw\0.˰\0\0.Π.ɵ.Η:Ò*\0.έ==.ƭÓ,var}.Μf\00Ø,var}.Ώw\0.ʅ.ƒçN,var}.Ζw\0.@\0>R?\0.Ϯ=*\0*\0.Ǩ+.Ϯ+y}catch(e){throw s[.ρy]=s[2][.Κy](),e}Z,var}.ͽ\b\0ER?\0.ϕ=w\0.ˋ.ϕ,var}.ρ.ſzRw\0\0\0.Π.Ƙ.Ǔ*\0*\0.ƃ+.Ε+.Ƴ„DS,var}.Δw\0.ˋ.ϱoLRl\0\0.˞++x,var}.αw\0.˰\0.Π.Ƙ.ƫ 1!÷\"Œ,var}.Ι\0.Π.Ƨ#Ü,var}.Ϧw\0.ʅ.Ơ$Â,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.νZ&\0\0\0\0\0ew\0.˰.ν%Èew\0\0.˖.ɮ.Π.ɨ&ì'Ñ,var}.Ϣc\0(4R?\0.Ι=*\0*\0.Ƕ+w\0.˰.Ι+.Ƴ)ì*ÆRw\0\0.ξ.Ơy\ns.s=[s[6],.Ξy]+,var}.ϐw\0.ʅ.Ƃ,¼,var}.Ϊ\b.ɔ\0.Π.ǒ-^e.Π.Ï/…e.Ά0µR?\0.ϗ=*\0*\0.Ƕ+w\0.˰.ϗ+.Ƴ12­,var}.ϱw\0.˰.Π3$e\b\0.Π.Ɖ.ƕ.Ί+\0.ϰ\b+\0*\0\0.ϰ.Ƥ===.ƞ.Ɲ.Ɲ.ϰ.ǧ4Ì5¦e*\0*\0.Ƕ+w\0\0.ͼ.Ɵ.ɸ+.Ƴ6I*\0\0\0.Π.Ƙ.NJ==f\007þR?\0.ϗ=w\0.˰.ϗ.ƭ8Ğ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ϻ.жZC\0\0,var}.ѣw\0.ʅ.Ȕ\f\x0B,var}.ёw\0.ʅ.ț\tR?\0.ѥ=w\0.˰\0.ϻ.Ǘ*\0\0.ϻ.Ƥ==.ɳ\b,var}.Ћw\0.˰\0.ϻ.ư\t\n,var}.Тw\0.ʅ.ȉ\x0B\f\x0B\rM\0!\0.ϻ.Ƒ,var}.К*\0+*\0.ж==f\00y((s[7][.Ψy]({})&&s[7][0])y\b(s[7][0]+y[.ѥy]=.Ћy)R?\0.ѥ=w\0.˰\0.ϻ.Ǘ.Ƒ,var}.К*\0+*\0.ж==f\00y(s[.Ќy\b]((s[7][.Ψy]({})&&s[7][0]),y(s[.Ќy\n](s[7][0],+\x0By\0.ѥy\f,((s[5]={})[.Тy]=.Ћy\t)&&(s[5][.ёy\f]=1)&&(s[5][.ѣy\f]=1)&&s[5]))\r,var}.ѥ\0}.Ћ\0\b*\0\0.ϻ.Ƥ==.ș\n,var}.Ќw\0.ʅ.ǭ,var}.Ћw\0.˰w\0\0.˖.ƿc1\0.\0params\b\x001\0.\0bodyw\0.˰\0.ϻ.Ƙ\0e.К93,var}.ϰw\0.Ϋ\0.Π.ǥ:õe\bys(.г.Ɠ.Ʋy)y[.гy];m<Ă=2R?\0.˖=c\0>’,var}.χ\by\nfunction().Ǝ.Ϯ.ǝ?[ew\0.ˋ.Х@o¥\0.Ь.NJAÇe\b\b*\0w\0\0.˖.ɏ\0+.ǎ.ɒ.Ǝ\0.Π.Ƙ.ǝ.ȅ\bw\0\0.˖.ɝ\0.Ƕ\0.Π.Ɖ.Ƴ.ƳB»CЍ\0.Π.ƪDŽ,var}.вw\0\0\bw\0.˰\0.Π.ǁ.ƛ.ǜ.ƅ.ΔE,e.ϕFğGŸ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.оZ\0\0\0\0\0ew\0.˰.оHb,var}.Х\b\b.ȝ*\0*\0.ƃ+.ψ+.Ƴ.ǎ\bw\0\0.˖.ɝ\0.Ƕ6\0\0.Π.Ɖ||.Ʋ.Ƴ.ǎ6\0\0.Π.ƭ||.Ƿ.Ƴ\0.Π.ƘIĀe.ƲJ‚,var}.я*\0*\0*\0*\0.Ⱥ+.ξ+.Ƴ+.Ɩ+w\0.˰\0.Π.ƘKħe.ƀLUM-Rw\0\0\0.Π.Ƙ.ȏw\0.}f26.Ƥ.ȕNªe.ΪOå`PĆ,var}.ϯ\0.Π.ǦQæ½\0.ͻ.NJRÎ,var}.Ϛ*\0*\0*\0y\f,s[3]=s.s[1]+y,s[.ρy]=s[2][.Κy]()+y)+.ǢSTvUޓ*\0.έ==.ƑVº,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.БZu\0\0\0\0\0ew\0.ˋw\0.˰.БWą,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.м.кZ\0\0\b\b*\0\0.м.Ƥ!=.Ə,var}.ϼw\0.ʅ\0.м.ǡRw\0\0.ξ.Ơy\ns.s=[s[6][.кy],.ϼy]\0`\bC.ƯXžRw\0\0.Ϩ.Ơw\0\0\0.Ѫ.Μ.ƒf\08M\0-f\06YĤe\bys.s=[w\0.˰\0.Π.ǁ.Ƒy]Z,var}.їw\0\0\0.Π.Ʃ.ǰ.Ш[Ėew\0.ʅ\0.Π.ư\\ð!*\0\0.ϯ.NJ>f\01]dĨ*\0\0.Ѫ.NJ==f\01^öRw\0\0.˖.ɡ.Π_R,var}.α*\0+\0\0.Π.Ʃ.NJ*\0.Ɠ+.ї.ї+.α`úab´R?\0.Х=w\0\0.Х.ǰ.Ѱcá,var}.гw\0.ʅ\0.Π.ǡdĪe\b.ѪeY.*\0\0.Π.Ɣ===fėgăhTRw\0\0\0\0.Ϫ.ǁ.ƶ.ǰ.ѭi¸,var}.ϸw\0.@\0j1kÖe\b\0.Π.Ɯ.Ƕw\0.˦\0.Π.ǟ.Ɠ.ƳlĎ,var}.уw\0.ʅ.ƂmÝ *\0.έ==.ƛnse\bys(.г.Ɠ.Ʋy)y[.гy]o`R?\0.Ь=*\0*\0.ƃ+.Ь+.ƳpÙqø,var}.Ψw\0.ʅ.ǓrČ,var}.΃w\0.ʅ.NJs;t,var}.Ϙw\0.˰\0.Π.Ƣ.ƨuR?\0.Λ=w\0.ˋ*\0*\0*\0.Ǟ+.ơ+w\0.˰.Λ+.ǝov©w«g*\0.έ==.ƨx_,var}.α*\0.Ɠ+.αy·›*\0\0\0.Π.ǚ.Ƥ==.ƏzÕ{,var}.ϧ.Э|5í*\0\0.ͼ.NJ>f\01}‡~\f,var}.Ϫ\0\0\0.Π.ǚ.Ǧf\00‰€,var}.ϕw\0.˰\b.ɇ\0.Π.ȇ.dz\0.Π.ɐ.ǝ¬‚Ăƒ]R?\0.Ѫ=w\0\0.Ѫ.ǰ.ѡ„¾è\0.Π.ƪ…\0e.Ѫ†te.Ѭ‡HˆQ,var}.Ьw\0\0\0.Π.Ɨ.ǰ.ь‰čŠĢó\0.Π.Ɣ‹êŒ(\t*\0\0\0.Π.Ƨ.Ƥ!==.Ə¢e\bw\0.˰\0.Π.ǒ.ƭ\0.Π.ǺŽġRl\0\0.˞--vđRl\0\0.˞--‘Û,var}.іw\0.ʅ.Ǔ’u,var}.Λ\byv=(.χy).s“¹”ĉe\b*\0w\0\0.˖.ɏ\0+.ǎ.ȝ.І*\0*\0.ɱ+.έ+.ɱ\0.Π.Ƅ.Ƴ.я•§e\b.Ι.Ǵw\0.˰\0.Π.ǩ.Ƒ.Dz–f—ÓRl\0\0.Μ++˜€e\b+\0\0.Π.Ɖ\b.ȁ\0.Π.Ɖ.Ɲ.ɋ.Ь+\0\0.Ь.NJ.ǎ.Ƿ™ăšĠ›Ĉë*\0\0\0.Π.ǚ.Ƥ==.ƋœĭR?\0.Ε=w\0\0w\0\0.Ε.ǰ.Ζ.Ɵ.Ɠ,var}.хw\0\0.˖.ƿ.Πž—ŸP\0,var}.нw\0.@\0 ƒ,var}.Ѫ\0.Π.Ƙ¡,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ϿZN\0\0\t^\0,var}.Ѡw\0.@\0*\0\0.Ͽ.Ƥ==.Ƌ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ϽZ^\0\0\0\0\f\n\0.Ͻ.Ɣ\fR?\0\0.Ϣ\0\0.Ͻ.ǁ.ǡ=f\01\b\x0B6\0M\0!\0.Ͻ.Ɣ&&\0.Ϣ\0\0.Ͻ.ǁ.ǡ\bR?\0\0.Ͻ.Ɣ=.ƹ\t\0`\n\x0B\f\tRw\0\0.Ε.Ơ\0\0.Ͻ.ǁ.ǡ\b\tRw\0\0\0.Ͽ.Ǧ.ǰ.Ѡ\0ey!(w.ʅ.Ͽyin s.s)&&(s.s=[w.ʅ.Ͽy])\b`\t¢ê£÷¤,var}.θw\0.ʅ.Ɯ¥ú¦¬§\x0B,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.иZj\0\06\0.и&&*\0w\0\0\b.nj.Dž.Ǯ.DZ\0.и.Ƥ!=M\0-f\01\0e.иe.Ж,var}.Жw\0.ˋw\0.˰.и¨¡e\b.ъ©¯ªé,var}.ϗ\0.Π.ǒ«™e\b\0.Π.ǡ¬O­R?\0.˖=.\0\t_typeMap2®ċRl\0\0.˞++¯ē°\0,var}.Ѱw\0.@\0±C.ƌ²i\0,var}.Шw\0.@\0³y,var}.ξ\b\0´?R?\0.Х=w\0\0.Х.Ɵ.Ƿµ¶Be\b.Ι.Ǵw\0.˰\0.Π.ǩ.Dz·&,var}.Іw\0\0w\0.˰\0.Π.ǚ.ǂ.Ƈ.ǎ.Ƿ¸{,var}.Эw\0.}f14.Ǜ.Ǎ.Ƿ.Ơ.NJ.Ɵ¹ïº6u\0,var}.ѡw\0.@\0»•¼āR?\0.Ϊ=w\0.˰.Ϊ½@R?\0.Ь=w\0\0w\0\0\0.Π.Ɨ.ǰ.Γ.Ɵ.Ɠ¾Íe\b\0.Π.Ǻ+\0*\0w\0\0\b.ǿ.ȶ.Ȣ.DZ\0.Π.Ǻ!=M\0-f\01.ɱ.Ƿ.ϗ¿\rR?\0.ύ=w\0.ˋw\0.˰.ύÀRw\0\0\0.Π.Ɓ.ƻ.ѫÁÃ,var}.цw\0.ʅ.ƐÂË&\0,var}.Яw\0.@\0Ãr,var}.΂w\0.ʅ.ƷÄ,var}.Ϩ\b\0ÅÄƯǰ,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.ЮZ\0\0\0\0\0ew\0.˰.ЮÈAe\b*\0w\0\0.˖.ɏ\0+.ǎ.ȅ\bw\0\0.˖.ɝ\0.Ƕ\0.Π.Ɖ.Ƴ.Ƴ\0.Π.ƘÉĕe.ΘʔR?\0.я=*\0*\0*\0*\0.Ǝ+.я+.ȩ+w\0\0w\0\0.˖.ɝ\0.ƒf\00M\0-f\02+.ȫËô,var}.Ѭ\b\t.ǹ.Ǝ\0.Π.ƚ.ǝ\0.Π.ǘ+\0\0.Π.ǀ.dž.Ƿ+\0\0.Π.ǀ.Ǝ.Ƿ+\0\0.Π.ǀ+\0\0\0\0.Π.ǀ.Ƙ.NJ\0.Π.ǀ.Ƿ.Ƿ+\0\0.Π.ǀ.ǝ.ǷÌñÍĥÎ,var}.Ϯ*\0*\0.Ϡ+.α+.ϚÏàЋe\b\0.Π.Ǻw\0.˰\0.Π.ǒ.ƭќRw\0\0\0.Π.Ƙ.ǰ.ϩÒFÓXp*\0.Μ<\0.Ѫ.NJÔ²,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.Ѩ.фZ\0\0\0\b*\0.ф==f\01\0ey\ts.s=[s.s[.ϟy][.фy],w.ʅ.Ѩoy]R?\0.ф=.Ǒew\0.˰.Ѩ.ƨ\bRw\0\0.ͽ.Ơw\0.ϧ.фÕMÖ+e\b.ƴ\0.Π.Ɯ.ƙw\0.˦\0.Π.ǟ.Ɠ.Ƴ×¹Ø#,var}.Κw\0.ʅ.ƷÙ/,var}.Ά*\0*\0.Ȯ+w\0\0.Ϩ.Ɵ.Ɠ+.ɶÚ*,var}.Ξw\0.ʅ\0\0.Ϫ.ǁ.ǡÛÁeys.s[0][.іy]([])Ü,var}.Ϡ*\0*\0*\0*\0*\0*\0yreturn +ys[2][.Ϧy](s[.ρy][.Ώy]())&&+y\f(s[s.s]=v.s[.Ώy]())&&+ys[s](+ys.s=[arguments,.ϟy],+y\ns.s=[this,.уy],+y\ts.s[0]=[]Ýje\bys.s[.гy]Þ×e\b.гߣe*\0*\0.ƃ+w\0\0.џ.Ɵ.Ɠ+.Ƴàwe\bys.s=[\0.Π.Ɣy,w\0.˰\0.Π.ǁ.Ƒy]áLâĔ`ãh±*\0\0\0.Ϫ.ǁ.Ƥ==.ƸäK–*\0\0.ϯ.NJ==f\00åî,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.Ї.ЉZ\0\b\b\0\0\fRw\0\0.ͻ.Ơ\bf\02.ЉRw\0\0.ͻ.Ơ\bf\01.Љ\n*\0\0.Ї.Ƥ==.ɕ\f\b\0ew\0.ˋw\0.˰.Ї\t*\0\0.Ї.Ƥ==.Ȋ\n\f\x0B\bew\0.˰.Ї\f\x0BæšR?\0.Ь=*\0*\0*\0*\0*\0*\0.Ǝ+.ƃ+w\0\0w\0\0.Ь.ƒf\00\0\0.ͻf\00f\01.Ɵ.Ɠ+.Ƴ+.ǎ++*\0\0\0.ͻf\00f\00==f\01.ȸ+\0*\0\0\0.ͻf\00f\00==f\02.ɤ.ɺ+.ǝç',var}.Ε\b\0èĥé70*\0\0\0.Π.ǒ.Ƥ==.ƏêâëĐ,var}.Іw\0\0w\0.˰\0.Π.ǚ.Ƈ.ǎ.Ƿìęíew\0\0.ͼ.Ɵ.ɸî\0\0,var}.ьw\0.@\0ïnĝ*\0.έ==.ǂðß,var}.џw\0\0.ϯ.ǰ.нñ¶ć\0.Π.ƑòCe\bys(.гy)ó‡ôÿR?\0.Ѭ=w\0\0.Ѭ.ǰ.ЯõFö¿,var}.ύ\b.ƃw\0.˦\0.Π.Ƙ.Ɠ.Ƴ÷äøü,var}.΁w\0.ʅ.Ɛùc.έúĊûÕüď,var}.ъw\0\0\0.Π.Ž.ǰ.УýÀ,var}.ͼ\b\0þÿ†R?\0.Ѭ=w\0.ˋw\0.˰.Ѭ‰āNR?\0.Ϊ=w\0.ˋ.ΪĂÊăùĄ®e.Λą³\0,var}.ѭw\0.@\0Ć\\R?\0.ϯ=w\0\0.ϯ.Ɔw\0.}f12.Ɣ.ƹć»Ĉ~,var}.І.Ǡĉ%ew\0\0.˖.ɮ.Π.ȒĊĠċěĘ*\0w\0\0.˄.DZ\0\0.Π.ǁ.ǡ!=M\0-f\01ČWe\x0By(s[8]==1?s(s.s[0][.цy\b](),s.s[.΂y]())&&0:s[8]==2?s(s.s[0][0][.΂y\b](),s.s[.΂y]()):s)&&(s.s[.΃y]<2)&&č Rw\0\0.˖.ɡ.ΠϤR?\0.ї=w\0\0.ї.ǰ.ϸď¨R?\0.ъ=+\0\0.ъ.NJ*\0*\0*\0.Ⱥ+w\0\0.ъ.Ɵ.Ɠ+.Ƴ+y&&s[7][.΁y]().ɭĐĚđke.хĒÉRw\0\0.Θ.Ơ.ƳēĚĔ\n,var}.Θ\bw\0.˰\0.Π.ǚ.ǂ\0.Π.Ǻ\0.Π.ƄĕÔe\b.Ƕw\0.˦\0.Π.Ɓ.Ɠ.ƳĖīew\0.ʅ\0\0.Π.ư.ɞėee\bw\0.˦.ϯ.ƓĘa,var}.Δw\0\0.˖.ƿ.ΠęJĩ\0.ξ.NJĚ)ě=R?\0.\0\t_typeMap2=.˖ĜVe.ύĝ;ĞqC\0,var}.Уw\0.@\0ğò,var}.гw\0.ʅ\0.Π.ǡoĠ˜ġe.вĢ}Rw\0\0.ψ.Ơw\0.˰\0.Π.Ɣģ8`ĤÏĥģĦýb\0,var}.ѫw\0.@\0ħfĨÅĩ<,var}.я*\0*\0*\0.Ⱥ+.ξ+w\0.˰\0.Π.Ƙ+.ƳĪÅīe\0\0.Π.ư.ɞĬ9,var}.Ίw\0.Ϋ\0.Π.Ɨĭû\0.Ε.NJ¡ZeW\0?\0.ʆ=*\0**\0.ʆ*.Ƿ+.ƻ%.NJ*\0.ʆ/.NJ¢¾,var}.ͭ.ſ£6R?\0.ʘ=o\0¤8¥>e\b.Ǵw\0.˦\0.̲.ƶ.Ɠ.Dz¦•R?\0\0.˓w\0\0.˅.Ʒ\0=.̚§¯G.͢¨f©áªj8,var}.̷w\0.@\0«®R?\0.\0title=ys=function(a,b){return w.ˋw\0\0w\0.˰w\0\0.\0parser.ǯ.\0_title.ƒf\02oy(a,b)}¬äØM\0!.͡­}e\b\0.̲.Ɯ.Ƕw\0.˦\0.̲.ǟ.Ɠ.Ƴ®˜.ʭ¯,var}.̃w\0\0\0.˓.͐.ƒ*\0\0\0.͢f\00.NJ+f\01M\0-f\01°{8,var}.̬w\0.@\0±¥e\bw\0.˦\0.̲.Ɓ.Ɠ²n`³Ç`´šI*\0w\0\0.˓.DZ.̚==M\0-f\01µ€¶SÞ.ʭ·9r,var}.͏w\0.@\0¸g8\f,var}.͑w\0.@\0¹ŒY6\0*\0\0.̲.ɪ===.ȉ||*\0\0.̲.ɪ===.ɍº¨»\nR?\0.\0title=ys(.\0titleyx,!s,((s[3]=[typeof window!=='undefined'?window:global]).value=s[3])&&(s[3].writable=true)&&(s[3][0].this=s[3][0])&&s[3])¼$,var}.ʔyĠ\n function test(v){\n for (v[2] = s[!s].length - 1; v[2] >= 0; v[2]--) { // 从环境中寻址处理\n if (v[0] in s[!s][v[2]]){\n return v[1] === s?s[!s][v[2]]:s[!s][v[2]][v[0]]\n }\n }\n return v[1] === s?s[!s][v[2]+1]:.΋y!('[s]' + v[0])\n }\n ½°8,var}.͋w\0.@\0¾›,var}.ʁw\0.ʅ.ư¿“,var}.͔\b\0À‡8,var}.̰w\0.@\0ÁL»ÄĂ8,var}.̼w\0.@\0Å&Rw\0\0.̲.ƻ.͊ÆËRw\0\0.ʍ.Ƿ\b.ǣ.̲.ǵÇÆRw\0\0.ʍ.Ƿ\0\0.ʆ.ƺ.͡Ȟ‰*\0w\0\0\0\0.\0Object.ƺ.ǣ.ǵ.Φ===.ƍÉ\x0B8\t,var}.͝w\0.@\0ÊÄ8\0,var}.̽w\0.@\0Ë¡`ÌÍR,var}.@/\0\0\0.'Z\0\0\0\0\0e/\0\0\0.Ѵ.РZ\0\0\0`Rw\0\0.͔.Ơ.ѴRw\0\0.͘.Ơ.Ѵ*\0\0.Ѵ.Ƥ===.ǼÎê,var}.̸w\0.ʅ.ǭώ8,var}.Ͱw\0.@\0Ð\\,var}.ѯw\0.ʅ.ǟÑé,var}.͐f\00Ò±e\b.Ǵw\0.˦\0.̲.ƶ.Ɠ.DzÓLÔàR?\0.ʘ=oÕÖFR?\0.̲=\0.̥.ə×ve\b+\0\0\0.̲.ư.Ȍ.ȧ.Ƿ\0.̲.Ǘw\0\0w\0.˰\0.̲.ư.Ƈ.ƫ.ǷØ;,var}.̚.̲Ù§,var}.͢w\0\0.ǖ.ƣ\0.˓.͐Úd`۟,var}.ʏy|\n function test(v) {\n return v & 1 ? s[s[4]][(v >> 1) + s[!s].length] : s[s[4]][v >> 1]\n }\n ÜQ8,var}.ͨw\0.@\0݊ew\0\0.ϋ.Ɵ.ǷÞißÚà£R?\0.\0\ttail_head=w\0.˰w\0\0.\0parser.ǯ.\0\ttail_headá)âNã47\0,var}.δw\0.@\0ä],var}.̚*\0*\0.Ǭ+.̲+.ǝåˆe\b\b.ȝw\0\0w\0.˰\0.̲.Ɣ.Ƈ.ǎ.Ƿ.ǎ\0.̲.Ɖ.ǎ\0.̲.ƭ.Ƴ\0.̲.Ƙæíe\b.ƾw\0.˦\0.̲.Ʃ.Ɠ.Ƴ\0.̲.Ƙç8,var}.̊w\0.@\0èÈ,var}.Φw\x006\0.˖\0.̲.Ƥ||\0.ʪ\0.̲.Ƥ.̲.͡éÙÃ*\0.͐<\0.˓.NJêÐ,var}.ʬw\0.ʅ.Ʋë%ìPR?\0.\0_title=yB\n s=function(v,x){\n return typeof v == typeof 0?.ʨy(v):typeof v == typeof 's'?.˹y([v,x]):s\n }\n íe\b\b\0.̲.ɟ+\0\0.̲.ɥ.Ɏ.Ƿ+\0\0.̲.Ȍ.ȧ.Ƿ\0.̲.Ǘ.Ƕw\0.˦\0.̲.Ʃ.Ɠ.Ƴ\0.̲.Ƙî\"ew\0.ʟ.̲ÔǛÕhÖŋ×ōØs˘*\0.Ʀ==f82Ù(ˣ*\0.Ʀ==f106ÚÌƷ*\0.˜==f\01ÛęR?\0.ʆ=*\0*\0.ʆ/\0.\0a.ƺ|f\00Üõƣ*\0\0\0.ʆ.Ƿ.ƻ==.NJÝɍÞàā*\0.Ʀ==f57ßÿàêe\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJ+\0*\0\0.ʆ.Ơ===.ƺ\b.ǣ\0.ʆ.Ơ\0.ʆ.ǵáʋâǬã͗äɨåe\b\0.ʆ.Ƿ.ƻæǭçͿÖ*\0.Ʀ==f5èĿé7e\b.Ƿ\0.ʆ.ƻêĩëijìȞͧ*\0.Ʀ==f98íɥîʹïðv!,var}.Ѣw\0.@\0ño!\t,var}.ʮw\0.@\0òšóĸô\bõÆ,var}.˃\b.Ơ\0.ʆ.Ƿ.ƺöŒ÷ʿø˖ùƸúȐûöü͓e\b\0.ʆ.Ƿ\0.ʆ.ƻýɮ!,var}.ѧw\0.@\0þ͑*\0.Ʀ==f141ÿɖȣ*\0.Ʀ==f137Ā;āĩÀ,var}.˖\0ă̔ĄNje.Ƿą̷Ć:ć͙Ĉ˜ă*\0\0\0.ʆ.Ƿ.ƻ===\0\0.ʆ.NJ.ƻĉŚʈ*\0\0\0.ʆ.ǣ.ƻ!==.ǵĊjċ̔ČʚčȜe\b.Ƿ\0.ʆ.ƻ.NJĎÔďͣĐȴ!,var}.єw\0.@\0đöĒɢR?\0.˄=6\0.ʽ||\b\0ē̡e\b+\0\0.ʆ.Ƿ\b.ƻ\0.ʆ.Ƿ.NJ.Ơ\0.ʆ.ƺĔȌʯ\0.ʆ.ǷĕǪƃ*\0.Ʀ==f70ĖÛRw\0\0.\0t.Ơ\0.\0a*\0.ʆ%\0.\0a.ƺė$e.ʣʓę˟Ěīě8e\b.Ƿ6\0\0.ʆ.ƻ||.NJ.ƠĜ̢e.Ƿĝ͒ĞƳğ˯e\b\0.ʆ.ǷĠƶƻ*\0.Ʀ==f36ġƳĢþģGć*\0.Ʀ==f33Ĥ̆ɜ*\0.Ʀ==f89ĥ˺ĦˑħĨÂ*\0.Ʀ==f64ĩɺĪnīɔĬƤĭˁƽ*\0.Ʀ==f90Į̉e\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.Ơ.ƺ\0.ʆ.ǣ.ǵįȭİ΅ı†*\0\0.ʆ.Ƿ===IJɹɈ*\0.Ʀ==f40ijŪĴŽĵnĶʑ*\0.Ʀ==f115ķǢe\0.ʆ.Ƿĸ̘Ĺǔe\b\0.ʆ.ƻ.NJ\0.ʆ.Ơ.ƺĺ̄Ļėɒ*\0.Ʀ==f155ļƗĽfľɡĿ„ŀʐŁʙ*\0.Ʀ==f92ł¾ŃŴńŧͶ*\0.Ʀ==f23ŅņDzRw\0.ˢ\0ŇʴňŢe\0.ʆ.Ƿʼnˮ!,var}.Нw\0.@\0ŊŌŋ̟ŌÎ͆*\0.Ʀ==f51ōS£*\0.Ʀ==f130ŎȆŏ©e.ǷŐ×őȵŒɆœ̊Ŕ̋e\b.Ƿ\0.ʆ.ƻŕƱ,var}.ˋ.ѢŖgŗ̩,var}.ˌ*\0*\0*\0*\0*\0*\0*\0*\0y(s=Object.defineProperty)(.\0titley,s[4],(+y(s[9]=[.˓y])&&+y(s[3]=+.ʄ+y\0w\0.\0JSON.Ʊw\0\0.ʳ.Ɵ.Ȏy\x0B.split('‍')+.ʄ+y)).value=s[3])+w\0\0.\0\ttail_head.ƒf\01+.ʄŘ)řǼŚȇ,var}.ː\b.Ơ\0.ʆ.ǣ.ƺś̵,var}.˄\b\0Ŝ͖ŝŽŞ͘şĕŠqRw\0\0.ʆ.Ơ.ˬšʮŢɥţŤȯɑ*\0.Ʀ==f38ť̚!,var}.Ϻw\0.@\0Ŧͪŧ¸e\0\0.ʆ.Ƿ.ƻŨï,var}.˃\0.ʆ.ǷũȳŪƖ*\0.Ʀ==f47ūʠŬ«,var}.ˌ*\0*\0*\0*\0*\0*\0*\0*\0y(s=Object.defineProperty)(.\0titley\b,s[4],((+ys[9]=[.˓y],+ys[3]=+.ʄ+y\0w\0.\0JSON.Ʊw\0\0.ʳ.Ɵ.Ȏy\x0B.split('‍')+.ʄ+y).value=s[3]))+w\0\0.\0\ttail_head.ƒf\01+.ʄŭŮ΃ů˵e\b.Ƿ6\0\0.ʆ.ƻ||.NJŰ͖űƆǍ*\0.Ʀ==f41Ų%e.ʽųŽŴ̧ŵǯŶʧŷȎŸ̦Źʷź͹ŻÁe\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJżİŽǽő*\0.Ʀ==f96žÜ˩*\0.Ʀ==f8ſĖR?\0.\0t=\b\0ƀÙƁƲƂŦʬ*\0.Ʀ==f110ƃʛƄòƅ̓e\b+\x006\0\0.ʆ.Ƿ&&\0\0.ʆ.Ƿ.ƻ.NJ.Ơ\0.ʆ.ƺ\0.ʆ.ǣ6\0\0.ʆ.ǵ||.Ơ+\x006\0\0.ʆ.Ƿ&&\0\0.ʆ.Ƿ.ƻ.ƍ.ƠƆ΂Ƈ̳ƈcƉƫ΄*\0.Ʀ==f77Ɗ˼e\b.Ƿ\0.ʆ.ƻƋŗRw\0.ʷ\0ƌť!,var}.Єw\0.@\0ƍİƎ˗e.ǷƏ̤0*\0.Ʀ==f16Ɛ2Ď*\0.Ʀ==f72Ƒ•ƒH!\f,var}.Фw\0.@\0ƓȲƔ‚ʰ*\0.Ʀ==f3ƕȚː*\0.Ʀ==f19ƖǓe\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.Ơ+\0\0.ʆ.ƺ\b+\0*\0\0\0.ʆ.ƺ.ǣ===.ǵ.ƍ.ǐ\0.ʆ.ƺ.ƤƗƂƘ̲ƙ̺Rw\0.˧\0ƚĨƛʘe*\0f\0.5-w\0\0.\0Math.Ƿ\0Ɯ̠ƝʆƞƙR?\0.˓=\b\0Ɵ\f¡*\0.Ʀ==f119Ơ˂D*\0.Ʀ==f20ơɟˍ*\0.Ʀ==f95ƢȾƣ̍,var}.˃\0.ʆ.ǷƤ|Ě*\0.Ʀ==f17ƥƞR?\0.˅=w\0\0w\0\0w\0\0w\0.\0Array\0.˓.NJ.ɩf\00.ǰw\0.}f157.ȏw\0.}f158.ȾƦ˰ƧşƨɃɣ*\0.Ʀ==f86Ʃȼǰ*\0.Ʀ==f158ƪŏʟ*\0.Ʀ==f55ƫMø\0.ʆ.ǷƬYƭȱƮƕƯǂƺ*\0.Ʀ==f61ưɯRw\0\0.ʍ.Ƿ.ƻƱʹ,var}.ʷ.ˇƲžƳ̃ƴƭƵÀ!,var}.Оw\0.@\0ƶĦe\b.Ƿ\0.ʆ.ƻ.NJƷȠƸ̕Ŗ*\0.Ʀ==f85ƹǏǙ*\0.Ʀ==f60ƺǀƻˑƼeƽœƾʦƿ,ǀʤǁ/e\b\0.ʆ.ǷǂǀǃƢDŽɂȏ*\0.Ʀ==f66Dž;džƢLJ¨ͭ*\0.Ʀ==f12Ljͻȥ*\0.Ʀ==f102ljƦe\b.Ƿ\0.ʆ.ƻNJ̏e\b.Ƿ\0.ʆ.ƻ.NJNj͐njåũ*\0.Ʀ==f39Ǎ΂ǎÈǏ’e\b+\0\0.ʆ.Ƿ.ƻ.NJ\0.ʆ.Ơ.ƺ\0.ʆ.ǣ.ǵǐǑ'ǒDZRw\0.ʷ\0ǓɐǔŇǕǚe\b.Ƿ\0.ʆ.ƻǖóe\b\0.ʆ.NJ.Ơ\0.ʆ.ƻǗÝʗ*\0.Ʀ==f139ǘƐǙɳǚşǛ\r͏*\0.Ʀ==f73ǜ·e\b\0.ʆ.ǷǝŞe\b.Ƿ+\0\0.ʆ.ƻ\b.NJ\0.ʆ.ƻ.Ơ.ƺǞ͙ǟĮʁ*\0.Ʀ==f15ǠƾǡǢ˽ǣʎR?\0.˓=\b\0Ǥl¬*\0.Ʀ==f78ǥȐǦŮǧ̒®*\0.Ʀ==f120Ǩ=,var}.ʳ\b\0ǩ˔Ǫɵe\b.Ƿ\0.ʆ.ƻǫ‘3*\0.Ʀ==f135ǬɅÏ*\0.Ʀ==f143ǭȹǮ͗ǯɄa*\0.Ʀ==f147ǰŷDZŬRw\0\0.ʳ.Ɵ.ȎDzǒRw\0.ɿ.ʆdz˴ǴɼRw\0\0\0.ʆ.NJ.Ơ.ѝǵŮǶƒ!\x0B,var}.Пw\0.@\0ǷŠǸPƬ*\0.Ʀ==f74ǹ!,var}.ѝw\0.@\0Ǻ͟ǻɩț*\0.Ʀ==f146Ǽ.ǽȵǾ\\e\b\0.ʆ.NJǿÄȀŸȁųe.ǷȂ́ȃȲȄĢȅǺȆŠȇŘȈɤȉ³ǡ*\0.Ʀ==f24ȊʕȋÅȌ-e\b\0.ʆ.ƻ\0.ʆ.NJȍ Ȏɕá*\0.Ʀ==f159ȏͳȐʄȑɗȒŹȓV,var}.˰.ϺȔĐ!,var}.Иw\0.@\0ȕʨȖǑȗƥR?\0.ʳ=w\0\0.ʳ.ȏw\0.}f156.ȾȘÕșȓ,var}.˦.ЪȚʩe.ǷțŵȜĿȝɨȞÑȟ˒!,var}.лw\0.@\0ȠȗȡdzȢŷȣ̑Ȥ̬Ƽ*\0.Ʀ==f133ȥˠȦļK*\0.Ʀ==f109ȧɋe\b\0.ʆ.ƻ.Ơ\0.ʆ.Ƿ.NJȨIȩ\te\b\0.ʆ.Ƿ.ƻ\0.ʆ.NJȪOȈ*\0.Ʀ==f103ȫǘȬNȭ˶Ȯijȯ̶e\0.ʆ.ǷȰ̈ȱĔĘ*\0.Ʀ==f76ȲŁȳIJȴƵ!,var}.Дw\0.@\0ȵ͕ȶYȷ̈́ȸČȹǜ*\0.Ʀ==f13Ⱥ˜”*\0.Ʀ==f93ȻŔ͵*\0.Ʀ==f144ȼȢe*\0f\0.5-w\0\0.\0Math.Ƿ\0ȽĞe\b\0.ʆ.ǷȾNJÃ*\0.Ʀ==f59ȿȮe\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.Ơ.ƺɀˋɁü6*\0.Ʀ==f80ɂ̐e\b.Ƿ\0.ʆ.ƻɃɪe*\0.Ƿ+\0.ʆ.ƻɄ͸e\b.Ƿ\0.ʆ.ƻ.NJɅ̀Ɇ̖ɇ>,var}.ː\0.ʆ.ǣɈ͊ɉɻ,var}.˃\b.Ơ\0.ʆ.Ƿ.ƺɊƭɋʉɌơɍ˫Ɏře\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.Ơɏˀ,var}.ɿ.ʙɐ˙ɑʔɒɓɔƎͥ*\0.Ʀ==f18ɕͦ,var}.Ъ\0ɖ̑ɗìɘĹ[\0.ʆ.Ƿəƒɚ¢!,var}.ѓw\0.@\0ɛ̨ƴ*\0.Ʀ==f75ɜʹɝḚ̈*\0.Ʀ==f99ɞʻe+\0*\0\0.ʆ.Ƿ==.ƻM\0-f\01f\01ɟˆe\b+\0\0.ʆ.Ƿ.ƻ.NJ\0.ʆ.Ơɠ˔ɡɸ*\0.Ʀ==f1ɢņRw\0.˧\0ɣzɤͱɥńɦŶɧʮɨçɩŵɪzɫɬǵǦ*\0.Ʀ==f151ɭßɮ́!,var}.тw\0.@\0ɯ̎e.ʍɰǧɱȺɲǼɳƯɴʸ!,var}.Ёw\0.@\0ɵʛɶʣµ*\0.Ʀ==f50ɷƛ¼*\0.Ʀ==f156ɸŀɹ͊ɺˇdž*\0.Ʀ==f58ɻɼưRw\0\0.ʍ.Ƿ\0\0.ʆ.ƺ\0\0.ʆ.NJ.ƍɽǺɾ̳ɿŹʀ͠ʁˉʂ̻ʃŊʄǕƧ*\0.Ʀ==f69ʅƊ͜*\0.Ʀ==f31ʆZʇ{ʈʵ,var}.ː\0.ʆ.ǣʉʝʊƓe\0\0.ʆ.Ƿ.ƻʋXʌɗʍǝ*\0.Ʀ==f43ʎĒR?\0.˅=\b\0ʏ÷ʐͤš*\0.Ʀ==f2ʑʇʒș,var}.Ъw\0.}f2.NJ.Ƿ.Ơ.ƻʓʋʔnjʕ_ʖʉʗɍʘďʙ¤,var}.ʍ\b\0ʚFƁ*\0.Ʀ==f7ʛͼʜȠʝ9͡*\0.Ʀ==f35ʞȉʟÊʠĤʡ̱ʢˌe\b.Ƿ\0.ʆ.ƻ.NJʣʃe\b.Ƿ\0.ʆ.ƻ.NJʤȨ̛*\0.Ʀ==f62ʥȍʦLɠ*\0.Ʀ==f65ʧ͛͝*\0.Ʀ==f105ʨ±Ņ*\0.Ʀ==f100ʩŸʪğȊ*\0.Ʀ==f27ʫ̇ʬͪʭ“ʮƔʯĽe\b\0.ʆ.NJ\0.ʆ.ƻʰ́ʱŴʲye\b.Ƿ6\0\0.ʆ.ƻ||.NJʳʠʴre\b\0.ʆ.ƻ.ǣ\0.ʆ.ƠʵŘʶ˭đ*\0.Ʀ==f153ʷ˝ʏ*\0.Ʀ==f117ʸý!,var}.бw\0.@\0ʹĭʺ̠ʻˋʼĄ*\0.Ʀ==f81ʽ˕ʾ̼ʿʀ̭*\0.Ʀ==f118ˀˬ,var}.˘.Пˁœ˂Ue.Ƿ˃Ȁͫ*\0.Ʀ==f123˄ĵe\b\0.ʆ.Ƿ.Ơ\0.ʆ.NJ˅ǿˆĴˇǃe\b.Ƿ\0.ʆ.ƻ+\0\0.ʆ.NJ\b.Ơ\0.ʆ.NJ.ƺ\0.ʆ.ǣˈĢˉƏˊȷˋʪˌcˍĴˎƄe.ƻˏˤe.ǷːŸˑ͉˒Ȕ!,var}.еw\0.@\0˓ĝ˔DŽ˕»ª*\0.Ʀ==f14˖̽˗Ʈ˘̹˙ēį*\0.Ʀ==f48˚̾˛A!,var}.Ѯw\0.@\0˜ċe\b\0.ʆ.Ƿ˝÷˞͢˟Ė.ʆˠȪˡ̣ˢľˣ²ˤ̼˥e\b.Ƿ\0.ʆ.ƻ.NJ\0.ʆ.Ơ.ƺ˦˧Je\b\0.ʆ.ƻ˨Ƚġ*\0.Ʀ==f10˩͢˪‹˫ˈȄ*\0.Ʀ==f140ˬǨ,var}.ʪc”1\0yFilew\0.}f27.ɘ1\0yProgramw\0.}f28.Ƙ1\0yBlockw\0.}f29.ɣ.ư.Ȱ1\0y\fCommentBlockw\0.}f30.ɣ.ư.Ȱ1\0yLinew\0.}f31.ǽ.ư1\0y\x0BCommentLinew\0.}f32.ǽ.ư1\0yVariableDeclarationw\0.}f33.ɪ.ɱ.Ǧ1\0yVariableDeclaratorw\0.}f34.Ɣ.ǁ.ǎ.ǜ1\0y\nIdentifierw\0.}f35.ǡ1\0yCallExpression.Ф1\0yFunctionDeclaration.ʦ1\0yBlockStatementw\0.}f36.Ǝ.Ƙ.ǝ1\0yReturnStatementw\0.}f37.ơ.ǒ.Ƿ.ǎ1\0yLiteralw\0.}f38.ɞ1\0yExpressionStatementw\0.}f39.Ǖ.ǎ1\0y\bProperty.ѓ1\0yDirectiveLiteralw\0.}f401\0y\tDirectivew\0.}f411\0y\tDecoratorw\0.}f42.Ɇ.Ǖ1\0yBreakStatementw\0.}f43.ȸ.ɓ.ɱ.Ƿ.ǎ1\0yContinueStatementw\0.}f44.Ɉ1\0yDebuggerStatementw\0.}f45.ɴ1\0yDoWhileStatementw\0.}f46.ɒ.Ƙ.ȅ.Ɖ.Ƴ1\0y\x0BIfStatementw\0.}\x0Bf47.LJ.Ɖ.Ƴ.Ɨ.ǥ.Ƥ.ƞ.Ƶ.ǫ.Ƿ1\0y\nSwitchCasew\0.}f48.Ɖ.ȁ.Ɲ.ɋ.Ɨ1\0ySwitchStatementw\0.}f49.ɇ.ȇ.dz.ɐ.ǝ1\0yThrowStatementw\0.}f50.ɔ.ǒ.ǎ1\0y\x0BCatchClausew\0.}f51.Ʈ.Ƣ.Ƴ.Ƙ1\0y\fTryStatementw\0.}f52.ǹ.ƚ.ǘ.ǀ.dž.Ƿ1\0yWhileStatementw\0.}f53.ȅ.Ɖ.Ƴ.Ƙ1\0y\rWithStatementw\0.}f541\0yEmptyStatementw\0.}f55.Ƿ1\0yLabeledStatementw\0.}f56.ɓ.Ɲ.Ƙ1\0y\fForStatement.ʼ1\0yForInStatement.л1\0yForOfStatement.е1\0yFunctionExpression.И1\0yClassDeclarationw\0.}\bf57.ɟ.Ʉ.ǁ.ɹ.Ƿ.Ʌ.Ƙ1\0yClassExpressionw\0.}f58.Ʉ.ǁ.ɹ.Ȥ.Ƿ.Ƙ1\0y\tClassBodyw\0.}f59.Ǝ.Ƙ.ǝ1\0y\rClassPropertyw\0.}\bf60.ɥ.Ɏ.Ƿ.Ǘ.ǜ.ư.ǎ1\0y\x0BClassMethod.є1\0yExportNamespaceSpecifierw\0.}f611\0yExportAllDeclarationw\0.}f621\0yExportDefaultSpecifierw\0.}f631\0yExportDefaultDeclarationw\0.}f64.ɫ.ɢ.ǎ1\0yExportNamedDeclaration.Д1\0yExportSpecifierw\0.}f65.Ǝ.ɦ.ǝ1\0yImportDeclaration.О1\0yImportNamespaceSpecifierw\0.}f66.Ɋ.ɯ1\0yImportSpecifierw\0.}f67.Ȑ.ǡ.ɯ.Ȧ1\0yImportDefaultSpecifierw\0.}f68.ɯ1\0y\rSpreadElementw\0.}f69.ȑ.ǒ1\0y\x0BRestElementw\0.}f70.ȑ.ǒ1\0y\fArrayPattern.ʠ1\0yAssignmentPatternw\0.}f71.ǚ.ǜ.Ƅ1\0ySequenceExpression.Ѯ1\0yAssignmentExpressionw\0.}f72.ǚ.Ǻ.Ƅ1\0yConditionalExpressionw\0.}f73.Ɖ.ƕ.Ɨ.Ɲ.ǥ1\0yLogicalExpressionw\0.}f74.ǚ.Ǻ.Ƅ1\0yBinaryExpressionw\0.}\ff75.Ȇ.ɚ.Ƕ.Ƿ.ǚ.Ǻ.Ȓ.ɗ.ɱ.Ƅ.Ƴ1\0yUpdateExpressionw\0.}f76.ƪ.Ǻ.ǒ1\0yUnaryExpressionw\0.}f77.ƪ.Ǻ.ǿ.ɱ.Ƿ.ǒ1\0yBindExpressionw\0.}f781\0yMemberExpressionw\0.}f79.Ƒ.Ƨ.Ǵ.ǩ.Dz.Ș1\0yTaggedTemplateExpressionw\0.}f80.ȓ.Ȩ1\0ySuperw\0.}f81.ɰ1\0yImportw\0.}f821\0yThisExpressionw\0.}f83.Ƃ1\0y\fDoExpressionw\0.}f84.ɒ.Ƙ1\0y\x0BNullLiteralw\0.}f85.ȗ1\0yBooleanLiteralw\0.}f86.Ƿ.ư1\0yArrayExpression.ʵ1\0y\rStringLiteralw\0.}f87.Ȇ.ɞ1\0yNumericLiteralw\0.}f88.Ȇ.ɞ1\0y\rRegExpLiteralw\0.}f89.Ȇ.ɞ1\0y\fMetaPropertyw\0.}f901\0y\rNewExpression.Ё1\0yTemplateElementw\0.}f91.ư.ɞ1\0yTemplateLiteralw\0.}\tf92.Ơ.Ȭ.Ɓ.ƻ.ɵ.Ȫ.ǝ.NJ1\0y\rObjectPattern.б1\0yObjectExpression.ѧ1\0y\fObjectMethod.т1\0yObjectPropertyw\0.}f93.Ȉ.ư.Ǘ.Ɲ1\0yArrowFunctionExpression.З1\0yAwaitExpressionw\0.}f94.ɜ.ǒ1\0yYieldExpressionw\0.}f95.ȼ.ȹ.ɂ.ǒ1\0yMethodDefinition.Н1\0yDeclaredPredicatew\0.}f961\0yInferredPredicatew\0.}f971\0y\fDeclareClassw\0.}f981\0yTypeAnnotationw\0.}f991\0yDeclareFunctionw\0.}f1001\0yDeclareExportDeclarationw\0.}f1011\0yDeclareVariablew\0.}f1021\0y\rDeclareModulew\0.}f1031\0yDeclareModuleExportsw\0.}f1041\0yDeclareTypeAliasw\0.}f1051\0yDeclareOpaqueTypew\0.}f1061\0yDeclareInterfacew\0.}f1071\0yInterfaceExtendsw\0.}f1081\0yInterfaceDeclarationw\0.}f1091\0y\tTypeAliasw\0.}f1101\0y\nOpaqueTypew\0.}f1111\0yTypeParameterDeclarationw\0.}f1121\0yTypeParameterInstantiationw\0.}f1131\0yObjectTypeIndexerw\0.}f1141\0yObjectTypePropertyw\0.}f1151\0yObjectTypeCallPropertyw\0.}f1161\0yObjectTypeSpreadPropertyw\0.}f1171\0yObjectTypeAnnotationw\0.}f1181\0yQualifiedTypeIdentifierw\0.}f1191\0yGenericTypeAnnotationw\0.}f1201\0yTypeofTypeAnnotationw\0.}f1211\0yTupleTypeAnnotationw\0.}f1221\0yFunctionTypeParamw\0.}f1231\0yAnyTypeAnnotationw\0.}f1241\0yVoidTypeAnnotationw\0.}f1251\0yBooleanTypeAnnotationw\0.}f1261\0yMixedTypeAnnotationw\0.}f1271\0yEmptyTypeAnnotationw\0.}f1281\0yNumberTypeAnnotationw\0.}f1291\0yStringTypeAnnotationw\0.}f1301\0yFunctionTypeAnnotationw\0.}f1311\0yStringLiteralTypeAnnotationw\0.}f1321\0yBooleanLiteralTypeAnnotationw\0.}f1331\0yNullLiteralTypeAnnotationw\0.}f1341\0yNumericLiteralTypeAnnotationw\0.}f1351\0yThisTypeAnnotationw\0.}f1361\0yExistentialTypeParamw\0.}f1371\0yArrayTypeAnnotationw\0.}f1381\0yNullableTypeAnnotationw\0.}f1391\0yIntersectionTypeAnnotationw\0.}f1401\0yUnionTypeAnnotationw\0.}f1411\0yTypeCastExpressionw\0.}f1421\0yClassImplementsw\0.}f1431\0yExperimentalRestPropertyw\0.}f144.ȑ.ǒ1\0yJSXEmptyExpressionw\0.}f145.Ƿ1\0yJSXSpreadChildw\0.}f1461\0yJSXExpressionContainerw\0.}f147.Ǝ.Ǖ.ǝ1\0yJSXSpreadAttributew\0.}f148.ɛ.ǒ.ǝ1\0y\fJSXAttributew\0.}f149.ǡ.ǜ.ư1\0y\rJSXIdentifierw\0.}f150.ǡ1\0yJSXNamespacedNamew\0.}f1511\0yJSXMemberExpressionw\0.}f1521\0yJSXOpeningElement.Ц1\0yJSXClosingElementw\0.}f153.Ȗ.ǡ.Ɍ1\0y\nJSXElementw\0.}\tf154.Ȇ.ɚ.Ƕ.Ƿ.ɲ.Ȁ.ȷ.Ƴ˭ûe\b.Ƿ\0.ʆ.ƻ.NJˮ\x0B!,var}.Цw\0.@\0˯ʕ˰ģ˱–˦*\0.Ʀ==f25˲Ô˳ƚ˴ňí*\0.Ʀ==f22˵\b˶˥͎*\0.Ʀ==f49˷ĝ˸Ǯã*\0.Ʀ==f101˹˺˺˨˻Ɂ˼ʫ˽ɬ˾̾˿C̀ͮä*\0.Ʀ==f4̱́̀̂̃ůô*\0.Ʀ==f11̄ˆ̅Õ̆îe\0\0.ʆ.Ƿ.ƻ̇lj*\0.Ʀ==f32̈ʶ̉ˉ̊<̋ȋ̌ʢƈ*\0.Ʀ==f148̍+̎ɱ̏d̐ͳ̑̒ˡ̓­Rw\0\0.ʍ.NJ.˜̔˄̕—e.Ƿ̖@x*\0.Ʀ==f114̗Ɍ̘ Ͳ*\0.Ʀ==f94̙˳*\0.Ʀ==f63̚ð!,var}.˝w\0.@\0̛I̜Ŷ̝ĀDž*\0.Ʀ==f122̞™ú*\0.Ʀ==f68̟ʲȸ*\0.Ʀ==f6̡̠̝ȭ̢̣ʺƜ*\0.Ʀ==f121̤¥e\b.Ƿ6\0\0.ʆ.ƻ||.NJ̥Ĉ̦ʡ*\0.Ʀ==f124̧Ő΁*\0.Ʀ==f129̨Ɋe\b+\x006\0\0.ʆ.Ƿ&&\0\0.ʆ.Ƿ.ƻ.NJ.Ơ\0.ʆ.ƺ+\x006\0*\0\0.ʆ.ǣ==.ǵ||*\0\0.ʆ.ǣ==.ƍ*\0*\0.ǐ+\0.ʆ.ǣ+.ǐ\0.ʆ.ǣ\0.ʆ.Ƥ+\x006\0\0.ʆ.Ƿ&&\0\0.ʆ.Ƿ.ƻ.ǰ.Ơ̩˾R?\0.ˌ=w\0\0.ˌ.Ƈ.ȟw\0\0.\0\ttail_body.ƒf\08M\0-f\01̪â̫Ú˚.˜̬ḙ̮͠Þ̯ºȅ*\0.Ʀ==f149̰ȕ̱&̲;ɭ*\0.Ʀ==f136̳Ȥ̴ǣR?\0.ʳ=\b\0̵̴,var}.ʄ.Ƿ̶ʔ̷ɘR*\0.Ʀ==f79̸̮̹͚̺#Rw\0.ˢ\0̻ʍ̼´̽̿̾¶̿Ǥ̀Ȼ́ʼn!,var}.Зw\0.@\0͂ͺ̓¦̈́ʱŃ*\0.Ʀ==f128ͅEĥ*\0.Ʀ==f9͆ȍ͇˿̥*\0.Ʀ==f107͈͉̌ěə*\0.Ʀ==f37͊ű͋ˏʾ*\0.Ʀ==f45͌Ż̸*\0.Ʀ==f56͍°ʳ*\0.Ʀ==f88͎B͏ͺ͐Ø͑ź͒ɾƇ*\0.Ʀ==f132͓›͔˖͕ʌȑ*\0.Ʀ==f97͖ǫ͗Lj͘ͽ͙p͚˅*\0.Ʀ==f83͛ƀ͜ʫ͝ƀ͞ȷ͟ķͷ*\0.Ʀ==f150͠Ɵͣ͢͡ͅŲǷ*\0.Ʀ==f157ͤˎ‡*\0\0.ʆ.Ƿ===f\00ͥƮͦʒ,var}.ʟ.ЄͧÑͨĂ,var}.ʘ\0ͩÇʂ*\0.Ʀ==f42ͪ!ͫŸͬùͭǭͮͯǾ*\0.ʽ!=.ǷͯĊe\b.ƻ\0.ʆ.NJ.ƠͰȧͱɦ̜*\0.Ʀ==f104ͲɌͳ½ʹ…,var}.˧.˲͵ȋͶʞͷ˽͸͈͹̪ž*\0.Ʀ==f142ͺǸͻˠͼȩȫ*\0.Ʀ==f71ͽȁŝ*\0.Ʀ==f44;ßͿue\b.Ƿ6\0\0.ʆ.ƻ||.NJ΀̈΁×΂ͩ΃Ȱ΀*\0.Ʀ==f152΄̿΅^ŭ*\0.Ʀ==f112Ά*Ć*\0.Ʀ==f108·̄ΈͰ~")); 2 | 3 | 4 | var btn = document.getElementById('aline_js_btn') 5 | btn.addEventListener('click', function(e){ 6 | var config = document.getElementById('jsobfuscator_config') 7 | var code = document.getElementById('jsobfuscator_code') 8 | var input = document.getElementById('jsobfuscator_input') 9 | 10 | config = eval('1,' + (config.value.trim() || '{}')) 11 | var unpacklist = config.unpacklist || [] 12 | var useFunction = config.useFunction 13 | useFunction = useFunction === undefined ? true : useFunction 14 | var ret; 15 | try{ ret = aline_js(input.value, unpacklist, 2, useFunction) }catch(e){ ret = e.toString() } 16 | code.value = ret 17 | }) 18 | 19 | 20 | 21 | var btn = document.getElementById('aline_js_get_config_btn') 22 | btn.addEventListener('click', function(e){ 23 | var config = document.getElementById('jsobfuscator_config') 24 | config.value = `{ 25 | unpacklist: ["funcA", "funcB"], // 不需要混淆的函數,用以优化性能 26 | useFunction: true, // 是否使用Function模式 27 | } 28 | ` 29 | }) 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /tools/bgscript/get_cookie.js: -------------------------------------------------------------------------------- 1 | var currtabid; 2 | var currdomain; 3 | function get_cookie(){ 4 | chrome.cookies.getAll({}, function(cookie){ 5 | var cookies = [] 6 | for (var i = 0; i < cookie.length; i++) { 7 | var _domain = cookie[i].domain 8 | if (_domain.charAt() == '.'){ 9 | _domain = _domain.slice(1) 10 | } 11 | if (currdomain.indexOf(_domain) != -1){ 12 | cookies.push(cookie[i]) 13 | } 14 | } 15 | chrome.tabs.sendMessage(currtabid, {action: {type:'getcookie', info: cookies}}, function(){}) 16 | }); 17 | } 18 | chrome.extension.onMessage.addListener(function (req, sender, sendResponse){ 19 | if (req.getcookie){ 20 | currtabid = sender.tab.id 21 | currdomain = req.domain 22 | get_cookie() 23 | sendResponse({}) 24 | } 25 | }) 26 | chrome.cookies.onChanged.addListener(function(info){ 27 | if (currtabid){ 28 | get_cookie() 29 | } 30 | }); -------------------------------------------------------------------------------- /tools/bgscript/get_html.js: -------------------------------------------------------------------------------- 1 | function get_html(url){ 2 | var json = save_cache 3 | function replaceX(e, r, n) { 4 | var t, u, f, i, l; 5 | t = e.indexOf(r); 6 | if (t >= 0) { 7 | f = e.substr(0, t); 8 | u = r.length; 9 | i = e.substr(t + u, e.length - (t + u) + 1); 10 | l = f + n + i; 11 | t = l.indexOf(r); 12 | return t >= 0 ? replaceX(l, r, n) : l; 13 | } 14 | return e; 15 | } 16 | function script_escape(str){ 17 | str = str.replace(/<( *\/ *script *>)/g, '\\x3C$1') 18 | return str.replace(/<( *script *>)/g, '\\x3C$1') 19 | } 20 | if (!json[url]){ 21 | return 22 | } 23 | var $ = cheerio.load(json[url].data) 24 | var keys = Object.keys(json) 25 | var used_script = [] 26 | function get_match(src, type) { 27 | for (var i = 0; i < keys.length; i++) { 28 | if (keys[i].indexOf(src) != -1 && json[keys[i]].type == type){ 29 | if (json[keys[i]].type == 'Script'){ 30 | used_script.push(keys[i]) 31 | } 32 | return json[keys[i]].data 33 | } 34 | } 35 | } 36 | var scripts = $("script") 37 | for (var i = 0; i < scripts.length; i++) { 38 | var script = scripts[i] 39 | if (script.attribs && script.attribs.src){ 40 | console.log(script.attribs.src) 41 | var src = script.attribs.src 42 | var rep = get_match(src, 'Script') 43 | if (rep){ 44 | script.children.push({ 45 | type: 'text', 46 | data: script_escape(rep), 47 | parent: script, 48 | prev: null, 49 | next: null, 50 | }) 51 | delete script.attribs.src 52 | }else{ 53 | console.log('not find...', src) 54 | } 55 | } 56 | } 57 | var links = $("link") 58 | for (var i = 0; i < links.length; i++) { 59 | var link = links[i] 60 | if (link.attribs && link.attribs.href){ 61 | var href = link.attribs.href 62 | var data = get_match(href, 'Stylesheet') 63 | if (data){ 64 | var mlist = data.match(/url\( *[^\( ]+ *\)/g) 65 | if (mlist){ 66 | mlist = mlist.map(function(e){ 67 | return /url\( *([^\( ]+) *\)/g.exec(e)[1] 68 | }) 69 | for (var j = 0; j < mlist.length; j++) { 70 | var woff = get_match(mlist[j], 'Font') 71 | if (woff){ 72 | console.log(mlist[j]) 73 | data = replaceX(data, mlist[j], 'data:application/x-font-woff;charset=utf-8;base64,' + woff) 74 | } 75 | } 76 | } 77 | var style = cheerio.load("")("style") 78 | $(link).replaceWith(style); 79 | } 80 | // var data = get_match(href, 'Font') 81 | // if (data){ 82 | // console.log(href, href in json) 83 | // } 84 | var data = get_match(href, 'Other') 85 | if (data){ 86 | link.attribs.href = "data:;base64," + data 87 | } 88 | // console.log(link) 89 | console.log(href) 90 | } 91 | } 92 | var imgs = $('img') 93 | for (var i = 0; i < imgs.length; i++) { 94 | var img = imgs[i] 95 | if (img.attribs && img.attribs.src){ 96 | var src = img.attribs.src 97 | var rep = get_match(src, 'Image') 98 | if (rep){ 99 | console.log('ok', src) 100 | img.attribs.src = "data:image/png;base64," + rep 101 | }else{ 102 | console.log('img not find...', src) 103 | } 104 | } 105 | } 106 | var json_obj = {}; 107 | var func_str = '' 108 | for (var i = 0; i < keys.length; i++) { 109 | if (json[keys[i]].type == 'Script' && used_script.indexOf(keys[i]) == -1){ 110 | console.log('not find script...', keys[i], json[keys[i]].data.length) 111 | json_obj[keys[i]] = {} 112 | json_obj[keys[i]].type = json[keys[i]].type 113 | json_obj[keys[i]].func = `vilame_run${i}` 114 | func_str += script_escape(`vilame_json['vilame_run${i}'] = function (){${json[keys[i]].data}}`) + '\n' 115 | } 116 | } 117 | var insert_code = ` 118 | var vilame_json = ` + JSON.stringify(json_obj) + ` 119 | ` + func_str + ` 120 | var vilame_keys = Object.keys(vilame_json) 121 | function get_match(src){ 122 | for (var i = 0; i < vilame_keys.length; i++) { 123 | if (vilame_keys[i].indexOf(src) != -1){ 124 | return vilame_json[vilame_json[vilame_keys[i]].func] 125 | } 126 | } 127 | } 128 | var v_insertBefore = Node.prototype.insertBefore 129 | Node.prototype.insertBefore = function(v){ 130 | var src; 131 | if (v && v.getAttribute && (src = v.getAttribute('src'))){ 132 | var func = get_match(src) 133 | if (func){ 134 | setTimeout(func, 0) 135 | return 136 | } 137 | } 138 | return v_insertBefore.apply(this, arguments) 139 | } 140 | var v_appendChild = Node.prototype.appendChild 141 | Node.prototype.appendChild = function(v){ 142 | if (v && v.getAttribute && (src = v.getAttribute('src'))){ 143 | var func = get_match(src) 144 | if (func){ 145 | setTimeout(func, 0) 146 | return 147 | } 148 | } 149 | return v_appendChild.apply(this, arguments) 150 | } 151 | ` 152 | var insert_script = cheerio.load("")("script")[0] 153 | var head = $("head") 154 | if (head.length){ 155 | head.append(insert_script) 156 | } 157 | return $.html() 158 | } -------------------------------------------------------------------------------- /tools/bgscript/replacer.js: -------------------------------------------------------------------------------- 1 | var typeMap = { 2 | "txt" : "text/plain", 3 | "html" : "text/html", 4 | "htm" : "text/html", 5 | "css" : "text/css", 6 | "js" : "text/javascript", 7 | "json" : "text/json", 8 | "xml" : "text/xml", 9 | "jpg" : "image/jpeg", 10 | "gif" : "image/gif", 11 | "png" : "image/png", 12 | "webp" : "image/webp" 13 | } 14 | 15 | function getLocalFileUrl(url) { 16 | var arr = url.split('.'); 17 | var type = arr[arr.length-1]; 18 | var xhr = new XMLHttpRequest(); 19 | xhr.open('get', url, false); 20 | xhr.send(null); 21 | var content = xhr.responseText || xhr.responseXML; 22 | if (!content) { 23 | return false; 24 | } 25 | var wordArray = CryptoJS.enc.Utf8.parse(content); 26 | var base64 = CryptoJS.enc.Base64.stringify(wordArray); 27 | return ("data:" + (typeMap[type] || typeMap.txt) + ";charset=utf-8;base64," + base64); 28 | } 29 | 30 | chrome.webRequest.onBeforeRequest.addListener(function (details) { 31 | if(!JSON.parse(localStorage.webRedirect_toggle || "false")){ 32 | return {} 33 | } 34 | var url = details.url; 35 | for (var i = 0; i < webRedirect.length; i++) { 36 | var [mstr, rurl_or_data, type] = webRedirect[i] 37 | if (url.indexOf(mstr) != -1){ 38 | if (type == 'redirect local.' && rurl_or_data.trim().indexOf('file:///') == 0){ 39 | var rdata = getLocalFileUrl(rurl_or_data) 40 | if (rdata){ 41 | return { redirectUrl: rdata }; 42 | } 43 | } 44 | if (type == 'change return data.'){ 45 | var arr = url.split('.') 46 | var rdata = "data:" + (typeMap[arr[arr.length-1]] || typeMap.txt) + ";charset=utf-8;base64," 47 | + CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(rurl_or_data)); 48 | return { redirectUrl: rdata }; 49 | } 50 | } 51 | } 52 | return {} 53 | }, 54 | {urls: [""]}, 55 | ["blocking"] 56 | ); 57 | 58 | var webRedirect = [] 59 | window.addEventListener('storage', function(){ 60 | webRedirect = JSON.parse(localStorage.webRedirect || "[]") 61 | }, false); 62 | chrome.storage.local.get([ 63 | "response_changer", 64 | ], function(res){ 65 | var init_data = JSON.parse(res["response_changer"] || "[]") 66 | webRedirect = init_data 67 | }) -------------------------------------------------------------------------------- /tools/btn_utils.js: -------------------------------------------------------------------------------- 1 | 2 | var open_ast_pagetn = document.getElementById('open_ast_page') 3 | var open_diff_texttn = document.getElementById('open_diff_text') 4 | var sojsontn = document.getElementById('sojson') 5 | var obtn = document.getElementById('ob') 6 | var jsfuckbtn = document.getElementById('jsfuck') 7 | var obnormalbtn = document.getElementById('obnormal') 8 | var tr2es5btn = document.getElementById('tr2es5') 9 | var babel_aline = document.getElementById('babel_aline') 10 | var uglifybtn = document.getElementById('uglify') 11 | var terserbtn = document.getElementById('terser') 12 | var uglify_minibtn = document.getElementById('uglify_mini') 13 | var terser_minibtn = document.getElementById('terser_mini') 14 | var txt = document.getElementById('txt') 15 | var txt2 = document.getElementById('txt2') 16 | 17 | open_ast_pagetn.addEventListener('click', function(e){ 18 | var temp = chrome.runtime.getURL('astexplorer_babel.html') 19 | console.log(temp) 20 | chrome.tabs.create({ 21 | url: temp 22 | }); 23 | }) 24 | 25 | open_diff_texttn.addEventListener('click', function(e){ 26 | var temp = chrome.runtime.getURL('diff_text.html') 27 | console.log(temp) 28 | chrome.tabs.create({ 29 | url: temp 30 | }); 31 | }) 32 | 33 | babel_aline.addEventListener('click', function(e){ 34 | try{ 35 | ;(txt2||txt).value = muti_process_aline(txt.value) 36 | }catch(e){ 37 | ;(txt2||txt).value = e.stack 38 | } 39 | }) 40 | 41 | function get_ob_config(){ 42 | return { 43 | clear_ob_extra: clear_ob_extra.checked, 44 | clear_not_use: clear_not_use.checked, 45 | ob_dec_name: ob_dec_name.value, 46 | } 47 | } 48 | 49 | sojsontn.addEventListener('click', function(e){ 50 | try{ 51 | try{ 52 | ;(txt2||txt).value = muti_process_sojsondefusion(txt.value, get_ob_config()) 53 | }catch(e){ 54 | console.log('解密失败,尝试不配置清理 clear_ob_extra 再次解密') 55 | var config = get_ob_config() 56 | delete config.clear_ob_extra 57 | ;(txt2||txt).value = muti_process_sojsondefusion(txt.value) 58 | } 59 | }catch(e){ 60 | ;(txt2||txt).value = e.stack 61 | } 62 | }) 63 | 64 | obtn.addEventListener('click', function(e){ 65 | try{ 66 | ;(txt2||txt).value = muti_process_obdefusion(txt.value, get_ob_config()) 67 | }catch(e){ 68 | if (e.__proto__.name == 'ReferenceError'){ 69 | var mth = /^(.*) is not defined/.exec(e.message) 70 | if (mth){ 71 | console.log(`出现 ReferenceError: '${mth[1]}' is not defined 的异常,尝试用 '${mth[1]}' 作为解密名字二次解密。`) 72 | var config = get_ob_config() 73 | config.ob_dec_name = mth[1] 74 | try{ 75 | ;(txt2||txt).value = muti_process_obdefusion(txt.value, config) 76 | }catch(e){ 77 | ;(txt2||txt).value = e.stack 78 | } 79 | return 80 | } 81 | } 82 | ;(txt2||txt).value = e.stack 83 | } 84 | }) 85 | 86 | obnormal.addEventListener('click', function(e){ 87 | try{ 88 | ;(txt2||txt).value = muti_process_defusion(txt.value, get_ob_config()) 89 | }catch(e){ 90 | ;(txt2||txt).value = e.stack 91 | } 92 | }) 93 | 94 | tr2es5.addEventListener('click', function(e){ 95 | try{ 96 | ;(txt2||txt).value = transform_jscode_to_es5(txt.value, get_ob_config()) 97 | }catch(e){ 98 | ;(txt2||txt).value = e.stack 99 | } 100 | }) 101 | 102 | jsfuckbtn.addEventListener('click', function(e){ 103 | try{ 104 | ;(txt2||txt).value = muti_process_jsfuckdefusion(txt.value) 105 | }catch(e){ 106 | ;(txt2||txt).value = e.stack 107 | } 108 | }) 109 | 110 | uglifybtn.addEventListener('click', function(e){ 111 | var r = UglifyJS.minify(txt.value, { 112 | compress: { 113 | drop_debugger: false, 114 | hoist_vars: false, 115 | join_vars: false, 116 | sequences: false, 117 | inline: false, 118 | loops: false, 119 | reduce_funcs: false, 120 | reduce_vars: false, 121 | collapse_vars: false, 122 | comparisons: false, 123 | computed_props: false, 124 | conditionals: true, 125 | evaluate: true, 126 | expression: false, 127 | }, 128 | output: { 129 | bracketize: true, 130 | beautify: true, 131 | }, 132 | }) 133 | ;(txt2||txt).value = r.code?r.code:r.error; 134 | }) 135 | 136 | uglify_minibtn.addEventListener('click', function(e){ 137 | var r = UglifyJS.minify(txt.value) 138 | ;(txt2||txt).value = r.code?r.code:r.error; 139 | }) 140 | 141 | terserbtn.addEventListener('click', function(e){ 142 | terser.charlist = '0123456789' 143 | terser.prefix = 'vvv_' 144 | terser.tail = '_' 145 | terser.minify(txt.value, {compress:false,output:{beautify:true}}).then(function(e){ 146 | terser.charlist = undefined 147 | terser.prefix = undefined 148 | terser.tail = undefined 149 | ;(txt2||txt).value = e.code?e.code:e.error; 150 | }) 151 | }) 152 | 153 | terser_minibtn.addEventListener('click', function(e){ 154 | terser.minify(txt.value).then(function(e){ 155 | ;(txt2||txt).value = e.code?e.code:e.error; 156 | }) 157 | }) 158 | 159 | var envb = document.getElementById('env'); 160 | envb.addEventListener('dblclick', function(e){ 161 | ;(txt2||txt).value = '!'+v_mk+'()'; 162 | }) 163 | 164 | var envb = document.getElementById('debug_hook'); 165 | envb.addEventListener('dblclick', function(e){ 166 | get_file('inject.js', function(e){ 167 | var ast = parser.parse(e) 168 | var fdecls = [] 169 | for (var i = 0; i < ast.program.body.length; i++) { 170 | if (t.isFunctionDeclaration(ast.program.body[i])){ 171 | fdecls.push(ast.program.body[i]) 172 | } 173 | else if(t.isVariableDeclaration(ast.program.body[i])){ 174 | fdecls.push(ast.program.body[i]) 175 | } 176 | } 177 | ast.program.body = fdecls 178 | var code = generator(ast).code 179 | code = code + ` 180 | add_config_hook(getsets) 181 | add_config_hook(funcs) 182 | chrome.storage.local.get(hookers, function (result) { 183 | result["config-hook-global"] = true 184 | var replacer_injectfunc = (injectfunc + '').replace('$domobj_placeholder', make_domhooker_funcs()) 185 | var replacer_injectfunc = replacer_injectfunc.replace('$make_v_func', make_v+';') 186 | var log_toggle = result["config-hook-log-toggle"] 187 | var temp_toggle = false 188 | if(!log_toggle){ 189 | temp_toggle = true 190 | } 191 | var inject_code = \`(\${replacer_injectfunc})(\${JSON.stringify(result)},window,\${temp_toggle})\` 192 | my_magic_obj['inject_code'] = inject_code 193 | }) 194 | ` 195 | new Function('my_magic_obj', code)(new Proxy({}, { 196 | set(a,b,c){ 197 | a[b] = c 198 | if (b == 'inject_code'){ 199 | attach_all(c) 200 | } 201 | return true 202 | } 203 | })) 204 | function attach_all(code){ 205 | debug_tab = true 206 | chrome.tabs.query({}, function(tabs) { 207 | for (var i = 0; i < tabs.length; i++) { 208 | if (tabs[i].url.startsWith("chrome")){ 209 | continue 210 | } 211 | attach_tab_debug(tabs[i].id, code) 212 | } 213 | }); 214 | function attach_tab_debug(tabId, code){ 215 | cache_tabid_new[tabId] = 1 216 | var tabids = Object.keys(cache_tabid_new) 217 | for (var i = 0; i < tabids.length; i++) { 218 | if (cache_tabid_new[tabids[i]] == 1 && !cache_tabid_att[tabids[i]]){ 219 | cache_tabid_att[tabids[i]] = 1 220 | var currtab = { tabId: +tabids[i] }; 221 | chrome.debugger.attach(currtab, "1.2", function () { 222 | chrome.debugger.sendCommand(currtab, "Page.enable", function(){ 223 | chrome.debugger.sendCommand(currtab, "Page.addScriptToEvaluateOnNewDocument", { 224 | source: code 225 | }, function(){ 226 | console.log('addScriptToEvaluateOnNewDocument ok .') 227 | }); 228 | }); 229 | }); 230 | } 231 | } 232 | } 233 | } 234 | }) 235 | }) -------------------------------------------------------------------------------- /tools/bytejs.js: -------------------------------------------------------------------------------- 1 | // makebytejs.js 2 | var vm = require('vm'); 3 | var fs = require('fs'); 4 | var _module = require('module'); 5 | var v8 = require('v8'); 6 | v8.setFlagsFromString('--no-lazy'); 7 | 8 | function xor(buffer){ 9 | var key = '123456789'.split('').map(function(e){return e.charCodeAt()}) 10 | for (var i = 0; i < buffer.length; i++) { 11 | buffer[i] ^= key[i % key.length] 12 | } 13 | } 14 | 15 | function compileFile(filePath) { 16 | if (!fs.existsSync(filePath)) return 17 | var code = fs.readFileSync(filePath, 'utf-8'); 18 | var script = new vm.Script(_module.wrap(code)); 19 | var bytecode = script.createCachedData(); 20 | xor(bytecode) 21 | fs.writeFileSync('main.bytecode', bytecode); 22 | } 23 | compileFile('./main_.js'); 24 | 25 | 26 | // runbytejs.js 27 | var _module = require('module'); 28 | var path = require('path'); 29 | var fs = require('fs') 30 | var vm = require('vm'); 31 | var v8 = require('v8'); 32 | v8.setFlagsFromString('--no-flush-bytecode'); 33 | function validateString(value, name) { 34 | if (typeof value !== 'string') { 35 | throw new Error(`${name} is not string`); 36 | } 37 | } 38 | function makeRequireFunction(mod) { 39 | var Module = mod.constructor; 40 | var require = function require(path) { 41 | return mod.require(path); 42 | }; 43 | require.resolve = function resolve(request, options) { 44 | validateString(request, 'request'); 45 | return Module._resolveFilename(request, mod, false, options); 46 | } 47 | require.resolve.paths = function paths(request) { 48 | validateString(request, 'request'); 49 | return Module._resolveLookupPaths(request, mod); 50 | }; 51 | require.main = process.mainModule; 52 | require.extensions = Module._extensions; 53 | require.cache = Module._cache; 54 | return require; 55 | } 56 | var HeaderOffsetMap = { 57 | 'magic': 0, 58 | 'version_hash': 4, 59 | 'source_hash': 8, 60 | 'flag_hash': 12 61 | }; 62 | function getFlagBuf() { 63 | var script = new vm.Script(""); 64 | return getHeader(script.createCachedData(), 'flag_hash'); 65 | } 66 | function getHeader(buffer, type) { 67 | var offset = HeaderOffsetMap[type]; 68 | return buffer.slice(offset, offset + 4); 69 | } 70 | function setHeader(buffer, type, vBuffer) { 71 | vBuffer.copy(buffer, HeaderOffsetMap[type]); 72 | } 73 | function buf2num(buf) { 74 | // 注意字节序问题 75 | var ret = 0; 76 | ret |= buf[3] << 24; 77 | ret |= buf[2] << 16; 78 | ret |= buf[1] << 8; 79 | ret |= buf[0]; 80 | return ret; 81 | } 82 | function loadBytecode(filePath) { 83 | var bytecode = fs.readFileSync(filePath, null); 84 | xor(bytecode) 85 | setHeader(bytecode, 'flag_hash', getFlagBuf()); 86 | var sourceHash = buf2num(getHeader(bytecode, 'source_hash')); 87 | var script = new vm.Script(' '.repeat(sourceHash), { 88 | filename: filePath, 89 | cachedData: bytecode, 90 | lineOffset: 0, 91 | displayErrors: true 92 | }); 93 | if (script.cachedDataRejected) { 94 | throw new Error('something is wrong'); 95 | } 96 | return script; 97 | } 98 | _module._extensions['.bytecode'] = function (module, filename) { 99 | var script = loadBytecode(filename, false); 100 | var wrapperFn = script.runInThisContext({ 101 | filename: filename, 102 | displayErrors: true, 103 | lineOffset: 0, 104 | columnOffset: 0, 105 | }); 106 | var require = makeRequireFunction(module); 107 | wrapperFn.bind(module.exports)(module.exports, require, module, filename, path.dirname(filename)); 108 | } 109 | 110 | require('./main.bytecode') -------------------------------------------------------------------------------- /tools/common.js: -------------------------------------------------------------------------------- 1 | function set_my_proxy(proxy){ 2 | if (proxy){ 3 | var proxylist = proxy.trim().split('\n').map(function(e){ 4 | return e.trim() 5 | }) 6 | var toggle = false 7 | for (var i = 0; i < proxylist.length; i++) { 8 | if (proxylist[i] && !proxylist[i].startsWith('//')){ 9 | proxy = proxylist[i] 10 | toggle = true 11 | break 12 | } 13 | } 14 | if(!toggle){ 15 | proxy = '' 16 | } 17 | }else{ 18 | proxy = proxy||'' 19 | } 20 | var pacScriptConfig = { 21 | mode: 'pac_script', 22 | pacScript: { 23 | data: ` 24 | function FindProxyForURL(url, host) { 25 | return "${proxy};DIRECT"; 26 | } 27 | ` 28 | } 29 | }; 30 | chrome.proxy.settings.set({ value: pacScriptConfig, scope: 'regular' }, function() { 31 | if (proxy){ 32 | // alert("代理设置完成"); 33 | }else{ 34 | // alert("取消代理链接"); 35 | } 36 | }); 37 | } -------------------------------------------------------------------------------- /tools/cryptojs.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var n,o,s,a,h,t,e,l,r,i,c,f,d,u,p,S,x,b,A,H,z,_,v,g,y,B,w,k,m,C,D,E,R,M,F,P,W,O,I,U=U||function(h){var i;if("undefined"!=typeof window&&window.crypto&&(i=window.crypto),"undefined"!=typeof self&&self.crypto&&(i=self.crypto),!(i=!(i=!(i="undefined"!=typeof globalThis&&globalThis.crypto?globalThis.crypto:i)&&"undefined"!=typeof window&&window.msCrypto?window.msCrypto:i)&&"undefined"!=typeof global&&global.crypto?global.crypto:i)&&"function"==typeof require)try{i=require("crypto")}catch(t){}var r=Object.create||function(t){return e.prototype=t,t=new e,e.prototype=null,t};function e(){}var t={},n=t.lib={},o=n.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},l=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=h.ceil(e/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new l.init(r,e/2)}},a=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new l.init(r,e)}},f=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},d=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new l.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?h.ceil(s):h.max((0|s)-this._minBufferSize,0))*o,n=h.min(4*c,n);if(c){for(var a=0;a>>32-e}function j(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>24&255)?(r=t>>8&255,i=255&t,255===(e=t>>16&255)?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i):t+=1<<24,t}function N(){for(var t=this._X,e=this._C,r=0;r<8;r++)E[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;R[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=R[0]+(R[7]<<16|R[7]>>>16)+(R[6]<<16|R[6]>>>16)|0,t[1]=R[1]+(R[0]<<8|R[0]>>>24)+R[7]|0,t[2]=R[2]+(R[1]<<16|R[1]>>>16)+(R[0]<<16|R[0]>>>16)|0,t[3]=R[3]+(R[2]<<8|R[2]>>>24)+R[1]|0,t[4]=R[4]+(R[3]<<16|R[3]>>>16)+(R[2]<<16|R[2]>>>16)|0,t[5]=R[5]+(R[4]<<8|R[4]>>>24)+R[3]|0,t[6]=R[6]+(R[5]<<16|R[5]>>>16)+(R[4]<<16|R[4]>>>16)|0,t[7]=R[7]+(R[6]<<8|R[6]>>>24)+R[5]|0}function q(){for(var t=this._X,e=this._C,r=0;r<8;r++)O[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;I[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=I[0]+(I[7]<<16|I[7]>>>16)+(I[6]<<16|I[6]>>>16)|0,t[1]=I[1]+(I[0]<<8|I[0]>>>24)+I[7]|0,t[2]=I[2]+(I[1]<<16|I[1]>>>16)+(I[0]<<16|I[0]>>>16)|0,t[3]=I[3]+(I[2]<<8|I[2]>>>24)+I[1]|0,t[4]=I[4]+(I[3]<<16|I[3]>>>16)+(I[2]<<16|I[2]>>>16)|0,t[5]=I[5]+(I[4]<<8|I[4]>>>24)+I[3]|0,t[6]=I[6]+(I[5]<<16|I[5]>>>16)+(I[4]<<16|I[4]>>>16)|0,t[7]=I[7]+(I[6]<<8|I[6]>>>24)+I[5]|0}return F=(M=U).lib,n=F.Base,o=F.WordArray,(M=M.x64={}).Word=n.extend({init:function(t,e){this.high=t,this.low=e}}),M.WordArray=n.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i>>2]|=t[i]<<24-i%4*8;s.call(this,r,e)}else s.apply(this,arguments)}).prototype=P),function(){var t=U,n=t.lib.WordArray,t=t.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),a=(w=U).lib.WordArray,w.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return a.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},h=(F=U).lib.WordArray,F.enc.Base64url={stringify:function(t,e=!0){var r=t.words,i=t.sigBytes,n=e?this._safe_map:this._map;t.clamp();for(var o=[],s=0;s>>2]>>>24-s%4*8&255)<<16|(r[s+1>>>2]>>>24-(s+1)%4*8&255)<<8|r[s+2>>>2]>>>24-(s+2)%4*8&255,a=0;a<4&&s+.75*a>>6*(3-a)&63));var h=n.charAt(64);if(h)for(;o.length%4;)o.push(h);return o.join("")},parse:function(t,e=!0){var r=t.length,i=e?this._safe_map:this._map;if(!(n=this._reverseMap))for(var n=this._reverseMap=[],o=0;o>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return h.create(i,n)}(t,r,n)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_safe_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},function(a){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,A=[];!function(){for(var t=0;t<64;t++)A[t]=4294967296*a.abs(a.sin(t+1))|0}();e=e.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],y=t[e+10],v=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],m=H(m=o[0],b=o[1],x=o[2],S=o[3],s,7,A[0]),S=H(S,m,b,x,c,12,A[1]),x=H(x,S,m,b,a,17,A[2]),b=H(b,x,S,m,h,22,A[3]);m=H(m,b,x,S,l,7,A[4]),S=H(S,m,b,x,f,12,A[5]),x=H(x,S,m,b,d,17,A[6]),b=H(b,x,S,m,u,22,A[7]),m=H(m,b,x,S,p,7,A[8]),S=H(S,m,b,x,_,12,A[9]),x=H(x,S,m,b,y,17,A[10]),b=H(b,x,S,m,v,22,A[11]),m=H(m,b,x,S,g,7,A[12]),S=H(S,m,b,x,B,12,A[13]),x=H(x,S,m,b,w,17,A[14]),m=z(m,b=H(b,x,S,m,k,22,A[15]),x,S,c,5,A[16]),S=z(S,m,b,x,d,9,A[17]),x=z(x,S,m,b,v,14,A[18]),b=z(b,x,S,m,s,20,A[19]),m=z(m,b,x,S,f,5,A[20]),S=z(S,m,b,x,y,9,A[21]),x=z(x,S,m,b,k,14,A[22]),b=z(b,x,S,m,l,20,A[23]),m=z(m,b,x,S,_,5,A[24]),S=z(S,m,b,x,w,9,A[25]),x=z(x,S,m,b,h,14,A[26]),b=z(b,x,S,m,p,20,A[27]),m=z(m,b,x,S,B,5,A[28]),S=z(S,m,b,x,a,9,A[29]),x=z(x,S,m,b,u,14,A[30]),m=C(m,b=z(b,x,S,m,g,20,A[31]),x,S,f,4,A[32]),S=C(S,m,b,x,p,11,A[33]),x=C(x,S,m,b,v,16,A[34]),b=C(b,x,S,m,w,23,A[35]),m=C(m,b,x,S,c,4,A[36]),S=C(S,m,b,x,l,11,A[37]),x=C(x,S,m,b,u,16,A[38]),b=C(b,x,S,m,y,23,A[39]),m=C(m,b,x,S,B,4,A[40]),S=C(S,m,b,x,s,11,A[41]),x=C(x,S,m,b,h,16,A[42]),b=C(b,x,S,m,d,23,A[43]),m=C(m,b,x,S,_,4,A[44]),S=C(S,m,b,x,g,11,A[45]),x=C(x,S,m,b,k,16,A[46]),m=D(m,b=C(b,x,S,m,a,23,A[47]),x,S,s,6,A[48]),S=D(S,m,b,x,u,10,A[49]),x=D(x,S,m,b,w,15,A[50]),b=D(b,x,S,m,f,21,A[51]),m=D(m,b,x,S,g,6,A[52]),S=D(S,m,b,x,h,10,A[53]),x=D(x,S,m,b,y,15,A[54]),b=D(b,x,S,m,c,21,A[55]),m=D(m,b,x,S,p,6,A[56]),S=D(S,m,b,x,k,10,A[57]),x=D(x,S,m,b,d,15,A[58]),b=D(b,x,S,m,B,21,A[59]),m=D(m,b,x,S,l,6,A[60]),S=D(S,m,b,x,v,10,A[61]),x=D(x,S,m,b,a,15,A[62]),b=D(b,x,S,m,_,21,A[63]),o[0]=o[0]+m|0,o[1]=o[1]+b|0,o[2]=o[2]+x|0,o[3]=o[3]+S|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=a.floor(r/4294967296),r=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,o=e.words,s=0;s<4;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return e},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function H(t,e,r,i,n,o,s){s=t+(e&r|~e&i)+n+s;return(s<>>32-o)+e}function z(t,e,r,i,n,o,s){s=t+(e&i|r&~i)+n+s;return(s<>>32-o)+e}function C(t,e,r,i,n,o,s){s=t+(e^r^i)+n+s;return(s<>>32-o)+e}function D(t,e,r,i,n,o,s){s=t+(r^(e|~i))+n+s;return(s<>>32-o)+e}t.MD5=i._createHelper(e),t.HmacMD5=i._createHmacHelper(e)}(Math),P=(M=U).lib,t=P.WordArray,e=P.Hasher,P=M.algo,l=[],P=P.SHA1=e.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){a<16?l[a]=0|t[e+a]:(h=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=h<<1|h>>>31);var h=(i<<5|i>>>27)+c+l[a];h+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=h}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t}}),M.SHA1=e._createHelper(P),M.HmacSHA1=e._createHmacHelper(P),function(n){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,o=[],p=[];!function(){function t(t){return 4294967296*(t-(0|t))|0}for(var e=2,r=0;r<64;)!function(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}(e)||(r<8&&(o[r]=t(n.pow(e,.5))),p[r]=t(n.pow(e,1/3)),r++),e++}();var _=[],e=e.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){f<16?_[f]=0|t[e+f]:(d=_[f-15],u=_[f-2],_[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+_[f-7]+((u<<15|u>>>17)^(u<<13|u>>>19)^u>>>10)+_[f-16]);var d=i&n^i&o^n&o,u=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+p[f]+_[f],l=h,h=a,a=c,c=s+u|0,s=o,o=n,n=i,i=u+(((i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22))+d)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(e),t.HmacSHA256=i._createHmacHelper(e)}(Math),r=(w=U).lib.WordArray,F=w.algo,i=F.SHA256,F=F.SHA224=i.extend({_doReset:function(){this._hash=new r.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=4,t}}),w.SHA224=i._createHelper(F),w.HmacSHA224=i._createHmacHelper(F),function(){var t=U,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,r=t.algo;function o(){return i.create.apply(i,arguments)}var t1=[o(1116352408,3609767458),o(1899447441,602891725),o(3049323471,3964484399),o(3921009573,2173295548),o(961987163,4081628472),o(1508970993,3053834265),o(2453635748,2937671579),o(2870763221,3664609560),o(3624381080,2734883394),o(310598401,1164996542),o(607225278,1323610764),o(1426881987,3590304994),o(1925078388,4068182383),o(2162078206,991336113),o(2614888103,633803317),o(3248222580,3479774868),o(3835390401,2666613458),o(4022224774,944711139),o(264347078,2341262773),o(604807628,2007800933),o(770255983,1495990901),o(1249150122,1856431235),o(1555081692,3175218132),o(1996064986,2198950837),o(2554220882,3999719339),o(2821834349,766784016),o(2952996808,2566594879),o(3210313671,3203337956),o(3336571891,1034457026),o(3584528711,2466948901),o(113926993,3758326383),o(338241895,168717936),o(666307205,1188179964),o(773529912,1546045734),o(1294757372,1522805485),o(1396182291,2643833823),o(1695183700,2343527390),o(1986661051,1014477480),o(2177026350,1206759142),o(2456956037,344077627),o(2730485921,1290863460),o(2820302411,3158454273),o(3259730800,3505952657),o(3345764771,106217008),o(3516065817,3606008344),o(3600352804,1432725776),o(4094571909,1467031594),o(275423344,851169720),o(430227734,3100823752),o(506948616,1363258195),o(659060556,3750685593),o(883997877,3785050280),o(958139571,3318307427),o(1322822218,3812723403),o(1537002063,2003034995),o(1747873779,3602036899),o(1955562222,1575990012),o(2024104815,1125592928),o(2227730452,2716904306),o(2361852424,442776044),o(2428436474,593698344),o(2756734187,3733110249),o(3204031479,2999351573),o(3329325298,3815920427),o(3391569614,3928383900),o(3515267271,566280711),o(3940187606,3454069534),o(4118630271,4000239992),o(116418474,1914138554),o(174292421,2731055270),o(289380356,3203993006),o(460393269,320620315),o(685471733,587496836),o(852142971,1086792851),o(1017036298,365543100),o(1126000580,2618297676),o(1288033470,3409855158),o(1501505948,4234509866),o(1607167915,987167468),o(1816402316,1246189591)],e1=[];!function(){for(var t=0;t<80;t++)e1[t]=o()}();r=r.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,y=o.low,v=s.high,g=s.low,B=c.high,w=c.low,k=a.high,m=a.low,S=h.high,x=h.low,b=l.high,r=l.low,A=f,H=d,z=u,C=p,D=_,E=y,R=v,M=g,F=B,P=w,W=k,O=m,I=S,U=x,K=b,X=r,L=0;L<80;L++){var j,T,N=e1[L];L<16?(T=N.high=0|t[e+2*L],j=N.low=0|t[e+2*L+1]):($=(q=e1[L-15]).high,J=q.low,G=(Q=e1[L-2]).high,V=Q.low,Z=(Y=e1[L-7]).high,q=Y.low,Y=(Q=e1[L-16]).high,T=(T=(($>>>1|J<<31)^($>>>8|J<<24)^$>>>7)+Z+((j=(Z=(J>>>1|$<<31)^(J>>>8|$<<24)^(J>>>7|$<<25))+q)>>>0>>0?1:0))+((G>>>19|V<<13)^(G<<3|V>>>29)^G>>>6)+((j+=J=(V>>>19|G<<13)^(V<<3|G>>>29)^(V>>>6|G<<26))>>>0>>0?1:0),j+=$=Q.low,N.high=T=T+Y+(j>>>0<$>>>0?1:0),N.low=j);var q=F&W^~F&I,Z=P&O^~P&U,V=A&z^A&D^z&D,G=(H>>>28|A<<4)^(H<<30|A>>>2)^(H<<25|A>>>7),J=t1[L],Q=J.high,Y=J.low,$=X+((P>>>14|F<<18)^(P>>>18|F<<14)^(P<<23|F>>>9)),N=K+((F>>>14|P<<18)^(F>>>18|P<<14)^(F<<23|P>>>9))+($>>>0>>0?1:0),J=G+(H&C^H&E^C&E),K=I,X=U,I=W,U=O,W=F,O=P,F=R+(N=(N=(N=N+q+(($=$+Z)>>>0>>0?1:0))+Q+(($=$+Y)>>>0>>0?1:0))+T+(($=$+j)>>>0>>0?1:0))+((P=M+$|0)>>>0>>0?1:0)|0,R=D,M=E,D=z,E=C,z=A,C=H,A=N+(((A>>>28|H<<4)^(A<<30|H>>>2)^(A<<25|H>>>7))+V+(J>>>0>>0?1:0))+((H=$+J|0)>>>0<$>>>0?1:0)|0}d=i.low=d+H,i.high=f+A+(d>>>0>>0?1:0),p=n.low=p+C,n.high=u+z+(p>>>0>>0?1:0),y=o.low=y+E,o.high=_+D+(y>>>0>>0?1:0),g=s.low=g+M,s.high=v+R+(g>>>0>>0?1:0),w=c.low=w+P,c.high=B+F+(w>>>0

>>0?1:0),m=a.low=m+O,a.high=k+W+(m>>>0>>0?1:0),x=h.low=x+U,h.high=S+I+(x>>>0>>0?1:0),r=l.low=r+X,l.high=b+K+(r>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(r),t.HmacSHA512=e._createHmacHelper(r)}(),P=(M=U).x64,c=P.Word,f=P.WordArray,P=M.algo,d=P.SHA512,P=P.SHA384=d.extend({_doReset:function(){this._hash=new f.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var t=d._doFinalize.call(this);return t.sigBytes-=16,t}}),M.SHA384=d._createHelper(P),M.HmacSHA384=d._createHmacHelper(P),function(l){var t=U,e=t.lib,f=e.WordArray,i=e.Hasher,d=t.x64.Word,e=t.algo,A=[],H=[],z=[];!function(){for(var t=1,e=0,r=0;r<24;r++){A[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)H[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s,c=0,a=0,h=0;h<7;h++)1&n&&((s=(1<>>24)|4278255360&(o<<24|o>>>8);(m=r[n]).high^=s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),m.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(m=r[a+5*f]).high,l^=m.low;var d=C[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=C[(a+4)%5],p=C[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(m=r[a+5*f]).high^=h,m.low^=l;for(var y=1;y<25;y++){var v=(m=r[y]).high,g=m.low,B=A[y];l=B<32?(h=v<>>32-B,g<>>32-B):(h=g<>>64-B,v<>>64-B);B=C[H[y]];B.high=h,B.low=l}var w=C[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var m=r[y=a+5*f],S=C[y],x=C[(a+1)%5+5*f],b=C[(a+2)%5+5*f];m.high=S.high^~x.high&b.high,m.low=S.low^~x.low&b.low}m=r[0],k=z[c];m.high^=k.high,m.low^=k.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(l.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,e=this.cfg.outputLength/8,o=e/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new f.init(s,e)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(e),t.HmacSHA3=i._createHmacHelper(e)}(Math),Math,F=(w=U).lib,u=F.WordArray,p=F.Hasher,F=w.algo,S=u.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=u.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=u.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=u.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),H=u.create([0,1518500249,1859775393,2400959708,2840853838]),z=u.create([1352829926,1548603684,1836072691,2053994217,0]),F=F.RIPEMD160=p.extend({_doReset:function(){this._hash=u.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}for(var o,s,c,a,h,l,f=this._hash.words,d=H.words,u=z.words,p=S.words,_=x.words,y=b.words,v=A.words,g=o=f[0],B=s=f[1],w=c=f[2],k=a=f[3],m=h=f[4],r=0;r<80;r+=1)l=o+t[e+p[r]]|0,l+=r<16?(s^c^a)+d[0]:r<32?K(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?X(s,c,a)+d[3]:(s^(c|~a))+d[4],l=(l=L(l|=0,y[r]))+h|0,o=h,h=a,a=L(c,10),c=s,s=l,l=g+t[e+_[r]]|0,l+=r<16?(B^(w|~k))+u[0]:r<32?X(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?K(B,w,k)+u[3]:(B^w^k)+u[4],l=(l=L(l|=0,v[r]))+m|0,g=m,m=k,k=L(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+m|0,f[2]=f[3]+h+g|0,f[3]=f[4]+o+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,n=e.words,o=0;o<5;o++){var s=n[o];n[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return e},clone:function(){var t=p.clone.call(this);return t._hash=this._hash.clone(),t}}),w.RIPEMD160=p._createHelper(F),w.HmacRIPEMD160=p._createHmacHelper(F),P=(M=U).lib.Base,_=M.enc.Utf8,M.algo.HMAC=P.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;(e=e.sigBytes>i?t.finalize(e):e).clamp();for(var t=this._oKey=e.clone(),e=this._iKey=e.clone(),n=t.words,o=e.words,s=0;s>>2];t.sigBytes-=e}},d=(e.BlockCipher=a.extend({cfg:a.cfg.extend({mode:n,padding:l}),reset:function(){var t;a.reset.call(this);var e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),l=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,e=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return e.toString(o)},parse:function(t){var e,r=o.parse(t),t=r.words;return 1398893684==t[0]&&1701076831==t[1]&&(e=s.create(t.slice(2,4)),t.splice(0,4),r.sigBytes-=16),d.create({ciphertext:r,salt:e})}},u=e.SerializableCipher=r.extend({cfg:r.extend({format:l}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),e=n.finalize(e),n=n.cfg;return d.create({ciphertext:e,key:r,iv:n.iv,algorithm:t,mode:n.mode,padding:n.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),t=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||s.random(8);t=c.create({keySize:e+r}).compute(t,i),r=s.create(t.words.slice(e),4*r);return t.sigBytes=4*e,d.create({key:t,iv:r,salt:i})}},p=e.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:t}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=r.iv;i=u.encrypt.call(this,t,e,r.key,i);return i.mixIn(r),i},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=r.iv,u.decrypt.call(this,t,e,r.key,i)}})}(),U.mode.CFB=((F=U.lib.BlockCipherMode.extend()).Encryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;j.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),F.Decryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);j.call(this,t,e,i,r),this._prevBlock=n}}),F),U.mode.CTR=(M=U.lib.BlockCipherMode.extend(),P=M.Encryptor=M.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(U.lib.WordArray.random(e-1)).concat(U.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso97971={pad:function(t,e){t.concat(U.lib.WordArray.create([2147483648],1)),U.pad.ZeroPadding.pad(t,e)},unpad:function(t){U.pad.ZeroPadding.unpad(t),t.sigBytes--}},U.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},U.pad.NoPadding={pad:function(){},unpad:function(){}},m=(P=U).lib.CipherParams,C=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(C)},parse:function(t){t=C.parse(t);return m.create({ciphertext:t})}},function(){var t=U,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],y=[],v=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=0,i=0,e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;h[r]=n=n>>>8^255&n^99;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a,_[n]=(a=16843009*c^65537*s^257*o^16843008*r)<<24|a>>>8,y[n]=a<<16|a>>>16,v[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],r=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^y[h[a>>>16&255]]^v[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,y,v,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],v=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=v,d=g;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],v=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(r)}(),function(){var t=U,e=t.lib,i=e.WordArray,r=e.BlockCipher,e=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],n=e.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){for(var s=n[o]=[],c=f[o],r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=n.createEncryptor(i.create(e)),this._des2=n.createEncryptor(i.create(r)),this._des3=n.createEncryptor(i.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(e)}(),function(){var t=U,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;for(var n=0,o=0;n<256;n++){var s=n%r,s=e[s>>>2]>>>24-s%4*8&255,o=(o+i[n]+s)%256,s=i[n];i[n]=i[o],i[o]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){var r=(r+t[e=(e+1)%256])%256,o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);r=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)N.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),s=e>>>16|4294901760&o,c=o<<16|65535&e;n[0]^=e,n[1]^=s,n[2]^=o,n[3]^=c,n[4]^=e,n[5]^=s,n[6]^=o,n[7]^=c;for(r=0;r<4;r++)N.call(this)}},_doProcessBlock:function(t,e){var r=this._X;N.call(this),D[0]=r[0]^r[5]>>>16^r[3]<<16,D[1]=r[2]^r[7]>>>16^r[5]<<16,D[2]=r[4]^r[1]>>>16^r[7]<<16,D[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)D[i]=16711935&(D[i]<<8|D[i]>>>24)|4278255360&(D[i]<<24|D[i]>>>8),t[e+i]^=D[i]},blockSize:4,ivSize:2}),M.Rabbit=F._createHelper(P),F=(M=U).lib.StreamCipher,P=M.algo,W=[],O=[],I=[],P=P.RabbitLegacy=F.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)q.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],t=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),s=e>>>16|4294901760&o,t=o<<16|65535&e;i[0]^=e,i[1]^=s,i[2]^=o,i[3]^=t,i[4]^=e,i[5]^=s,i[6]^=o,i[7]^=t;for(n=0;n<4;n++)q.call(this)}},_doProcessBlock:function(t,e){var r=this._X;q.call(this),W[0]=r[0]^r[5]>>>16^r[3]<<16,W[1]=r[2]^r[7]>>>16^r[5]<<16,W[2]=r[4]^r[1]>>>16^r[7]<<16,W[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)W[i]=16711935&(W[i]<<8|W[i]>>>24)|4278255360&(W[i]<<24|W[i]>>>8),t[e+i]^=W[i]},blockSize:4,ivSize:2}),M.RabbitLegacy=F._createHelper(P),U}); 2 | 3 | 4 | 5 | // if (typeof exports != 'undefined'){ 6 | // CryptoJS = exports 7 | // } 8 | // function aes_enc(data, key, iv){ 9 | // var srcs = CryptoJS.enc.Utf8.parse(data) 10 | // var key = CryptoJS.enc.Utf8.parse(key); 11 | // var iv = CryptoJS.enc.Utf8.parse(iv); 12 | // var encrypted = CryptoJS.AES.encrypt(srcs, key, { 13 | // iv: iv, 14 | // mode: CryptoJS.mode.CBC, 15 | // padding: CryptoJS.pad.Pkcs7 16 | // }).toString() 17 | // return encrypted 18 | // } 19 | 20 | // function aes_dec(data, key, iv){ 21 | // var key = CryptoJS.enc.Utf8.parse(key); 22 | // var iv = CryptoJS.enc.Utf8.parse(iv); 23 | // var decrypted = CryptoJS.AES.decrypt(data, key, { 24 | // iv: iv, 25 | // mode: CryptoJS.mode.CBC, 26 | // padding: CryptoJS.pad.Pkcs7 27 | // }).toString(CryptoJS.enc.Utf8) 28 | // return decrypted 29 | // } 30 | 31 | // var enc_data = aes_enc('123', '0123456789012345', '0123456789012345') 32 | // var dec_data = aes_dec(enc_data, '0123456789012345', '0123456789012345') 33 | // console.log(enc_data) 34 | // console.log(dec_data) -------------------------------------------------------------------------------- /tools/diff_text.js: -------------------------------------------------------------------------------- 1 | var value = ''; 2 | var orig1 = ''; 3 | var orig2 = ''; 4 | var dv 5 | var panes = 2 6 | var highlight = false 7 | var connect = false 8 | var collapse = false; 9 | function initUI() { 10 | if (value == null) return; 11 | var target = document.getElementById("view"); 12 | target.innerHTML = ""; 13 | if(dv){ 14 | var left = dv.leftOriginal() 15 | var curr = dv.editor() 16 | var right = dv.rightOriginal() 17 | value = curr.getValue() 18 | if (left){ orig1 = left.getValue() } 19 | if (right){ orig2 = right.getValue() } 20 | } 21 | dv = CodeMirror.MergeView(target, { 22 | value: value, 23 | origLeft: panes == 2 ? null : orig1, 24 | orig: orig2, 25 | lineNumbers: true, 26 | mode: "text/html", 27 | highlightDifferences: highlight, 28 | // viewportMargin: Infinity, 29 | // connect: connect, 30 | collapseIdentical: false, 31 | allowEditingOriginals: true, 32 | // onChange: function (cm) { 33 | // console.log(cm.getValue()); 34 | // }, 35 | }); 36 | var left = dv.leftOriginal() 37 | var curr = dv.editor() 38 | var right = dv.rightOriginal() 39 | function changer(_saver, cm) { 40 | chrome.storage.local.set({ 41 | [_saver]: cm.getValue(), 42 | }) 43 | } 44 | curr.on('change', changer.bind(null, 'diff_value')) 45 | if (left){ left.on('change', changer.bind(null, 'diff_orig1')) } 46 | if (right){ right.on('change', changer.bind(null, 'diff_orig2')) } 47 | resize(dv, window.innerHeight-100) 48 | } 49 | 50 | window.onload = function(){ 51 | chrome.storage.local.get([ 52 | 'diff_value', 53 | 'diff_orig1', 54 | 'diff_orig2', 55 | ], function (result) { 56 | value = result['diff_value'] || '' 57 | orig1 = result['diff_orig1'] || '' 58 | orig2 = result['diff_orig2'] || '' 59 | initUI(); 60 | }) 61 | } 62 | window.onresize = function(){ 63 | resize(dv, window.innerHeight-100) 64 | } 65 | 66 | function resize(mergeView, height) { 67 | if (mergeView.leftOriginal()){ 68 | mergeView.leftOriginal().setSize(null, height); 69 | } 70 | mergeView.editor().setSize(null, height); 71 | if (mergeView.rightOriginal()){ 72 | mergeView.rightOriginal().setSize(null, height); 73 | } 74 | mergeView.wrap.style.height = height + "px"; 75 | } 76 | 77 | var diff_0 = document.getElementById('diff_0') 78 | if(diff_0){ 79 | diff_0.addEventListener('click', function(){ 80 | initUI() 81 | }) 82 | } 83 | var diff_1 = document.getElementById('diff_1') 84 | if(diff_1){ 85 | diff_1.addEventListener('click', function(){ 86 | panes=2;initUI() 87 | }) 88 | } 89 | var diff_2 = document.getElementById('diff_2') 90 | if(diff_2){ 91 | diff_2.addEventListener('click', function(){ 92 | panes=3;initUI() 93 | }) 94 | } -------------------------------------------------------------------------------- /tools/error_front.js: -------------------------------------------------------------------------------- 1 | function send_error_info_to_front(e, tid, url){ 2 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 3 | chrome.tabs.sendMessage(tid, {action: {type:'error', info: url + '\n' + e}}, function(response) {}); 4 | }); 5 | } -------------------------------------------------------------------------------- /tools/merge.css: -------------------------------------------------------------------------------- 1 | .CodeMirror{font-family:monospace;height:360px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-folded,.CodeMirror-foldgutter-open{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"\25BE"}.CodeMirror-foldgutter-folded:after{content:"\25B8"} 2 | 3 | 4 | .CodeMirror-merge { 5 | position: relative; 6 | border: 1px solid #ddd; 7 | white-space: pre; 8 | box-sizing: content-box; 9 | -webkit-box-sizing: content-box; 10 | } 11 | 12 | .CodeMirror-merge, .CodeMirror-merge .CodeMirror { 13 | height: 350px; 14 | } 15 | 16 | .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } 17 | .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } 18 | .CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } 19 | .CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } 20 | 21 | .CodeMirror-merge-pane { 22 | display: inline-block; 23 | white-space: normal; 24 | vertical-align: top; 25 | } 26 | .CodeMirror-merge-pane-rightmost { 27 | position: absolute; 28 | right: 0px; 29 | z-index: 1; 30 | } 31 | 32 | .CodeMirror-merge-gap { 33 | z-index: 2; 34 | display: inline-block; 35 | height: 100%; 36 | -moz-box-sizing: border-box; 37 | box-sizing: border-box; 38 | overflow: hidden; 39 | border-left: 1px solid #ddd; 40 | border-right: 1px solid #ddd; 41 | position: relative; 42 | background: #f8f8f8; 43 | } 44 | 45 | .CodeMirror-merge-scrolllock-wrap { 46 | position: absolute; 47 | bottom: 0; left: 50%; 48 | } 49 | .CodeMirror-merge-scrolllock { 50 | position: relative; 51 | left: -50%; 52 | cursor: pointer; 53 | color: #555; 54 | line-height: 1; 55 | } 56 | .CodeMirror-merge-scrolllock:after { 57 | content: "\21db\00a0\00a0\21da"; 58 | } 59 | .CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after { 60 | content: "\21db\21da"; 61 | } 62 | 63 | .CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { 64 | position: absolute; 65 | left: 0; top: 0; 66 | right: 0; bottom: 0; 67 | line-height: 1; 68 | } 69 | 70 | .CodeMirror-merge-copy { 71 | position: absolute; 72 | cursor: pointer; 73 | color: #44c; 74 | z-index: 3; 75 | } 76 | 77 | .CodeMirror-merge-copy-reverse { 78 | position: absolute; 79 | cursor: pointer; 80 | color: #44c; 81 | } 82 | 83 | .CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } 84 | .CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } 85 | 86 | .CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { 87 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); 88 | background-position: bottom left; 89 | background-repeat: repeat-x; 90 | } 91 | 92 | .CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { 93 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); 94 | background-position: bottom left; 95 | background-repeat: repeat-x; 96 | } 97 | 98 | .CodeMirror-merge-r-chunk { background: #ffffe0; } 99 | .CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } 100 | .CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } 101 | .CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } 102 | 103 | .CodeMirror-merge-l-chunk { background: #eef; } 104 | .CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } 105 | .CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } 106 | .CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } 107 | 108 | .CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } 109 | .CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } 110 | .CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } 111 | 112 | .CodeMirror-merge-collapsed-widget:before { 113 | content: "(...)"; 114 | } 115 | .CodeMirror-merge-collapsed-widget { 116 | cursor: pointer; 117 | color: #88b; 118 | background: #eef; 119 | border: 1px solid #ddf; 120 | font-size: 90%; 121 | padding: 0 3px; 122 | border-radius: 4px; 123 | } 124 | .CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } 125 | -------------------------------------------------------------------------------- /tools/mod_code_getter.js: -------------------------------------------------------------------------------- 1 | function errorHandler(e){ 2 | console.log(e) 3 | } 4 | 5 | function get_file(filename, callback, errcallback){ 6 | chrome.runtime.getPackageDirectoryEntry(function(root) { 7 | root.getFile(filename, {}, function(fileEntry) { 8 | fileEntry.file(function(file) { 9 | var reader = new FileReader(); 10 | reader.onloadend = function(e) { 11 | // console.log(e, this.result) 12 | callback(this.result) 13 | } 14 | reader.readAsText(file); 15 | }, (errcallback||errorHandler)); 16 | }, (errcallback||errorHandler)); 17 | }); 18 | } 19 | 20 | var test_get_model_code = document.getElementById('test_get_model_code') 21 | if (test_get_model_code){ 22 | test_get_model_code.addEventListener('click', function(e){ 23 | function callback(text){ 24 | document.getElementById('my_code_dec').value = text 25 | } 26 | get_file('tools/mod_code_getter.js', callback) 27 | }) 28 | } 29 | 30 | var get_code_babel_ast = document.getElementById('get_code_babel_ast') 31 | if (get_code_babel_ast){ 32 | get_code_babel_ast.addEventListener('click', function(e){ 33 | function callback(text){ 34 | document.getElementById('my_code_dec').value = text 35 | } 36 | get_file('tools/babel_asttool.js', callback) 37 | }) 38 | } 39 | 40 | var get_code_cryptojs = document.getElementById('get_code_cryptojs') 41 | if (get_code_cryptojs){ 42 | get_code_cryptojs.addEventListener('click', function(e){ 43 | function callback(text){ 44 | document.getElementById('my_code_dec').value = text 45 | } 46 | get_file('tools/cryptojs.js', callback) 47 | }) 48 | } 49 | 50 | var get_code_uglifyjs = document.getElementById('get_code_uglifyjs') 51 | if (get_code_uglifyjs){ 52 | get_code_uglifyjs.addEventListener('click', function(e){ 53 | function callback(text){ 54 | document.getElementById('my_code_dec').value = text 55 | } 56 | get_file('tools/uglify_es.js', callback) 57 | }) 58 | } 59 | 60 | var get_code_request = document.getElementById('get_code_request') 61 | if (get_code_request){ 62 | get_code_request.addEventListener('click', function(e){ 63 | function callback(text){ 64 | document.getElementById('my_code_dec').value = text 65 | } 66 | get_file('tools/request.js', callback) 67 | }) 68 | } 69 | 70 | var get_code_jsencrypt = document.getElementById('get_code_jsencrypt') 71 | if (get_code_jsencrypt){ 72 | get_code_jsencrypt.addEventListener('click', function(e){ 73 | function callback(text){ 74 | document.getElementById('my_code_dec').value = text 75 | } 76 | get_file('tools/jsencrypt.js', callback) 77 | }) 78 | } 79 | 80 | var get_code_cheerio = document.getElementById('get_code_cheerio') 81 | if (get_code_cheerio){ 82 | get_code_cheerio.addEventListener('click', function(e){ 83 | function callback(text){ 84 | document.getElementById('my_code_dec').value = text 85 | } 86 | get_file('tools/cheerio.js', callback) 87 | }) 88 | } 89 | 90 | var get_code_terser = document.getElementById('get_code_terser') 91 | if (get_code_terser){ 92 | get_code_terser.addEventListener('click', function(e){ 93 | function callback(text){ 94 | document.getElementById('my_code_dec').value = text 95 | } 96 | get_file('tools/terser.js', callback) 97 | }) 98 | } 99 | 100 | var get_code_parse5 = document.getElementById('get_code_parse5') 101 | if (get_code_parse5){ 102 | get_code_parse5.addEventListener('click', function(e){ 103 | function callback(text){ 104 | document.getElementById('my_code_dec').value = text 105 | } 106 | get_file('tools/parse5.js', callback) 107 | }) 108 | } -------------------------------------------------------------------------------- /tools/redirect.js: -------------------------------------------------------------------------------- 1 | chrome.storage.local.get(["config-hook-new-tab"], function(e) { 2 | if(!e['config-hook-new-tab']) { 3 | chrome.tabs.update({ url: "chrome-search://local-ntp/local-ntp.html" }) 4 | }else{ 5 | var option_page = chrome.runtime.getURL('options.html') 6 | chrome.tabs.update({ url: option_page }) 7 | } 8 | }) -------------------------------------------------------------------------------- /tools/replacer.js: -------------------------------------------------------------------------------- 1 | function html_script_replacer(body, replacer, url){ 2 | var html = cheerio.load(body) 3 | var scripts = html("script"); 4 | if (!scripts.length){ 5 | return 6 | } 7 | for (var i = 0; i < scripts.length; i++) { 8 | var script = scripts[i] 9 | if (script.attribs.src){ 10 | continue 11 | } 12 | if (!script.children.length){ 13 | continue 14 | } 15 | if (script.attribs.type != 'text/javascript' && script.attribs.type !== undefined){ 16 | continue 17 | } 18 | var jscode = '' 19 | for (var j = 0; j < script.children.length; j++) { 20 | jscode += script.children[j].data 21 | } 22 | if (!jscode){ 23 | return 24 | } 25 | var newscript = cheerio.load("")("script"); 26 | newscript.attribs = script.attribs; 27 | html(script).replaceWith(newscript); 28 | } 29 | return html.html() 30 | } -------------------------------------------------------------------------------- /tools/sub_logger.js: -------------------------------------------------------------------------------- 1 | function sub_logger(){ 2 | chrome.storage.local.get([ 3 | 'config-hook-global', 4 | 'config-myinject_toggle', 5 | 'config-replacer_toggle', 6 | 'config-pac_proxy', 7 | ], function(e){ 8 | chrome.browserAction.setBadgeBackgroundColor({color: '#BC1717'}); 9 | var info = '' 10 | if (e['config-hook-global']){ 11 | info += 'H' 12 | } 13 | if (e['config-myinject_toggle']){ 14 | info += 'I' 15 | } 16 | if (e['config-pac_proxy']){ 17 | info += 'P' 18 | } 19 | if (e['config-replacer_toggle']){ 20 | info += 'R' 21 | localStorage.webRedirect_toggle = JSON.stringify(true) 22 | }else{ 23 | localStorage.webRedirect_toggle = JSON.stringify(false) 24 | } 25 | 26 | chrome.browserAction.setBadgeText({text: info}); 27 | }) 28 | } -------------------------------------------------------------------------------- /tools/window_hooker.js: -------------------------------------------------------------------------------- 1 | // 暂时还在考虑的一种 window hook 方式。需要配合全局 ast 代码修改的方式 2 | function fetch_hook(code){ 3 | var newn = t.ConditionalExpression( 4 | t.BinaryExpression('===', t.ThisExpression(), t.Identifier('v_window')), 5 | t.Identifier('v_win'), 6 | t.ThisExpression() 7 | ) 8 | function protect_this(path){ 9 | var node = path.node 10 | path.replaceWith(newn) 11 | path.stop() 12 | } 13 | var ast = parser.parse(code, {allowReturnOutsideFunction: true}); 14 | traverse(ast, {ThisExpression: protect_this}); 15 | var { code } = generator(ast, { jsescOption: { minimal: true, } }); 16 | return ` 17 | 18 | // 暂时还在考虑的一种 window hook 方式。需要配合全局 ast 代码修改的方式 19 | ;(function(){ 20 | var cache = {} 21 | function make_cache_hooker(obj, name){ 22 | if (name in cache){ return cache[name] } 23 | return cache[name] = new Proxy(obj, { 24 | set: function(a,b,c){ return filter_log('set', b, c), obj[b]=c }, 25 | get: function(a,b){ 26 | var r = obj[b] 27 | if (!(b == Symbol.unscopables || b == Symbol.toStringTag || b == Symbol.toPrimitive)){ filter_log(name, 'get', b, r) } 28 | if (typeof r == 'function'){ return r.bind(obj) } 29 | return r 30 | }, 31 | }) 32 | } 33 | var filter_log = console.log 34 | !function make_fake_window(){ 35 | if (window.v_win){ return } 36 | var _win = {} 37 | function mainobj(b, r){ 38 | switch(b){ 39 | case 'window': 40 | case 'self': 41 | case 'top': 42 | case 'frames': // 这两个可能存在问题 43 | case 'parent': // 这两个可能存在问题 44 | case 'globalThis': r = win; break 45 | case 'clientInformation': r = make_cache_hooker(clientInformation, 'window.clientInformation'); break 46 | case 'crypto': r = make_cache_hooker(crypto, 'window.crypto'); break 47 | case 'customElements': r = make_cache_hooker(customElements, 'window.customElements'); break 48 | case 'document': r = make_cache_hooker(document, 'window.document'); break 49 | case 'external': r = make_cache_hooker(external, 'window.external'); break 50 | case 'history': r = make_cache_hooker(history, 'window.history'); break 51 | case 'indexedDB': r = make_cache_hooker(indexedDB, 'window.indexedDB'); break 52 | case 'localStorage': r = make_cache_hooker(localStorage, 'window.localStorage'); break 53 | case 'locationbar': r = make_cache_hooker(locationbar, 'window.locationbar'); break 54 | case 'menubar': r = make_cache_hooker(menubar, 'window.menubar'); break 55 | case 'navigator': r = make_cache_hooker(navigator, 'window.navigator'); break 56 | case 'performance': r = make_cache_hooker(performance, 'window.performance'); break 57 | case 'personalbar': r = make_cache_hooker(personalbar, 'window.personalbar'); break 58 | case 'screen': r = make_cache_hooker(screen, 'window.screen'); break 59 | case 'scrollbars': r = make_cache_hooker(scrollbars, 'window.scrollbars'); break 60 | case 'sessionStorage': r = make_cache_hooker(sessionStorage, 'window.sessionStorage'); break 61 | case 'statusbar': r = make_cache_hooker(statusbar, 'window.statusbar'); break 62 | case 'toolbar': r = make_cache_hooker(toolbar, 'window.toolbar'); break 63 | case 'trustedTypes': r = make_cache_hooker(trustedTypes, 'window.trustedTypes'); break 64 | case 'visualViewport': r = make_cache_hooker(visualViewport, 'window.visualViewport'); break 65 | case 'location': r = make_cache_hooker(location, 'window.location'); break 66 | default: r = window[b]; break 67 | } 68 | return r 69 | } 70 | var unlogs = [ 71 | 'undefined', 72 | 'v_window', 73 | ] 74 | var localeval = eval 75 | var win = new Proxy(_win, { 76 | has: function(a,b){ return true }, 77 | set: function(a,b,c){ return filter_log('window set', b, c), window[b]=c }, 78 | get: function(a,b){ 79 | var r = mainobj(b) 80 | if (!(b == Symbol.unscopables || b == Symbol.toStringTag || b == Symbol.toPrimitive || unlogs.indexOf(b) != -1)){ filter_log('window', 'get', b, r) } 81 | if (typeof r == 'function' && !r.prototype){ return r.bind(window) } 82 | return r 83 | }, 84 | }) 85 | var interceptor = new Proxy(_win, { 86 | has: function(a,b){ return b in window }, // win 和 interceptor 的区别在这里 87 | set: function(a,b,c){ return filter_log('window set', b, c), window[b]=c }, 88 | get: function(a,b){ 89 | if (!(b in window) && typeof b != 'symbol'){ throw ReferenceError(b + ' is not defined') } // win 和 interceptor 的区别在这里 90 | var r = mainobj(b) 91 | if (!(b == Symbol.unscopables || b == Symbol.toStringTag || b == Symbol.toPrimitive || unlogs.indexOf(b) != -1)){ filter_log('window', 'get', b, r) } 92 | if (typeof r == 'function' && !r.prototype){ return r.bind(window) } 93 | return r 94 | }, 95 | }) 96 | window.v_win = win 97 | window.v_interceptor = interceptor 98 | window.v_window = window 99 | // window.v_eval = eval 100 | }() 101 | })() 102 | 103 | 104 | with (window.v_interceptor){ 105 | ${code} 106 | } 107 | 108 | ` 109 | } 110 | --------------------------------------------------------------------------------