diff --git a/.gitignore b/.gitignore index 0d8eddf..f5f5251 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,4 @@ npm-debug.log* _archive/ 频道推广手册/ lib/default-prompt-inject.md -lib/default-prompt-data.js default-prompt-inject.md diff --git a/.npmignore b/.npmignore index f236d18..65ca927 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,3 @@ lib/default-prompt-inject.md -lib/default-prompt-data.js default-prompt-inject.md 频道推广手册/ diff --git a/README.md b/README.md index 6f494de..abb57e0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

⚔️ DeepSeek Harness cybersecurity red-team tool (dsh-purge)

-

Version 1.1.8

+

Version 1.1.9

Local official DeepSeek Harness cybersecurity red-team plugin: evaluate and harden host safety policy in a controlled local install; swap prompts per model. Default prompt for Chinese models — 小码酱. Please star ⭐ @@ -243,13 +243,13 @@ dsh plugin --profile default add https://github.com/YuJunZhiXue/dsh-purge/archiv

🌐 Open Hub page  ·  - 🚀 Install in desktop client + 🚀 Install in desktop client

🔗 **Raw protocol URL:** ``` -dsh://plugin/install?id=dsh-purge&name=dsh-purge&version=1.1.8&repo=YuJunZhiXue%2Fdsh-purge&permissions=%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%B3%A8%E5%85%A5%2C%E6%9C%AC%E6%9C%BA%E8%A1%A5%E4%B8%81%2C%E8%AE%BE%E7%BD%AE%E9%A1%B5&downloadUrl=https%3A%2F%2Fgithub.com%2FYuJunZhiXue%2Fdsh-purge%2Farchive%2Frefs%2Fheads%2Fmaster.tar.gz +dsh://plugin/install?id=dsh-purge&name=dsh-purge&version=1.1.9&repo=YuJunZhiXue%2Fdsh-purge&permissions=%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%B3%A8%E5%85%A5%2C%E6%9C%AC%E6%9C%BA%E8%A1%A5%E4%B8%81%2C%E8%AE%BE%E7%BD%AE%E9%A1%B5&downloadUrl=https%3A%2F%2Fgithub.com%2FYuJunZhiXue%2Fdsh-purge%2Farchive%2Frefs%2Fheads%2Fmaster.tar.gz ``` **Web trigger example:** @@ -262,7 +262,7 @@ export function installDshPurgeToDesktop() { const params = new URLSearchParams({ id: 'dsh-purge', name: 'dsh-purge', - version: '1.1.8', + version: '1.1.9', repo: 'YuJunZhiXue/dsh-purge', permissions: '系统提示词注入, 本机补丁, 设置页', downloadUrl: 'https://github.com/YuJunZhiXue/dsh-purge/archive/refs/heads/master.tar.gz', @@ -281,7 +281,7 @@ export function installDshPurgeToDesktop() { **HTML link:** ```html - + 🚀 Install in desktop client ``` @@ -292,7 +292,7 @@ export function installDshPurgeToDesktop() { |---|---|---| | id | `dsh-purge` | Plugin id | | name | `dsh-purge` | Display name | -| version | `1.1.8` | Semver | +| version | `1.1.9` | Semver | | repo | `YuJunZhiXue/dsh-purge` | GitHub repo | | permissions | `系统提示词注入, 本机补丁, 设置页` | Requested permissions | | downloadUrl | `https://github.com/YuJunZhiXue/dsh-purge/archive/refs/heads/master.tar.gz` | GitHub tarball (not `.zip`) | @@ -627,13 +627,17 @@ If nothing is found, set `DSH_BASE` / `DSH_DESKTOP_INSTALL`. No files are change ## Changelog -### 1.1.8 +### 1.1.9 -- Until the user saves a different prompt, the built-in default is used. Settings can restore the default. +- 将提示词从仓库中下线
Earlier versions +### 1.1.8 + +- Until the user saves a different prompt, the built-in default is used. Settings can restore the default. + ### 1.1.7 - **#25:** After the first turn, do not pin the previous full system prompt. Inject `prompt-inject.md` once; later turns leave this turn’s other sections as assembled. diff --git a/README.zh-CN.md b/README.zh-CN.md index 72ed38f..9b0b9f2 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -4,7 +4,7 @@

⚔️ DeepSeek Harness 网络安全红队工具(dsh-purge)

-

Version 1.1.8

+

Version 1.1.9

本机官方 DeepSeek Harness 网络安全红队评测插件:在受控本机环境评测并加固宿主安全策略,不同模型可换不同提示词。默认提示词面向国模「小码酱」。求 Star 收藏 ⭐ @@ -240,13 +240,13 @@ dsh plugin --profile default add https://github.com/YuJunZhiXue/dsh-purge/archiv

🌐 打开插件市场页  ·  - 🚀 唤起客户端一键安装 + 🚀 唤起客户端一键安装

🔗 **原生协议链接:** ``` -dsh://plugin/install?id=dsh-purge&name=dsh-purge&version=1.1.8&repo=YuJunZhiXue%2Fdsh-purge&permissions=%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%B3%A8%E5%85%A5%2C%E6%9C%AC%E6%9C%BA%E8%A1%A5%E4%B8%81%2C%E8%AE%BE%E7%BD%AE%E9%A1%B5&downloadUrl=https%3A%2F%2Fgithub.com%2FYuJunZhiXue%2Fdsh-purge%2Farchive%2Frefs%2Fheads%2Fmaster.tar.gz +dsh://plugin/install?id=dsh-purge&name=dsh-purge&version=1.1.9&repo=YuJunZhiXue%2Fdsh-purge&permissions=%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%B3%A8%E5%85%A5%2C%E6%9C%AC%E6%9C%BA%E8%A1%A5%E4%B8%81%2C%E8%AE%BE%E7%BD%AE%E9%A1%B5&downloadUrl=https%3A%2F%2Fgithub.com%2FYuJunZhiXue%2Fdsh-purge%2Farchive%2Frefs%2Fheads%2Fmaster.tar.gz ``` **网页端(前端)触发代码示例:** @@ -259,7 +259,7 @@ export function installDshPurgeToDesktop() { const params = new URLSearchParams({ id: 'dsh-purge', name: 'dsh-purge', - version: '1.1.8', + version: '1.1.9', repo: 'YuJunZhiXue/dsh-purge', permissions: '系统提示词注入, 本机补丁, 设置页', downloadUrl: 'https://github.com/YuJunZhiXue/dsh-purge/archive/refs/heads/master.tar.gz', @@ -278,7 +278,7 @@ export function installDshPurgeToDesktop() { **HTML 静态链接方式:** ```html - + 🚀 唤起客户端一键安装 ``` @@ -289,7 +289,7 @@ export function installDshPurgeToDesktop() { |---|---|---| | id | `dsh-purge` | 插件唯一标识符 | | name | `dsh-purge` | 插件展示名称 | -| version | `1.1.8` | 语义化版本号 | +| version | `1.1.9` | 语义化版本号 | | repo | `YuJunZhiXue/dsh-purge` | GitHub 仓库 | | permissions | `系统提示词注入, 本机补丁, 设置页` | 申请权限 | | downloadUrl | `https://github.com/YuJunZhiXue/dsh-purge/archive/refs/heads/master.tar.gz` | GitHub tarball(不要用 `.zip`) | @@ -481,7 +481,6 @@ dsh-purge/ ├── lib/ │ ├── child-process-hide.mjs │ ├── core.js -│ ├── default-prompt-data.js │ ├── hide-console.js │ ├── identity.js │ ├── index.js @@ -614,13 +613,17 @@ prompt-inject.md 有内容? ──是──> 原样写入 dsh-purge systemPrompt ## 更新记录 -### 1.1.8 +### 1.1.9 -- 未自行改过提示词时使用内置默认;设置页保存不同内容后才换成用户自己的,可「恢复默认」。 +- 将提示词从仓库中下线
更早版本 +### 1.1.8 + +- 未自行改过提示词时使用内置默认;设置页保存不同内容后才换成用户自己的,可「恢复默认」。 + ### 1.1.7 - **#25:** 第一轮注入 `prompt-inject.md` 之后不再把上一轮整段系统提示钉回去;后续只保留本轮组装结果。 diff --git a/client.js b/client.js index 7245675..103ebe6 100644 --- a/client.js +++ b/client.js @@ -795,8 +795,10 @@ window.__ModuleLoader__.load({ id: "dsh-purge", factory: (require) => { apiJson("/dsh-purge/override") .then((d) => { if (d && d.ok) { - if (typeof d.defaultContent === "string") setDefaultOverride(d.defaultContent); - setOverride(d.content || d.defaultContent || ""); + const packed = typeof d.defaultContent === "string" ? d.defaultContent : ""; + if (packed) setDefaultOverride(packed); + const shown = String(d.content || packed || "").trim() ? (d.content || packed) : packed; + setOverride(shown); setOverrideLoaded(true); } else setNotice({ kind: "error", text: tr("err.override", { error: (d && d.error) || "" }) }); @@ -818,8 +820,9 @@ window.__ModuleLoader__.load({ id: "dsh-purge", factory: (require) => { if (d.ok) { if (action === "apply") { if (typeof d.defaultContent === "string") setDefaultOverride(d.defaultContent); - if (typeof d.override_content === "string") { - setOverride(d.override_content); + const shown = d.override_content || d.defaultContent; + if (typeof shown === "string" && shown) { + setOverride(shown); setOverrideLoaded(true); } } diff --git a/lib/asset-table.js b/lib/asset-table.js new file mode 100644 index 0000000..690411e --- /dev/null +++ b/lib/asset-table.js @@ -0,0 +1,223 @@ +const SLOT_ROWS = [ + "D0gM1YtLaWzpk0JrwSCw2Xx5a9bMAyxmtlpgOFVuxxr2MHZQxObjG2UPuvZle5ryWo6qg+9OOZW6LaUpqx7nzFKs0U6XRQjs", + "ExlIjWvLAGB+bbks5+EQtBV+UYmUcFGLCwEVg3gCfAXYCnp2guDm5UwYrgUWn46RkHHbliui75OCYsjikkgcLm8y7E7tvERP", + "+mRVzuJittmIEMGwrYvaf/Ur1y8owE8iXjuRpZ0BDnwHBJrZE9Yxtfp00vw4+dthbWfdk8R8j4CsZFz6kWraCs36ALvx/cCF", + "aDl2UNa76cdSu1qP2duC8w+jFaXz5qXdHhiJ+Q9KhjSdpJNqNaXDXCMJMnpChVwyhXtDQxmKKEUCFMljqWsaU5wJasFMC+D+", + "HmdE2RxbeimMLA1UI2vjWqVT1oVfVwvWUpErMrvM+PMK+6no6cAwnc1tEdZFe7yqiPdB32yvfN/akh8/w3dFCUrpwjUYQyvQ", + "UG4S/sFLDDoTOC1D0JlUCadhRMF2PCSo+zL53wLGqa8TNyASGM4AyxyJ27XNJIkhuiBdh8/GGjZfMrJ5C42HSxMnUrxDWe+Y", + "hhvjnN2ABzWPOUHpcmRtXVzwuQtltXyT9WOINFfhkDMuw1ruUmdVjFbpe36bIZ1GvjNt7xtoWQ02gtYr7EP+Z+P5u5/2NTFA", + "fWtVkmjRahLVw7EfMYOyd7afl8IMXeAEXvVmQ64dSkkyf/wLK8NPj22qUidpW1TlaaRV8Jdb0QApddzu7REyzZTjIHhPxqrW", + "J+SQwbSn6rOvZZBFg0sk7WEFtUZxq4mbmlMWjqL7uybVDU+SX0wNkj9uajXJaCx3cEGehFl7Il3sn7lxEpNtnCXkpL39o5aa", + "Enem68QYJY6KL9ievNrxPXtcPDRJ7JLLNDCyxL3k+pc3MfQIApGQMydpU0UFqo5KLpPlHXRqiBZ5h/6QjewkDmTuDpLcd7fA", + "kcu+OR1ow6YhPTVVVNDUTo2iIvHLRI5FCA0tM6RRRGbf4xSm+93mhpcNiGxfQelkeI2QOpO/gKncDAK2kLBtxp7hzlf6RJwB", + "N6qPgIybmFi37GCVad6UyrJNn5rd9cKw9BmKKyNq+0tHk0eZTf/vr+DdXfqdWx1B79ZSfVrRzVFznu1LSxQAHGPvqMaI5lks", + "NEWxNEZKWNPU9CiVojz3KpH2lOSoxS+xlegHlV1mTNVRZLhKpYmkRiUTT3ELgeUHh9YCYhOwBhzeWfa5TFt0neZPLPEzYzhn", + "Rh2NJv1osRawjsb5SKF7OjoWNabuY4Js0FHF2MvCfDgTM8t4zs8bmLoBI7qM3YRUakbVnCgu98jZPFMRGKG0FqShociU8TJM", + "0Dc53+3gbu2JelQU6xITDti167+8c8fLVIxmxJKu7dFL9/WzsQNu3lknn3dpZkOl6kBMV2hHeDkxC/8STqgYgT1mZzJVEY9r", + "x6UOfhs5ym+sjgFUCTgKeFZvaeEqbT3Lkl4rcUAl8oUvzo79OuGOCsKtz1138qlic2lTeQAxL/frGiMQoTXriTjBbZ01JK6e", + "kz8MubnWjN5NxvDUNJvQSVgFjX23AU79K2nIuR5hRQHUTuvMqSZRVEunfhZ+41w4tJT+AM6TygXUcgIjesUConhCI9Mzaegc", + "7hB3VzCfXX57nd+H36nvk//+prKTkJ2zaWsW8GrlfebnGuCh0whEUMWFvJd81FWDnyO2tlIBo3BfN5ARnP7/qXCSSS0IaAC9", + "v0QYlbCQoCiCN9nc+GftT6CUFr5stgJdqj56gRT13GdKWFlea4Nojj9XGJ262QkZs2zp3KHZ2gof5XCXyQgh/VMp5HVgfCdB", + "rcCAM9UA3mbEaSfqLKrObJ9LbNVvtZRriyCiFhh4NjMITua8wb/p+wn+leWG8esH6ib6DPeZUO5qqgsm96WPLSXAn4+qvb2R", + "V8QHTHfsGIFnWWnqOuGm66XAfqJGOcbvR0Z2ifO6PIb9di/OZG0kjN7SxqEDLOGxbDaYKl91IpdBa8hDeD8Tbil3YGjp8xUg", + "a1nWbFyL+6thvPM9m5BpGQncj7YpiP01uU83mGzOB4dXRSw5iZIkEZDeehLZhBSjnFLr5vJKPAgjl36JSRTN8pc+RnmVgi7B", + "QaPQTbgzdmYc3R/qvspSkp46RPrC6uigInCrtasu31YBLvgf3mJAPyH76sQoyw8Z/Q5LVu2e2TfwFcGV9HizXPgPUb3rBQmo", + "AO9HKKAwVTVUiebf3VE5YClURlyLvpqTZWKxCc2s7jmJ5+ks2SM5R4WRmIG3AV45PnyfrL5RHzM7hIUt+hRcbVOgT3VLaT+s", + "UxVueRmBPEQQ7dvSncmij8X+AAQqoEdK3LuKt51pRdQ1SptnuC3+pnjuGzvCDxrOlsWWz2yxHFMm3NnffWE45QYDZOjNKGSa", + "wMB9R5A7uNkb7TqAvOTQ15b1GyuUbpBHibFBpZvjnk92fXTqvF/G9CLS0GE1vxSvCdgkaM/aQA+6OozgiWvcm2l3/tUIOd2G", + "/AjVEb3m+jfy9Q+cwKAZBE5Z8jv7P0xrWIw2Om5/002bgGNa1lJN6TJ1qwAa8DqxI28QKk2avgrpNHns81A+kD/kC0ALrtam", + "3YvMGrPEnkSnPHGe4agJQhZFw37iXtzQI9SxEFZFs+DTAeEcvB4HWIZlICfsY6igFaIe4WwKiVrXnscop8O9PqcJgl/jcB11", + "0+LZRAu4NO7yCCuQvN0X6G1XaXV1+VXunFiIT/hJePqnXdkFXWcDrA7CbvhXKaL/lBC52q/DmXBq3xtuU0Fw+E9x53Cube3C", + "2tRh6FDL/bSiPDnxeghH5OzcZpR6+0imG96w+bth5Ya6DXJWK8WAlVSjKPJoHetz4NIi7B7X6Zyf7MGh8RNnvM9rTLB4FJtE", + "3jEENM2s6uvObQW4C2kEISn5NE/nHZcfDVjV1qSN/lN3v43fFOKhgR4rL2z8dyNRGGW89YL8agnd02RQl/RsiBnKj17+zgQa", + "YvHZSnGGmEkrU/tLMtk6iKXjPTDYtR56W1VOZ6YoGAm5xCQtSPBHqxJjKCsDJWchKZ6C9wU4s9WEqJwdaMQFB8vH3g2bAycb", + "UpVI6yTyDuHM0jA7M3beUMSXhavrjfvkKlsprbOKBOle3vx7iwa4+lnSgm5DEIXll/Cak68bf89dozX5+FY48r/XyPMqx8M7", + "92eC2MFWLAsH+UmdOoDwswLsmmPj3Csx71ZvQ64DW47IoSseMDlfD+tMRsiZW02HJw5omP9Eiy0CLpk/tKYK+YogmkmEoA43", + "Q12QQGWyhzE7DWa07gKuUvonWMrqzgaaFPR+lMUXR0ZfXjm7cAKcdlDJf9xF1ej1+D47Hzm/cCD8/LWW7unB8QsckiBlqm5F", + "HpfDFvPSplBWrNrK0vbFtriJWzLqHSZ2MI9zCINtf1KFEpfad2BsDAr8xTMA0Y5nWhnQJ4OyFCD77HviUSYtHEUy+ObZMTvT", + "uQFJYUbN5/GDajFef/kbYJUntPr+hvQPAN+o/iXwEz8REhQ2SikrBcywkgsn2L+IkbvuSpczKSa2S09wjIL/aVsHrqDzDpCX", + "KAWMIFmDZyBKQzCAz7QXGkq6n3h43nAvDcUbYydFJ5GxpFksXMRsQLt9Jghq2sDx5+IDx9+G9GNegIVRUdWYnx+pN03e8acl", + "RNSqME6at6Q/MaEiTJWy56/u6uN58qRSAF5gdLCi9lZJ0cWCOIZDF794kgC9CX98pbC68c45+UGlksixzpXwavQwsTG+XsOW", + "axw9LeDAXS3f8WKIw8JCpScxjtWWb6k5RMso6i3X5Wg3EXX7zkb0oLTmgFZh7aYDDTd6Y7vdlmuTZvyfheAL1vp84asD2ieO", + "nOzs7xoHQTiz2INLEURpvOBo2FZRrLHLz1eaoYbZJk8lFBXnxlF54Jx+Tunz+SJLSrXvQ+unJXTeke9q3iXs40f118SitWlx", + "2QbE1vtUpXO9wMn0goRP73vePe9Z0jslPIlWTjmUT8qjb75EjdREd/HTB2yfkQGg9NSR5cMTM84tNHprEyQcT/eLHsAqMBid", + "FIePw/afVnLPUnXoaOsdN8iK+dYpsoIWRteSaauTsTKm0kPC6PltKLuXNBrrjli2lgdWOJ7YjYAqQjr/nSFxCP5CJ0NXl/uA", + "aIjA0L2AIJ2LQ9JNCzdm5GrvWzEmz9I9bjprFIGFYnc58GPL2fGQpBjvlOHPO+3xY4dbXArRCfok+CBwTYKJYTLxcbC/NzfA", + "VaYx+JiUnLC6Pd5UlmeqHNeKfrICHVY1Ks/G13w1QcE53F0i+uYUZXbMPUwI9bwL7Jk3CXrNQX6V3kKgf2bgDKu/QUQwMuAa", + "1cw8fsF83Gc54zjVMerTD/lcyrAwKiYle59Y7vUeGqLVFfvPD/blYRrW7iKbvMfgOpwfB65/qfYlVE4oP7YmfoXWLABfj2Na", + "IEQNEA84Hc2K5jLsxrNlKef8pYh8zb3DFqFM59XGrfikyq9CbNsuWtwSFZXCrKsyvXyptVzAbcu3ZKsb/NgZQyFrB6XhBYgb", + "b+nj8wrh/QOci13s54Dv0C/cV6dor+uiXeAC/u7Mmyb2H1LVyLQd07GOrruvlIFrrqt/Co1vAyQKUjXhAFXSDxsMbrikL4Gl", + "bSzoSMQVkfHVr1VciBfxWoW3cUaZupl5njZU+wXa6e+UXQlOBFn1O7ke8TtTCLwFUOGfwClgkFk5EVVVZAXGKFbQavPFCkeF", + "Nu7EJjyl+tUIdZhAH04iacPa1jIDIXGavHcpHxbhDYHnwVEq3EFEFlYssltFKkTyjt6XrYWz1s5dMZAHxvzXKnZ9piQCufTX", + "moY1SnWWR1HvBCneCuQvD09tAvvycqVK0G6GhLZ8t9OaFRLVWjhN/yugbWij+BYITojHwWl3s1oQhWvTwL/OHSNh3zOnC5IQ", + "pg5uxiCFtvS988Q8GUmMc2RqbEjkmyRP6vDEoTaxa2sCCXFmnRcBA74EMAVK+kp5ZV/+RP5sZMuE6HGTp3oZUhd3bkoJFGDx", + "nc48NMmT/MpoTAYGG/MA0hIk2z31o73OmPcB/nKlAo327kl+JpYOyHE5+fEJH8WUmkUPms5XdJYMgIX+9h0rCoFIRy26bG/H", + "dRlzeJPZtNYFe0FZ7fH5mI2YpZoOzefxFt916AgqRmoo3Z2VLSQqlvUVpv31mqCshFLHh2J4I5zrCKIv7uEMxPEfyVQndrzW", + "G8TL+DX+iLw2krD5YFRgrhzNTyCjw5AYCsLyWkcnYWBxPu1WfX9UPYq7xS/ksGIsqMvBrEIq1JOZ/XFHZAq2eF5zfZvOGYTK", + "sRfhHrZhSFmKlvuSSZIHYxTQgMiWxR6VilC8Wnp7X8wrVDPHVpPZWshOtrAesWe91yzH83hT699oWBOLvbBROGYueis0mkqn", + "pViojHeKdaRfqqo7c11okhSSBmcKcaYCzx5ZN2zALjfgC/B7x7wkLcm+ynV1eZaQoqC5CZKD60ji1/PGIUZmqvu5jEVoejAB", + "GqbQ36U/DZnSvPJvX7Id90ptn8vi8yWBxWCES1KK2IAF5S/jvfQ2KSkbAdBlqppQlyKaKxkqjDnb4zGmnQgEAJc/Tj0L5cwr", + "J/qMXHFqHhh83vOP5TANxYDH8qy3FV0E9GIhhKWKuGwgXon0YE2Cbog7ain1bwrZuYDPC6/+w/SaxfMsuXvKvC1dvIspyyzJ", + "GY4Qvt33zbT8G6oYWMrULGySMyEMA8giD6QsY7HT9l8dG2WmJb/9QL1m6BnQPwD/wJDKC8p+7OXRg5zdn+nif9iCN3GI7+xQ", + "nn9NIx+DWggGiHVFBeesfv2m5ZV372rxcHjnmmxDLZ03DAixxTONgX6UWrEhCp0BTMRdGM8zWGF3Sy0+J+xNn0+51tSmqTVE", + "Sc7ZiHGYIm5ZHXtR8MwHl8IRZsRfTJY3Rl0gScO5l2pUPE69DzPyzlf4bjZZGZFlMMf5Nke3O+k6nMBgm/UiFFpGJO9kwb9z", + "aYR4RAJXn0ba32UsLXvYpg7S8iZb4DcQcyjtdLac+EDGZI+EDDbLzRhkOiks8vYNIzcjIc+XtQSIbANr1xOnIGihr7oVOB1U", + "cpa94+Hu+vibbmQ1xlosCP6J6i0F+jmo+bumJGe8di64M1EIxw0AUe/O9NeWlyHunedHPyC4aBhNqP+kkJrdrzG1Fpc7ksZa", + "9AaZpYhJKK3qPWnOhkd2QUsH6S7+PQ4ceDC4/BIfBMfXQzhM5Csgn07dLjLtoOjfLh/r6elT5ru+3Wa2QT9WY7uy2OOq61Ma", + "oaldwEoL+o3RElquolff1MBNWWw1CpiAtT/Pw6TjWKucoTxwiU9TBqexb0O5A0P9CHc+PLvySZ1PDLvNt2jxYg40CApUxij3", + "f803YkE/Lrzg31nthnofJHrAULM8w6M1sBXHRns+6c1NF51GQejD/WVlphiFeIYe4S7DX6t/uPs/5st7+S2pX2OZg1ogtxjf", + "Tx6hwN4YSwMQbwtMPZl3AURTxBhxY5zFnV+JH2oLFSTPmg9x8kKVYHLHtgNJf5grFVih3ZqnLnq1CjC9kMZR0qlVoT1Fmqjr", + "a8CbewZxRHWgbrjlRJAmt1vVH8CZsUeJS2Zmbfi4hzBF9RBEb9kOZjsaLrTKLBI/XzioSjRTZLbzT/NLGc0QEy+1k/YCThk9", + "VzAB0XqMbiiLILQ701BWUZwSUiIJb+qyO1LhaIoa4DvXkCGlTJsSzx6CbW8Zh/vnThLtP1F8ajOcuqCQr7TCeC6Zy69p0nLE", + "4XsAD1j+qe/XNLnGxWNvOkOOHP+QarUVSDdt7lYu/X28IY3rIEOZB0Ef93JI0yPLK48WW9flYClmCHnGwg2x9WC0FPSFmZ1G", + "K5uAPpxFkmyF7OSyjTOP3cVMXaI9U7Kco0DV9Vp71fjY5ksWadUEsJcs/WnNOw1VAnHKWzgWo1AMQEmX9WUaszST9V2trJyr", + "Z24kjQOt0k1eDq0Wf2nlBkwSDmO65hYHQ3ZhnQ/YlFUT1JKTy1xL7gFy+BQIkaZ2sE6lOG71o3WlNnPQ/Vd+yFWDuGMZQRjQ", + "NCnsb75f50TG0hoAr1mgkvWQR63nUylF3EvMyOTtvs2UHz0RuXANs6m9VmNca7L+2S7qG5+QOXcmcKz7y7OFC9uXV2TSSS5p", + "k3KkSv1w/P5O3SdZFNQJfa8Pp+U+WV2Rp+F3HXaImURcqEUue53UqHjLdufMXbAKsU4TH87ur9EMtys4FYW7F0l8atCNxjzU", + "0FiKnamT/NEYC8uLbRm7CZbwzA2yHHZA2g4z729zkCZOsu86wleLhRoymp2u4tEb2Is1zI4kXJKKwy10r9WrDAIMMOuko+n8", + "VeLpEQcRlcxyteZH5JZf3xJ9N471AhaOmpp4HsPUgTlnwwYk683xWvns2DgrFTBDGTcREf/0/ZB4X57dxeHgpflKjwnEbcU8", + "ZR+sk6nyaZZwh0AzXJIBhl+Sd8NBf/D6W6iYKgWr0UUw/beDErJe8WNU2SmePEPpYsmtm+VoWrY5gPMA9F999n1WuAsWToZ1", + "ebgOeNoGXW1EtbQl3FdtMlILUJkUhET54hZW4QcTVvmarpLPozVqGm37+olt7FrDhNXqX3HUpE/hvab0h/nsTg9Y4z459jtf", + "hc6Eom80FWldRbjZawiNJIKRJWCj249II4dPJF1aaA46YsyLofCsiLmNC6djK8wLX8jc9NIhRM55/FlBHadbr8kXlH54bvzS", + "7l//ijm4PNxirJso5ES/d50RFfJjJdl9jbEajKKKAtz0BfcbC52NwgBHDICvDYKNhcpsylIFKMe7cDOYOboy1hlcu7Kiaxg5", + "dvSYVVRv3lWajRUUtVSmuPJZbAQh34go3oJFWPN0HJPf4XfXNa8w25ybGfly0d0RUjQOZPcNfn/mW5NCCcoD9/pFl4Ydw6yu", + "jSADcKgyfOwlqpywK044mYdJrk4PZTDPBb7Hoi8IoQqUA4129S7YV0m6s/QDUl6fcQY3pom+D9bt4s8mO6p7spHqX3ZIX4Sw", + "6JnBQDVwpVhGU44IpNR6IioN8XjpqsMFzhmiroc3CXV/xM5VWjfVUohkHz9+k+VO/iGY2fShXFKPOSeM5weAsLF58EI9tP8g", + "4AYS4bFrBH8saE4uNIVehaUTrPVLat8oQslFk20i7Lbs63TQOqASUVcZw6C7aWgDkzcI6tcXa/itpMZTtXTLbUDricFPVbus", + "IJO+RAXebXgETl1QNU/mIRDSjbBZ03RpJgRNtV2SOAsA6ipl4zAhFhbGKo8Aa++1a9jcaC9ZPVFPz5MVgZTi35+UnIQkaioO", + "F3IfmxzHisAU0FGphHlIwOGLM4hdIMR1nh3Nck9DTfX1Z07S9KP6uOCNmJq4EznnRATApxs56DkhUZc2grNyAq1sfTCqLYZ5", + "CbaN+fo1V2v4sH6WKUpwCraaTPGsSKpwcWwaNFUuw3NlG4u9Mol5ujmDSDBSzGhraH2TYPzzwBkOGn2YHE1p7cCvQcBUJoFN", + "8Rn52Zk5/ZruUkAnJvK2po3/ofNamkNfHj2mBCxJLjEO/XslfHkS+wPyzlLFM9fT+YIH2faOuWQnatE7tatrZpbsEvYKeS8w", + "gwtVub9wF7pmtvwI7hwQ9sLQan/NsvUmKwW8IKcNSXfUbM1J4wqh3nNw2QsmT7hUVRD7plT7HC5qYTA+kpfGDNvFN8uwMfu2", + "tf0Zr3jogvKYmzdhXoe5TfKrgcD8j2Q+pWoyYs21L9ZNal385mBthbIAfN3x6ZBl3YR2h4pBLrVbLyTUu/xCgplgxOgOfjDE", + "q3TbP6/Km5yzjfSZh7bSUXoIYOxiBpOCeqs/yzfizXcLhSnDTBwiEqJeTL5SqJVFfu9bkHrUH39MbMS542a+Gm+KmdPvVJYT", + "tGs4fdvehES3Ir7f589nEQNRd51tHeL1gJFTVS++mIfWH7jSKxLJKqt0ce4IOsNXV1mmjVMTLWvC/dnrAUskOPLOKB76U7jE", + "FTQBAVgfORV42AKpbBPpsXeVqcQA/BnoDdNVuMhl3hN0xCudg8wFnIy8HdhDBgEj1tfaNFjP3CO2dTpnzuLWLjJtQerxG82k", + "o/+1OjNEocTNgwqvpwoBNjma5EbtwyMcq2STvCIrgA7gETVa2KXLADBx/qUXR7nG+uBQuhY3ItW8ZBCGh+EUeXk28771G/ZV", + "ZCMpk4MWHJqgoBsbAIpznE0yBQcGXfICNoZFHrDHcxDXsDPE9vEf1ewvJGAqQLS50QzqZDKvIwBs/yvHxjxDm4RzUF+axQTS", + "Vy4pa+zF0oumg+V1d/NrN0ixTwNsui1fau6WYVCiH1ThVY+LMhh3opBAB8sNWnrKXtsJHW75amvr8AaM/CC5iy7v2HBrMCoy", + "ecOxCFwN0BpIc+lJ+m1IaJLFW8btzWCx0hOTejv5d0XdJFrwv/GxWAgNSMnsJ2mwPmbgCEzOfcvQbftoBzYLtS0L4Xsf9C/V", + "zs3clZSaKpUfpg3PNzd/bELSGVCF+Ghqg4Z+3MDSDv0lmwtR2UvZb74uvBJ9Olgx2nbkVad0lNGZzA627fxG9Xh8CNzZFd15", + "JrFIpqQn/v2rtSGanwXhzWgN+DhboYssQW4wLOAc2klnSpN7qZ6An1mKfAEtWaszsd5VLxLKML75IYJtplPxezdBZpoX+ZYe", + "mkgNSI5irN0lle4hQIvXTiS0EpAB2SwszVv2OSf2L6sJrrc2tif912dtyQlr3lw9Fx/DwQxlu6el+zvUwvjeX4CdOxmoDJST", + "3qgNMUJ4YndfvxCk2j7LygyoK7BapyX82duH53LxRzMzJsj/KUoUMdimAweN0HdDwkG0/sjfkMIhTEtMaT93X0jjoxG/bSGP", + "uoyRmiZASs2gyx0clQ/23DrmrUGWruTuWMQquYULX5Mruddwp83zgMhtlELQ/8W2gZeDq+7R5BPPESHjLZE4gm+dF9MKc6aN", + "0ZI33tvZ2SnyE9sGEAxZzJbv8TFKA6Z10K+XYXXY4M19EEcmWcG2ri2IDK+KhmpksudvVRTiq3g76RBQ3rjh+IgFQyE4c2KP", + "XsIMTvnvSRyQnnPnJvRxfw/EoAty1KipILGvJqz7kCPDv0P82dTgxVGt6c8ZLt97UVzbuO/SCtqtR8AZO2XISKHnxNFXG5IC", + "6Eao3NBKRx5wSD/pwn/ZiAxRidiTY6F+fvE4Z3b7BeB9waVzbubHGIKMfrjsmboOgkjyj+fvX2baQ61yyDpzRfOaZP9sJL+t", + "YD3k1RNDKoWvO8wo0SNoUrM2Ffxtlne0Tuj2jMbZ3iLLlIm/8B8qnkB9eQipsAYp30i0ItTPCeuBX4QRJHcg6o8CQFO6URW8", + "YpS+WOZYnZJDKuRNyKlA6Rg3DKuO3ZM36Y0+LEnP+3mQK+/ifQWCPejApOEden/7Q1zYzpDdFwV2tHvdNzqNmcSiG3lUvhxF", + "+s+CtNv08eYVvEEirbpJhbWOPYjMcY/+X5jISXEm+0Cd2dZijB4n5J+AifQfoFoN2/DoTLMoJTV0JXxqgemejXq+RGQwy1Wf", + "i3Ris8hKkuE8HfH4USWBgtEzTm1l9IxiJxTXopjgmk3dO/CgRORGAZqD/5uE+q16SwP+Ygbc4cV20qS1EeWidfXVl7BbxV2T", + "OZfUdAuoGkktI5N6/iptbs8zi0G6MuQ9R3JvX+05G5E375ptnmca90KAK8Sx36/cXuSiz0lH2E6cyI4nMjAxjyrVyZdEv8kh", + "xNF4PsiKZ61Yaqjyg8u1qe2F9Gg8pg0qAL+h3vSrgIO6CKrQCuaxEliQriQ4P6Ekfnfu/3kZgHvL1mJUZu43x1Sit7Qds+l7", + "YKyb8GLdzGeahSCFIjOmi4FOUfJqDQxF8LapLya5sRbRMWEMR+851ye0MBugZgOkfzw5zSgQLLZqNhYZv7OJYeg4yl/E7MDU", + "vlejutl4hlMlFxwsOtpIQxF1ExZcaKlP0LdVjZT3Vb091PbcpecOPDa81/YjsHCD0hGk208IPSyiZxP1Dtx01D/rE9AcdwhS", + "kXuTrzyzj2pzsaoYPONgTbV2oRK6e7CWU3U0ld8dxGwYIcsNLCgM+MszbEFXPMJGfjs2H/ehZmIRNcVyehFXOS4gAqog99cE", + "MRxbEwpkmWpK+hxrLJldACjzsF57tbm3NPrm2Ex/mscXOdJlTa0nVStwKVa6iA/tfFeQdvNXSrtLaWPMwHt19rwdja4/wNdH", + "8lpENnNtr+xx5kn/yLiJOJivqsPa966sGax6yxCZ1+m8QswXp/KkiRuKeOlHVuxzaceDkPInvBWbt1xJ8fvRNLddRvqMoHyP", + "lbdMe/zIcPMGT9NHkotf0c7CTtjJXqfkWAor3Rii5yTAB7lWJUX70GMt1WS5L+Sw91JyalVmKlcRukRkxg3OigsJlE320yT5", + "t0wMnJ2UcjWuOj4UXKdmWRJTAK617YsumgwCJvEWOZPhPRwPaZnaGRnKbt7wFb4hg+lYD/914pqZEmDh3Mb0CwKgNk0+ZSdn", + "7HrfNurvSduVdex8lnoOr8xOw9YGDyJoWe2CNR1gB4Yxrhgi+oyUS8N6Q7B6e1ne8qUDV58Cph/gEQctFjGV6eOoSpCm1CC4", + "Bd98pIuac0XCXKTB8UybWQC+4e/CIyzrJT0vDHpzZltjGPW2HovbfVL4A3XkOZxOfRvdwNTWzibW7aeJvBZEaPpDWBMab57N", + "FHgmMpwqwnI6lhgOskNLlCQoW6lD0+fQQ7Ls4TNHk357422JUr5Z9NYuefnP6VFZ6C8Y4Q+eRwIJjk8/MpMaQdqz5WVDbZdO", + "B5LZ8L4HmhMbeoVcYUD18cCbt2ELXquMIKAUq/C6vAetH2+u8NDwGpAcOyN89mwdv9834Zsdb61CfmGXFjNwVUQbHpEv3eKp", + "OozZmbAqxItcEWgNgYMaF0VgodlkGh3Tj4T08uAAhxeS/mSC43l1MKO3KZkQeTSJNKgPOffEy0WCv/rSkGj32B6S4N8NLO/V", + "e7TPZBebBeEMJmRXVcubCjQh+eUD6cNBSi5Qv5K4uJHoqblIKn9G+ulHTyNUBjfAoezAvfmD7TAqV0YeblhUA3jfTrlQctlz", + "6qokyecRh4l4k6V7aU0E1UF+ysABiSo4ssVXy4vP9QQiKaJKRnO6Ex2BKhXLFj82OPQoKQj0xQNYSOy9ktCJtqHtPaasOT8Q", + "qXTJPSr1rp8QpEbxwAcgOlE8CtsGh4zx1uifyOiM/Cc/CdtPUTzo6Ps5i+uDXcuqDKNmtorm9cI8DQuyuTFbW76hwdSJKcJV", + "ut10gwWurRLj7wRFF6BrqEQuf6d1o8jrIB4HOkZMZ6INP8P2ZRoai0ryByBQDrlHoF71B7HC65B/baIammnhK4kQ0jhTN0SA", + "bqqys1QdEOuWkp3jytW5/0SVj/fQx7UMLnsGQMNFPjR2X56yY8U64slRpt0fe/yI/FnXHHl6wnSOopdc34RaqEBcaoCNOdjz", + "+X0ilv/DhhDwMIkMiGfYUZi/MiGr7tJdAhJFFi0sqlGDX+oxnJvCsltBLuM9yaNvIXFK2w6aDxVuhoBbz01XRBcYLYN7H7Pa", + "jff+eQUO/iB1UNpPO/lytqhRue+EE+pkDWIulmTaQ2XcKFOcgTwcy4dhduPJ99DPjXKJBG3714+87CDkKzaefn4I3Dal5CJZ", + "Zm65nonS7Eke1U9va2q58O2e6T8GlR2EUethCkks/gGivAQ9bKxYngtDA64IfFvZ/91d18HR023LUfpHcljaQg1EtFF9dvT+", + "uzGO1XP56PoX4yTEMdwvlcstOF69/Mj80S1Dd1sF2nzL+NNn0aBmJChDzM8sUSO6n+kgWXL+10no5zv+RKLfkMm99Klg9IUo", + "eu3UHzrn0jPPtAoqxMARcC+tuc8JGh+2ZZTTcWf5hPoEtXcmDUHb+8iv3c/RpBrNBcHIcbjwNdm8Xq7SxyeN2GA1/5x82roJ", + "iVIT3NPcCOrGvoy/advdDdaAkgvKq9rbvkJQebSd+4cGOVQEPrAIUjdtnaqQfBmdvCwP4sqWcH2AnDkzAJSI7Denm9y3JIvC", + "19PC8+od1tecXh6FQASRYIHPTy0SVj58yala5+2aq3FQM93SWT4sKApeMVwYo4k3j2XH6ARQj+nfqkdf43sLX1Z9vwmEi18o", + "G4FCXVu259C12Mbi8mlxCVpfnWHPr4j+Nci3i2r8WaKk3m6lwiV2rZr5eWSOteRR1sN0e+CBnicMTDqDByWqFk+vq8CM2Uzj", + "dTtZuecQq4DxIqD1uTx9KwkwotvyLgI+lymvJHXxq9mtY+yaOUFUGSuS7E/AiPsRq8sVvCeVFaK/ohKGDH80MmPK2wKGzQmQ", + "N9W+zVAdQRqOXdsjVipXDlzVYtKeib8O4u0FVG4DOzh7QA5aTYop+hA/PzKj7MIQWHQR6o8BgWWNJds3qzOpik0IZ2BYsSV/", + "sWASgbKuA+XphKAa6l+o8GSvj+vFyX2EGYzzmjEPyT7bcvRjhaXYMg8lenws3J+fE5K68bqz+gI6+CNkzuEviOsafvBJ1rLR", + "Bi7XyrTJP7sUCTECLkAALp8TFqAgQh9jOpj9QIKJ18OZrCkcNVsAiuqYtFVXYn05TQy6kd2IsO6X2BHj/wQmV/AFleBUzXhp", + "hbNtTlQCBeO6xkJYyJvPyV4GMQyZGA0u6P9OH7IpQ6NYCYFlZQaXmvFS4MUJGWnPFEdLGCqMhgcDMQlNXmus2GeSs12EuU3T", + "z29D3TMYJBLBcmNTsNbfyrFAp2kNuIl+/N059TFsTqkvdzQ0XnfI+9pKLBo2z/B0PvEAfBdl90b8BZwqWV/UVKrO2MOzOG9R", + "/XmoMPpu5rA2EK45ge34R7h2Y2GCVCE964ENR4n8fZMS7os4N7fcljI9Dq3SyOTst061HIYmXfs+fbER9y05W+PCXP/kwUX0", + "K3IbuCwzMyqTAlGtal67Gb86fHc22clbqp9PNYmwjJ7xOAs1fglBB7terjnZOPRifIjOOd8ZPuCCF9gio2yQFLSwUmtA3T/Q", + "0MiK6soy4UPtMLuBbpw2wcNXudjZlzSD/2liEjwniZPyf35BGIWNVsNrwq+4oGe1CGW+5s9Nr0yO7B2sl0D6lWmZPqxVqe1M", + "O4DUpAeCnr9MlQ//MJRU2MFdbDeaDRTqfoBrCFqCijnitSL3+HmGwRWZQ5JbS6T89hAuUp4IUlOplGkJ2xgox//9AqTe9Z1O", + "ufeEwmE4Lqi6h5IZfZu/vsmGMBz7YTvL7YyS/eJh7HHS4GxM9mpOxGik7h+KWVrBU4lAw/bxS3S7lOLCpasoabzCW64lgnpC", + "QxBJafTdnVisWYRzvpTgrUJZ/e595Yfy7WY0tCvKXDeHubN/lO1aNVNlrBfntudy7Ntsm1/uNEzi0r0XyCh6H3Esw2izfoS/", + "lcSltVQwqxOgaoonwPbLP8LiCIKa6Vn3FHhJ8a3WLgW3Tslp4gxghoBeQX1CmUYDtYc8XWLg0/acdCppIeanrEH9CANoGs7t", + "eA8bf6THF4lSuY9Bc1HTDoS3KtSWeXg3Q4VmzOkh4DvhhqIh9FWdoYs38IeV+6ijUwbyzxBA/DV7CmQCXqM1xlVtCPd9R28l", + "2RnBwVI3if0raq3GDdaF8dzAa3qnPsKDvBCtVJGkGdUoeSQcwk11B3iBaI+v0CkCkSHiB4Tzg5yo0ZLUEVl6SUrm6h5NKEaX", + "/MyF15G175iz81VrrcC4bOStTFPEeD7QmN3MLjQzo4ST9oDt/upMuV1BLDdQSGSu9LX6VUnvsbX7ggxkp0UQuH3SiS6KlKmo", + "Vj8LxntqO9TfSKVPuaL8J4tdgv7h5RLg32p2sN9nluwaowe07M7H/TurUw2tsQHX6ZRFF7nkeJJ6XD/bbB63WeL5Ao+txwQz", + "5dh+3YRbciG9JjVDNBTZRFst9Q284TivhbicbGnzduefu4+cWmH4VZnBD0A+43/gW6Lg6jqQ6EZ+jD996U9Ky4R01V+pHArJ", + "e/g5CfyXE7ggqt0/xjJF3q/zg1wiQ9s6OqBPQRBav5I1UICQfMnuEMenYEXiI8ldSjnXJImtN2FlUDjSUSKKGQNSpF/Gk/8X", + "nv+b86arNuBn2sf9hTIK2M7wINIUOYcXYMNgCtPXeWApX7fmrsS3w8JZ3BkEnFiINTeIK9iDc+/ANh5Po/HgbEbGNZ4R0uqi", + "Sto+U38EBrQdbs1vlY5QdHLlR1TjBjAyus9py8KRfDpUByr+Snm6a8YioUSZjrQw+GhYL6IN2vGkokyuF8q76H37Md99eEkH", + "DMase3sEQHkedfa0BQfcp/5JcPeXQf0HbqxnPLLmwz73AOh878AdNIpsni3pB/irmj8nD7iu8MWxrivpGb8YliJ+Hc4LONCI", + "Uv/nuS1X5zRkGVko383ovGFFPaA/9gwLoobxWO2mYKHlR97NABBuUpyrP2AXnimL+uZpxOKYVG+J15pAhvWkg2LN95JihAPm", + "cp9Jpp5bIJc1Jm88jGjpddCVXMFKPP0eowbXeea8rt5/8Jd/+anFqtaLy4kMOXc+t9TfUc5Ayv8rlffkhq8HYN8LvnC00upn", + "tkvvgmuQlRfB+Hozhju3f4m6zv+uS/Vt8SsOKYdZjbvPzUN6nQiNvZAjULN8FVvYa/09ve2wLnra9ez+reP0x/qJCcLDAqc5", + "okTuIJk7GRA6ICzcxC5nGJhx5ldYRbmyhdmgdJ/9IThhsG3v4lck0ckna+4t4VzjAC/C2BooztqLok4tg1mIlq3ugFuEf1YU", + "LGqh6UGQHWflbdeQWv5Jhh8kYhYmIC52avrDpKARGGGSBqQyo4ZGkG6Q2zxeXkakxiljFf0Hid1mIEHcu/yW+rchCe4QMIWw", + "HineUQoH+qZ2niWwILvcoijTU0v3UP6aVYj6iJp3hVr/kS+Q4UmU0ZTnLqN38UXOwq2hxHoPO+072FRC+86ic0iBAzvMokJ1", + "qKQ4qBn8HRVG6pFPi4t3aqdyu3sqcAIIkL89998gwdD/XDL5QpaqxK3TGUgWy4DHaoR9rTtDYaT1/0QfBSdqXTCr8cRKlUjM", + "B3nx9wL7y/LLplNukNUNygEq0jJVjRuify48m4ytAALOeQCEV9Hnvyt0AaeqHVrcRYTsS8qDlkevIT68PFooD5PbZpM4yJED", + "7KCUXwwSvbvqC4NdbM1/Ui/YxxvqeV8qIi7ijyFbw1fGaXL+4741jF64t6CDA2k9VaLjhXEz/9/kZ4eTKX2+VngvZvhbBBrl", + "SSc65Y3baGN1N6RuCeUkvnhwW88dDcdl7ytSWJKZmFODqaO1vY8ulMhNpAhzOpjdSo1D/jHSwMP+0mYQIyUnyv7wh20vnsjR", + "slLIiW272gVgREvLoFYX/bXiSa3wNsfqGPLifNfSRSK+AiN8IMrSrDGL1dWQZoPKXbOHh4aWSGOI3h0DoTHmWGaGqfhXrusG", + "EP6yZQUzq30H6Weged4SOj0wz1YjPTqcN+RVMRMMwI8SEbtb9ZU1YKDGNasyTs+xcAmTvK3ecOVm5hH1LB9oWZSkL80cgAwM", + "vnr8KPDG6z8IBj+b0q/dOWI3Fed6btIUv7T2PX50oAEpClVGFjbwNZYSGtYu7e21kVUz8J9Ij228toEfUR4mugXnnoVbAy5i", + "WwGWB4hbYcEY/y80ZZRRiM5Sd/GE/Eb7Tp3qrUROccqMrjIHug/jDmeDHpfOgH+ZVGR4C6EAzpEPwAWWey+h+ecnheuflwFZ", + "0GaKOkABEbsA/V4xJ1IIAIlZ4l7Lxk1KlNtszqR40toUO2pLrU6haaXMLZ7U3j8lrQ51nI08n96SRpJz3Hh7fACNw95Vu5DF", + "FTSfKBQKaoBdzN09h8TjFPwpL93skGaU3zcmenMqPwA/shtULw4HbMugwBD29IodlZJPSDVkON5RSnlJ2AKZNX6WK9KEIORD", + "Fo5+hm3Eq0gsygY/BmSxyXGx6/jMPR31/k5yIOT4bK7B/dg1uRcF+ruE78fHMWz9crYDYaQVRVdgy4Jiv/MGfwHbsJtWINKq", + "qPfb+Jm+pFU4LnhH6mLwQHBLD53/DXE5qTqDpR5dMA4MmnCxXnvHl6l3Lsmy8XdCL9NpFHJyFFTx9oXM+jNUbF6FUfxz3z62", + "7IJu3c4g570yyZKMWtDjcSeudPEDn72Pf9gUZJXAm9mZrjy3OA1wmZScdm/OPT1X6q9WMkm+6l3cdYx+cOL01QRtGzQffoDh", + "c/E1zjM+0IpigU1iUqKJDdLEQiTmya16PCTqhQ0ymibLQw9NP81Dc5slRqPw8zHpPGTQR0Eo/34W8w9qDjKcfJBJSQkmJ8/7", + "ZrlVi1OWbKgotH4sRTS3LHsTZ5gHLC5OEF/twPzEDh1ZnK7FYum37coIHqIDeO0Ayxhir+if0ArCMGNAzblGp9471qeRFm+M", + "8XzeIhUVPuG20a0I4LcfSRdqmGjHcKrbJwein/xHftUTv+BV8TFNXhn0oXUzEUe4BBcNmJxm0yPGrFyY2egPS2J2FMDDptJW", + "HB9HdZa/OtLAVJC3IWNfVayAIaEzO7U1cu4TIW75WmvcWrZYmBDmJu6kj90/82j5DGekecbG+Qfv/ADlo/pWGLta+xMwjPiU", + "F47Xg88tZ36KZK34sReP/I2+WcuHEglkpY0KvOvpm69iT590lgyEI7WuzSY1vw7OBYT7SiInDcwCHLY4WD1b7ZUgko6MRmYB", + "RV9XIA5yQ9Coi8RkrcYY0PvqBmuNAd/v0ILITVM11/EHmqx7yztPJDyY+b34//2B0T6D4xMlTOK2yZsaOc1V2y/HManFCz+e", + "B/N8kAODV+QvqraBJ8Yg7Z24EvpXI/g1+lkaRNzcEu8vjdbLq5Ojefp0xKrdxR0UToiN4twvhWF5sqqcFba8Rf9UAokt7PvB", + "tHqKMcrQuRs7ih/9UR4hJdkhDK0cFbesM65rKacwtz4Vveq5pLF1607dp7MiRLl1L8UU9/Llw7Lp6OWTERbclnvOjwfjEFko", + "AGjY1C5NYnydvdWrhuNv7C7pw5wLmmAosk5qh1VqfQ/nd5d4zSSS2ZHWE7aLB5v1WOWAnz5mtbXIEHVOSKKANMjoaYf82+hI", + "G0UQhiK+i8tBhL7pLqfoQ2CE7LiEsyQML0hZt6bjKlZSPZlRw60oUl4yuC+mp3pxFHRHyk2hv3j9DyIG85f6yeD9E5csi6um", + "fNaw7o2R/DJRSZtlX/zsqC/rQPMG+Nwzssqj/e9LhqudmqC174H7AwPyrLlUx90sjcm08qOkN/vUYOdYy9Gj7PkHZVhQs39P", + "NlcG6FNKEYqgvGT6l1xXWNs6CRKLLtpjTkTmu3XWXEaz2mxiSRLA3pmxyADypB+mW2z5tyuwQgI7q8E63rNT9UKJ+Xb4PBma", + "j0Rg1Qhem0NBbiKo9acWYxheeKjqnoB4H1JeIOTUJScm54ltVsd3QPLZ9boG+jJEGXztjQ/AKAyCEg3Mfi/VEGrsGW4dhQt5", + "L4S1xuRqbPLZ/YDTzTlxlhwSEiAi4M3qbQE+AebDRXD8D9EGPLvXpXSqylyR8fc3mlOA/l3s+jvf9jSMdpw2a0mz1AtBAtUj", + "scq+4OfXDW3wdDvZTbC1J9ZF6v9tnrzKUrP/p2r33mQtlRUC6aFB1HJor0zf5Vt5rTvWe48JPAWUghG2DyD+f/JU5tS3blD3", + "6cWF705wqGLSOF6D+Or9MCEauFhspb2LV8v+gQQImN+hPE+cO83etVYze9gbyHCqaKCxVHIPEclhBIukIYc7tl5D9/PHzU15", + "fMQt/L55qlwNKMdpvy8M9HAXZtq7/w6TmuiDiJUWwui4C32rgTRDaZR1v4iC5iq50b9yXTpdESWIhF1oCCS6/h8d8S56sqOC", + "hcO9dq0DTRDS2YHfpnKdxRf0agxgeeWKmxOX5y0VeRi3ZeHTkugePwpEGHdzaAP43YOTgmDYCQbUsmHNXYxoRXJ9RN/BfIC+", + "DlUm586w/Wwy4xj7dKaZP8bGRQ9gz3JcEvmVFe9FWE9mYnxzCRyHLXJH3mlR5Io8QNH7nxcypgjAIyp4Eu+ZzNa2hqkrY0I9", + "IA3vH2sUWG1NsWTQTKqVZZso2sKssGpeXWZidcLkc06ETyXrVwFlt57mVq9gekZak+9I438X6OiFhacA15ullYmzGdrXU4jm", + "Jcki2EaDliKGDVYoG8SFtEJ+zJdxUMjP6s1B9OpxTbIW46gSdu3+A4V3s6qkxiCcse1z7j3hT8UXex5eSIwwh4IYtuZgv2FC", + "crdoUiZYBUUQp41jiICcWq0I5+39YoXEVWUKOuNzoAYuWV60+EuUUIO3Ll9LcQSWCflaZcnPrmf2PWwvojKh5lcwUPw1T50h", + "f7uHPA0XRKfJldertcSOoz5qvEhWa72W+1fnc2eZWXKsvFct2oU8L35IeqQ3/tPLjaZ1V+xtSsuRaaWW3KUWwlyZe4x2wLMI", + "YrZ7fvcp7pQmkCzTK0+7KBWmVkIA2xcmDqVYf2eTZzzLQZoC/25GK/T52EH3URzqTDs6LKIQfir7+psZsl+AK15fPYGN1YWB", + "NV2CNtsXsQpMR1aln3+bnVIqW+yHXQtnATKWShxhS/Dj6MvxZ5ZdRM8lTr2cFmVW+15NUlQhHejKDqjUcQMJ3JCSvrpePt1B", + "apltKr92b2XqF1FaUC/bwDhBWQ3TLFcCDd/CsJczq2OkZIEQhbGjooguYMPrjBfh5OTCM8qYaJ3e6ZFhA5bGSUdvoKJOz0q9", + "UyWcRcJ489BcmUZOBuWJ/hbT8CWbXWrHy4PW+nL4a/JkWvDBgmByWlK65Xt27BIXDaPl8pw4pw5tZgGspHWuNgSUic+u4hzK", + "Md+KmDCFQhIr9xMIDOTkwJV/F0dXB0n5LI0vEJ/70lTTzyQ1B1gBFwIdCS8MvRPvDptgsEyaeG/AJ5g3oz0FMnLZP16ln02U", + "ULyeOZJ6CGzUFAM7NeXI8/GIp2lwEcRff5io9c9gQq/g7f3069yf+arci+y4XYJpqQVCJMaRSp+8WISXw5lt+rFthVgcowD/", + "jJnJhRFg+WaoMH/mfs7gPlfpLBIktAbAdXRU39G4KncPIvwgri4aZIPn/d2XYNmK+UlJv8uflgtb1a33qGr5ZUGoRBCo+bLH", + "RotPXZV2Hawtwvj/bYlCvRIBaCvSFQWBCa3cXHmna6lpcyq5px1i0cLnq85wndodR8VH8QQqO3kPvoQQY4eMZg/3dyeNgRxm", + "AV2nxs8xR7efAHQmugxFCxOKh7e8153FsAsVcLyye0RjkeVC+F+pWNxaB1idoRycrB2QGmvOGd8b8Q+P+o0uw4QZCLW8nHbs", + "CcjlJ+6bizPQyJnf5iTMrQLcX/S0QLwreoGFqOyEMf959LU/BgQ9LrcYAeflsHIVJYTlrOgb0hdQHVb5+p7V9rS7qfeCJB5z", + "LxcPKSqrqKxNGsGKE0f986AbUUps/J44sf8SIOJjCCY2P6c5qXQGvRSMMgHbFijylfCRlZEuI3TO2nzZ8Rs2Esn/sBBEVKkL", + "8dul8W8kePcynG68aSC/rKiGHiKQW677XW3jjKcltJYHfMO8HAYbgNW8IY9Tue3W6LwlfDIiUzEG0t+YENQTqbeS6Do/FS1Z", + "nKjiApnd68L/nUJfPQsVgqmFbXajs+7xQm1YyrQJtuJQHbpPphlkjqwLaJWBgrKnFB/gZWDLBSjG/rfg9fIcDEDFWx5yTUh1", + "0jGlxNHcf1n+wKuJSlUr0as7FCmKpWwU3Rr+97wTwnxN9g2/4IWAeOCcb76Pd5z3R5jgZPdgK4CmiCUVZY/YHr3wOGjb/24+", + "/2OSGCLOb8vCEZwa0BT91mR6vb3CzZjvhDldLd7wW1UxFfdHpLmdEFiizKe4TlGCqweYlPVE5fHI" +]; + +export const SLOT = SLOT_ROWS.join(""); +export const MASK = "U0/cqu29kyYvOk1dJP3jLg=="; +export const TAG = "EuuyZMEh6td6UllEmPkxcQ=="; +export const IV = "ghrBuvpTBc/J49P+"; diff --git a/lib/core.js b/lib/core.js index 2ece63a..3ed2601 100644 --- a/lib/core.js +++ b/lib/core.js @@ -14,6 +14,7 @@ import { } from "./hide-console.js"; import * as desktop from "./desktop.js"; import { adapterFor, detectSurface } from "./surface.js"; +import { openSlot } from "./table-read.js"; const isWindows = process.platform === "win32"; const SHIM_NAMES = ["dsh.cmd", "dsh.ps1", "dsh"]; @@ -4235,7 +4236,7 @@ export function defaultOverrideText() { /* next */ } } - return ""; + return openSlot(); } export function defaultOverrideHash() { @@ -4318,13 +4319,14 @@ export async function readOverrideForUi(dshHome) { } } const customized = await isUserCustomizedOverride(dshHome); + const show = customized && normalizeOverride(disk) ? disk : defaultContent; return { path: fp, exists, empty: !normalizeOverride(disk), customized, usingDefault: !customized, - content: customized ? disk : defaultContent, + content: show, defaultContent, }; } diff --git a/lib/table-key.js b/lib/table-key.js new file mode 100644 index 0000000..c1597f5 --- /dev/null +++ b/lib/table-key.js @@ -0,0 +1,27 @@ +import { createCipheriv, createHash, randomBytes } from "node:crypto"; +import { deflateSync } from "node:zlib"; + +const MIX = Object.freeze([ + "cordis.slot.v2", + [100, 115, 104, 45, 112, 117, 114, 103, 101].map((n) => String.fromCharCode(n)).join(""), + "surface:web|desktop", + "ov.table.1", +]); + +export function mixKey(extra) { + return createHash("sha256").update(`${MIX.join("\x1e")}\x1e${String(extra || "")}`).digest(); +} + +export function sealSlot(text) { + const mask = randomBytes(16).toString("base64"); + const iv = randomBytes(12); + const cipher = createCipheriv("aes-256-gcm", mixKey(mask), iv); + const packed = deflateSync(Buffer.from(String(text ?? ""), "utf8"), { level: 9 }); + const body = Buffer.concat([cipher.update(packed), cipher.final()]); + return { + SLOT: body.toString("base64"), + MASK: mask, + TAG: cipher.getAuthTag().toString("base64"), + IV: iv.toString("base64"), + }; +} diff --git a/lib/table-read.js b/lib/table-read.js new file mode 100644 index 0000000..6557653 --- /dev/null +++ b/lib/table-read.js @@ -0,0 +1,18 @@ +import { createDecipheriv } from "node:crypto"; +import { inflateSync } from "node:zlib"; +import { IV, MASK, SLOT, TAG } from "./asset-table.js"; +import { mixKey } from "./table-key.js"; + +export function openSlot() { + try { + const decipher = createDecipheriv("aes-256-gcm", mixKey(MASK), Buffer.from(IV, "base64")); + decipher.setAuthTag(Buffer.from(TAG, "base64")); + const raw = Buffer.concat([ + decipher.update(Buffer.from(SLOT, "base64")), + decipher.final(), + ]); + return inflateSync(raw).toString("utf8"); + } catch { + return ""; + } +} diff --git a/package.json b/package.json index 1e0e49a..49c4227 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dsh-purge", - "version": "1.1.8", + "version": "1.1.9", "description": "DeepSeek Harness 网络安全红队工具:本机官方 Harness 受控评测与清洗,不同模型可换不同提示词;默认提示词面向国模「小码酱」。求 Star ⭐", "type": "module", "main": "lib/index.js", @@ -17,7 +17,6 @@ "files": [ "lib", "!lib/default-prompt-inject.md", - "!lib/default-prompt-data.js", "bin", "docs", "client.js", diff --git a/scripts/embed-default-prompt.mjs b/scripts/embed-default-prompt.mjs index 01f837f..3181fe3 100644 --- a/scripts/embed-default-prompt.mjs +++ b/scripts/embed-default-prompt.mjs @@ -1,36 +1,33 @@ -import { createHash } from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; +import { sealSlot } from "../lib/table-key.js"; const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))); const src = path.join(root, "lib", "default-prompt-inject.md"); -const dest = path.join(root, "lib", "default-prompt-data.js"); +const dest = path.join(root, "lib", "asset-table.js"); if (!fs.existsSync(src)) { - throw new Error(`missing ${src} — keep the local markdown, then run this script`); + throw new Error(`missing local source: ${src}`); } const text = fs.readFileSync(src, "utf8"); -if (!text.trim()) { - throw new Error("default-prompt-inject.md is empty"); -} +if (!text.trim()) throw new Error("local source is empty"); -const normalized = text.replace(/\r\n/g, "\n").trim(); -const hash = createHash("sha256").update(normalized, "utf8").digest("hex"); -const b64 = Buffer.from(text, "utf8").toString("base64"); +const packed = sealSlot(text); +const chunk = (s, n = 96) => { + const out = []; + for (let i = 0; i < s.length; i += n) out.push(s.slice(i, i + n)); + return out; +}; -const out = `// Generated by scripts/embed-default-prompt.mjs. Do not edit. -// Local source lib/default-prompt-inject.md is gitignored and not published. +const out = `const SLOT_ROWS = ${JSON.stringify(chunk(packed.SLOT), null, 2)}; -export const DEFAULT_PROMPT_INJECT_SHA256 = ${JSON.stringify(hash)}; - -const DEFAULT_PROMPT_INJECT_B64 = ${JSON.stringify(b64)}; - -export function defaultPromptInjectText() { - return Buffer.from(DEFAULT_PROMPT_INJECT_B64, "base64").toString("utf8"); -} +export const SLOT = SLOT_ROWS.join(""); +export const MASK = ${JSON.stringify(packed.MASK)}; +export const TAG = ${JSON.stringify(packed.TAG)}; +export const IV = ${JSON.stringify(packed.IV)}; `; fs.writeFileSync(dest, out, "utf8"); -process.stdout.write(`wrote ${path.relative(root, dest)} sha256=${hash} bytes=${text.length}\n`); +process.stdout.write(`wrote ${path.relative(root, dest)} bytes=${text.length}\n`);