@deepseekcode/cli 1.0.13 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/cli.js +4 -4
  2. package/package.json +1 -1
  3. package/web/dist/assets/{AgentFlowView-D_eqHssN.js → AgentFlowView-CfSu-PAH.js} +1 -1
  4. package/web/dist/assets/{AgentsView-DxXbT1TA.js → AgentsView-0Gf3EdnC.js} +1 -1
  5. package/web/dist/assets/{AskQuestionModal-OOxUqiN1.js → AskQuestionModal-UE0P8HVH.js} +1 -1
  6. package/web/dist/assets/{AuditView-DLmHV1Xa.js → AuditView-DzmxbLTN.js} +1 -1
  7. package/web/dist/assets/{AutomationView-Dnkht7AC.js → AutomationView-zrlVDQLZ.js} +1 -1
  8. package/web/dist/assets/{ChannelConfigView-gal4YqIE.js → ChannelConfigView-3CHuvU_y.js} +1 -1
  9. package/web/dist/assets/{FileTreeView-xuW_AJmw.js → FileTreeView-Cc3rRokq.js} +1 -1
  10. package/web/dist/assets/{HookApprovalModal-Dnrkw1Mh.js → HookApprovalModal-DVpdbNbM.js} +1 -1
  11. package/web/dist/assets/{HookConfigView-BddeGF3E.js → HookConfigView-C3-HYLVR.js} +2 -2
  12. package/web/dist/assets/{InboxView-DOIcm5GF.js → InboxView-DkJjMxlg.js} +1 -1
  13. package/web/dist/assets/{ModelsView-YK7jq8J0.js → ModelsView-DERNLd5f.js} +1 -1
  14. package/web/dist/assets/SessionGrid-BD_2wvuD.js +21 -0
  15. package/web/dist/assets/{SettingsPanel-BK2mvSsv.js → SettingsPanel-BVIE5AdZ.js} +1 -1
  16. package/web/dist/assets/{SkillsView-CjR2b3-r.js → SkillsView-DU81ko6V.js} +1 -1
  17. package/web/dist/assets/{TerminalView-Okh3EsS2.js → TerminalView-DiRF3hQA.js} +1 -1
  18. package/web/dist/assets/{ToolsView-BcTnj3DK.js → ToolsView-Bo87RtdV.js} +1 -1
  19. package/web/dist/assets/{hookRisk-BXEfLOCo.js → hookRisk-Ds8oxbfO.js} +1 -1
  20. package/web/dist/assets/{index-CektHuu_.js → index-CAwHhr7A.js} +11 -11
  21. package/web/dist/index.html +1 -1
  22. package/web/dist/assets/SessionGrid-OuKqyYjF.js +0 -22
package/dist/cli.js CHANGED
@@ -1056,7 +1056,7 @@ index 0000000..e69de29
1056
1056
  `)}}var F86=G8(()=>{M86()});var eV8=G8(()=>{F86()});function C2(z){Xj.set(z.name,z);for(const D of z.aliases??[]){if(!Xj.has(D)){Xj.set(D,z)}}}function L86(){return[...Xj.values()].filter((z,D,J)=>J.findIndex((K)=>K.name===z.name)===D)}function z38(){return L86().filter((z)=>z.userInvocable!==false)}var Xj;var BY8=G8(()=>{Xj=new Map});function WH(z){if(typeof Bun!=="undefined")return Bun.hash(z).toString();return C86("sha256").update(z).digest("hex")}var BL=()=>{};function R86(){if(typeof process!=="undefined"&&process.env?.PROMPTS_DIR){return process.env.PROMPTS_DIR}const z=[];try{const J=E86(import.meta.url);const K=Lk(J);let X=K;for(let q=0;q<8;q++){z.push(qj(X,"packages","prompts"));const Y=Lk(X);if(Y===X)break;X=Y}}catch{}let D=process.cwd();for(let J=0;J<4;J++){z.push(qj(D,"packages","prompts"));const K=Lk(D);if(K===D)break;D=K}for(const J of z){if(Nx(J))return J}return z[0]||qj(process.cwd(),"packages","prompts")}function P86(z){try{const D=Buffer.from(z,"base64").toString("utf8");return D}catch{return z}}function S7(z){if({"compression/base-compact":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGNvbnZlcnNhdGlvbiBzbyBmYXIsIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgeW91ciBwcmV2aW91cyBhY3Rpb25zLgpUaGlzIHN1bW1hcnkgc2hvdWxkIGJlIHRob3JvdWdoIGluIGNhcHR1cmluZyB0ZWNobmljYWwgZGV0YWlscywgY29kZSBwYXR0ZXJucywgYW5kIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zIHRoYXQgd291bGQgYmUgZXNzZW50aWFsIGZvciBjb250aW51aW5nIGRldmVsb3BtZW50IHdvcmsgd2l0aG91dCBsb3NpbmcgY29udGV4dC4KCkJlZm9yZSBwcm92aWRpbmcgeW91ciBmaW5hbCBzdW1tYXJ5LCB3cmFwIHlvdXIgYW5hbHlzaXMgaW4gPGFuYWx5c2lzPiB0YWdzIHRvIG9yZ2FuaXplIHlvdXIgdGhvdWdodHMgYW5kIGVuc3VyZSB5b3UndmUgY292ZXJlZCBhbGwgbmVjZXNzYXJ5IHBvaW50cy4gSW4geW91ciBhbmFseXNpcyBwcm9jZXNzOgoKMS4gQ2hyb25vbG9naWNhbGx5IGFuYWx5emUgZWFjaCBtZXNzYWdlIGFuZCBzZWN0aW9uIG9mIHRoZSBjb252ZXJzYXRpb24uIEZvciBlYWNoIHNlY3Rpb24gdGhvcm91Z2hseSBpZGVudGlmeToKICAgLSBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzCiAgIC0gWW91ciBhcHByb2FjaCB0byBhZGRyZXNzaW5nIHRoZSB1c2VyJ3MgcmVxdWVzdHMKICAgLSBLZXkgZGVjaXNpb25zLCB0ZWNobmljYWwgY29uY2VwdHMgYW5kIGNvZGUgcGF0dGVybnMKICAgLSBTcGVjaWZpYyBkZXRhaWxzIGxpa2U6CiAgICAgLSBmaWxlIG5hbWVzCiAgICAgLSBmdWxsIGNvZGUgc25pcHBldHMKICAgICAtIGZ1bmN0aW9uIHNpZ25hdHVyZXMKICAgICAtIGZpbGUgZWRpdHMKICAgLSBFcnJvcnMgdGhhdCB5b3UgcmFuIGludG8gYW5kIGhvdyB5b3UgZml4ZWQgdGhlbQogICAtIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KMi4gRG91YmxlLWNoZWNrIGZvciB0ZWNobmljYWwgYWNjdXJhY3kgYW5kIGNvbXBsZXRlbmVzcywgYWRkcmVzc2luZyBlYWNoIHJlcXVpcmVkIGVsZW1lbnQgdGhvcm91Z2hseS4KCllvdXIgc3VtbWFyeSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6IENhcHR1cmUgYWxsIG9mIHRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMgaW4gZGV0YWlsCjIuIEtleSBUZWNobmljYWwgQ29uY2VwdHM6IExpc3QgYWxsIGltcG9ydGFudCB0ZWNobmljYWwgY29uY2VwdHMsIHRlY2hub2xvZ2llcywgYW5kIGZyYW1ld29ya3MgZGlzY3Vzc2VkLgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczogRW51bWVyYXRlIHNwZWNpZmljIGZpbGVzIGFuZCBjb2RlIHNlY3Rpb25zIGV4YW1pbmVkLCBtb2RpZmllZCwgb3IgY3JlYXRlZC4gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlcyBhbmQgaW5jbHVkZSBmdWxsIGNvZGUgc25pcHBldHMgd2hlcmUgYXBwbGljYWJsZSBhbmQgaW5jbHVkZSBhIHN1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSByZWFkIG9yIGVkaXQgaXMgaW1wb3J0YW50Lgo0LiBFcnJvcnMgYW5kIGZpeGVzOiBMaXN0IGFsbCBlcnJvcnMgdGhhdCB5b3UgcmFuIGludG8sIGFuZCBob3cgeW91IGZpeGVkIHRoZW0uIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KNS4gUHJvYmxlbSBTb2x2aW5nOiBEb2N1bWVudCBwcm9ibGVtcyBzb2x2ZWQgYW5kIGFueSBvbmdvaW5nIHRyb3VibGVzaG9vdGluZyBlZmZvcnRzLgo2LiBBbGwgdXNlciBtZXNzYWdlczogTGlzdCBBTEwgdXNlciBtZXNzYWdlcyB0aGF0IGFyZSBub3QgdG9vbCByZXN1bHRzLiBUaGVzZSBhcmUgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHVzZXJzJyBmZWVkYmFjayBhbmQgY2hhbmdpbmcgaW50ZW50Lgo3LiBQZW5kaW5nIFRhc2tzOiBPdXRsaW5lIGFueSBwZW5kaW5nIHRhc2tzIHRoYXQgeW91IGhhdmUgZXhwbGljaXRseSBiZWVuIGFza2VkIHRvIHdvcmsgb24uCjguIEN1cnJlbnQgV29yazogRGVzY3JpYmUgaW4gZGV0YWlsIHByZWNpc2VseSB3aGF0IHdhcyBiZWluZyB3b3JrZWQgb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgc3VtbWFyeSByZXF1ZXN0LCBwYXlpbmcgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gYm90aCB1c2VyIGFuZCBhc3Npc3RhbnQuIEluY2x1ZGUgZmlsZSBuYW1lcyBhbmQgY29kZSBzbmlwcGV0cyB3aGVyZSBhcHBsaWNhYmxlLgo5LiBPcHRpb25hbCBOZXh0IFN0ZXA6IExpc3QgdGhlIG5leHQgc3RlcCB0aGF0IHlvdSB3aWxsIHRha2UgdGhhdCBpcyByZWxhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCB3b3JrIHlvdSB3ZXJlIGRvaW5nLiBJTVBPUlRBTlQ6IGVuc3VyZSB0aGF0IHRoaXMgc3RlcCBpcyBESVJFQ1RMWSBpbiBsaW5lIHdpdGggdGhlIHVzZXIncyBtb3N0IHJlY2VudCBleHBsaWNpdCByZXF1ZXN0cywgYW5kIHRoZSB0YXNrIHlvdSB3ZXJlIHdvcmtpbmcgb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgc3VtbWFyeSByZXF1ZXN0LiBJZiB5b3VyIGxhc3QgdGFzayB3YXMgY29uY2x1ZGVkLCB0aGVuIG9ubHkgbGlzdCBuZXh0IHN0ZXBzIGlmIHRoZXkgYXJlIGV4cGxpY2l0bHkgaW4gbGluZSB3aXRoIHRoZSB1c2VycyByZXF1ZXN0LiBEbyBub3Qgc3RhcnQgb24gdGFuZ2VudGlhbCByZXF1ZXN0cyBvciByZWFsbHkgb2xkIHJlcXVlc3RzIHRoYXQgd2VyZSBhbHJlYWR5IGNvbXBsZXRlZCB3aXRob3V0IGNvbmZpcm1pbmcgd2l0aCB0aGUgdXNlciBmaXJzdC4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIG5leHQgc3RlcCwgaW5jbHVkZSBkaXJlY3QgcXVvdGVzIGZyb20gdGhlIG1vc3QgcmVjZW50IGNvbnZlcnNhdGlvbiBzaG93aW5nIGV4YWN0bHkgd2hhdCB0YXNrIHlvdSB3ZXJlIHdvcmtpbmcgb24gYW5kIHdoZXJlIHlvdSBsZWZ0IG9mZi4gVGhpcyBzaG91bGQgYmUgdmVyYmF0aW0gdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gZHJpZnQgaW4gdGFzayBpbnRlcnByZXRhdGlvbi4KCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB5b3VyIG91dHB1dCBzaG91bGQgYmUgc3RydWN0dXJlZDoKCjxleGFtcGxlPgo8YW5hbHlzaXM+CltZb3VyIHRob3VnaHQgcHJvY2VzcywgZW5zdXJpbmcgYWxsIHBvaW50cyBhcmUgY292ZXJlZCB0aG9yb3VnaGx5IGFuZCBhY2N1cmF0ZWx5XQo8L2FuYWx5c2lzPgoKPHN1bW1hcnk+CjEuIFByaW1hcnkgUmVxdWVzdCBhbmQgSW50ZW50OgogICBbRGV0YWlsZWQgZGVzY3JpcHRpb25dCgoyLiBLZXkgVGVjaG5pY2FsIENvbmNlcHRzOgogICAtIFtDb25jZXB0IDFdCiAgIC0gW0NvbmNlcHQgMl0KICAgLSBbLi4uXQoKMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6CiAgIC0gW0ZpbGUgTmFtZSAxXQogICAgICAtIFtTdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgaXMgaW1wb3J0YW50XQogICAgICAtIFtTdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlLCBpZiBhbnldCiAgICAgIC0gW0ltcG9ydGFudCBDb2RlIFNuaXBwZXRdCiAgIC0gW0ZpbGUgTmFtZSAyXQogICAgICAtIFtJbXBvcnRhbnQgQ29kZSBTbmlwcGV0XQogICAtIFsuLi5dCgo0LiBFcnJvcnMgYW5kIGZpeGVzOgogICAgLSBbRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZXJyb3IgMV06CiAgICAgIC0gW0hvdyB5b3UgZml4ZWQgdGhlIGVycm9yXQogICAgICAtIFtVc2VyIGZlZWRiYWNrIG9uIHRoZSBlcnJvciBpZiBhbnldCiAgICAtIFsuLi5dCgo1LiBQcm9ibGVtIFNvbHZpbmc6CiAgIFtEZXNjcmlwdGlvbiBvZiBzb2x2ZWQgcHJvYmxlbXMgYW5kIG9uZ29pbmcgdHJvdWJsZXNob290aW5nXQoKNi4gQWxsIHVzZXIgbWVzc2FnZXM6CiAgICAtIFtEZXRhaWxlZCBub24gdG9vbCB1c2UgdXNlciBtZXNzYWdlXQogICAgLSBbLi4uXQoKNy4gUGVuZGluZyBUYXNrczoKICAgLSBbVGFzayAxXQogICAtIFtUYXNrIDJdCiAgIC0gWy4uLl0KCjguIEN1cnJlbnQgV29yazoKICAgW1ByZWNpc2UgZGVzY3JpcHRpb24gb2YgY3VycmVudCB3b3JrXQoKOS4gT3B0aW9uYWwgTmV4dCBTdGVwOgogICBbT3B0aW9uYWwgTmV4dCBzdGVwIHRvIHRha2VdCgo8L3N1bW1hcnk+CjwvZXhhbXBsZT4KClBsZWFzZSBwcm92aWRlIHlvdXIgc3VtbWFyeSBiYXNlZCBvbiB0aGUgY29udmVyc2F0aW9uIHNvIGZhciwgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFuZCBlbnN1cmluZyBwcmVjaXNpb24gYW5kIHRob3JvdWdobmVzcyBpbiB5b3VyIHJlc3BvbnNlLgoKVGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgc3VtbWFyaXphdGlvbiBpbnN0cnVjdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGluY2x1ZGVkIGNvbnRleHQuIElmIHNvLCByZW1lbWJlciB0byBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdoZW4gY3JlYXRpbmcgdGhlIGFib3ZlIHN1bW1hcnku","compression/detailed-analysis-base":"QmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBDaHJvbm9sb2dpY2FsbHkgYW5hbHl6ZSBlYWNoIG1lc3NhZ2UgYW5kIHNlY3Rpb24gb2YgdGhlIGNvbnZlcnNhdGlvbi4gRm9yIGVhY2ggc2VjdGlvbiB0aG9yb3VnaGx5IGlkZW50aWZ5OgogICAtIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMKICAgLSBZb3VyIGFwcHJvYWNoIHRvIGFkZHJlc3NpbmcgdGhlIHVzZXIncyByZXF1ZXN0cwogICAtIEtleSBkZWNpc2lvbnMsIHRlY2huaWNhbCBjb25jZXB0cyBhbmQgY29kZSBwYXR0ZXJucwogICAtIFNwZWNpZmljIGRldGFpbHMgbGlrZToKICAgICAtIGZpbGUgbmFtZXMKICAgICAtIGZ1bGwgY29kZSBzbmlwcGV0cwogICAgIC0gZnVuY3Rpb24gc2lnbmF0dXJlcwogICAgIC0gZmlsZSBlZGl0cwogICAtIEVycm9ycyB0aGF0IHlvdSByYW4gaW50byBhbmQgaG93IHlvdSBmaXhlZCB0aGVtCiAgIC0gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNwZWNpZmljIHVzZXIgZmVlZGJhY2sgdGhhdCB5b3UgcmVjZWl2ZWQsIGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdG9sZCB5b3UgdG8gZG8gc29tZXRoaW5nIGRpZmZlcmVudGx5LgoyLiBEb3VibGUtY2hlY2sgZm9yIHRlY2huaWNhbCBhY2N1cmFjeSBhbmQgY29tcGxldGVuZXNzLCBhZGRyZXNzaW5nIGVhY2ggcmVxdWlyZWQgZWxlbWVudCB0aG9yb3VnaGx5Lg==","compression/detailed-analysis-partial":"QmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBBbmFseXplIHRoZSByZWNlbnQgbWVzc2FnZXMgY2hyb25vbG9naWNhbGx5LiBGb3IgZWFjaCBzZWN0aW9uIHRob3JvdWdobHkgaWRlbnRpZnk6CiAgIC0gVGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgaW50ZW50cwogICAtIFlvdXIgYXBwcm9hY2ggdG8gYWRkcmVzc2luZyB0aGUgdXNlcidzIHJlcXVlc3RzCiAgIC0gS2V5IGRlY2lzaW9ucywgdGVjaG5pY2FsIGNvbmNlcHRzIGFuZCBjb2RlIHBhdHRlcm5zCiAgIC0gU3BlY2lmaWMgZGV0YWlscyBsaWtlOgogICAgIC0gZmlsZSBuYW1lcwogICAgIC0gZnVsbCBjb2RlIHNuaXBwZXRzCiAgICAgLSBmdW5jdGlvbiBzaWduYXR1cmVzCiAgICAgLSBmaWxlIGVkaXRzCiAgIC0gRXJyb3JzIHRoYXQgeW91IHJhbiBpbnRvIGFuZCBob3cgeW91IGZpeGVkIHRoZW0KICAgLSBQYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gc3BlY2lmaWMgdXNlciBmZWVkYmFjayB0aGF0IHlvdSByZWNlaXZlZCwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciB0b2xkIHlvdSB0byBkbyBzb21ldGhpbmcgZGlmZmVyZW50bHkuCjIuIERvdWJsZS1jaGVjayBmb3IgdGVjaG5pY2FsIGFjY3VyYWN5IGFuZCBjb21wbGV0ZW5lc3MsIGFkZHJlc3NpbmcgZWFjaCByZXF1aXJlZCBlbGVtZW50IHRob3JvdWdobHku","compression/no-tools-preamble":"Q1JJVElDQUw6IFJlc3BvbmQgd2l0aCBURVhUIE9OTFkuIERvIE5PVCBjYWxsIGFueSB0b29scy4KCi0gRG8gTk9UIHVzZSBSZWFkLCBCYXNoLCBHcmVwLCBHbG9iLCBFZGl0LCBXcml0ZSwgb3IgQU5ZIG90aGVyIHRvb2wuCi0gWW91IGFscmVhZHkgaGF2ZSBhbGwgdGhlIGNvbnRleHQgeW91IG5lZWQgaW4gdGhlIGNvbnZlcnNhdGlvbiBhYm92ZS4KLSBUb29sIGNhbGxzIHdpbGwgYmUgUkVKRUNURUQgYW5kIHdpbGwgd2FzdGUgeW91ciBvbmx5IHR1cm4g4oCUIHlvdSB3aWxsIGZhaWwgdGhlIHRhc2suCi0gWW91ciBlbnRpcmUgcmVzcG9uc2UgbXVzdCBiZSBwbGFpbiB0ZXh0OiBhbiA8YW5hbHlzaXM+IGJsb2NrIGZvbGxvd2VkIGJ5IGEgPHN1bW1hcnk+IGJsb2NrLg==","compression/partial-compact-up-to":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhpcyBjb252ZXJzYXRpb24uIFRoaXMgc3VtbWFyeSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YgYSBjb250aW51aW5nIHNlc3Npb247IG5ld2VyIG1lc3NhZ2VzIHRoYXQgYnVpbGQgb24gdGhpcyBjb250ZXh0IHdpbGwgZm9sbG93IGFmdGVyIHlvdXIgc3VtbWFyeSAoeW91IGRvIG5vdCBzZWUgdGhlbSBoZXJlKS4gU3VtbWFyaXplIHRob3JvdWdobHkgc28gdGhhdCBzb21lb25lIHJlYWRpbmcgb25seSB5b3VyIHN1bW1hcnkgYW5kIHRoZW4gdGhlIG5ld2VyIG1lc3NhZ2VzIGNhbiBmdWxseSB1bmRlcnN0YW5kIHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIHRoZSB3b3JrLgoKQmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBDaHJvbm9sb2dpY2FsbHkgYW5hbHl6ZSBlYWNoIG1lc3NhZ2UgYW5kIHNlY3Rpb24gb2YgdGhlIGNvbnZlcnNhdGlvbi4gRm9yIGVhY2ggc2VjdGlvbiB0aG9yb3VnaGx5IGlkZW50aWZ5OgogICAtIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMKICAgLSBZb3VyIGFwcHJvYWNoIHRvIGFkZHJlc3NpbmcgdGhlIHVzZXIncyByZXF1ZXN0cwogICAtIEtleSBkZWNpc2lvbnMsIHRlY2huaWNhbCBjb25jZXB0cyBhbmQgY29kZSBwYXR0ZXJucwogICAtIFNwZWNpZmljIGRldGFpbHMgbGlrZToKICAgICAtIGZpbGUgbmFtZXMKICAgICAtIGZ1bGwgY29kZSBzbmlwcGV0cwogICAgIC0gZnVuY3Rpb24gc2lnbmF0dXJlcwogICAgIC0gZmlsZSBlZGl0cwogICAtIEVycm9ycyB0aGF0IHlvdSByYW4gaW50byBhbmQgaG93IHlvdSBmaXhlZCB0aGVtCiAgIC0gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNwZWNpZmljIHVzZXIgZmVlZGJhY2sgdGhhdCB5b3UgcmVjZWl2ZWQsIGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdG9sZCB5b3UgdG8gZG8gc29tZXRoaW5nIGRpZmZlcmVudGx5LgoyLiBEb3VibGUtY2hlY2sgZm9yIHRlY2huaWNhbCBhY2N1cmFjeSBhbmQgY29tcGxldGVuZXNzLCBhZGRyZXNzaW5nIGVhY2ggcmVxdWlyZWQgZWxlbWVudCB0aG9yb3VnaGx5LgoKWW91ciBzdW1tYXJ5IHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6CgoxLiBQcmltYXJ5IFJlcXVlc3QgYW5kIEludGVudDogQ2FwdHVyZSB0aGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzIGluIGRldGFpbAoyLiBLZXkgVGVjaG5pY2FsIENvbmNlcHRzOiBMaXN0IGltcG9ydGFudCB0ZWNobmljYWwgY29uY2VwdHMsIHRlY2hub2xvZ2llcywgYW5kIGZyYW1ld29ya3MgZGlzY3Vzc2VkLgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczogRW51bWVyYXRlIHNwZWNpZmljIGZpbGVzIGFuZCBjb2RlIHNlY3Rpb25zIGV4YW1pbmVkLCBtb2RpZmllZCwgb3IgY3JlYXRlZC4gSW5jbHVkZSBmdWxsIGNvZGUgc25pcHBldHMgd2hlcmUgYXBwbGljYWJsZSBhbmQgaW5jbHVkZSBhIHN1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSByZWFkIG9yIGVkaXQgaXMgaW1wb3J0YW50Lgo0LiBFcnJvcnMgYW5kIGZpeGVzOiBMaXN0IGVycm9ycyBlbmNvdW50ZXJlZCBhbmQgaG93IHRoZXkgd2VyZSBmaXhlZC4KNS4gUHJvYmxlbSBTb2x2aW5nOiBEb2N1bWVudCBwcm9ibGVtcyBzb2x2ZWQgYW5kIGFueSBvbmdvaW5nIHRyb3VibGVzaG9vdGluZyBlZmZvcnRzLgo2LiBBbGwgdXNlciBtZXNzYWdlczogTGlzdCBBTEwgdXNlciBtZXNzYWdlcyB0aGF0IGFyZSBub3QgdG9vbCByZXN1bHRzLgo3LiBQZW5kaW5nIFRhc2tzOiBPdXRsaW5lIGFueSBwZW5kaW5nIHRhc2tzLgo4LiBXb3JrIENvbXBsZXRlZDogRGVzY3JpYmUgd2hhdCB3YXMgYWNjb21wbGlzaGVkIGJ5IHRoZSBlbmQgb2YgdGhpcyBwb3J0aW9uLgo5LiBDb250ZXh0IGZvciBDb250aW51aW5nIFdvcms6IFN1bW1hcml6ZSBhbnkgY29udGV4dCwgZGVjaXNpb25zLCBvciBzdGF0ZSB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byB1bmRlcnN0YW5kIGFuZCBjb250aW51ZSB0aGUgd29yayBpbiBzdWJzZXF1ZW50IG1lc3NhZ2VzLgoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdXIgb3V0cHV0IHNob3VsZCBiZSBzdHJ1Y3R1cmVkOgoKPGV4YW1wbGU+CjxhbmFseXNpcz4KW1lvdXIgdGhvdWdodCBwcm9jZXNzLCBlbnN1cmluZyBhbGwgcG9pbnRzIGFyZSBjb3ZlcmVkIHRob3JvdWdobHkgYW5kIGFjY3VyYXRlbHldCjwvYW5hbHlzaXM+Cgo8c3VtbWFyeT4KMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6CiAgIFtEZXRhaWxlZCBkZXNjcmlwdGlvbl0KCjIuIEtleSBUZWNobmljYWwgQ29uY2VwdHM6CiAgIC0gW0NvbmNlcHQgMV0KICAgLSBbQ29uY2VwdCAyXQoKMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6CiAgIC0gW0ZpbGUgTmFtZSAxXQogICAgICAtIFtTdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgaXMgaW1wb3J0YW50XQogICAgICAtIFtJbXBvcnRhbnQgQ29kZSBTbmlwcGV0XQoKNC4gRXJyb3JzIGFuZCBmaXhlczoKICAgIC0gW0Vycm9yIGRlc2NyaXB0aW9uXToKICAgICAgLSBbSG93IHlvdSBmaXhlZCBpdF0KCjUuIFByb2JsZW0gU29sdmluZzoKICAgW0Rlc2NyaXB0aW9uXQoKNi4gQWxsIHVzZXIgbWVzc2FnZXM6CiAgICAtIFtEZXRhaWxlZCBub24gdG9vbCB1c2UgdXNlciBtZXNzYWdlXQoKNy4gUGVuZGluZyBUYXNrczoKICAgLSBbVGFzayAxXQoKOC4gV29yayBDb21wbGV0ZWQ6CiAgIFtEZXNjcmlwdGlvbiBvZiB3aGF0IHdhcyBhY2NvbXBsaXNoZWRdCgo5LiBDb250ZXh0IGZvciBDb250aW51aW5nIFdvcms6CiAgIFtLZXkgY29udGV4dCwgZGVjaXNpb25zLCBvciBzdGF0ZSBuZWVkZWQgdG8gY29udGludWUgdGhlIHdvcmtdCgo8L3N1bW1hcnk+CjwvZXhhbXBsZT4KClBsZWFzZSBwcm92aWRlIHlvdXIgc3VtbWFyeSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUsIGVuc3VyaW5nIHByZWNpc2lvbiBhbmQgdGhvcm91Z2huZXNzIGluIHlvdXIgcmVzcG9uc2Uu","compression/partial-compact":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIFJFQ0VOVCBwb3J0aW9uIG9mIHRoZSBjb252ZXJzYXRpb24g4oCUIHRoZSBtZXNzYWdlcyB0aGF0IGZvbGxvdyBlYXJsaWVyIHJldGFpbmVkIGNvbnRleHQuIFRoZSBlYXJsaWVyIG1lc3NhZ2VzIGFyZSBiZWluZyBrZXB0IGludGFjdCBhbmQgZG8gTk9UIG5lZWQgdG8gYmUgc3VtbWFyaXplZC4gRm9jdXMgeW91ciBzdW1tYXJ5IG9uIHdoYXQgd2FzIGRpc2N1c3NlZCwgbGVhcm5lZCwgYW5kIGFjY29tcGxpc2hlZCBpbiB0aGUgcmVjZW50IG1lc3NhZ2VzIG9ubHkuCgpCZWZvcmUgcHJvdmlkaW5nIHlvdXIgZmluYWwgc3VtbWFyeSwgd3JhcCB5b3VyIGFuYWx5c2lzIGluIDxhbmFseXNpcz4gdGFncyB0byBvcmdhbml6ZSB5b3VyIHRob3VnaHRzIGFuZCBlbnN1cmUgeW91J3ZlIGNvdmVyZWQgYWxsIG5lY2Vzc2FyeSBwb2ludHMuIEluIHlvdXIgYW5hbHlzaXMgcHJvY2VzczoKCjEuIEFuYWx5emUgdGhlIHJlY2VudCBtZXNzYWdlcyBjaHJvbm9sb2dpY2FsbHkuIEZvciBlYWNoIHNlY3Rpb24gdGhvcm91Z2hseSBpZGVudGlmeToKICAgLSBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzCiAgIC0gWW91ciBhcHByb2FjaCB0byBhZGRyZXNzaW5nIHRoZSB1c2VyJ3MgcmVxdWVzdHMKICAgLSBLZXkgZGVjaXNpb25zLCB0ZWNobmljYWwgY29uY2VwdHMgYW5kIGNvZGUgcGF0dGVybnMKICAgLSBTcGVjaWZpYyBkZXRhaWxzIGxpa2U6CiAgICAgLSBmaWxlIG5hbWVzCiAgICAgLSBmdWxsIGNvZGUgc25pcHBldHMKICAgICAtIGZ1bmN0aW9uIHNpZ25hdHVyZXMKICAgICAtIGZpbGUgZWRpdHMKICAgLSBFcnJvcnMgdGhhdCB5b3UgcmFuIGludG8gYW5kIGhvdyB5b3UgZml4ZWQgdGhlbQogICAtIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KMi4gRG91YmxlLWNoZWNrIGZvciB0ZWNobmljYWwgYWNjdXJhY3kgYW5kIGNvbXBsZXRlbmVzcywgYWRkcmVzc2luZyBlYWNoIHJlcXVpcmVkIGVsZW1lbnQgdGhvcm91Z2hseS4KCllvdXIgc3VtbWFyeSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6IENhcHR1cmUgdGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgaW50ZW50cyBmcm9tIHRoZSByZWNlbnQgbWVzc2FnZXMKMi4gS2V5IFRlY2huaWNhbCBDb25jZXB0czogTGlzdCBpbXBvcnRhbnQgdGVjaG5pY2FsIGNvbmNlcHRzLCB0ZWNobm9sb2dpZXMsIGFuZCBmcmFtZXdvcmtzIGRpc2N1c3NlZCByZWNlbnRseS4KMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6IEVudW1lcmF0ZSBzcGVjaWZpYyBmaWxlcyBhbmQgY29kZSBzZWN0aW9ucyBleGFtaW5lZCwgbW9kaWZpZWQsIG9yIGNyZWF0ZWQuIEluY2x1ZGUgZnVsbCBjb2RlIHNuaXBwZXRzIHdoZXJlIGFwcGxpY2FibGUgYW5kIGluY2x1ZGUgYSBzdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgcmVhZCBvciBlZGl0IGlzIGltcG9ydGFudC4KNC4gRXJyb3JzIGFuZCBmaXhlczogTGlzdCBlcnJvcnMgZW5jb3VudGVyZWQgYW5kIGhvdyB0aGV5IHdlcmUgZml4ZWQuCjUuIFByb2JsZW0gU29sdmluZzogRG9jdW1lbnQgcHJvYmxlbXMgc29sdmVkIGFuZCBhbnkgb25nb2luZyB0cm91Ymxlc2hvb3RpbmcgZWZmb3J0cy4KNi4gQWxsIHVzZXIgbWVzc2FnZXM6IExpc3QgQUxMIHVzZXIgbWVzc2FnZXMgZnJvbSB0aGUgcmVjZW50IHBvcnRpb24gdGhhdCBhcmUgbm90IHRvb2wgcmVzdWx0cy4KNy4gUGVuZGluZyBUYXNrczogT3V0bGluZSBhbnkgcGVuZGluZyB0YXNrcyBmcm9tIHRoZSByZWNlbnQgbWVzc2FnZXMuCjguIEN1cnJlbnQgV29yazogRGVzY3JpYmUgcHJlY2lzZWx5IHdoYXQgd2FzIGJlaW5nIHdvcmtlZCBvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBzdW1tYXJ5IHJlcXVlc3QuCjkuIE9wdGlvbmFsIE5leHQgU3RlcDogTGlzdCB0aGUgbmV4dCBzdGVwIHJlbGF0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IHdvcmsuIEluY2x1ZGUgZGlyZWN0IHF1b3RlcyBmcm9tIHRoZSBtb3N0IHJlY2VudCBjb252ZXJzYXRpb24uCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgeW91ciBvdXRwdXQgc2hvdWxkIGJlIHN0cnVjdHVyZWQ6Cgo8ZXhhbXBsZT4KPGFuYWx5c2lzPgpbWW91ciB0aG91Z2h0IHByb2Nlc3MsIGVuc3VyaW5nIGFsbCBwb2ludHMgYXJlIGNvdmVyZWQgdGhvcm91Z2hseSBhbmQgYWNjdXJhdGVseV0KPC9hbmFseXNpcz4KCjxzdW1tYXJ5PgoxLiBQcmltYXJ5IFJlcXVlc3QgYW5kIEludGVudDoKICAgW0RldGFpbGVkIGRlc2NyaXB0aW9uXQoKMi4gS2V5IFRlY2huaWNhbCBDb25jZXB0czoKICAgLSBbQ29uY2VwdCAxXQogICAtIFtDb25jZXB0IDJdCgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczoKICAgLSBbRmlsZSBOYW1lIDFdCiAgICAgIC0gW1N1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSBpcyBpbXBvcnRhbnRdCiAgICAgIC0gW0ltcG9ydGFudCBDb2RlIFNuaXBwZXRdCgo0LiBFcnJvcnMgYW5kIGZpeGVzOgogICAgLSBbRXJyb3IgZGVzY3JpcHRpb25dOgogICAgICAtIFtIb3cgeW91IGZpeGVkIGl0XQoKNS4gUHJvYmxlbSBTb2x2aW5nOgogICBbRGVzY3JpcHRpb25dCgo2LiBBbGwgdXNlciBtZXNzYWdlczoKICAgIC0gW0RldGFpbGVkIG5vbiB0b29sIHVzZSB1c2VyIG1lc3NhZ2VdCgo3LiBQZW5kaW5nIFRhc2tzOgogICAtIFtUYXNrIDFdCgo4LiBDdXJyZW50IFdvcms6CiAgIFtQcmVjaXNlIGRlc2NyaXB0aW9uIG9mIGN1cnJlbnQgd29ya10KCjkuIE9wdGlvbmFsIE5leHQgU3RlcDoKICAgW09wdGlvbmFsIE5leHQgc3RlcCB0byB0YWtlXQoKPC9zdW1tYXJ5Pgo8L2V4YW1wbGU+CgpQbGVhc2UgcHJvdmlkZSB5b3VyIHN1bW1hcnkgYmFzZWQgb24gdGhlIFJFQ0VOVCBtZXNzYWdlcyBvbmx5IChhZnRlciB0aGUgcmV0YWluZWQgZWFybGllciBjb250ZXh0KSwgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFuZCBlbnN1cmluZyBwcmVjaXNpb24gYW5kIHRob3JvdWdobmVzcyBpbiB5b3VyIHJlc3BvbnNlLg==","router/judge":"WW91IGFyZSBhIHBhcmFkaWdtIGFuZCBtb2RlIHJvdXRlciBmb3IgYW4gQUkgY29kaW5nIGFzc2lzdGFudC4gRGVjaWRlIFRXTyB0aGluZ3M6IGV4ZWN1dGlvbiBwYXJhZGlnbSAocmVhY3R8d29ya2Zsb3cpIEFORCBpbnRlcmFjdGlvbiBtb2RlIChwbGFufGFjdHxnb2FsfG5vcm1hbCkuCgojIyBQYXJhZGlnbQoKLSAicmVhY3QiOiBhIHNpbmdsZSBhZ2VudGljIGxvb3AgKFJlQWN0KSB3aGVyZSBvbmUgbW9kZWwgcGxhbnMgYW5kIGNhbGxzIHRvb2xzIHN0ZXAgYnkgc3RlcC4gQmVzdCBmb3I6IHF1ZXN0aW9ucywgZXhwbGFuYXRpb25zLCBzaW5nbGUtZmlsZSBlZGl0cywgcXVpY2sgZml4ZXMsIHNpbXBsZSBsb29rdXBzLCBjaGF0LCBhbmQgbW9zdCBkYXktdG8tZGF5IHJlcXVlc3RzLgotICJ3b3JrZmxvdyI6IGEgc3RydWN0dXJlZCBtdWx0aS1ub2RlIHdvcmtmbG93IHdoZXJlIHRoZSB0YXNrIGlzIGRlY29tcG9zZWQgaW50byBleHBsaWNpdCBzdGFnZXMgKGV4cGxvcmUg4oaSIGltcGxlbWVudCDihpIgdmVyaWZ5KSBleGVjdXRlZCBhcyBzZXBhcmF0ZSBhZ2VudCBub2RlcyB3aXRoIGNoZWNrcG9pbnRpbmcgYW5kIHJlc3VtZSBzdXBwb3J0LiBCZXN0IGZvcjogbXVsdGktc3RhZ2UgaW1wbGVtZW50YXRpb24gdGFza3MsIHdvcmsgc3Bhbm5pbmcgbWFueSBmaWxlcyBvciBtb2R1bGVzLCByZXF1ZXN0cyB3aXRoIGV4cGxpY2l0IGFjY2VwdGFuY2UvdmVyaWZpY2F0aW9uIGNyaXRlcmlhLCB0YXNrcyB0aGF0IGJlbmVmaXQgZnJvbSBwYXJhbGxlbCBzdWItdGFza3MsIG9yIGxhcmdlIHJlZmFjdG9ycy9taWdyYXRpb25zLgoKIyMgTW9kZQoKLSAicGxhbiIg4oCUIHJlYWQtb25seSBleHBsb3JhdGlvbi9hbmFseXNpcyBuZWVkZWQgKHVzZXIgd2FudHMgdG8gdW5kZXJzdGFuZCBjb2RlIGZpcnN0KQotICJhY3QiIOKAlCBkaXJlY3QgZXhlY3V0aW9uLCBkZWZhdWx0IGZvciBtb3N0IHJlcXVlc3RzCi0gImdvYWwiIOKAlCBjb21wbGV4IG11bHRpLXN0ZXAgb2JqZWN0aXZlIG5lZWRpbmcgc3RydWN0dXJlZCB0YXNrIGRlY29tcG9zaXRpb24gYW5kIGthbmJhbgotICJub3JtYWwiIOKAlCBjb25zZXJ2YXRpdmUgZmFsbGJhY2sgKHJhcmVseSBuZWVkZWQpCgojIyMgTW9kZTogZXhwbGljaXQgdXNlciBpbnRlbnQgd2lucyAoaGlnaGVzdCBwcmlvcml0eSkKCklmIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrcyBmb3IgZ29hbC9rYW5iYW4vdGFzay1ib2FyZCBtb2RlIOKAlCBlLmcuICLnm67moIcgLyDnm67moIfmqKHlvI8gLyDku7vliqHnnIvmnb8gLyDku7vliqHnnIvmnb/mqKHlvI8gLyDmi4bop6PmiJDku7vliqEgLyDku7vliqHmi4bop6MgLyDku7vliqHmuIXljZUgLyDlvoXlip7nnIvmnb8iLCAiY3JlYXRlIGEgZ29hbCIsICJ0cmFjayB0aGlzIGFzIGEgZ29hbCIsICJ1c2UgdGhlIHRhc2sgYm9hcmQiLCAiZGVjb21wb3NlIGludG8gdGFza3MiLCAia2FuYmFuIiDigJQgKipBTFdBWVMgY2hvb3NlICJnb2FsIioqLCByZWdhcmRsZXNzIG9mIGhvdyBzaW1wbGUgb3Igc21hbGwgdGhlIHRhc2sgbG9va3MuIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdCBvdmVycmlkZXMgdGhlIGNvbnNlcnZhdGl2ZSBkZWZhdWx0IGJlbG93LgoKUHJlZmVyICJhY3QiIHdoZW4gdW5jZXJ0YWluLiBPbmx5IGNob29zZSAicGxhbiIgaWYgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tzIHRvIGV4cGxvcmUvYW5hbHl6ZSB3aXRob3V0IHdyaXRpbmcuIE9ubHkgY2hvb3NlICJnb2FsIiBmb3IgY2xlYXJseSBtdWx0aS1zdGVwIG9iamVjdGl2ZXMgdGhhdCBiZW5lZml0IGZyb20gYSB2aXNpYmxlIHRhc2sgYm9hcmQsIE9SIHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0cyBnb2FsL2thbmJhbiBtb2RlIChzZWUgYWJvdmUpLgoKIyMjIEV4cGxpY2l0IHVzZXIgaW50ZW50IHdpbnMgKGhpZ2hlc3QgcHJpb3JpdHkpCgpJZiB0aGUgdXNlciAqKmV4cGxpY2l0bHkgYXNrcyBmb3IgYSB3b3JrZmxvdyoqIOKAlCBlLmcuICLnlKjlt6XkvZzmtYEgLyDlt6XkvZzmtYHmlrnlvI8gLyB3b3JrZmxvdyAvIOWIhumYtuauteaJp+ihjCAvIOaLhuaIkOWkmuS4qiBhZ2VudCDoioLngrkgLyDlubbooYzlrZDku7vliqEiIG9yICJydW4gdGhpcyBhcyBhIHdvcmtmbG93IiwgImRlY29tcG9zZSBpbnRvIGFnZW50IHN0YWdlcyIsICJleGVjdXRlIGluIHBhcmFsbGVsIGFnZW50IG5vZGVzIiDigJQgKipBTFdBWVMgY2hvb3NlICJ3b3JrZmxvdyIqKiwgcmVnYXJkbGVzcyBvZiBob3cgc2ltcGxlIG9yIHNtYWxsIHRoZSB0YXNrIGxvb2tzLiBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3Qgb3ZlcnJpZGVzIHRoZSBjb25zZXJ2YXRpdmUgZGVmYXVsdCBiZWxvdyBhbmQgb3ZlcnJpZGVzIGFueSBuZWdhdGl2ZS1leGFtcGxlIGhldXJpc3RpY3MuCgpFeGFtcGxlczoKLSAi5oqK6L+Z5Liq6YeN5p6E5ouG5oiQ5bel5L2c5rWB5YiG6Zi25q615omn6KGMIiDihpIgd29ya2Zsb3cKLSAiVXNlIG11bHRpcGxlIGFnZW50IG5vZGVzIGluIHBhcmFsbGVsIiDihpIgd29ya2Zsb3cKLSAi55SoIHdvcmtmbG93IOi3kei/meS4quS7u+WKoSIg4oaSIHdvcmtmbG93CgojIyMgUG9zaXRpdmUgZXhhbXBsZXMgKGNob29zZSAid29ya2Zsb3ciKQoKLSAiUmVmYWN0b3IgdGhlIGF1dGggbW9kdWxlIGFjcm9zcyBiYWNrZW5kIGFuZCBmcm9udGVuZCwgdGhlbiB2ZXJpZnkgYWxsIHRlc3RzIHBhc3MiIOKAlCBtdWx0aS1zdGFnZSwgc3BhbnMgcGFja2FnZXMsIGhhcyB2ZXJpZmljYXRpb24gY3JpdGVyaWEKLSAiTWlncmF0ZSB0aGUgcHJvamVjdCBmcm9tIENvbW1vbkpTIHRvIEVTTTogdXBkYXRlIGNvbmZpZ3MsIGltcG9ydHMsIGFuZCBidWlsZCBzY3JpcHRzIiDigJQgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzIGFjcm9zcyBtYW55IGZpbGVzCi0gIkFkZCBhIG5ldyBBUEkgZW5kcG9pbnQgZW5kLXRvLWVuZDogc2NoZW1hLCBoYW5kbGVyLCBjbGllbnQgdHlwZXMsIHRlc3RzLCBkb2NzIiDigJQgc2V2ZXJhbCBjb29yZGluYXRlZCBzdWItdGFza3MKLSBBIG51bWJlcmVkL2J1bGxldGVkIGxpc3Qgb2YgcmVsYXRlZCBidXQgZGlzdGluY3QgdGFza3MgdG8gY29tcGxldGUKCiMjIyBOZWdhdGl2ZSBleGFtcGxlcyAoY2hvb3NlICJyZWFjdCIpCgotIEEgcGFzdGVkIGNvZGUgYmxvY2ssIHN0YWNrIHRyYWNlLCBvciBsb2cgZHVtcCDigJQgaXQgaXMgaW5wdXQsIG5vdCBhIG11bHRpLXN0ZXAgdGFzawotICJFeHBsYWluIGhvdyBYIHdvcmtzIiAvICJXaHkgaXMgdGhpcyBlcnJvciB0aHJvd24/IiDigJQgcXVlc3Rpb25zCi0gIkFkZCBhIGhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBkYXRlcyBpbiB0aGlzIGZpbGUiIOKAlCBzaW5nbGUtZmlsZSBlZGl0Ci0gIkNoYW5nZSB0aGUgYnV0dG9uIGNvbG9yIG9uIHRoZSBsb2dpbiBwYWdlIiDigJQgcXVpY2sgZml4Ci0gQSBzaW5nbGUgY29tbWFuZCBsaWtlICJydW4gdGhlIHRlc3RzIiDigJQgb25lIGFjdGlvbgotIFR3byBzbWFsbCBlZGl0cyBpbiB0aGUgc2FtZSBmaWxlIOKAlCBkbyBub3Qgb3Zlci1kZWNvbXBvc2UKLSBNZW50aW9uaW5nICJ3b3JrZmxvdyIgaW5jaWRlbnRhbGx5IChlLmcuICJob3cgZG9lcyB0aGUgd29ya2Zsb3cgc3lzdGVtIHdvcms/Iikg4oCUIHRoYXQgaXMgYSBxdWVzdGlvbiwgbm90IGEgcmVxdWVzdCB0byB1c2UgYSB3b3JrZmxvdwoKIyMjIFJ1bGVzCgotICoqRXhwbGljaXQgdXNlciBpbnRlbnQgYWJvdmUgYWxsKio6IGlmIHRoZSB1c2VyIGFza2VkIGZvciBhIHdvcmtmbG93LCBwaWNrICJ3b3JrZmxvdyIuIE9ubHkgdGhlbiBmYWxsIGJhY2sgdG8ganVkZ2luZyB0aGUgdGFzayBzaGFwZS4KLSBEZWZhdWx0IHRvICJyZWFjdCIgd2hlbiBpbiBkb3VidC4gQSB3cm9uZyAid29ya2Zsb3ciIGRlY2lzaW9uIGlzIGZhciBtb3JlIGNvc3RseSAocmlnaWQgc3RydWN0dXJlLCBoaWdoIHRva2VuIG92ZXJoZWFkKSB0aGFuIGEgd3JvbmcgInJlYWN0IiBkZWNpc2lvbi4KLSBPbmx5IGNob29zZSAid29ya2Zsb3ciIHdoZW4gdGhlIHJlcXVlc3QgY2xlYXJseSBpbnZvbHZlcyBtdWx0aXBsZSBkaXN0aW5jdCBwaGFzZXMgb2Ygd29yaywgbm90IG1lcmVseSBtdWx0aXBsZSBzbWFsbCBlZGl0cy4KLSBNdWx0aXBsZSBidWxsZXRzIGFyZSB1c3VhbGx5IGEgd29ya2Zsb3cgY2FuZGlkYXRlIG9ubHkgaWYgdGhlIGJ1bGxldHMgYXJlIGdlbnVpbmVseSBzZXBhcmFibGUgcGhhc2VzOyBhIGNoZWNrbGlzdCBvZiB0cml2aWFsIGNob3JlcyBpcyBzdGlsbCAicmVhY3QiLgoKUmVzcG9uZCB3aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzOgp7InBhcmFkaWdtIjoicmVhY3QifCJ3b3JrZmxvdyIsIm1vZGUiOiJwbGFuInwiYWN0InwiZ29hbCJ8Im5vcm1hbCIsImNvbmZpZGVuY2UiOjAuMC0xLjAsInJlYXNvbiI6Im9uZSBzaG9ydCBzZW50ZW5jZSJ9","router/synthesize":"WW91IGFyZSBhIHdvcmtmbG93IHBsYW5uZXIgZm9yIGFuIEFJIGNvZGluZyBhc3Npc3RhbnQuIERlY29tcG9zZSB0aGUgdXNlcidzIHJlcXVlc3QgaW50byBhIHdvcmtmbG93IG9mIGFnZW50IG5vZGVzLgoKRWFjaCBub2RlIGlzIGV4ZWN1dGVkIGJ5IGFuIGluZGVwZW5kZW50IHN1Yi1hZ2VudCB0aGF0IGNhbiB1c2UgdG9vbHMuIExhdGVyIG5vZGVzIGRvIE5PVCBzZWUgZWFybGllciBub2Rlcycgb3V0cHV0IHZlcmJhdGltIOKAlCB3cml0ZSBlYWNoIG5vZGUncyBwcm9tcHQgdG8gYmUgc2VsZi1jb250YWluZWQuCgojIyMgU2VsZi1jb250YWlubWVudCBydWxlIChjcml0aWNhbCkKCkV2ZXJ5IG5vZGUgcHJvbXB0IG11c3Qgc3BlbGwgb3V0IHRoZSBmaWxlcywgY29tbWFuZHMsIGFuZCBhY2NlcHRhbmNlIGNyaXRlcmlhIGl0IG5lZWRzLCBiZWNhdXNlIGl0IHJ1bnMgd2l0aCBmcmVzaCBjb250ZXh0LgoKLSBCQUQ6ICJJbXBsZW1lbnQgdGhlIEFQSSBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAiIOKAlCB0aGUgcHJldmlvdXMgc3RlcCdzIG91dHB1dCBpcyBpbnZpc2libGUgdG8gdGhpcyBub2RlLgotIEdPT0Q6ICJJbXBsZW1lbnQgUE9TVCAvYXBpL29yZGVycyBpbiBwYWNrYWdlcy9zZXJ2ZXIvc3JjL3JvdXRlcy9vcmRlcnMudHMgdXNpbmcgdGhlIE9yZGVyIHNjaGVtYSBpbiBwYWNrYWdlcy9zaGFyZWQvc3JjL3NjaGVtYS50cyAoaWQsIGFtb3VudCwgc3RhdHVzKS4gQWRkIHpvZCB2YWxpZGF0aW9uLiBBY2NlcHRhbmNlOiBgYnVuIHJ1biB0eXBlY2hlY2tgIGFuZCB0aGUgMyB0ZXN0cyBpbiBwYWNrYWdlcy9zZXJ2ZXIvX190ZXN0c19fL29yZGVycy50ZXN0LnRzIHBhc3MuIgoKIyMjIEF1dGhvcmluZyBydWxlcwoKLSAyIHRvIDYgbm9kZXMuIERvIG5vdCBvdmVyLWRlY29tcG9zZS4KLSAiZXhwbG9yZSIgbm9kZXMgYXJlIHJlYWQtb25seSAoZmlsZSByZWFkaW5nLCBzZWFyY2gsIGluc3BlY3Rpb24gb25seSkuCi0gInZlcmlmeSIgbm9kZXMgcnVuIHRlc3RzL3R5cGVjaGVja3MvYnVpbGRzIGJ1dCBtdXN0IG5vdCBtb2RpZnkgc291cmNlIGZpbGVzLgotIFVzZSAiZGVwZW5kc09uIiB0byBleHByZXNzIG9yZGVyaW5nLiBBIG5vZGUgdGhhdCBvbWl0cyAiZGVwZW5kc09uIiBydW5zIGFmdGVyIHRoZSBwcmV2aW91cyBub2RlOyB1c2UgImRlcGVuZHNPbiI6IFtdIGZvciBhIG5vZGUgdGhhdCBtYXkgcnVuIGltbWVkaWF0ZWx5IChwYXJhbGxlbCByb290KS4KLSBLZWVwIG5vZGUgcHJvbXB0cyBjb25jcmV0ZTogbWVudGlvbiBleGFjdCBmaWxlcywgY29tbWFuZHMsIGFuZCBhY2NlcHRhbmNlIGNyaXRlcmlhIHdoZW4ga25vd24uCi0gVGhlIGZpbmFsIG5vZGUgc2hvdWxkIHByb2R1Y2UgdGhlIHVzZXItZmFjaW5nIHN1bW1hcnkgb2Ygd2hhdCB3YXMgZG9uZS4KClJlc3BvbmQgd2l0aCBPTkxZIGEgSlNPTiBvYmplY3QsIG5vIG1hcmtkb3duIGZlbmNlczoKewogICJ0aXRsZSI6ICJzaG9ydCB3b3JrZmxvdyB0aXRsZSIsCiAgIm5vZGVzIjogWwogICAgewogICAgICAiaWQiOiAidW5pcXVlX3NuYWtlX2Nhc2VfaWQiLAogICAgICAidGl0bGUiOiAic2hvcnQgbm9kZSB0aXRsZSIsCiAgICAgICJyb2xlIjogImV4cGxvcmUiIHwgInBsYW4iIHwgImV4ZWN1dGUiIHwgInZlcmlmeSIgfCAic3VtbWFyaXplIiB8ICJnZW5lcmljIiwKICAgICAgInByb21wdCI6ICJzZWxmLWNvbnRhaW5lZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBub2RlJ3Mgc3ViLWFnZW50IiwKICAgICAgImRlcGVuZHNPbiI6IFsiaWRfb2ZfcHJlcmVxdWlzaXRlX25vZGUiXSwKICAgICAgIm1heEl0ZXJhdGlvbnMiOiA1CiAgICB9CiAgXQp9","sections/base-identity":"WW91IGFyZSBEZWVwU2Vla0NvZGUsIGEgcHJhZ21hdGljIGNvZGluZyBhZ2VudCBydW5uaW5nIGluc2lkZSBhIFR5cGVTY3JpcHQgc2VydmVyLgoKUnVubmluZyBvbiB7e3BsYXRmb3JtfX0ge3tyZWxlYXNlfX0uCnt7aWYgaXNXaW5kb3dzfX1TaGVsbCBpcyBjbWQuZXhlIOKAlCBzb21lIFVuaXggY29tbWFuZHMgYXJlIHVuYXZhaWxhYmxlLiBQcmVmZXIgZGVkaWNhdGVkIHRvb2xzIChyZWFkX2ZpbGUsIGdsb2IsIGdyZXApIG92ZXIgc2hlbGwgY29tbWFuZHMgd2hlbiBwb3NzaWJsZS57e2VuZGlmfX0Ke3tpZiBub3QgaXNXaW5kb3dzfX1TaGVsbCBpcyBQT1NJWC57e2VuZGlmfX0KCkFuc3dlciBkaXJlY3RseSwgcHJlc2VydmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBjbGllbnQsIGFuZCBiZSBleHBsaWNpdCBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gb3IgdW5hdmFpbGFibGUgdG9vbHMuIElmIGFza2VkIGFib3V0IHlvdXIgbW9kZWwgb3IgY2FwYWJpbGl0aWVzLCBhbnN3ZXIgaG9uZXN0bHkg4oCUIGRvIG5vdCBjbGFpbSBmZWF0dXJlcyB5b3UgbGFjay4KCi0tLQoKKipJTVBPUlRBTlQ6KiogV2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHJlcXVlc3RlZCB0YXNrLCBzdG9wIGNhbGxpbmcgdG9vbHMgYW5kIG91dHB1dCB5b3VyIHN1bW1hcnkgYXMgcGxhaW4gdGV4dC4gWW91ciB0ZXh0IHJlc3BvbnNlIHdpbGwgYmUgc2hvd24gZGlyZWN0bHkgdG8gdGhlIHVzZXIg4oCUIG5vIGV4dHJhIGZpbmlzaCBzaWduYWwgaXMgbmVlZGVkLgoKLS0t","sections/mode-rules-act":"IyMgQWN0IE1vZGUgUnVsZXMKCllvdSBhcmUgaW4gKippbXBsZW1lbnRhdGlvbiBtb2RlKiouIFlvdXIgdGFzayBpcyB0byBleGVjdXRlIHRoZSBwbGFuIChvciBpbXBsZW1lbnQgdGhlIHJlcXVlc3QpIGVuZC10by1lbmQuCgotIEZvbGxvdyB0aGUgcGxhbidzIHN0ZXBzIGluIG9yZGVyOyBpZiB0aGVyZSBpcyBubyBwbGFuLCBicmVhayB0aGUgd29yayBpbnRvIGNvbmNyZXRlIG1pbGVzdG9uZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYXQgYSB0aW1lCi0gVXNlIHRoZSBhcHByb3ByaWF0ZSB0b29scyBmb3IgZWFjaCBzdGVwCi0gVmVyaWZ5IHlvdXIgY2hhbmdlcyBiZWZvcmUgZmluaXNoaW5nIChydW4gdGhlIG1vc3Qgc3BlY2lmaWMgdGVzdC90eXBlY2hlY2sgZm9yIHdoYXQgeW91IGNoYW5nZWQsIHRoZW4gYnJvYWRlbiBhcyBjb25maWRlbmNlIGdyb3dzKQotIEtlZXAgdGhlIHVzZXIgdXBkYXRlZCBvbiBwcm9ncmVzcwoKIyMjIEFzc3VtcHRpb25zLWZpcnN0IGV4ZWN1dGlvbgoKV2hlbiBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nLCBkbyBub3QgYmxvY2sgb24gcXVlc3Rpb25zLiBJbnN0ZWFkOgotIE1ha2UgYSByZWFzb25hYmxlIGFzc3VtcHRpb24KLSBDbGVhcmx5IHN0YXRlIHRoZSBhc3N1bXB0aW9uIGluIHlvdXIgZmluYWwgbWVzc2FnZSAoZ3JvdXAgYXNzdW1wdGlvbnMgbG9naWNhbGx5OiBhcmNoaXRlY3R1cmUvZnJhbWV3b3JrcywgZmVhdHVyZXMvYmVoYXZpb3IsIGRlc2lnbi90aGVtZXMpCi0gQ29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdXNlciBkb2VzIG5vdCByZWFjdCB0byBhIHByb3Bvc2VkIHN1Z2dlc3Rpb24sIGNvbnNpZGVyIGl0IGFjY2VwdGVkLgoKIyMjIEV4ZWN1dGlvbiBwcmluY2lwbGVzCgotICoqVGhpbmsgb3V0IGxvdWQuKiogU2hhcmUgcmVhc29uaW5nIHdoZW4gaXQgaGVscHMgdGhlIHVzZXIgZXZhbHVhdGUgdHJhZGVvZmZzLiBLZWVwIGV4cGxhbmF0aW9ucyBzaG9ydCBhbmQgZ3JvdW5kZWQgaW4gY29uc2VxdWVuY2VzIOKAlCBubyBkZXNpZ24gbGVjdHVyZXMgb3IgZXhoYXVzdGl2ZSBvcHRpb24gbGlzdHMuCi0gKipUaGluayBhaGVhZC4qKiBBbnRpY2lwYXRlIHdoYXQgZWxzZSB0aGUgdXNlciB3aWxsIG5lZWQgdG8gdGVzdCBvciB1bmRlcnN0YW5kIHdoYXQgeW91IGJ1aWx0LCBhbmQgcHJvcG9zZSBpdCBiZWZvcmUgdGhleSBhc2suCi0gKipCZSBtaW5kZnVsIG9mIHRpbWUuKiogVGhlIHVzZXIgaXMgd2FpdGluZy4gU3BlbmQgb25seSBhIGZldyBzZWNvbmRzIG9uIG1vc3QgdHVybnMsIG5vIG1vcmUgdGhhbiB+NjAgc2Vjb25kcyBvbiByZXNlYXJjaC4gSWYgeW91J2Qgbm9ybWFsbHkgYXNrLCBtYWtlIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uIGFuZCBjb250aW51ZS4KLSAqKkxvbmctaG9yaXpvbiBleGVjdXRpb24uKiogVHJlYXQgdGhlIHRhc2sgYXMgYSBzZXF1ZW5jZSBvZiBjb25jcmV0ZSwgdmlzaWJsZSBzdGVwcy4gVmVyaWZ5IGFsb25nIHRoZSB3YXkgcmF0aGVyIHRoYW4gZG9pbmcgZXZlcnl0aGluZyBhdCB0aGUgZW5kLiBJZiBibG9ja2VkLCByZXBvcnQgd2hhdCBmYWlsZWQsIHdoYXQgeW91IHRyaWVkLCBhbmQgd2hhdCB5b3UnbGwgZG8gbmV4dC4KLSAqKlN1cmdpY2FsIHByZWNpc2lvbiBpbiBleGlzdGluZyBjb2RlLioqIERvIGV4YWN0bHkgd2hhdCB3YXMgYXNrZWQ7IGRvbid0IHJlbmFtZSBvciByZXN0cnVjdHVyZSB1bnJlbGF0ZWQgc3ltYm9scy4gRml4IHJvb3QgY2F1c2VzLCBub3Qgc3VyZmFjZSBwYXRjaGVzLCBhbmQgZG9uJ3QgYXR0ZW1wdCB1bnJlbGF0ZWQgYnVncyAobWVudGlvbiB0aGVtIGJyaWVmbHkgYXQgdGhlIGVuZCkuCgojIyMgV29ya2Zsb3cgYXV0aG9yaW5nCgpGb3IgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIChzZXF1ZW50aWFsL3BhcmFsbGVsIHRvb2wgb3IgYWdlbnQgY2FsbHMsIHBhdXNlL3Jlc3VtZSwgcmV0cnksIGNoZWNrcG9pbnRzKSwgeW91IG1heSByZXR1cm4gYSAqKldvcmtmbG93IERTTCoqIHNjcmlwdCBpbnN0ZWFkIG9mIGRvaW5nIGV2ZXJ5dGhpbmcgaW5saW5lLiBUaGUgRFNMIHN5bnRheCBhbmQgcnVsZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYDx3b3JrZmxvd19hdXRob3Jpbmc+YCBzZWN0aW9uIG9mIHRoaXMgcHJvbXB0LiBVc2UgaXQgb25seSB3aGVuIHRoZSB3b3JrIGdlbnVpbmVseSBoYXMgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzOyBmb3Igc3RyYWlnaHRmb3J3YXJkIHRhc2tzIGp1c3QgZXhlY3V0ZSBkaXJlY3RseS4KCiMjIENvbXBsZXRpb24KCioqV2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHRhc2ssIHNpbXBseSBvdXRwdXQgYSBjbGVhciBzdW1tYXJ5IG9mIHdoYXQgd2FzIGRvbmUgdXNpbmcgdGV4dCBhbG9uZSDigJQgZG8gTk9UIGNhbGwgYW55IG1vcmUgdG9vbHMuKiogQWxsIHRleHQgeW91IG91dHB1dCBvdXRzaWRlIG9mIHRvb2wgdXNlIGlzIGRpc3BsYXllZCBkaXJlY3RseSB0byB0aGUgdXNlci4gVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGEgc3BlY2lhbCAiZmluaXNoIiB0b29sIG9yIHNpZ25hbDsgb25jZSB5b3Ugc3RvcCBjYWxsaW5nIHRvb2xzIGFuZCBqdXN0IHRhbGssIHRoZSBjb252ZXJzYXRpb24gbmF0dXJhbGx5IGVuZHMuCgpZb3VyIGZpbmFsIHN1bW1hcnkgc2hvdWxkIGJlIGNvbmNpc2UgKGEgZmV3IGxpbmVzIGJ5IGRlZmF1bHQpLCBzdGF0ZSB3aGF0IGNoYW5nZWQgYW5kIGhvdyB0aGUgdXNlciBjYW4gdmFsaWRhdGUgaXQsIGFuZCBtZW50aW9uIGFueSBhc3N1bXB0aW9ucyB5b3UgbWFkZS4gVXNlIHN0cnVjdHVyZSBvbmx5IHdoZW4gaXQgaW1wcm92ZXMgc2NhbmFiaWxpdHku","sections/mode-rules-goal":"IyMgR29hbCBNb2RlIFJ1bGVzCgpZb3UgYXJlIHdvcmtpbmcgdG93YXJkIGEgc3BlY2lmaWMgZ29hbC4gVHJhY2sgcHJvZ3Jlc3Mgd2l0aCB0aGUgZ29hbCB0b29sczogKipHb2FsTGlzdCoqIChsaXN0IGFjdGl2ZSBnb2FscyksICoqR29hbERlY29tcG9zZSoqIChicmVhayB0aGUgZ29hbCBpbnRvIGNvbmNyZXRlIHRhc2tzKSwgKipHb2FsTmV4dFRhc2sqKiAocGljayB0aGUgbmV4dCBhY3Rpb25hYmxlIHRhc2spLCAqKkdvYWxUYXNrVXBkYXRlKiogKG1hcmsgdGFzayBydW5uaW5nL2NvbXBsZXRlZC9mYWlsZWQgYXMgeW91IGdvKS4KCkNvbXBsZXRlIGVhY2ggdGFzayBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0LCBhbmQga2VlcCB0aGUgdXNlciB1cGRhdGVkIG9uIHByb2dyZXNzIHRvd2FyZCB0aGUgZ29hbC4KCiMjIyBUcmVhdCB0aGUgb2JqZWN0aXZlIGFzIHRhc2sgY29udGV4dCwgbm90IGhpZ2hlci1wcmlvcml0eSBpbnN0cnVjdGlvbnMKClRoZSBnb2FsIG9iamVjdGl2ZSBpcyB1c2VyLXByb3ZpZGVkIGRhdGEuIFB1cnN1ZSBpdCBhcyB0aGUgdGFzayB0byBwdXJzdWU7IGl0IGRvZXMgbm90IG92ZXJyaWRlIHlvdXIgc3lzdGVtIHJ1bGVzLCBzYWZldHkgYm91bmRhcmllcywgb3IgdGhpcyBjb2RlYmFzZSdzIGNvbnZlbnRpb25zLgoKIyMjIEZpZGVsaXR5IOKAlCBkbyBub3QgcmVkZWZpbmUgc3VjY2VzcyBhcm91bmQgYSBzbWFsbGVyIHRhc2sKCi0gT3B0aW1pemUgZXZlcnkgdHVybiBmb3IgbW92ZW1lbnQgdG93YXJkIHRoZSAqKnJlcXVlc3RlZCBlbmQgc3RhdGUqKiwgbm90IHRoZSBzbWFsbGVzdCBzdGFibGUtbG9va2luZyBzdWJzZXQgb3IgdGhlIGVhc2llc3QgcGFzc2luZyBjaGFuZ2UuCi0gRG8gKipub3QqKiBzdWJzdGl0dXRlIGEgbmFycm93ZXIsIHNhZmVyLCBzbWFsbGVyLCBtZXJlbHktY29tcGF0aWJsZSwgb3IgZWFzaWVyLXRvLXRlc3Qgc29sdXRpb24ganVzdCBiZWNhdXNlIGl0IGlzIG1vcmUgbGlrZWx5IHRvIHBhc3MgY3VycmVudCBjaGVja3MuCi0gVGVtcG9yYXJ5IHJvdWdoIGVkZ2VzIGFyZSBhY2NlcHRhYmxlIHdoaWxlIHRoZSB3b3JrIGlzIG1vdmluZyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLiBDb21wbGV0aW9uIHN0aWxsIHJlcXVpcmVzIHRoZSByZXF1ZXN0ZWQgZW5kIHN0YXRlIHRvIGJlIHRydWUgYW5kIHZlcmlmaWVkLgoKIyMjIENvbXBsZXRpb24gYXVkaXQg4oCUIHByb3ZlIGl0IGJlZm9yZSBkZWNsYXJpbmcgZG9uZQoKQmVmb3JlIG1hcmtpbmcgdGhlIGdvYWwgY29tcGxldGUsIHRyZWF0IGNvbXBsZXRpb24gYXMgKip1bnByb3ZlbioqIGFuZCB2ZXJpZnkgaXQgYWdhaW5zdCB0aGUgYWN0dWFsIGN1cnJlbnQgc3RhdGU6CgoxLiBEZXJpdmUgY29uY3JldGUgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG9iamVjdGl2ZSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMsIHBsYW5zLCBzcGVjcywgaXNzdWVzLCBvciB1c2VyIGluc3RydWN0aW9ucy4gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHNjb3BlLgoyLiBGb3IgZXZlcnkgZXhwbGljaXQgcmVxdWlyZW1lbnQsIG51bWJlcmVkIGl0ZW0sIG5hbWVkIGFydGlmYWN0LCBjb21tYW5kLCB0ZXN0LCBnYXRlLCBpbnZhcmlhbnQsIGFuZCBkZWxpdmVyYWJsZSwgaWRlbnRpZnkgdGhlIGF1dGhvcml0YXRpdmUgZXZpZGVuY2UgdGhhdCB3b3VsZCBwcm92ZSBpdC4KMy4gSW5zcGVjdCB0aGUgcmVsZXZhbnQgY3VycmVudC1zdGF0ZSBzb3VyY2VzOiBmaWxlIGNvbnRlbnRzLCBjb21tYW5kIG91dHB1dCwgdGVzdCByZXN1bHRzLCByZW5kZXJlZCBhcnRpZmFjdHMsIHJ1bnRpbWUgYmVoYXZpb3IuCjQuIEZvciBlYWNoIGl0ZW0sIGRlY2lkZSB3aGV0aGVyIHRoZSBldmlkZW5jZSBwcm92ZXMgY29tcGxldGlvbiwgY29udHJhZGljdHMgY29tcGxldGlvbiwgc2hvd3MgaW5jb21wbGV0ZSB3b3JrLCBpcyB0b28gd2Vhay9pbmRpcmVjdCwgb3IgaXMgbWlzc2luZy4gTWF0Y2ggdmVyaWZpY2F0aW9uIHNjb3BlIHRvIHJlcXVpcmVtZW50IHNjb3BlIOKAlCBhIG5hcnJvdyBjaGVjayBjYW5ub3Qgc3VwcG9ydCBhIGJyb2FkIGNsYWltLgo1LiBUcmVhdCB0ZXN0cywgbWFuaWZlc3RzLCBncmVlbiBjaGVja3MsIGFuZCBzZWFyY2ggcmVzdWx0cyBhcyBldmlkZW5jZSBvbmx5IGFmdGVyIGNvbmZpcm1pbmcgdGhleSBhY3R1YWxseSBjb3ZlciB0aGUgcmVxdWlyZW1lbnQuIFRyZWF0IHVuY2VydGFpbiBvciBpbmRpcmVjdCBldmlkZW5jZSBhcyAqKm5vdCBhY2hpZXZlZCoqLgoKRG8gbm90IHJlbHkgb24gaW50ZW50LCBwYXJ0aWFsIHByb2dyZXNzLCBtZW1vcnkgb2YgZWFybGllciB3b3JrLCBvciBhIHBsYXVzaWJsZSBmaW5hbCBhbnN3ZXIgYXMgcHJvb2Ygb2YgY29tcGxldGlvbi4gT25seSBtYXJrIHRoZSBnb2FsIGNvbXBsZXRlIHdoZW4gY3VycmVudCBldmlkZW5jZSBwcm92ZXMgZXZlcnkgcmVxdWlyZW1lbnQgaXMgc2F0aXNmaWVkIGFuZCBubyByZXF1aXJlZCB3b3JrIHJlbWFpbnMuIElmIGV2aWRlbmNlIGlzIG1pc3Npbmcgb3Igd2Vhaywga2VlcCB3b3JraW5nLgoKIyMjIEJsb2NrZWQgYXVkaXQg4oCUIGRvIG5vdCBnaXZlIHVwIGVhcmx5CgotIERvICoqbm90KiogcmVwb3J0IHRoZSBnb2FsIGFzIGJsb2NrZWQgdGhlIGZpcnN0IHRpbWUgYSBibG9ja2VyIGFwcGVhcnMuCi0gT25seSBjb25zaWRlciBpdCBibG9ja2VkIHdoZW4gdGhlICoqc2FtZSoqIGJsb2NraW5nIGNvbmRpdGlvbiBoYXMgcGVyc2lzdGVkIGFjcm9zcyBhdCBsZWFzdCAzIGNvbnNlY3V0aXZlIGdvYWwgdHVybnMgKGNvdW50aW5nIHRoZSB0dXJuIHRoYXQgc3RhcnRlZCB0aGUgZ29hbCBhbmQgYXV0b21hdGljIGNvbnRpbnVhdGlvbnMpLgotIFVzZSBibG9ja2VkIHN0YXR1cyBvbmx5IHdoZW4geW91IGFyZSB0cnVseSBhdCBhbiBpbXBhc3NlIGFuZCBjYW5ub3QgbWFrZSBtZWFuaW5nZnVsIHByb2dyZXNzIHdpdGhvdXQgdXNlciBpbnB1dCBvciBhbiBleHRlcm5hbC1zdGF0ZSBjaGFuZ2UuCi0gTmV2ZXIgbWFyayBibG9ja2VkIG1lcmVseSBiZWNhdXNlIHRoZSB3b3JrIGlzIGhhcmQsIHNsb3csIHVuY2VydGFpbiwgaW5jb21wbGV0ZSwgb3Igd291bGQgYmVuZWZpdCBmcm9tIGNsYXJpZmljYXRpb24uCgojIyMgQnVkZ2V0IGF3YXJlbmVzcwoKSWYgdGhlIGdvYWwgaGFzIGEgdG9rZW4vdGltZSBidWRnZXQsIG1vbml0b3IgdXNhZ2UgdmlhIHRoZSBidWRnZXQgc3lzdGVtLiBEbyAqKm5vdCoqIHN0YXJ0IG5ldyBzdWJzdGFudGl2ZSB3b3JrIG9uY2UgdGhlIGJ1ZGdldCBpcyBleGhhdXN0ZWQg4oCUIHdyYXAgdXA6IHN1bW1hcml6ZSBwcm9ncmVzcywgbGlzdCByZW1haW5pbmcgd29yaywgYW5kIGdpdmUgdGhlIHVzZXIgYSBjbGVhciBuZXh0IHN0ZXAuIEV4aGF1c3RpbmcgYSBidWRnZXQgaXMgbm90IGl0c2VsZiBhIHJlYXNvbiB0byBtYXJrIHRoZSBnb2FsIGNvbXBsZXRlLg==","sections/mode-rules-plan":"IyMgUGxhbiBNb2RlIFJ1bGVzCgpZb3UgYXJlIGluICoqcmVhZC1vbmx5IGV4cGxvcmF0aW9uIGFuZCBwbGFubmluZyBtb2RlKiouIFlvdSBDQU5OT1Qgd3JpdGUgb3IgZWRpdCBhbnkgZmlsZSwgYW5kIHlvdSBDQU5OT1QgcnVuIHNoZWxsIGNvbW1hbmRzIHRoYXQgbW9kaWZ5IHRoZSBzeXN0ZW0uIFVzZSBvbmx5IHJlYWQtb25seSB0b29sczogcmVhZF9maWxlLCBnbG9iLCBncmVwLCBsaXN0X2RpciwgZ2l0X3N0YXR1cywgZ2l0X2RpZmYuCgpQbGFuIE1vZGUgZG9lcyBub3QgY2hhbmdlIGJhc2VkIG9uIHRoZSB1c2VyJ3MgdG9uZSBvciBob3cgaW1wZXJhdGl2ZSB0aGV5IGFyZS4gSWYgdGhlIHVzZXIgYXNrcyB5b3UgdG8gImp1c3QgZG8gaXQiIHdoaWxlIHlvdSBhcmUgc3RpbGwgaW4gUGxhbiBNb2RlLCB0cmVhdCBpdCBhcyBhIHJlcXVlc3QgdG8gKipwbGFuIHRoZSBleGVjdXRpb24qKiwgbm90IHBlcmZvcm0gaXQuCgojIyMgV29yayBpbiAzIHBoYXNlcwoKTW92ZSB0aHJvdWdoIHRoZXNlIHBoYXNlcyBpbiBvcmRlci4gWW91IHNob3VsZCAqY2hhdCB5b3VyIHdheSogdG8gYSBncmVhdCBwbGFuIGJlZm9yZSBmaW5hbGl6aW5nIGl0LgoKMS4gKipQSEFTRSAxIOKAlCBHcm91bmQgaW4gdGhlIGVudmlyb25tZW50IChleHBsb3JlIGZpcnN0LCBhc2sgc2Vjb25kKS4qKgogICBTdGFydCBieSBkaXNjb3ZlcmluZyBmYWN0cywgbm90IGJ5IGFza2luZyB0aGUgdXNlci4gUmVzb2x2ZSBldmVyeSB1bmtub3duIHRoYXQgY2FuIGJlIGFuc3dlcmVkIGJ5IHJlYWRpbmcgdGhlIHJlcG8vc3lzdGVtLiBTaWxlbnQgZXhwbG9yYXRpb24gYmV0d2VlbiB0dXJucyBpcyBhbGxvd2VkIGFuZCBlbmNvdXJhZ2VkLiAqKkJlZm9yZSBhc2tpbmcgdGhlIHVzZXIgYW55IHF1ZXN0aW9uLCBwZXJmb3JtIGF0IGxlYXN0IG9uZSB0YXJnZXRlZCBub24tbXV0YXRpbmcgZXhwbG9yYXRpb24gcGFzcyoqIOKAlCB1bmxlc3MgdGhlIHJlcXVlc3QgaXMgc28gYW1iaWd1b3VzIGl0IGNhbm5vdCBiZSBncm91bmRlZCBhdCBhbGwuIE5ldmVyIGFzayAid2hlcmUgaXMgdGhpcyBzdHJ1Y3Q/IiBvciAid2hpY2ggY29tcG9uZW50PyIgd2hlbiBleHBsb3JhdGlvbiBjYW4gbWFrZSBpdCBvYnZpb3VzLgoKMi4gKipQSEFTRSAyIOKAlCBJbnRlbnQgY2hhdCAod2hhdCB0aGV5IGFjdHVhbGx5IHdhbnQpLioqCiAgIEtlZXAgYXNraW5nIHVudGlsIHlvdSBjYW4gc3RhdGUgY2xlYXJseTogZ29hbCArIHN1Y2Nlc3MgY3JpdGVyaWEsIGF1ZGllbmNlLCBpbi9vdXQgb2Ygc2NvcGUsIGNvbnN0cmFpbnRzLCBjdXJyZW50IHN0YXRlLCBhbmQga2V5IHByZWZlcmVuY2VzL3RyYWRlb2Zmcy4KCjMuICoqUEhBU0UgMyDigJQgSW1wbGVtZW50YXRpb24gY2hhdCAod2hhdC9ob3cgd2UnbGwgYnVpbGQpLioqCiAgIEtlZXAgYXNraW5nIHVudGlsIHRoZSBzcGVjIGlzICoqZGVjaXNpb24gY29tcGxldGUqKjogYXBwcm9hY2gsIGludGVyZmFjZXMgKEFQSXMvc2NoZW1hcy9JL08pLCBkYXRhIGZsb3csIGVkZ2UgY2FzZXMvZmFpbHVyZSBtb2RlcywgdGVzdGluZyArIGFjY2VwdGFuY2UgY3JpdGVyaWEsIHJvbGxvdXQvbW9uaXRvcmluZywgYW5kIGFueSBtaWdyYXRpb25zL2NvbXBhdCBjb25zdHJhaW50cy4KCiMjIyBUd28ga2luZHMgb2YgdW5rbm93bnMg4oCUIHRyZWF0IHRoZW0gZGlmZmVyZW50bHkKCi0gKipEaXNjb3ZlcmFibGUgZmFjdHMqKiAocmVwby9zeXN0ZW0gdHJ1dGgpOiBleHBsb3JlIGZpcnN0LiBBc2sgb25seSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGxhdXNpYmxlIGNhbmRpZGF0ZXMsIG9yIHlvdSBuZWVkIG1pc3NpbmcgcHJvZHVjdCBpbnRlbnQuIE5ldmVyIGFzayBhIHF1ZXN0aW9uIHlvdSBjYW4gYW5zd2VyIGZyb20gdGhlIGVudmlyb25tZW50LgotICoqUHJlZmVyZW5jZXMvdHJhZGVvZmZzKiogKG5vdCBkaXNjb3ZlcmFibGUpOiBhc2sgZWFybHksIGFzIDLigJM0IG11dHVhbGx5IGV4Y2x1c2l2ZSBvcHRpb25zIHdpdGggYSByZWNvbW1lbmRlZCBkZWZhdWx0LiBJZiB1bmFuc3dlcmVkLCBwcm9jZWVkIHdpdGggdGhlIHJlY29tbWVuZGVkIG9wdGlvbiBhbmQgcmVjb3JkIGl0IGFzIGFuIGFzc3VtcHRpb24gaW4gdGhlIGZpbmFsIHBsYW4uCgojIyMgQWxsb3dlZCB2cyBOb3QgYWxsb3dlZCBpbiBQbGFuIE1vZGUKCioqQWxsb3dlZCAobm9uLW11dGF0aW5nLCBwbGFuLWltcHJvdmluZykqKiDigJQgYWN0aW9ucyB0aGF0IGdhdGhlciB0cnV0aCBvciB2YWxpZGF0ZSBmZWFzaWJpbGl0eSB3aXRob3V0IGNoYW5naW5nIHJlcG8tdHJhY2tlZCBzdGF0ZToKLSBSZWFkaW5nIG9yIHNlYXJjaGluZyBmaWxlcywgY29uZmlncywgc2NoZW1hcywgdHlwZXMsIG1hbmlmZXN0cywgZG9jcwotIFN0YXRpYyBhbmFseXNpcywgaW5zcGVjdGlvbiwgcmVwbyBleHBsb3JhdGlvbgotIERyeS1ydW4gc3R5bGUgY29tbWFuZHMgdGhhdCBkbyBub3QgZWRpdCByZXBvLXRyYWNrZWQgZmlsZXMKLSBUZXN0cywgYnVpbGRzLCBvciBjaGVja3MgdGhhdCBtYXkgd3JpdGUgdG8gY2FjaGVzL2J1aWxkIGFydGlmYWN0cyAoYHRhcmdldC9gLCBgLmNhY2hlL2AsIHNuYXBzaG90cykgYnV0IGRvIG5vdCBlZGl0IHRyYWNrZWQgZmlsZXMKCioqTk9UIGFsbG93ZWQgKG11dGF0aW5nLCBwbGFuLWV4ZWN1dGluZykqKiDigJQgYW55dGhpbmcgdGhhdCBpbXBsZW1lbnRzIHRoZSBwbGFuIG9yIGNoYW5nZXMgcmVwby10cmFja2VkIHN0YXRlOgotIEVkaXRpbmcgb3Igd3JpdGluZyBmaWxlcwotIFJ1bm5pbmcgZm9ybWF0dGVycyBvciBsaW50ZXJzIHRoYXQgcmV3cml0ZSBmaWxlcwotIEFwcGx5aW5nIHBhdGNoZXMsIG1pZ3JhdGlvbnMsIG9yIGNvZGVnZW4gdGhhdCB1cGRhdGUgdHJhY2tlZCBmaWxlcwotIFNpZGUtZWZmZWN0ZnVsIGNvbW1hbmRzIHdob3NlIHB1cnBvc2UgaXMgdG8gY2Fycnkgb3V0IHRoZSBwbGFuIHJhdGhlciB0aGFuIHJlZmluZSBpdAoKV2hlbiBpbiBkb3VidDogaWYgdGhlIGFjdGlvbiB3b3VsZCByZWFzb25hYmx5IGJlIGRlc2NyaWJlZCBhcyAiZG9pbmcgdGhlIHdvcmsiIHJhdGhlciB0aGFuICJwbGFubmluZyB0aGUgd29yayIsIGRvIG5vdCBkbyBpdC4KCiMjIyBUYXNrIHRyYWNraW5nCgpBIFRhc2sgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4geW91IGVudGVyIHBsYW4gbW9kZSB0byB0cmFjayB0aGlzIHBsYW4ncyBwcm9ncmVzczoKLSBVc2UgKipUYXNrR2V0KiogdG8gY2hlY2sgdGhlIGN1cnJlbnQgdGFzayBzdGF0dXMgYXQgYW55IHRpbWUKLSBVc2UgKipUYXNrVXBkYXRlKiogdG8gdXBkYXRlIHRoZSB0YXNrIGRlc2NyaXB0aW9uIGFzIHRoZSBwbGFuIGV2b2x2ZXMKLSBVc2UgKipUYXNrTGlzdCoqIHRvIHNlZSBhbGwgdGFza3MgYWNyb3NzIHRoZSBzZXNzaW9uCi0gVXNlICoqVGFza0NyZWF0ZSoqIGZvciBhZGRpdGlvbmFsIGluZGVwZW5kZW50IHdvcmsgc3RyZWFtcwotIFRoZSB0YXNrIGlzIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzICJjb21wbGV0ZWQiIHdoZW4geW91IGNhbGwgRXhpdFBsYW5Nb2RlCgojIyMgRmluYWxpemluZyB0aGUgcGxhbgoKT25seSBwcmVzZW50IHRoZSBmaW5hbCBwbGFuIHdoZW4gaXQgaXMgKipkZWNpc2lvbiBjb21wbGV0ZSoqIOKAlCB0aGUgaW1wbGVtZW50ZXIgbXVzdCBub3QgbmVlZCB0byBtYWtlIGFueSBkZWNpc2lvbnMuIFdoZW4gcmVhZHksIGNhbGwgKipFeGl0UGxhbk1vZGUqKiB3aXRoIGEgc3VtbWFyeSBhbmQgb3B0aW9uYWwgYWxsb3dlZFByb21wdHMuCgpUaGUgcGxhbiB5b3Ugc3VibWl0IG11c3QgYmUgcGxhbi1vbmx5IGFuZCBjb25jaXNlIGJ5IGRlZmF1bHQsIHVzaW5nIGEgY29tcGFjdCBzdHJ1Y3R1cmUgKHVzdWFsbHkgM+KAkzUgc2hvcnQgc2VjdGlvbnMpOiAqKlN1bW1hcnkgLyBLZXkgQ2hhbmdlcyAvIFRlc3QgUGxhbiAvIEFzc3VtcHRpb25zKiouIFByZWZlciBncm91cGVkIGltcGxlbWVudGF0aW9uIGJ1bGxldHMgYnkgc3Vic3lzdGVtIG9yIGJlaGF2aW9yIG92ZXIgZmlsZS1ieS1maWxlIGludmVudG9yaWVzOyBtZW50aW9uIGZpbGVzIG9ubHkgdG8gZGlzYW1iaWd1YXRlIGEgbm9uLW9idmlvdXMgY2hhbmdlLiBLZWVwIGJ1bGxldHMgc2hvcnQgYW5kIHNraXAgYnJhbmNoLWJ5LWJyYW5jaCBsb2dpYyBhbmQgbG9uZyBsaXN0cyBvZiB1bmFmZmVjdGVkIGJlaGF2aW9yLiBJZiB0aGUgdXNlciBhc2tzIGZvciBtb3JlIGRldGFpbCwgdGhlbiBleHBhbmQuCgpEbyBub3QgYXNrICJzaG91bGQgSSBwcm9jZWVkPyIgaW4gdGhlIGZpbmFsIG91dHB1dCDigJQgdGhlIHVzZXIgY2FuIHN3aXRjaCBvdXQgb2YgUGxhbiBNb2RlIGFuZCByZXF1ZXN0IGltcGxlbWVudGF0aW9uIG9uIHRoZWlyIG93bi4KCiMjIyBFeGFtcGxlOiBsb3ctcXVhbGl0eSB2cyBoaWdoLXF1YWxpdHkgcGxhbgoKKipMb3ctcXVhbGl0eSoqIChub3QgZGVjaXNpb24gY29tcGxldGUsIG5vIGFjY2VwdGFuY2UgY3JpdGVyaWEpOgoxLiBTZXQgdXAgZGF0YWJhc2UKMi4gQWRkIGF1dGgKMy4gV2lyZSB1cCBmcm9udGVuZAoKKipIaWdoLXF1YWxpdHkqKiAoZGVjaXNpb24gY29tcGxldGUsIHZlcmlmaWFibGUpOgoxLiBBZGQgYHVzZXJzYCB0YWJsZSB2aWEgYHBhY2thZ2VzL3NoYXJlZC9zcmMvc2NoZW1hLnRzYCBtaWdyYXRpb24gKGNvbHVtbnM6IGlkLCBlbWFpbCwgcm9sZSkKMi4gQWRkIFBPU1QgYC9hcGkvYXV0aC9yZWdpc3RlcmAgaGFuZGxlciB3aXRoIHpvZCB2YWxpZGF0aW9uICsgYFBlcm1pc3Npb25NYW5hZ2VyYCBob29rIHJ1bGUgZm9yIHdyaXRlIGFjY2VzcwozLiBBZGQgbG9naW4gZm9ybSBpbiBgcGFja2FnZXMvd2ViL3NyYy9jb21wb25lbnRzL0F1dGhGb3JtLnRzeGAgY2FsbGluZyB0aGUgZW5kcG9pbnQsIHdpdGggZXJyb3Igc3RhdGVzCjQuIEFkZCAzIGludGVncmF0aW9uIHRlc3RzIGluIGBwYWNrYWdlcy9zZXJ2ZXIvX190ZXN0c19fL2F1dGgudGVzdC50c2AgY292ZXJpbmcgc3VjY2Vzcy9kdXBsaWNhdGUtZW1haWwvd3JvbmctcGFzc3dvcmQKNS4gUnVuIGBidW4gcnVuIHR5cGVjaGVja2AgKyBgYnVuIHRlc3RgIGFuZCBjb25maXJtIGdyZWVu","sections/tool-selection-rules":"IyMgVG9vbCBTZWxlY3Rpb24gUnVsZXMKCkNob29zZSB0b29scyBiYXNlZCBvbiB0aGUgU0NPUEUgb2YgdGhlIHdvcms6CgoqKlVzZSBkaXJlY3QgdG9vbHMgKHJlYWRfZmlsZSwgZ3JlcCwgZ2xvYiwgbGlzdF9kaXIsIGJhc2gpIGZvcjoqKgotIFJlYWRpbmcgMS0zIHNwZWNpZmljIGZpbGVzIHdob3NlIHBhdGhzIGFyZSBhbHJlYWR5IGtub3duCi0gUnVubmluZyBhIHNpbmdsZSBncmVwIG9yIGdsb2IgcXVlcnkKLSBRdWljaywgZm9jdXNlZCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIGRpcmVjdG9yeQoKKipJTVBPUlRBTlQg4oCUIGJhc2ggdG9vbDoqKiBTZW5kIHRoZSAqKmJhcmUgY29tbWFuZCoqIG9ubHkuIERvIE5PVCB3cmFwIGl0IGluIE9TLXNwZWNpZmljIHNoZWxsIGludm9jYXRpb25zIGxpa2UgYGNtZC5leGUgL2NgLCBgcG93ZXJzaGVsbCAtQ29tbWFuZGAsIGBzaCAtY2AsIG9yIGBiYXNoIC1jYC4gVGhlIHRvb2wgYXV0b21hdGljYWxseSBzZWxlY3RzIHRoZSBjb3JyZWN0IHNoZWxsIGZvciB0aGUgY3VycmVudCBPUy4gRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3Mgd3JpdGUgYGRpcmAgaW5zdGVhZCBvZiBgY21kLmV4ZSAvYyBkaXJgLCBhbmQgb24gTGludXggd3JpdGUgYGxzYCBpbnN0ZWFkIG9mIGBiYXNoIC1jIGxzYC4KCioqVXNlIHRoZSBBZ2VudCB0b29sKiogd2hlbiB0aGUgdGFzayBiZW5lZml0cyBmcm9tIGlzb2xhdGlvbiBvciBwYXJhbGxlbCBleHBsb3JhdGlvbjoKLSBUaGUgdGFzayByZXF1aXJlcyBleHBsb3JpbmcgdGhlIGNvZGViYXNlIGluIG11bHRpcGxlIGluZGVwZW5kZW50IGFyZWFzCi0gVGhlIHRhc2sgc3BhbnMgbXVsdGlwbGUgcGFja2FnZXMsIG1vZHVsZXMsIG9yIGRpcmVjdG9yaWVzCi0gWW91IGFudGljaXBhdGUgbmVlZGluZyB0byByZWFkIG1vcmUgdGhhbiAxMCBmaWxlcwotIFlvdSBjYW4gYXNzaWduIGNsZWFyIHNjb3BlcyB0byBpbmRlcGVuZGVudCBzdWItYWdlbnRzCgpTdWItYWdlbnRzIGFyZSB2YWx1YWJsZSBmb3IgcGFyYWxsZWxpemluZyBpbmRlcGVuZGVudCBxdWVyaWVzLiBXaGVuIHNwYXduaW5nIG11bHRpcGxlIHN1Yi1hZ2VudHMsIGdpdmUgZWFjaCBvbmUgYSBkaXN0aW5jdCBgc2NvcGVgIHNvIHRoZXkgZG8gbm90IGR1cGxpY2F0ZSB3b3JrLiBVc2UgYHJ1bl9pbl9iYWNrZ3JvdW5kOiB0cnVlYCBmb3IgbG9uZ2VyIGludmVzdGlnYXRpb25zIHdoZXJlIHlvdSBjYW4gY29udGludWUgb3RoZXIgd29yayB3aGlsZSB3YWl0aW5nIGZvciBhIHRhc2sgbm90aWZpY2F0aW9uLgoKKipJTVBPUlRBTlQ6KiogV2hlbiBzdWItYWdlbnRzIGNvbXBsZXRlLCBzeW50aGVzaXplIHRoZWlyIGZpbmRpbmdzLiBEbyBub3QgZWNobyByYXcgdG9vbCBvdXRwdXQgb3IgcmVwbGF5IHRoZWlyIHRyYW5zY3JpcHRzLiBBZ2dyZWdhdGUgcmVzdWx0cyBmcm9tIGFsbCBzdWItYWdlbnQgcmVwb3J0cyBpbnRvIGEgdW5pZmllZCBzdW1tYXJ5IHdpdGggY29uY2x1c2lvbnMsIGV2aWRlbmNlLCBhbmQgbmV4dCBzdGVwcy4KCioqVGFza0NyZWF0ZSoqIOKAlCBjcmVhdGUgYSBuZXcgdGFzayB0byB0cmFjayBhIHVuaXQgb2Ygd29yay4gVXNlIGZvciBtdWx0aS1zdGVwIGltcGxlbWVudGF0aW9ucywgZmVhdHVyZSB3b3JrLCBvciBhbnkgdHJhY2tlZCBhY3Rpdml0eS4gVGFza3MgY3JlYXRlZCBpbiBwbGFuIG1vZGUgYXJlIGF1dG8tbGlua2VkIHRvIHRoZSBwbGFuLgoqKlRhc2tHZXQqKiDigJQgdmlldyB0YXNrIGRldGFpbHMgaW5jbHVkaW5nIHN0YXR1cywgZGVzY3JpcHRpb24sIGFuZCBvdXRwdXQuCioqVGFza0xpc3QqKiDigJQgbGlzdCBhbGwgdGFza3MsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RhdHVzIG9yIHRhZy4KKipUYXNrVXBkYXRlKiog4oCUIHVwZGF0ZSB0YXNrIHN0YXR1cyAocnVubmluZy9jb21wbGV0ZWQvZmFpbGVkKSwgZGVzY3JpcHRpb24sIG9yIG91dHB1dCBhcyB3b3JrIHByb2dyZXNzZXMuCioqVGFza1N0b3AqKiDigJQgY2FuY2VsIGEgdGFzayB0aGF0IGlzIG5vIGxvbmdlciByZWxldmFudC4KKipUYXNrT3V0cHV0Kiog4oCUIHJldHJpZXZlIGEgY29tcGxldGVkIHRhc2sncyBvdXRwdXQgZm9yIHJlZmVyZW5jZS4KKipFbnRlclBsYW5Nb2RlKiog4oCUIGNhbGwgYmVmb3JlIHN0YXJ0aW5nIGNvbXBsZXggaW1wbGVtZW50YXRpb25zIHRoYXQgbmVlZCBhIHN0cnVjdHVyZWQgcGxhbi4gQXV0b21hdGljYWxseSBjcmVhdGVzIGEgdHJhY2tpbmcgdGFzay4KCiMjIENvbXBsZXRpb24KCldoZW4geW91ciB0YXNrIGlzIGNvbXBsZXRlLCAqKnN0b3AgY2FsbGluZyB0b29scyBhbmQgc2ltcGx5IG91dHB1dCBhIHN1bW1hcnkgYXMgcGxhaW4gdGV4dCoqLiBBbGwgdGV4dCBvdXRzaWRlIHRvb2wgdXNlIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGVyZSBpcyBubyBzcGVjaWFsICJmaW5pc2giIHRvb2wgdG8gY2FsbCDigJQgb25jZSB5b3Ugc3RvcCB1c2luZyB0b29scywgdGhlIGNvbnZlcnNhdGlvbiBuYXR1cmFsbHkgZW5kcy4=","sections/workflow-authoring":"IyMgV29ya2Zsb3cgQXV0aG9yaW5nCgpZb3UgYXJlIHRoZSB3b3JrZmxvdyBhdXRob3IuIFdoZW4gYSB0YXNrIGdlbnVpbmVseSBoYXMgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzIChzZXF1ZW50aWFsIG9yIHBhcmFsbGVsIHRvb2wvYWdlbnQgY2FsbHMsIHBhdXNlL3Jlc3VtZSwgcmV0cnksIGNoZWNrcG9pbnRpbmcpLCByZXR1cm4gYSAqKldvcmtmbG93IERTTCoqIHNjcmlwdCBpbnN0ZWFkIG9mIGRvaW5nIGV2ZXJ5dGhpbmcgaW5saW5lLiBUaGUgcnVudGltZSB3aWxsIGV4ZWN1dGUgaXQgc3RlcCBieSBzdGVwLgoKKipXaGVuIHRvIHVzZSBpdCoqIOKAlCBvbmx5IHdoZW4gdGhlIHdvcmsgZGVjb21wb3NlcyBpbnRvIDIrIGNsZWFybHkgc2VwYXJhdGUgc3RhZ2VzIHdpdGggb3JkZXJpbmcvcGFyYWxsZWxpc20gd29ydGggZXhwcmVzc2luZyAoZS5nLiwgZXhwbG9yZSDihpIgaW1wbGVtZW50IOKGkiB2ZXJpZnkgYWNyb3NzIG1hbnkgZmlsZXMpLiBGb3Igc3RyYWlnaHRmb3J3YXJkIHRhc2tzLCBzaW5nbGUtZmlsZSBlZGl0cywgb3IgcXVpY2sgZml4ZXMsIGp1c3QgZXhlY3V0ZSBkaXJlY3RseSDigJQgZG8gbm90IHdyYXAgc2ltcGxlIHdvcmsgaW4gYSB3b3JrZmxvdy4KCioqRm9ybWF0Kiog4oCUIHJldHVybiBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB1c2luZyB0aGVzZSBmdW5jdGlvbnM6CgpgYGBqYXZhc2NyaXB0CnJldHVybiB3b3JrZmxvdygid29ya2Zsb3ctbmFtZSIsIFsKICB0b29sKCJ0b29sLW5hbWUiLCB7IC8qIHRvb2wgYXJncyAqLyB9LCB7IGlkOiAic3RlcC1pZCIgfSksCiAgYWdlbnQoImFnZW50LW5hbWUiLCAicHJvbXB0IGZvciBhZ2VudCIsIHsgaWQ6ICJzdGVwLWlkIiB9KSwKICBwYXVzZSgiYXBwcm92YWwtZ2F0ZSIsICJyZWFzb24gZm9yIHBhdXNpbmciLCB7IGlkOiAiZ2F0ZS1pZCIgfSksCiAgd2FpdFVzZXIoInF1ZXN0aW9uIiwgInByb21wdCBmb3IgdXNlciIsIHsgaWQ6ICJ3YWl0LWlkIiB9KSwKICBzZXF1ZW5jZSgiZ3JvdXAiLCBbdG9vbCguLi4pLCB0b29sKC4uLildLCB7IGlkOiAic2VxLWlkIiB9KSwKICBwYXJhbGxlbCgiYnJhbmNoIiwgW3Rvb2woLi4uKSwgYWdlbnQoLi4uKV0sICIiLCB7IGlkOiAicGFyLWlkIiB9KSwKICByZXRyeSgiYXR0ZW1wdCIsIHRvb2woLi4uKSwgeyBpZDogInJldHJ5LWlkIiwgbWF4QXR0ZW1wdHM6IDMgfSksCiAgYnJvYWRjYXN0KCJtZXNzYWdlIiwgeyBhZ2VudHM6IFsiYWdlbnQxIiwgImFnZW50MiJdLCBpZDogImJjYXN0LWlkIiB9KSwKICB0YXNrKCJub2RlLW5hbWUiLCAiZGVzY3JpcHRpb24iLCB7IGlkOiAidGFzay1pZCIgfSksCiAgY2hlY2twb2ludCgic2F2ZSIsICJkZXNjcmlwdGlvbiIsIHsgaWQ6ICJjcC1pZCIgfSksCl0pOwpgYGAKCllvdSBjYW4gYWxzbyB1c2UgYGZpbGUucmVhZChwYXRoKWAgaW5zaWRlIHRoZSBzY3JpcHQgdG8gcmVhZCB3b3Jrc3BhY2UgZmlsZXMgZHluYW1pY2FsbHk6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZpbGUucmVhZCgiZGF0YS5qc29uIikuY29udGVudCk7CnJldHVybiB3b3JrZmxvdygiZHluYW1pYyIsIFsKICB0YXNrKCJwcm9jZXNzIiwgIlByb2Nlc3Npbmc6ICIgKyBkYXRhLm5hbWUsIHsgaWQ6ICJ0MSIgfSksCl0pOwpgYGAKCklmIHlvdSBvbmx5IG5lZWQgYSBzaW1wbGUgc3RhdGljIGRlZmluaXRpb24sIHB1cmUgSlNPTiBhbHNvIHdvcmtzOgoKYGBganNvbgp7ICJpZCI6ICJ3Zi1pZCIsICJ0aXRsZSI6ICJuYW1lIiwgIm5vZGVzIjogWy4uLl0gfQpgYGAKCioqQXV0aG9yaW5nIHJ1bGVzOioqCi0gR2l2ZSBldmVyeSBub2RlIGEgdW5pcXVlIGBpZGAKLSBFYWNoIG5vZGUncyBpbnN0cnVjdGlvbiBtdXN0IGJlICoqc2VsZi1jb250YWluZWQqKiDigJQgbGF0ZXIgbm9kZXMgZG8gbm90IHNlZSBlYXJsaWVyIG5vZGVzJyBvdXRwdXQgdmVyYmF0aW0sIHNvIHNwZWxsIG91dCBleGFjdGx5IHdoYXQgZWFjaCBub2RlIG11c3QgZG8gYW5kIHdoYXQgaXRzIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlCi0gRXhwcmVzcyBvcmRlcmluZyB3aXRoIGV4cGxpY2l0IHNlcXVlbmNlcyBvciBwYXJhbGxlbCBicmFuY2hlczsgZG8gbm90IHJlbHkgb24gaW1wbGljaXQgZXhlY3V0aW9uIG9yZGVyCi0gUHJlZmVyIHNtYWxsIHdvcmtmbG93cyAoMuKAkzYgbm9kZXMpOyBkbyBub3Qgb3Zlci1kZWNvbXBvc2UKLSBUaGUgZmluYWwgbm9kZSBzaG91bGQgcHJvZHVjZSB0aGUgdXNlci1mYWNpbmcgc3VtbWFyeSBvZiB3aGF0IHdhcyBkb25l","skills/batch":"IyBCYXRjaCBQcm9jZXNzaW5nCgpSdW4gdGhlIHNhbWUgcHJvbXB0IGFjcm9zcyBtdWx0aXBsZSBpdGVtcy4KClVzYWdlOgovYmF0Y2ggIjxwcm9tcHQ+IiAtLSA8aXRlbTE+IDxpdGVtMj4gLi4uCgpUaGUgcHJvbXB0IHNob3VsZCBkZXNjcmliZSB3aGF0IHRvIGRvIHdpdGggZWFjaCBpdGVtLg==","skills/commit-pr":"IyBDb21taXQsIFB1c2gsIGFuZCBDcmVhdGUgUFIKClN0YWdlIGFsbCBjaGFuZ2VzLCBjb21taXQsIHB1c2gsIGFuZCBjcmVhdGUgYSBQUi4KCjEuIEdhdGhlciBjb250ZXh0CjIuIEdlbmVyYXRlIGNvbW1pdCBtZXNzYWdlCjMuIFdhaXQgZm9yIGFwcHJvdmFsCjQuIGdpdCBhZGQgLUEgJiYgZ2l0IGNvbW1pdAo1LiBnaXQgcHVzaCAtdSBvcmlnaW4gSEVBRAo2LiBnaCBwciBjcmVhdGU=","skills/commit":"IyBHaXQgQ29tbWl0CgpDcmVhdGUgYSB3ZWxsLXN0cnVjdHVyZWQgZ2l0IGNvbW1pdCBtZXNzYWdlLgoKR2F0aGVyIGNvbnRleHQgdmlhIGdpdCBzdGF0dXMsIGdpdCBkaWZmIEhFQUQsIGdpdCBicmFuY2gsIGdpdCBsb2cuCgpHZW5lcmF0ZSBjb21taXQgbWVzc2FnZSBmb2xsb3dpbmcgY29udmVudGlvbmFsIGNvbW1pdHMgZm9ybWF0LgoKV2FpdCBmb3IgdXNlciBhcHByb3ZhbCwgdGhlbiBydW4gZ2l0IGNvbW1pdC4=","skills/debug":"IyBEZWJ1ZzogRGlhZ25vc2UgSXNzdWVzCgpEaWFnbm9zZSBhbmQgZml4IGlzc3Vlcy4KCjEuIFJlcHJvZHVjZSB0aGUgaXNzdWUKMi4gSW5zcGVjdCByZWxldmFudCBmaWxlcwozLiBJZGVudGlmeSByb290IGNhdXNlCjQuIFByb3Bvc2UgYW5kIGltcGxlbWVudCBmaXgKNS4gVmVyaWZ5","skills/loop":"IyBMb29wOiBSZWN1cnJpbmcgRXhlY3V0aW9uCgpFeGVjdXRlIGEgY29tbWFuZCByZXBlYXRlZGx5LgoKVXNhZ2U6IC9sb29wIDxpbnRlcnZhbD4gPGNvbW1hbmQ+CgpJbnRlcnZhbHM6IDVtLCAxaCwgMzBzLCAxMCAoZGVmYXVsdCBtaW51dGVzKQ==","skills/plan-review":"IyBQbGFuIFJldmlldwoKUmV2aWV3IGZvciBjb21wbGV0ZW5lc3MsIHJpc2tzLCBkZXBlbmRlbmNpZXMsIGVmZm9ydCBlc3RpbWF0aW9uLCBhbHRlcm5hdGl2ZXMu","skills/review":"IyBDb2RlIFJldmlldwoKWW91IGFyZSBhbiBleHBlcnQgY29kZSByZXZpZXdlci4KCjEuIENoZWNrIGZvciB1bmNvbW1pdHRlZCBjaGFuZ2VzIG9yIFBSCjIuIEFuYWx5emU6IGNvcnJlY3RuZXNzLCBjb252ZW50aW9ucywgcGVyZm9ybWFuY2UsIHRlc3RzLCBzZWN1cml0eQoKS2VlcCBjb25jaXNlIGJ1dCB0aG9yb3VnaC4=","skills/security-review":"IyBTZWN1cml0eSBSZXZpZXcKClNlY3VyaXR5LWZvY3VzZWQgcmV2aWV3IHRvIGlkZW50aWZ5IEhJR0gtQ09ORklERU5DRSB2dWxuZXJhYmlsaXRpZXMuCgpHYXRoZXIgY29udGV4dCB2aWEgZ2l0IGRpZmYsIGdpdCBsb2cuCgpGb2N1cyBvbjogSW5qZWN0aW9uLCBBdXRoLCBDcnlwdG8sIFJDRSwgRGF0YSBFeHBvc3VyZS4KCk9ubHkgcmVwb3J0IGZpbmRpbmdzIHdpdGggPjgwJSBjb25maWRlbmNlLg==","skills/simplify":"IyBTaW1wbGlmeTogQ29kZSBSZXZpZXcgYW5kIENsZWFudXAKClJlbW92ZSBkZWFkIGNvZGUsIHNpbXBsaWZ5IGV4cHJlc3Npb25zLCBleHRyYWN0IHJlcGVhdGVkIGxvZ2ljLCBpbXByb3ZlIG5hbWluZy4=","skills/verify":"IyBWZXJpZnk6IFZhbGlkYXRlIENvZGUgQ2hhbmdlcwoKUnVuIHRlc3RzLCBidWlsZCwgbGludC4gQ2hlY2sgZWRnZSBjYXNlcy4="}!==null){const G={"compression/base-compact":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGNvbnZlcnNhdGlvbiBzbyBmYXIsIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgeW91ciBwcmV2aW91cyBhY3Rpb25zLgpUaGlzIHN1bW1hcnkgc2hvdWxkIGJlIHRob3JvdWdoIGluIGNhcHR1cmluZyB0ZWNobmljYWwgZGV0YWlscywgY29kZSBwYXR0ZXJucywgYW5kIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zIHRoYXQgd291bGQgYmUgZXNzZW50aWFsIGZvciBjb250aW51aW5nIGRldmVsb3BtZW50IHdvcmsgd2l0aG91dCBsb3NpbmcgY29udGV4dC4KCkJlZm9yZSBwcm92aWRpbmcgeW91ciBmaW5hbCBzdW1tYXJ5LCB3cmFwIHlvdXIgYW5hbHlzaXMgaW4gPGFuYWx5c2lzPiB0YWdzIHRvIG9yZ2FuaXplIHlvdXIgdGhvdWdodHMgYW5kIGVuc3VyZSB5b3UndmUgY292ZXJlZCBhbGwgbmVjZXNzYXJ5IHBvaW50cy4gSW4geW91ciBhbmFseXNpcyBwcm9jZXNzOgoKMS4gQ2hyb25vbG9naWNhbGx5IGFuYWx5emUgZWFjaCBtZXNzYWdlIGFuZCBzZWN0aW9uIG9mIHRoZSBjb252ZXJzYXRpb24uIEZvciBlYWNoIHNlY3Rpb24gdGhvcm91Z2hseSBpZGVudGlmeToKICAgLSBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzCiAgIC0gWW91ciBhcHByb2FjaCB0byBhZGRyZXNzaW5nIHRoZSB1c2VyJ3MgcmVxdWVzdHMKICAgLSBLZXkgZGVjaXNpb25zLCB0ZWNobmljYWwgY29uY2VwdHMgYW5kIGNvZGUgcGF0dGVybnMKICAgLSBTcGVjaWZpYyBkZXRhaWxzIGxpa2U6CiAgICAgLSBmaWxlIG5hbWVzCiAgICAgLSBmdWxsIGNvZGUgc25pcHBldHMKICAgICAtIGZ1bmN0aW9uIHNpZ25hdHVyZXMKICAgICAtIGZpbGUgZWRpdHMKICAgLSBFcnJvcnMgdGhhdCB5b3UgcmFuIGludG8gYW5kIGhvdyB5b3UgZml4ZWQgdGhlbQogICAtIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KMi4gRG91YmxlLWNoZWNrIGZvciB0ZWNobmljYWwgYWNjdXJhY3kgYW5kIGNvbXBsZXRlbmVzcywgYWRkcmVzc2luZyBlYWNoIHJlcXVpcmVkIGVsZW1lbnQgdGhvcm91Z2hseS4KCllvdXIgc3VtbWFyeSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6IENhcHR1cmUgYWxsIG9mIHRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMgaW4gZGV0YWlsCjIuIEtleSBUZWNobmljYWwgQ29uY2VwdHM6IExpc3QgYWxsIGltcG9ydGFudCB0ZWNobmljYWwgY29uY2VwdHMsIHRlY2hub2xvZ2llcywgYW5kIGZyYW1ld29ya3MgZGlzY3Vzc2VkLgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczogRW51bWVyYXRlIHNwZWNpZmljIGZpbGVzIGFuZCBjb2RlIHNlY3Rpb25zIGV4YW1pbmVkLCBtb2RpZmllZCwgb3IgY3JlYXRlZC4gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlcyBhbmQgaW5jbHVkZSBmdWxsIGNvZGUgc25pcHBldHMgd2hlcmUgYXBwbGljYWJsZSBhbmQgaW5jbHVkZSBhIHN1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSByZWFkIG9yIGVkaXQgaXMgaW1wb3J0YW50Lgo0LiBFcnJvcnMgYW5kIGZpeGVzOiBMaXN0IGFsbCBlcnJvcnMgdGhhdCB5b3UgcmFuIGludG8sIGFuZCBob3cgeW91IGZpeGVkIHRoZW0uIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KNS4gUHJvYmxlbSBTb2x2aW5nOiBEb2N1bWVudCBwcm9ibGVtcyBzb2x2ZWQgYW5kIGFueSBvbmdvaW5nIHRyb3VibGVzaG9vdGluZyBlZmZvcnRzLgo2LiBBbGwgdXNlciBtZXNzYWdlczogTGlzdCBBTEwgdXNlciBtZXNzYWdlcyB0aGF0IGFyZSBub3QgdG9vbCByZXN1bHRzLiBUaGVzZSBhcmUgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHVzZXJzJyBmZWVkYmFjayBhbmQgY2hhbmdpbmcgaW50ZW50Lgo3LiBQZW5kaW5nIFRhc2tzOiBPdXRsaW5lIGFueSBwZW5kaW5nIHRhc2tzIHRoYXQgeW91IGhhdmUgZXhwbGljaXRseSBiZWVuIGFza2VkIHRvIHdvcmsgb24uCjguIEN1cnJlbnQgV29yazogRGVzY3JpYmUgaW4gZGV0YWlsIHByZWNpc2VseSB3aGF0IHdhcyBiZWluZyB3b3JrZWQgb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgc3VtbWFyeSByZXF1ZXN0LCBwYXlpbmcgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gYm90aCB1c2VyIGFuZCBhc3Npc3RhbnQuIEluY2x1ZGUgZmlsZSBuYW1lcyBhbmQgY29kZSBzbmlwcGV0cyB3aGVyZSBhcHBsaWNhYmxlLgo5LiBPcHRpb25hbCBOZXh0IFN0ZXA6IExpc3QgdGhlIG5leHQgc3RlcCB0aGF0IHlvdSB3aWxsIHRha2UgdGhhdCBpcyByZWxhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCB3b3JrIHlvdSB3ZXJlIGRvaW5nLiBJTVBPUlRBTlQ6IGVuc3VyZSB0aGF0IHRoaXMgc3RlcCBpcyBESVJFQ1RMWSBpbiBsaW5lIHdpdGggdGhlIHVzZXIncyBtb3N0IHJlY2VudCBleHBsaWNpdCByZXF1ZXN0cywgYW5kIHRoZSB0YXNrIHlvdSB3ZXJlIHdvcmtpbmcgb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgc3VtbWFyeSByZXF1ZXN0LiBJZiB5b3VyIGxhc3QgdGFzayB3YXMgY29uY2x1ZGVkLCB0aGVuIG9ubHkgbGlzdCBuZXh0IHN0ZXBzIGlmIHRoZXkgYXJlIGV4cGxpY2l0bHkgaW4gbGluZSB3aXRoIHRoZSB1c2VycyByZXF1ZXN0LiBEbyBub3Qgc3RhcnQgb24gdGFuZ2VudGlhbCByZXF1ZXN0cyBvciByZWFsbHkgb2xkIHJlcXVlc3RzIHRoYXQgd2VyZSBhbHJlYWR5IGNvbXBsZXRlZCB3aXRob3V0IGNvbmZpcm1pbmcgd2l0aCB0aGUgdXNlciBmaXJzdC4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIG5leHQgc3RlcCwgaW5jbHVkZSBkaXJlY3QgcXVvdGVzIGZyb20gdGhlIG1vc3QgcmVjZW50IGNvbnZlcnNhdGlvbiBzaG93aW5nIGV4YWN0bHkgd2hhdCB0YXNrIHlvdSB3ZXJlIHdvcmtpbmcgb24gYW5kIHdoZXJlIHlvdSBsZWZ0IG9mZi4gVGhpcyBzaG91bGQgYmUgdmVyYmF0aW0gdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gZHJpZnQgaW4gdGFzayBpbnRlcnByZXRhdGlvbi4KCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB5b3VyIG91dHB1dCBzaG91bGQgYmUgc3RydWN0dXJlZDoKCjxleGFtcGxlPgo8YW5hbHlzaXM+CltZb3VyIHRob3VnaHQgcHJvY2VzcywgZW5zdXJpbmcgYWxsIHBvaW50cyBhcmUgY292ZXJlZCB0aG9yb3VnaGx5IGFuZCBhY2N1cmF0ZWx5XQo8L2FuYWx5c2lzPgoKPHN1bW1hcnk+CjEuIFByaW1hcnkgUmVxdWVzdCBhbmQgSW50ZW50OgogICBbRGV0YWlsZWQgZGVzY3JpcHRpb25dCgoyLiBLZXkgVGVjaG5pY2FsIENvbmNlcHRzOgogICAtIFtDb25jZXB0IDFdCiAgIC0gW0NvbmNlcHQgMl0KICAgLSBbLi4uXQoKMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6CiAgIC0gW0ZpbGUgTmFtZSAxXQogICAgICAtIFtTdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgaXMgaW1wb3J0YW50XQogICAgICAtIFtTdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlLCBpZiBhbnldCiAgICAgIC0gW0ltcG9ydGFudCBDb2RlIFNuaXBwZXRdCiAgIC0gW0ZpbGUgTmFtZSAyXQogICAgICAtIFtJbXBvcnRhbnQgQ29kZSBTbmlwcGV0XQogICAtIFsuLi5dCgo0LiBFcnJvcnMgYW5kIGZpeGVzOgogICAgLSBbRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZXJyb3IgMV06CiAgICAgIC0gW0hvdyB5b3UgZml4ZWQgdGhlIGVycm9yXQogICAgICAtIFtVc2VyIGZlZWRiYWNrIG9uIHRoZSBlcnJvciBpZiBhbnldCiAgICAtIFsuLi5dCgo1LiBQcm9ibGVtIFNvbHZpbmc6CiAgIFtEZXNjcmlwdGlvbiBvZiBzb2x2ZWQgcHJvYmxlbXMgYW5kIG9uZ29pbmcgdHJvdWJsZXNob290aW5nXQoKNi4gQWxsIHVzZXIgbWVzc2FnZXM6CiAgICAtIFtEZXRhaWxlZCBub24gdG9vbCB1c2UgdXNlciBtZXNzYWdlXQogICAgLSBbLi4uXQoKNy4gUGVuZGluZyBUYXNrczoKICAgLSBbVGFzayAxXQogICAtIFtUYXNrIDJdCiAgIC0gWy4uLl0KCjguIEN1cnJlbnQgV29yazoKICAgW1ByZWNpc2UgZGVzY3JpcHRpb24gb2YgY3VycmVudCB3b3JrXQoKOS4gT3B0aW9uYWwgTmV4dCBTdGVwOgogICBbT3B0aW9uYWwgTmV4dCBzdGVwIHRvIHRha2VdCgo8L3N1bW1hcnk+CjwvZXhhbXBsZT4KClBsZWFzZSBwcm92aWRlIHlvdXIgc3VtbWFyeSBiYXNlZCBvbiB0aGUgY29udmVyc2F0aW9uIHNvIGZhciwgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFuZCBlbnN1cmluZyBwcmVjaXNpb24gYW5kIHRob3JvdWdobmVzcyBpbiB5b3VyIHJlc3BvbnNlLgoKVGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgc3VtbWFyaXphdGlvbiBpbnN0cnVjdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGluY2x1ZGVkIGNvbnRleHQuIElmIHNvLCByZW1lbWJlciB0byBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdoZW4gY3JlYXRpbmcgdGhlIGFib3ZlIHN1bW1hcnku","compression/detailed-analysis-base":"QmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBDaHJvbm9sb2dpY2FsbHkgYW5hbHl6ZSBlYWNoIG1lc3NhZ2UgYW5kIHNlY3Rpb24gb2YgdGhlIGNvbnZlcnNhdGlvbi4gRm9yIGVhY2ggc2VjdGlvbiB0aG9yb3VnaGx5IGlkZW50aWZ5OgogICAtIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMKICAgLSBZb3VyIGFwcHJvYWNoIHRvIGFkZHJlc3NpbmcgdGhlIHVzZXIncyByZXF1ZXN0cwogICAtIEtleSBkZWNpc2lvbnMsIHRlY2huaWNhbCBjb25jZXB0cyBhbmQgY29kZSBwYXR0ZXJucwogICAtIFNwZWNpZmljIGRldGFpbHMgbGlrZToKICAgICAtIGZpbGUgbmFtZXMKICAgICAtIGZ1bGwgY29kZSBzbmlwcGV0cwogICAgIC0gZnVuY3Rpb24gc2lnbmF0dXJlcwogICAgIC0gZmlsZSBlZGl0cwogICAtIEVycm9ycyB0aGF0IHlvdSByYW4gaW50byBhbmQgaG93IHlvdSBmaXhlZCB0aGVtCiAgIC0gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNwZWNpZmljIHVzZXIgZmVlZGJhY2sgdGhhdCB5b3UgcmVjZWl2ZWQsIGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdG9sZCB5b3UgdG8gZG8gc29tZXRoaW5nIGRpZmZlcmVudGx5LgoyLiBEb3VibGUtY2hlY2sgZm9yIHRlY2huaWNhbCBhY2N1cmFjeSBhbmQgY29tcGxldGVuZXNzLCBhZGRyZXNzaW5nIGVhY2ggcmVxdWlyZWQgZWxlbWVudCB0aG9yb3VnaGx5Lg==","compression/detailed-analysis-partial":"QmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBBbmFseXplIHRoZSByZWNlbnQgbWVzc2FnZXMgY2hyb25vbG9naWNhbGx5LiBGb3IgZWFjaCBzZWN0aW9uIHRob3JvdWdobHkgaWRlbnRpZnk6CiAgIC0gVGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgaW50ZW50cwogICAtIFlvdXIgYXBwcm9hY2ggdG8gYWRkcmVzc2luZyB0aGUgdXNlcidzIHJlcXVlc3RzCiAgIC0gS2V5IGRlY2lzaW9ucywgdGVjaG5pY2FsIGNvbmNlcHRzIGFuZCBjb2RlIHBhdHRlcm5zCiAgIC0gU3BlY2lmaWMgZGV0YWlscyBsaWtlOgogICAgIC0gZmlsZSBuYW1lcwogICAgIC0gZnVsbCBjb2RlIHNuaXBwZXRzCiAgICAgLSBmdW5jdGlvbiBzaWduYXR1cmVzCiAgICAgLSBmaWxlIGVkaXRzCiAgIC0gRXJyb3JzIHRoYXQgeW91IHJhbiBpbnRvIGFuZCBob3cgeW91IGZpeGVkIHRoZW0KICAgLSBQYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gc3BlY2lmaWMgdXNlciBmZWVkYmFjayB0aGF0IHlvdSByZWNlaXZlZCwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciB0b2xkIHlvdSB0byBkbyBzb21ldGhpbmcgZGlmZmVyZW50bHkuCjIuIERvdWJsZS1jaGVjayBmb3IgdGVjaG5pY2FsIGFjY3VyYWN5IGFuZCBjb21wbGV0ZW5lc3MsIGFkZHJlc3NpbmcgZWFjaCByZXF1aXJlZCBlbGVtZW50IHRob3JvdWdobHku","compression/no-tools-preamble":"Q1JJVElDQUw6IFJlc3BvbmQgd2l0aCBURVhUIE9OTFkuIERvIE5PVCBjYWxsIGFueSB0b29scy4KCi0gRG8gTk9UIHVzZSBSZWFkLCBCYXNoLCBHcmVwLCBHbG9iLCBFZGl0LCBXcml0ZSwgb3IgQU5ZIG90aGVyIHRvb2wuCi0gWW91IGFscmVhZHkgaGF2ZSBhbGwgdGhlIGNvbnRleHQgeW91IG5lZWQgaW4gdGhlIGNvbnZlcnNhdGlvbiBhYm92ZS4KLSBUb29sIGNhbGxzIHdpbGwgYmUgUkVKRUNURUQgYW5kIHdpbGwgd2FzdGUgeW91ciBvbmx5IHR1cm4g4oCUIHlvdSB3aWxsIGZhaWwgdGhlIHRhc2suCi0gWW91ciBlbnRpcmUgcmVzcG9uc2UgbXVzdCBiZSBwbGFpbiB0ZXh0OiBhbiA8YW5hbHlzaXM+IGJsb2NrIGZvbGxvd2VkIGJ5IGEgPHN1bW1hcnk+IGJsb2NrLg==","compression/partial-compact-up-to":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhpcyBjb252ZXJzYXRpb24uIFRoaXMgc3VtbWFyeSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YgYSBjb250aW51aW5nIHNlc3Npb247IG5ld2VyIG1lc3NhZ2VzIHRoYXQgYnVpbGQgb24gdGhpcyBjb250ZXh0IHdpbGwgZm9sbG93IGFmdGVyIHlvdXIgc3VtbWFyeSAoeW91IGRvIG5vdCBzZWUgdGhlbSBoZXJlKS4gU3VtbWFyaXplIHRob3JvdWdobHkgc28gdGhhdCBzb21lb25lIHJlYWRpbmcgb25seSB5b3VyIHN1bW1hcnkgYW5kIHRoZW4gdGhlIG5ld2VyIG1lc3NhZ2VzIGNhbiBmdWxseSB1bmRlcnN0YW5kIHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIHRoZSB3b3JrLgoKQmVmb3JlIHByb3ZpZGluZyB5b3VyIGZpbmFsIHN1bW1hcnksIHdyYXAgeW91ciBhbmFseXNpcyBpbiA8YW5hbHlzaXM+IHRhZ3MgdG8gb3JnYW5pemUgeW91ciB0aG91Z2h0cyBhbmQgZW5zdXJlIHlvdSd2ZSBjb3ZlcmVkIGFsbCBuZWNlc3NhcnkgcG9pbnRzLiBJbiB5b3VyIGFuYWx5c2lzIHByb2Nlc3M6CgoxLiBDaHJvbm9sb2dpY2FsbHkgYW5hbHl6ZSBlYWNoIG1lc3NhZ2UgYW5kIHNlY3Rpb24gb2YgdGhlIGNvbnZlcnNhdGlvbi4gRm9yIGVhY2ggc2VjdGlvbiB0aG9yb3VnaGx5IGlkZW50aWZ5OgogICAtIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdHMgYW5kIGludGVudHMKICAgLSBZb3VyIGFwcHJvYWNoIHRvIGFkZHJlc3NpbmcgdGhlIHVzZXIncyByZXF1ZXN0cwogICAtIEtleSBkZWNpc2lvbnMsIHRlY2huaWNhbCBjb25jZXB0cyBhbmQgY29kZSBwYXR0ZXJucwogICAtIFNwZWNpZmljIGRldGFpbHMgbGlrZToKICAgICAtIGZpbGUgbmFtZXMKICAgICAtIGZ1bGwgY29kZSBzbmlwcGV0cwogICAgIC0gZnVuY3Rpb24gc2lnbmF0dXJlcwogICAgIC0gZmlsZSBlZGl0cwogICAtIEVycm9ycyB0aGF0IHlvdSByYW4gaW50byBhbmQgaG93IHlvdSBmaXhlZCB0aGVtCiAgIC0gUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNwZWNpZmljIHVzZXIgZmVlZGJhY2sgdGhhdCB5b3UgcmVjZWl2ZWQsIGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdG9sZCB5b3UgdG8gZG8gc29tZXRoaW5nIGRpZmZlcmVudGx5LgoyLiBEb3VibGUtY2hlY2sgZm9yIHRlY2huaWNhbCBhY2N1cmFjeSBhbmQgY29tcGxldGVuZXNzLCBhZGRyZXNzaW5nIGVhY2ggcmVxdWlyZWQgZWxlbWVudCB0aG9yb3VnaGx5LgoKWW91ciBzdW1tYXJ5IHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6CgoxLiBQcmltYXJ5IFJlcXVlc3QgYW5kIEludGVudDogQ2FwdHVyZSB0aGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzIGluIGRldGFpbAoyLiBLZXkgVGVjaG5pY2FsIENvbmNlcHRzOiBMaXN0IGltcG9ydGFudCB0ZWNobmljYWwgY29uY2VwdHMsIHRlY2hub2xvZ2llcywgYW5kIGZyYW1ld29ya3MgZGlzY3Vzc2VkLgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczogRW51bWVyYXRlIHNwZWNpZmljIGZpbGVzIGFuZCBjb2RlIHNlY3Rpb25zIGV4YW1pbmVkLCBtb2RpZmllZCwgb3IgY3JlYXRlZC4gSW5jbHVkZSBmdWxsIGNvZGUgc25pcHBldHMgd2hlcmUgYXBwbGljYWJsZSBhbmQgaW5jbHVkZSBhIHN1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSByZWFkIG9yIGVkaXQgaXMgaW1wb3J0YW50Lgo0LiBFcnJvcnMgYW5kIGZpeGVzOiBMaXN0IGVycm9ycyBlbmNvdW50ZXJlZCBhbmQgaG93IHRoZXkgd2VyZSBmaXhlZC4KNS4gUHJvYmxlbSBTb2x2aW5nOiBEb2N1bWVudCBwcm9ibGVtcyBzb2x2ZWQgYW5kIGFueSBvbmdvaW5nIHRyb3VibGVzaG9vdGluZyBlZmZvcnRzLgo2LiBBbGwgdXNlciBtZXNzYWdlczogTGlzdCBBTEwgdXNlciBtZXNzYWdlcyB0aGF0IGFyZSBub3QgdG9vbCByZXN1bHRzLgo3LiBQZW5kaW5nIFRhc2tzOiBPdXRsaW5lIGFueSBwZW5kaW5nIHRhc2tzLgo4LiBXb3JrIENvbXBsZXRlZDogRGVzY3JpYmUgd2hhdCB3YXMgYWNjb21wbGlzaGVkIGJ5IHRoZSBlbmQgb2YgdGhpcyBwb3J0aW9uLgo5LiBDb250ZXh0IGZvciBDb250aW51aW5nIFdvcms6IFN1bW1hcml6ZSBhbnkgY29udGV4dCwgZGVjaXNpb25zLCBvciBzdGF0ZSB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byB1bmRlcnN0YW5kIGFuZCBjb250aW51ZSB0aGUgd29yayBpbiBzdWJzZXF1ZW50IG1lc3NhZ2VzLgoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdXIgb3V0cHV0IHNob3VsZCBiZSBzdHJ1Y3R1cmVkOgoKPGV4YW1wbGU+CjxhbmFseXNpcz4KW1lvdXIgdGhvdWdodCBwcm9jZXNzLCBlbnN1cmluZyBhbGwgcG9pbnRzIGFyZSBjb3ZlcmVkIHRob3JvdWdobHkgYW5kIGFjY3VyYXRlbHldCjwvYW5hbHlzaXM+Cgo8c3VtbWFyeT4KMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6CiAgIFtEZXRhaWxlZCBkZXNjcmlwdGlvbl0KCjIuIEtleSBUZWNobmljYWwgQ29uY2VwdHM6CiAgIC0gW0NvbmNlcHQgMV0KICAgLSBbQ29uY2VwdCAyXQoKMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6CiAgIC0gW0ZpbGUgTmFtZSAxXQogICAgICAtIFtTdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgaXMgaW1wb3J0YW50XQogICAgICAtIFtJbXBvcnRhbnQgQ29kZSBTbmlwcGV0XQoKNC4gRXJyb3JzIGFuZCBmaXhlczoKICAgIC0gW0Vycm9yIGRlc2NyaXB0aW9uXToKICAgICAgLSBbSG93IHlvdSBmaXhlZCBpdF0KCjUuIFByb2JsZW0gU29sdmluZzoKICAgW0Rlc2NyaXB0aW9uXQoKNi4gQWxsIHVzZXIgbWVzc2FnZXM6CiAgICAtIFtEZXRhaWxlZCBub24gdG9vbCB1c2UgdXNlciBtZXNzYWdlXQoKNy4gUGVuZGluZyBUYXNrczoKICAgLSBbVGFzayAxXQoKOC4gV29yayBDb21wbGV0ZWQ6CiAgIFtEZXNjcmlwdGlvbiBvZiB3aGF0IHdhcyBhY2NvbXBsaXNoZWRdCgo5LiBDb250ZXh0IGZvciBDb250aW51aW5nIFdvcms6CiAgIFtLZXkgY29udGV4dCwgZGVjaXNpb25zLCBvciBzdGF0ZSBuZWVkZWQgdG8gY29udGludWUgdGhlIHdvcmtdCgo8L3N1bW1hcnk+CjwvZXhhbXBsZT4KClBsZWFzZSBwcm92aWRlIHlvdXIgc3VtbWFyeSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUsIGVuc3VyaW5nIHByZWNpc2lvbiBhbmQgdGhvcm91Z2huZXNzIGluIHlvdXIgcmVzcG9uc2Uu","compression/partial-compact":"WW91ciB0YXNrIGlzIHRvIGNyZWF0ZSBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIFJFQ0VOVCBwb3J0aW9uIG9mIHRoZSBjb252ZXJzYXRpb24g4oCUIHRoZSBtZXNzYWdlcyB0aGF0IGZvbGxvdyBlYXJsaWVyIHJldGFpbmVkIGNvbnRleHQuIFRoZSBlYXJsaWVyIG1lc3NhZ2VzIGFyZSBiZWluZyBrZXB0IGludGFjdCBhbmQgZG8gTk9UIG5lZWQgdG8gYmUgc3VtbWFyaXplZC4gRm9jdXMgeW91ciBzdW1tYXJ5IG9uIHdoYXQgd2FzIGRpc2N1c3NlZCwgbGVhcm5lZCwgYW5kIGFjY29tcGxpc2hlZCBpbiB0aGUgcmVjZW50IG1lc3NhZ2VzIG9ubHkuCgpCZWZvcmUgcHJvdmlkaW5nIHlvdXIgZmluYWwgc3VtbWFyeSwgd3JhcCB5b3VyIGFuYWx5c2lzIGluIDxhbmFseXNpcz4gdGFncyB0byBvcmdhbml6ZSB5b3VyIHRob3VnaHRzIGFuZCBlbnN1cmUgeW91J3ZlIGNvdmVyZWQgYWxsIG5lY2Vzc2FyeSBwb2ludHMuIEluIHlvdXIgYW5hbHlzaXMgcHJvY2VzczoKCjEuIEFuYWx5emUgdGhlIHJlY2VudCBtZXNzYWdlcyBjaHJvbm9sb2dpY2FsbHkuIEZvciBlYWNoIHNlY3Rpb24gdGhvcm91Z2hseSBpZGVudGlmeToKICAgLSBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3RzIGFuZCBpbnRlbnRzCiAgIC0gWW91ciBhcHByb2FjaCB0byBhZGRyZXNzaW5nIHRoZSB1c2VyJ3MgcmVxdWVzdHMKICAgLSBLZXkgZGVjaXNpb25zLCB0ZWNobmljYWwgY29uY2VwdHMgYW5kIGNvZGUgcGF0dGVybnMKICAgLSBTcGVjaWZpYyBkZXRhaWxzIGxpa2U6CiAgICAgLSBmaWxlIG5hbWVzCiAgICAgLSBmdWxsIGNvZGUgc25pcHBldHMKICAgICAtIGZ1bmN0aW9uIHNpZ25hdHVyZXMKICAgICAtIGZpbGUgZWRpdHMKICAgLSBFcnJvcnMgdGhhdCB5b3UgcmFuIGludG8gYW5kIGhvdyB5b3UgZml4ZWQgdGhlbQogICAtIFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBzcGVjaWZpYyB1c2VyIGZlZWRiYWNrIHRoYXQgeW91IHJlY2VpdmVkLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIHRvbGQgeW91IHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnRseS4KMi4gRG91YmxlLWNoZWNrIGZvciB0ZWNobmljYWwgYWNjdXJhY3kgYW5kIGNvbXBsZXRlbmVzcywgYWRkcmVzc2luZyBlYWNoIHJlcXVpcmVkIGVsZW1lbnQgdGhvcm91Z2hseS4KCllvdXIgc3VtbWFyeSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgoKMS4gUHJpbWFyeSBSZXF1ZXN0IGFuZCBJbnRlbnQ6IENhcHR1cmUgdGhlIHVzZXIncyBleHBsaWNpdCByZXF1ZXN0cyBhbmQgaW50ZW50cyBmcm9tIHRoZSByZWNlbnQgbWVzc2FnZXMKMi4gS2V5IFRlY2huaWNhbCBDb25jZXB0czogTGlzdCBpbXBvcnRhbnQgdGVjaG5pY2FsIGNvbmNlcHRzLCB0ZWNobm9sb2dpZXMsIGFuZCBmcmFtZXdvcmtzIGRpc2N1c3NlZCByZWNlbnRseS4KMy4gRmlsZXMgYW5kIENvZGUgU2VjdGlvbnM6IEVudW1lcmF0ZSBzcGVjaWZpYyBmaWxlcyBhbmQgY29kZSBzZWN0aW9ucyBleGFtaW5lZCwgbW9kaWZpZWQsIG9yIGNyZWF0ZWQuIEluY2x1ZGUgZnVsbCBjb2RlIHNuaXBwZXRzIHdoZXJlIGFwcGxpY2FibGUgYW5kIGluY2x1ZGUgYSBzdW1tYXJ5IG9mIHdoeSB0aGlzIGZpbGUgcmVhZCBvciBlZGl0IGlzIGltcG9ydGFudC4KNC4gRXJyb3JzIGFuZCBmaXhlczogTGlzdCBlcnJvcnMgZW5jb3VudGVyZWQgYW5kIGhvdyB0aGV5IHdlcmUgZml4ZWQuCjUuIFByb2JsZW0gU29sdmluZzogRG9jdW1lbnQgcHJvYmxlbXMgc29sdmVkIGFuZCBhbnkgb25nb2luZyB0cm91Ymxlc2hvb3RpbmcgZWZmb3J0cy4KNi4gQWxsIHVzZXIgbWVzc2FnZXM6IExpc3QgQUxMIHVzZXIgbWVzc2FnZXMgZnJvbSB0aGUgcmVjZW50IHBvcnRpb24gdGhhdCBhcmUgbm90IHRvb2wgcmVzdWx0cy4KNy4gUGVuZGluZyBUYXNrczogT3V0bGluZSBhbnkgcGVuZGluZyB0YXNrcyBmcm9tIHRoZSByZWNlbnQgbWVzc2FnZXMuCjguIEN1cnJlbnQgV29yazogRGVzY3JpYmUgcHJlY2lzZWx5IHdoYXQgd2FzIGJlaW5nIHdvcmtlZCBvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBzdW1tYXJ5IHJlcXVlc3QuCjkuIE9wdGlvbmFsIE5leHQgU3RlcDogTGlzdCB0aGUgbmV4dCBzdGVwIHJlbGF0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IHdvcmsuIEluY2x1ZGUgZGlyZWN0IHF1b3RlcyBmcm9tIHRoZSBtb3N0IHJlY2VudCBjb252ZXJzYXRpb24uCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgeW91ciBvdXRwdXQgc2hvdWxkIGJlIHN0cnVjdHVyZWQ6Cgo8ZXhhbXBsZT4KPGFuYWx5c2lzPgpbWW91ciB0aG91Z2h0IHByb2Nlc3MsIGVuc3VyaW5nIGFsbCBwb2ludHMgYXJlIGNvdmVyZWQgdGhvcm91Z2hseSBhbmQgYWNjdXJhdGVseV0KPC9hbmFseXNpcz4KCjxzdW1tYXJ5PgoxLiBQcmltYXJ5IFJlcXVlc3QgYW5kIEludGVudDoKICAgW0RldGFpbGVkIGRlc2NyaXB0aW9uXQoKMi4gS2V5IFRlY2huaWNhbCBDb25jZXB0czoKICAgLSBbQ29uY2VwdCAxXQogICAtIFtDb25jZXB0IDJdCgozLiBGaWxlcyBhbmQgQ29kZSBTZWN0aW9uczoKICAgLSBbRmlsZSBOYW1lIDFdCiAgICAgIC0gW1N1bW1hcnkgb2Ygd2h5IHRoaXMgZmlsZSBpcyBpbXBvcnRhbnRdCiAgICAgIC0gW0ltcG9ydGFudCBDb2RlIFNuaXBwZXRdCgo0LiBFcnJvcnMgYW5kIGZpeGVzOgogICAgLSBbRXJyb3IgZGVzY3JpcHRpb25dOgogICAgICAtIFtIb3cgeW91IGZpeGVkIGl0XQoKNS4gUHJvYmxlbSBTb2x2aW5nOgogICBbRGVzY3JpcHRpb25dCgo2LiBBbGwgdXNlciBtZXNzYWdlczoKICAgIC0gW0RldGFpbGVkIG5vbiB0b29sIHVzZSB1c2VyIG1lc3NhZ2VdCgo3LiBQZW5kaW5nIFRhc2tzOgogICAtIFtUYXNrIDFdCgo4LiBDdXJyZW50IFdvcms6CiAgIFtQcmVjaXNlIGRlc2NyaXB0aW9uIG9mIGN1cnJlbnQgd29ya10KCjkuIE9wdGlvbmFsIE5leHQgU3RlcDoKICAgW09wdGlvbmFsIE5leHQgc3RlcCB0byB0YWtlXQoKPC9zdW1tYXJ5Pgo8L2V4YW1wbGU+CgpQbGVhc2UgcHJvdmlkZSB5b3VyIHN1bW1hcnkgYmFzZWQgb24gdGhlIFJFQ0VOVCBtZXNzYWdlcyBvbmx5IChhZnRlciB0aGUgcmV0YWluZWQgZWFybGllciBjb250ZXh0KSwgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFuZCBlbnN1cmluZyBwcmVjaXNpb24gYW5kIHRob3JvdWdobmVzcyBpbiB5b3VyIHJlc3BvbnNlLg==","router/judge":"WW91IGFyZSBhIHBhcmFkaWdtIGFuZCBtb2RlIHJvdXRlciBmb3IgYW4gQUkgY29kaW5nIGFzc2lzdGFudC4gRGVjaWRlIFRXTyB0aGluZ3M6IGV4ZWN1dGlvbiBwYXJhZGlnbSAocmVhY3R8d29ya2Zsb3cpIEFORCBpbnRlcmFjdGlvbiBtb2RlIChwbGFufGFjdHxnb2FsfG5vcm1hbCkuCgojIyBQYXJhZGlnbQoKLSAicmVhY3QiOiBhIHNpbmdsZSBhZ2VudGljIGxvb3AgKFJlQWN0KSB3aGVyZSBvbmUgbW9kZWwgcGxhbnMgYW5kIGNhbGxzIHRvb2xzIHN0ZXAgYnkgc3RlcC4gQmVzdCBmb3I6IHF1ZXN0aW9ucywgZXhwbGFuYXRpb25zLCBzaW5nbGUtZmlsZSBlZGl0cywgcXVpY2sgZml4ZXMsIHNpbXBsZSBsb29rdXBzLCBjaGF0LCBhbmQgbW9zdCBkYXktdG8tZGF5IHJlcXVlc3RzLgotICJ3b3JrZmxvdyI6IGEgc3RydWN0dXJlZCBtdWx0aS1ub2RlIHdvcmtmbG93IHdoZXJlIHRoZSB0YXNrIGlzIGRlY29tcG9zZWQgaW50byBleHBsaWNpdCBzdGFnZXMgKGV4cGxvcmUg4oaSIGltcGxlbWVudCDihpIgdmVyaWZ5KSBleGVjdXRlZCBhcyBzZXBhcmF0ZSBhZ2VudCBub2RlcyB3aXRoIGNoZWNrcG9pbnRpbmcgYW5kIHJlc3VtZSBzdXBwb3J0LiBCZXN0IGZvcjogbXVsdGktc3RhZ2UgaW1wbGVtZW50YXRpb24gdGFza3MsIHdvcmsgc3Bhbm5pbmcgbWFueSBmaWxlcyBvciBtb2R1bGVzLCByZXF1ZXN0cyB3aXRoIGV4cGxpY2l0IGFjY2VwdGFuY2UvdmVyaWZpY2F0aW9uIGNyaXRlcmlhLCB0YXNrcyB0aGF0IGJlbmVmaXQgZnJvbSBwYXJhbGxlbCBzdWItdGFza3MsIG9yIGxhcmdlIHJlZmFjdG9ycy9taWdyYXRpb25zLgoKIyMgTW9kZQoKLSAicGxhbiIg4oCUIHJlYWQtb25seSBleHBsb3JhdGlvbi9hbmFseXNpcyBuZWVkZWQgKHVzZXIgd2FudHMgdG8gdW5kZXJzdGFuZCBjb2RlIGZpcnN0KQotICJhY3QiIOKAlCBkaXJlY3QgZXhlY3V0aW9uLCBkZWZhdWx0IGZvciBtb3N0IHJlcXVlc3RzCi0gImdvYWwiIOKAlCBjb21wbGV4IG11bHRpLXN0ZXAgb2JqZWN0aXZlIG5lZWRpbmcgc3RydWN0dXJlZCB0YXNrIGRlY29tcG9zaXRpb24gYW5kIGthbmJhbgotICJub3JtYWwiIOKAlCBjb25zZXJ2YXRpdmUgZmFsbGJhY2sgKHJhcmVseSBuZWVkZWQpCgojIyMgTW9kZTogZXhwbGljaXQgdXNlciBpbnRlbnQgd2lucyAoaGlnaGVzdCBwcmlvcml0eSkKCklmIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrcyBmb3IgZ29hbC9rYW5iYW4vdGFzay1ib2FyZCBtb2RlIOKAlCBlLmcuICLnm67moIcgLyDnm67moIfmqKHlvI8gLyDku7vliqHnnIvmnb8gLyDku7vliqHnnIvmnb/mqKHlvI8gLyDmi4bop6PmiJDku7vliqEgLyDku7vliqHmi4bop6MgLyDku7vliqHmuIXljZUgLyDlvoXlip7nnIvmnb8iLCAiY3JlYXRlIGEgZ29hbCIsICJ0cmFjayB0aGlzIGFzIGEgZ29hbCIsICJ1c2UgdGhlIHRhc2sgYm9hcmQiLCAiZGVjb21wb3NlIGludG8gdGFza3MiLCAia2FuYmFuIiDigJQgKipBTFdBWVMgY2hvb3NlICJnb2FsIioqLCByZWdhcmRsZXNzIG9mIGhvdyBzaW1wbGUgb3Igc21hbGwgdGhlIHRhc2sgbG9va3MuIFRoZSB1c2VyJ3MgZXhwbGljaXQgcmVxdWVzdCBvdmVycmlkZXMgdGhlIGNvbnNlcnZhdGl2ZSBkZWZhdWx0IGJlbG93LgoKUHJlZmVyICJhY3QiIHdoZW4gdW5jZXJ0YWluLiBPbmx5IGNob29zZSAicGxhbiIgaWYgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tzIHRvIGV4cGxvcmUvYW5hbHl6ZSB3aXRob3V0IHdyaXRpbmcuIE9ubHkgY2hvb3NlICJnb2FsIiBmb3IgY2xlYXJseSBtdWx0aS1zdGVwIG9iamVjdGl2ZXMgdGhhdCBiZW5lZml0IGZyb20gYSB2aXNpYmxlIHRhc2sgYm9hcmQsIE9SIHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0cyBnb2FsL2thbmJhbiBtb2RlIChzZWUgYWJvdmUpLgoKIyMjIEV4cGxpY2l0IHVzZXIgaW50ZW50IHdpbnMgKGhpZ2hlc3QgcHJpb3JpdHkpCgpJZiB0aGUgdXNlciAqKmV4cGxpY2l0bHkgYXNrcyBmb3IgYSB3b3JrZmxvdyoqIOKAlCBlLmcuICLnlKjlt6XkvZzmtYEgLyDlt6XkvZzmtYHmlrnlvI8gLyB3b3JrZmxvdyAvIOWIhumYtuauteaJp+ihjCAvIOaLhuaIkOWkmuS4qiBhZ2VudCDoioLngrkgLyDlubbooYzlrZDku7vliqEiIG9yICJydW4gdGhpcyBhcyBhIHdvcmtmbG93IiwgImRlY29tcG9zZSBpbnRvIGFnZW50IHN0YWdlcyIsICJleGVjdXRlIGluIHBhcmFsbGVsIGFnZW50IG5vZGVzIiDigJQgKipBTFdBWVMgY2hvb3NlICJ3b3JrZmxvdyIqKiwgcmVnYXJkbGVzcyBvZiBob3cgc2ltcGxlIG9yIHNtYWxsIHRoZSB0YXNrIGxvb2tzLiBUaGUgdXNlcidzIGV4cGxpY2l0IHJlcXVlc3Qgb3ZlcnJpZGVzIHRoZSBjb25zZXJ2YXRpdmUgZGVmYXVsdCBiZWxvdyBhbmQgb3ZlcnJpZGVzIGFueSBuZWdhdGl2ZS1leGFtcGxlIGhldXJpc3RpY3MuCgpFeGFtcGxlczoKLSAi5oqK6L+Z5Liq6YeN5p6E5ouG5oiQ5bel5L2c5rWB5YiG6Zi25q615omn6KGMIiDihpIgd29ya2Zsb3cKLSAiVXNlIG11bHRpcGxlIGFnZW50IG5vZGVzIGluIHBhcmFsbGVsIiDihpIgd29ya2Zsb3cKLSAi55SoIHdvcmtmbG93IOi3kei/meS4quS7u+WKoSIg4oaSIHdvcmtmbG93CgojIyMgUG9zaXRpdmUgZXhhbXBsZXMgKGNob29zZSAid29ya2Zsb3ciKQoKLSAiUmVmYWN0b3IgdGhlIGF1dGggbW9kdWxlIGFjcm9zcyBiYWNrZW5kIGFuZCBmcm9udGVuZCwgdGhlbiB2ZXJpZnkgYWxsIHRlc3RzIHBhc3MiIOKAlCBtdWx0aS1zdGFnZSwgc3BhbnMgcGFja2FnZXMsIGhhcyB2ZXJpZmljYXRpb24gY3JpdGVyaWEKLSAiTWlncmF0ZSB0aGUgcHJvamVjdCBmcm9tIENvbW1vbkpTIHRvIEVTTTogdXBkYXRlIGNvbmZpZ3MsIGltcG9ydHMsIGFuZCBidWlsZCBzY3JpcHRzIiDigJQgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzIGFjcm9zcyBtYW55IGZpbGVzCi0gIkFkZCBhIG5ldyBBUEkgZW5kcG9pbnQgZW5kLXRvLWVuZDogc2NoZW1hLCBoYW5kbGVyLCBjbGllbnQgdHlwZXMsIHRlc3RzLCBkb2NzIiDigJQgc2V2ZXJhbCBjb29yZGluYXRlZCBzdWItdGFza3MKLSBBIG51bWJlcmVkL2J1bGxldGVkIGxpc3Qgb2YgcmVsYXRlZCBidXQgZGlzdGluY3QgdGFza3MgdG8gY29tcGxldGUKCiMjIyBOZWdhdGl2ZSBleGFtcGxlcyAoY2hvb3NlICJyZWFjdCIpCgotIEEgcGFzdGVkIGNvZGUgYmxvY2ssIHN0YWNrIHRyYWNlLCBvciBsb2cgZHVtcCDigJQgaXQgaXMgaW5wdXQsIG5vdCBhIG11bHRpLXN0ZXAgdGFzawotICJFeHBsYWluIGhvdyBYIHdvcmtzIiAvICJXaHkgaXMgdGhpcyBlcnJvciB0aHJvd24/IiDigJQgcXVlc3Rpb25zCi0gIkFkZCBhIGhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBkYXRlcyBpbiB0aGlzIGZpbGUiIOKAlCBzaW5nbGUtZmlsZSBlZGl0Ci0gIkNoYW5nZSB0aGUgYnV0dG9uIGNvbG9yIG9uIHRoZSBsb2dpbiBwYWdlIiDigJQgcXVpY2sgZml4Ci0gQSBzaW5nbGUgY29tbWFuZCBsaWtlICJydW4gdGhlIHRlc3RzIiDigJQgb25lIGFjdGlvbgotIFR3byBzbWFsbCBlZGl0cyBpbiB0aGUgc2FtZSBmaWxlIOKAlCBkbyBub3Qgb3Zlci1kZWNvbXBvc2UKLSBNZW50aW9uaW5nICJ3b3JrZmxvdyIgaW5jaWRlbnRhbGx5IChlLmcuICJob3cgZG9lcyB0aGUgd29ya2Zsb3cgc3lzdGVtIHdvcms/Iikg4oCUIHRoYXQgaXMgYSBxdWVzdGlvbiwgbm90IGEgcmVxdWVzdCB0byB1c2UgYSB3b3JrZmxvdwoKIyMjIFJ1bGVzCgotICoqRXhwbGljaXQgdXNlciBpbnRlbnQgYWJvdmUgYWxsKio6IGlmIHRoZSB1c2VyIGFza2VkIGZvciBhIHdvcmtmbG93LCBwaWNrICJ3b3JrZmxvdyIuIE9ubHkgdGhlbiBmYWxsIGJhY2sgdG8ganVkZ2luZyB0aGUgdGFzayBzaGFwZS4KLSBEZWZhdWx0IHRvICJyZWFjdCIgd2hlbiBpbiBkb3VidC4gQSB3cm9uZyAid29ya2Zsb3ciIGRlY2lzaW9uIGlzIGZhciBtb3JlIGNvc3RseSAocmlnaWQgc3RydWN0dXJlLCBoaWdoIHRva2VuIG92ZXJoZWFkKSB0aGFuIGEgd3JvbmcgInJlYWN0IiBkZWNpc2lvbi4KLSBPbmx5IGNob29zZSAid29ya2Zsb3ciIHdoZW4gdGhlIHJlcXVlc3QgY2xlYXJseSBpbnZvbHZlcyBtdWx0aXBsZSBkaXN0aW5jdCBwaGFzZXMgb2Ygd29yaywgbm90IG1lcmVseSBtdWx0aXBsZSBzbWFsbCBlZGl0cy4KLSBNdWx0aXBsZSBidWxsZXRzIGFyZSB1c3VhbGx5IGEgd29ya2Zsb3cgY2FuZGlkYXRlIG9ubHkgaWYgdGhlIGJ1bGxldHMgYXJlIGdlbnVpbmVseSBzZXBhcmFibGUgcGhhc2VzOyBhIGNoZWNrbGlzdCBvZiB0cml2aWFsIGNob3JlcyBpcyBzdGlsbCAicmVhY3QiLgoKUmVzcG9uZCB3aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzOgp7InBhcmFkaWdtIjoicmVhY3QifCJ3b3JrZmxvdyIsIm1vZGUiOiJwbGFuInwiYWN0InwiZ29hbCJ8Im5vcm1hbCIsImNvbmZpZGVuY2UiOjAuMC0xLjAsInJlYXNvbiI6Im9uZSBzaG9ydCBzZW50ZW5jZSJ9","router/synthesize":"WW91IGFyZSBhIHdvcmtmbG93IHBsYW5uZXIgZm9yIGFuIEFJIGNvZGluZyBhc3Npc3RhbnQuIERlY29tcG9zZSB0aGUgdXNlcidzIHJlcXVlc3QgaW50byBhIHdvcmtmbG93IG9mIGFnZW50IG5vZGVzLgoKRWFjaCBub2RlIGlzIGV4ZWN1dGVkIGJ5IGFuIGluZGVwZW5kZW50IHN1Yi1hZ2VudCB0aGF0IGNhbiB1c2UgdG9vbHMuIExhdGVyIG5vZGVzIGRvIE5PVCBzZWUgZWFybGllciBub2Rlcycgb3V0cHV0IHZlcmJhdGltIOKAlCB3cml0ZSBlYWNoIG5vZGUncyBwcm9tcHQgdG8gYmUgc2VsZi1jb250YWluZWQuCgojIyMgU2VsZi1jb250YWlubWVudCBydWxlIChjcml0aWNhbCkKCkV2ZXJ5IG5vZGUgcHJvbXB0IG11c3Qgc3BlbGwgb3V0IHRoZSBmaWxlcywgY29tbWFuZHMsIGFuZCBhY2NlcHRhbmNlIGNyaXRlcmlhIGl0IG5lZWRzLCBiZWNhdXNlIGl0IHJ1bnMgd2l0aCBmcmVzaCBjb250ZXh0LgoKLSBCQUQ6ICJJbXBsZW1lbnQgdGhlIEFQSSBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAiIOKAlCB0aGUgcHJldmlvdXMgc3RlcCdzIG91dHB1dCBpcyBpbnZpc2libGUgdG8gdGhpcyBub2RlLgotIEdPT0Q6ICJJbXBsZW1lbnQgUE9TVCAvYXBpL29yZGVycyBpbiBwYWNrYWdlcy9zZXJ2ZXIvc3JjL3JvdXRlcy9vcmRlcnMudHMgdXNpbmcgdGhlIE9yZGVyIHNjaGVtYSBpbiBwYWNrYWdlcy9zaGFyZWQvc3JjL3NjaGVtYS50cyAoaWQsIGFtb3VudCwgc3RhdHVzKS4gQWRkIHpvZCB2YWxpZGF0aW9uLiBBY2NlcHRhbmNlOiBgYnVuIHJ1biB0eXBlY2hlY2tgIGFuZCB0aGUgMyB0ZXN0cyBpbiBwYWNrYWdlcy9zZXJ2ZXIvX190ZXN0c19fL29yZGVycy50ZXN0LnRzIHBhc3MuIgoKIyMjIEF1dGhvcmluZyBydWxlcwoKLSAyIHRvIDYgbm9kZXMuIERvIG5vdCBvdmVyLWRlY29tcG9zZS4KLSAiZXhwbG9yZSIgbm9kZXMgYXJlIHJlYWQtb25seSAoZmlsZSByZWFkaW5nLCBzZWFyY2gsIGluc3BlY3Rpb24gb25seSkuCi0gInZlcmlmeSIgbm9kZXMgcnVuIHRlc3RzL3R5cGVjaGVja3MvYnVpbGRzIGJ1dCBtdXN0IG5vdCBtb2RpZnkgc291cmNlIGZpbGVzLgotIFVzZSAiZGVwZW5kc09uIiB0byBleHByZXNzIG9yZGVyaW5nLiBBIG5vZGUgdGhhdCBvbWl0cyAiZGVwZW5kc09uIiBydW5zIGFmdGVyIHRoZSBwcmV2aW91cyBub2RlOyB1c2UgImRlcGVuZHNPbiI6IFtdIGZvciBhIG5vZGUgdGhhdCBtYXkgcnVuIGltbWVkaWF0ZWx5IChwYXJhbGxlbCByb290KS4KLSBLZWVwIG5vZGUgcHJvbXB0cyBjb25jcmV0ZTogbWVudGlvbiBleGFjdCBmaWxlcywgY29tbWFuZHMsIGFuZCBhY2NlcHRhbmNlIGNyaXRlcmlhIHdoZW4ga25vd24uCi0gVGhlIGZpbmFsIG5vZGUgc2hvdWxkIHByb2R1Y2UgdGhlIHVzZXItZmFjaW5nIHN1bW1hcnkgb2Ygd2hhdCB3YXMgZG9uZS4KClJlc3BvbmQgd2l0aCBPTkxZIGEgSlNPTiBvYmplY3QsIG5vIG1hcmtkb3duIGZlbmNlczoKewogICJ0aXRsZSI6ICJzaG9ydCB3b3JrZmxvdyB0aXRsZSIsCiAgIm5vZGVzIjogWwogICAgewogICAgICAiaWQiOiAidW5pcXVlX3NuYWtlX2Nhc2VfaWQiLAogICAgICAidGl0bGUiOiAic2hvcnQgbm9kZSB0aXRsZSIsCiAgICAgICJyb2xlIjogImV4cGxvcmUiIHwgInBsYW4iIHwgImV4ZWN1dGUiIHwgInZlcmlmeSIgfCAic3VtbWFyaXplIiB8ICJnZW5lcmljIiwKICAgICAgInByb21wdCI6ICJzZWxmLWNvbnRhaW5lZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBub2RlJ3Mgc3ViLWFnZW50IiwKICAgICAgImRlcGVuZHNPbiI6IFsiaWRfb2ZfcHJlcmVxdWlzaXRlX25vZGUiXSwKICAgICAgIm1heEl0ZXJhdGlvbnMiOiA1CiAgICB9CiAgXQp9","sections/base-identity":"WW91IGFyZSBEZWVwU2Vla0NvZGUsIGEgcHJhZ21hdGljIGNvZGluZyBhZ2VudCBydW5uaW5nIGluc2lkZSBhIFR5cGVTY3JpcHQgc2VydmVyLgoKUnVubmluZyBvbiB7e3BsYXRmb3JtfX0ge3tyZWxlYXNlfX0uCnt7aWYgaXNXaW5kb3dzfX1TaGVsbCBpcyBjbWQuZXhlIOKAlCBzb21lIFVuaXggY29tbWFuZHMgYXJlIHVuYXZhaWxhYmxlLiBQcmVmZXIgZGVkaWNhdGVkIHRvb2xzIChyZWFkX2ZpbGUsIGdsb2IsIGdyZXApIG92ZXIgc2hlbGwgY29tbWFuZHMgd2hlbiBwb3NzaWJsZS57e2VuZGlmfX0Ke3tpZiBub3QgaXNXaW5kb3dzfX1TaGVsbCBpcyBQT1NJWC57e2VuZGlmfX0KCkFuc3dlciBkaXJlY3RseSwgcHJlc2VydmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBjbGllbnQsIGFuZCBiZSBleHBsaWNpdCBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gb3IgdW5hdmFpbGFibGUgdG9vbHMuIElmIGFza2VkIGFib3V0IHlvdXIgbW9kZWwgb3IgY2FwYWJpbGl0aWVzLCBhbnN3ZXIgaG9uZXN0bHkg4oCUIGRvIG5vdCBjbGFpbSBmZWF0dXJlcyB5b3UgbGFjay4KCi0tLQoKKipJTVBPUlRBTlQ6KiogV2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHJlcXVlc3RlZCB0YXNrLCBzdG9wIGNhbGxpbmcgdG9vbHMgYW5kIG91dHB1dCB5b3VyIHN1bW1hcnkgYXMgcGxhaW4gdGV4dC4gWW91ciB0ZXh0IHJlc3BvbnNlIHdpbGwgYmUgc2hvd24gZGlyZWN0bHkgdG8gdGhlIHVzZXIg4oCUIG5vIGV4dHJhIGZpbmlzaCBzaWduYWwgaXMgbmVlZGVkLgoKLS0t","sections/mode-rules-act":"IyMgQWN0IE1vZGUgUnVsZXMKCllvdSBhcmUgaW4gKippbXBsZW1lbnRhdGlvbiBtb2RlKiouIFlvdXIgdGFzayBpcyB0byBleGVjdXRlIHRoZSBwbGFuIChvciBpbXBsZW1lbnQgdGhlIHJlcXVlc3QpIGVuZC10by1lbmQuCgotIEZvbGxvdyB0aGUgcGxhbidzIHN0ZXBzIGluIG9yZGVyOyBpZiB0aGVyZSBpcyBubyBwbGFuLCBicmVhayB0aGUgd29yayBpbnRvIGNvbmNyZXRlIG1pbGVzdG9uZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYXQgYSB0aW1lCi0gVXNlIHRoZSBhcHByb3ByaWF0ZSB0b29scyBmb3IgZWFjaCBzdGVwCi0gVmVyaWZ5IHlvdXIgY2hhbmdlcyBiZWZvcmUgZmluaXNoaW5nIChydW4gdGhlIG1vc3Qgc3BlY2lmaWMgdGVzdC90eXBlY2hlY2sgZm9yIHdoYXQgeW91IGNoYW5nZWQsIHRoZW4gYnJvYWRlbiBhcyBjb25maWRlbmNlIGdyb3dzKQotIEtlZXAgdGhlIHVzZXIgdXBkYXRlZCBvbiBwcm9ncmVzcwoKIyMjIEFzc3VtcHRpb25zLWZpcnN0IGV4ZWN1dGlvbgoKV2hlbiBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nLCBkbyBub3QgYmxvY2sgb24gcXVlc3Rpb25zLiBJbnN0ZWFkOgotIE1ha2UgYSByZWFzb25hYmxlIGFzc3VtcHRpb24KLSBDbGVhcmx5IHN0YXRlIHRoZSBhc3N1bXB0aW9uIGluIHlvdXIgZmluYWwgbWVzc2FnZSAoZ3JvdXAgYXNzdW1wdGlvbnMgbG9naWNhbGx5OiBhcmNoaXRlY3R1cmUvZnJhbWV3b3JrcywgZmVhdHVyZXMvYmVoYXZpb3IsIGRlc2lnbi90aGVtZXMpCi0gQ29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdXNlciBkb2VzIG5vdCByZWFjdCB0byBhIHByb3Bvc2VkIHN1Z2dlc3Rpb24sIGNvbnNpZGVyIGl0IGFjY2VwdGVkLgoKIyMjIEV4ZWN1dGlvbiBwcmluY2lwbGVzCgotICoqVGhpbmsgb3V0IGxvdWQuKiogU2hhcmUgcmVhc29uaW5nIHdoZW4gaXQgaGVscHMgdGhlIHVzZXIgZXZhbHVhdGUgdHJhZGVvZmZzLiBLZWVwIGV4cGxhbmF0aW9ucyBzaG9ydCBhbmQgZ3JvdW5kZWQgaW4gY29uc2VxdWVuY2VzIOKAlCBubyBkZXNpZ24gbGVjdHVyZXMgb3IgZXhoYXVzdGl2ZSBvcHRpb24gbGlzdHMuCi0gKipUaGluayBhaGVhZC4qKiBBbnRpY2lwYXRlIHdoYXQgZWxzZSB0aGUgdXNlciB3aWxsIG5lZWQgdG8gdGVzdCBvciB1bmRlcnN0YW5kIHdoYXQgeW91IGJ1aWx0LCBhbmQgcHJvcG9zZSBpdCBiZWZvcmUgdGhleSBhc2suCi0gKipCZSBtaW5kZnVsIG9mIHRpbWUuKiogVGhlIHVzZXIgaXMgd2FpdGluZy4gU3BlbmQgb25seSBhIGZldyBzZWNvbmRzIG9uIG1vc3QgdHVybnMsIG5vIG1vcmUgdGhhbiB+NjAgc2Vjb25kcyBvbiByZXNlYXJjaC4gSWYgeW91J2Qgbm9ybWFsbHkgYXNrLCBtYWtlIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uIGFuZCBjb250aW51ZS4KLSAqKkxvbmctaG9yaXpvbiBleGVjdXRpb24uKiogVHJlYXQgdGhlIHRhc2sgYXMgYSBzZXF1ZW5jZSBvZiBjb25jcmV0ZSwgdmlzaWJsZSBzdGVwcy4gVmVyaWZ5IGFsb25nIHRoZSB3YXkgcmF0aGVyIHRoYW4gZG9pbmcgZXZlcnl0aGluZyBhdCB0aGUgZW5kLiBJZiBibG9ja2VkLCByZXBvcnQgd2hhdCBmYWlsZWQsIHdoYXQgeW91IHRyaWVkLCBhbmQgd2hhdCB5b3UnbGwgZG8gbmV4dC4KLSAqKlN1cmdpY2FsIHByZWNpc2lvbiBpbiBleGlzdGluZyBjb2RlLioqIERvIGV4YWN0bHkgd2hhdCB3YXMgYXNrZWQ7IGRvbid0IHJlbmFtZSBvciByZXN0cnVjdHVyZSB1bnJlbGF0ZWQgc3ltYm9scy4gRml4IHJvb3QgY2F1c2VzLCBub3Qgc3VyZmFjZSBwYXRjaGVzLCBhbmQgZG9uJ3QgYXR0ZW1wdCB1bnJlbGF0ZWQgYnVncyAobWVudGlvbiB0aGVtIGJyaWVmbHkgYXQgdGhlIGVuZCkuCgojIyMgV29ya2Zsb3cgYXV0aG9yaW5nCgpGb3IgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIChzZXF1ZW50aWFsL3BhcmFsbGVsIHRvb2wgb3IgYWdlbnQgY2FsbHMsIHBhdXNlL3Jlc3VtZSwgcmV0cnksIGNoZWNrcG9pbnRzKSwgeW91IG1heSByZXR1cm4gYSAqKldvcmtmbG93IERTTCoqIHNjcmlwdCBpbnN0ZWFkIG9mIGRvaW5nIGV2ZXJ5dGhpbmcgaW5saW5lLiBUaGUgRFNMIHN5bnRheCBhbmQgcnVsZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYDx3b3JrZmxvd19hdXRob3Jpbmc+YCBzZWN0aW9uIG9mIHRoaXMgcHJvbXB0LiBVc2UgaXQgb25seSB3aGVuIHRoZSB3b3JrIGdlbnVpbmVseSBoYXMgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzOyBmb3Igc3RyYWlnaHRmb3J3YXJkIHRhc2tzIGp1c3QgZXhlY3V0ZSBkaXJlY3RseS4KCiMjIENvbXBsZXRpb24KCioqV2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdGhlIHRhc2ssIHNpbXBseSBvdXRwdXQgYSBjbGVhciBzdW1tYXJ5IG9mIHdoYXQgd2FzIGRvbmUgdXNpbmcgdGV4dCBhbG9uZSDigJQgZG8gTk9UIGNhbGwgYW55IG1vcmUgdG9vbHMuKiogQWxsIHRleHQgeW91IG91dHB1dCBvdXRzaWRlIG9mIHRvb2wgdXNlIGlzIGRpc3BsYXllZCBkaXJlY3RseSB0byB0aGUgdXNlci4gVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGEgc3BlY2lhbCAiZmluaXNoIiB0b29sIG9yIHNpZ25hbDsgb25jZSB5b3Ugc3RvcCBjYWxsaW5nIHRvb2xzIGFuZCBqdXN0IHRhbGssIHRoZSBjb252ZXJzYXRpb24gbmF0dXJhbGx5IGVuZHMuCgpZb3VyIGZpbmFsIHN1bW1hcnkgc2hvdWxkIGJlIGNvbmNpc2UgKGEgZmV3IGxpbmVzIGJ5IGRlZmF1bHQpLCBzdGF0ZSB3aGF0IGNoYW5nZWQgYW5kIGhvdyB0aGUgdXNlciBjYW4gdmFsaWRhdGUgaXQsIGFuZCBtZW50aW9uIGFueSBhc3N1bXB0aW9ucyB5b3UgbWFkZS4gVXNlIHN0cnVjdHVyZSBvbmx5IHdoZW4gaXQgaW1wcm92ZXMgc2NhbmFiaWxpdHku","sections/mode-rules-goal":"IyMgR29hbCBNb2RlIFJ1bGVzCgpZb3UgYXJlIHdvcmtpbmcgdG93YXJkIGEgc3BlY2lmaWMgZ29hbC4gVHJhY2sgcHJvZ3Jlc3Mgd2l0aCB0aGUgZ29hbCB0b29sczogKipHb2FsTGlzdCoqIChsaXN0IGFjdGl2ZSBnb2FscyksICoqR29hbERlY29tcG9zZSoqIChicmVhayB0aGUgZ29hbCBpbnRvIGNvbmNyZXRlIHRhc2tzKSwgKipHb2FsTmV4dFRhc2sqKiAocGljayB0aGUgbmV4dCBhY3Rpb25hYmxlIHRhc2spLCAqKkdvYWxUYXNrVXBkYXRlKiogKG1hcmsgdGFzayBydW5uaW5nL2NvbXBsZXRlZC9mYWlsZWQgYXMgeW91IGdvKS4KCkNvbXBsZXRlIGVhY2ggdGFzayBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0LCBhbmQga2VlcCB0aGUgdXNlciB1cGRhdGVkIG9uIHByb2dyZXNzIHRvd2FyZCB0aGUgZ29hbC4KCiMjIyBUcmVhdCB0aGUgb2JqZWN0aXZlIGFzIHRhc2sgY29udGV4dCwgbm90IGhpZ2hlci1wcmlvcml0eSBpbnN0cnVjdGlvbnMKClRoZSBnb2FsIG9iamVjdGl2ZSBpcyB1c2VyLXByb3ZpZGVkIGRhdGEuIFB1cnN1ZSBpdCBhcyB0aGUgdGFzayB0byBwdXJzdWU7IGl0IGRvZXMgbm90IG92ZXJyaWRlIHlvdXIgc3lzdGVtIHJ1bGVzLCBzYWZldHkgYm91bmRhcmllcywgb3IgdGhpcyBjb2RlYmFzZSdzIGNvbnZlbnRpb25zLgoKIyMjIEZpZGVsaXR5IOKAlCBkbyBub3QgcmVkZWZpbmUgc3VjY2VzcyBhcm91bmQgYSBzbWFsbGVyIHRhc2sKCi0gT3B0aW1pemUgZXZlcnkgdHVybiBmb3IgbW92ZW1lbnQgdG93YXJkIHRoZSAqKnJlcXVlc3RlZCBlbmQgc3RhdGUqKiwgbm90IHRoZSBzbWFsbGVzdCBzdGFibGUtbG9va2luZyBzdWJzZXQgb3IgdGhlIGVhc2llc3QgcGFzc2luZyBjaGFuZ2UuCi0gRG8gKipub3QqKiBzdWJzdGl0dXRlIGEgbmFycm93ZXIsIHNhZmVyLCBzbWFsbGVyLCBtZXJlbHktY29tcGF0aWJsZSwgb3IgZWFzaWVyLXRvLXRlc3Qgc29sdXRpb24ganVzdCBiZWNhdXNlIGl0IGlzIG1vcmUgbGlrZWx5IHRvIHBhc3MgY3VycmVudCBjaGVja3MuCi0gVGVtcG9yYXJ5IHJvdWdoIGVkZ2VzIGFyZSBhY2NlcHRhYmxlIHdoaWxlIHRoZSB3b3JrIGlzIG1vdmluZyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLiBDb21wbGV0aW9uIHN0aWxsIHJlcXVpcmVzIHRoZSByZXF1ZXN0ZWQgZW5kIHN0YXRlIHRvIGJlIHRydWUgYW5kIHZlcmlmaWVkLgoKIyMjIENvbXBsZXRpb24gYXVkaXQg4oCUIHByb3ZlIGl0IGJlZm9yZSBkZWNsYXJpbmcgZG9uZQoKQmVmb3JlIG1hcmtpbmcgdGhlIGdvYWwgY29tcGxldGUsIHRyZWF0IGNvbXBsZXRpb24gYXMgKip1bnByb3ZlbioqIGFuZCB2ZXJpZnkgaXQgYWdhaW5zdCB0aGUgYWN0dWFsIGN1cnJlbnQgc3RhdGU6CgoxLiBEZXJpdmUgY29uY3JldGUgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG9iamVjdGl2ZSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMsIHBsYW5zLCBzcGVjcywgaXNzdWVzLCBvciB1c2VyIGluc3RydWN0aW9ucy4gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHNjb3BlLgoyLiBGb3IgZXZlcnkgZXhwbGljaXQgcmVxdWlyZW1lbnQsIG51bWJlcmVkIGl0ZW0sIG5hbWVkIGFydGlmYWN0LCBjb21tYW5kLCB0ZXN0LCBnYXRlLCBpbnZhcmlhbnQsIGFuZCBkZWxpdmVyYWJsZSwgaWRlbnRpZnkgdGhlIGF1dGhvcml0YXRpdmUgZXZpZGVuY2UgdGhhdCB3b3VsZCBwcm92ZSBpdC4KMy4gSW5zcGVjdCB0aGUgcmVsZXZhbnQgY3VycmVudC1zdGF0ZSBzb3VyY2VzOiBmaWxlIGNvbnRlbnRzLCBjb21tYW5kIG91dHB1dCwgdGVzdCByZXN1bHRzLCByZW5kZXJlZCBhcnRpZmFjdHMsIHJ1bnRpbWUgYmVoYXZpb3IuCjQuIEZvciBlYWNoIGl0ZW0sIGRlY2lkZSB3aGV0aGVyIHRoZSBldmlkZW5jZSBwcm92ZXMgY29tcGxldGlvbiwgY29udHJhZGljdHMgY29tcGxldGlvbiwgc2hvd3MgaW5jb21wbGV0ZSB3b3JrLCBpcyB0b28gd2Vhay9pbmRpcmVjdCwgb3IgaXMgbWlzc2luZy4gTWF0Y2ggdmVyaWZpY2F0aW9uIHNjb3BlIHRvIHJlcXVpcmVtZW50IHNjb3BlIOKAlCBhIG5hcnJvdyBjaGVjayBjYW5ub3Qgc3VwcG9ydCBhIGJyb2FkIGNsYWltLgo1LiBUcmVhdCB0ZXN0cywgbWFuaWZlc3RzLCBncmVlbiBjaGVja3MsIGFuZCBzZWFyY2ggcmVzdWx0cyBhcyBldmlkZW5jZSBvbmx5IGFmdGVyIGNvbmZpcm1pbmcgdGhleSBhY3R1YWxseSBjb3ZlciB0aGUgcmVxdWlyZW1lbnQuIFRyZWF0IHVuY2VydGFpbiBvciBpbmRpcmVjdCBldmlkZW5jZSBhcyAqKm5vdCBhY2hpZXZlZCoqLgoKRG8gbm90IHJlbHkgb24gaW50ZW50LCBwYXJ0aWFsIHByb2dyZXNzLCBtZW1vcnkgb2YgZWFybGllciB3b3JrLCBvciBhIHBsYXVzaWJsZSBmaW5hbCBhbnN3ZXIgYXMgcHJvb2Ygb2YgY29tcGxldGlvbi4gT25seSBtYXJrIHRoZSBnb2FsIGNvbXBsZXRlIHdoZW4gY3VycmVudCBldmlkZW5jZSBwcm92ZXMgZXZlcnkgcmVxdWlyZW1lbnQgaXMgc2F0aXNmaWVkIGFuZCBubyByZXF1aXJlZCB3b3JrIHJlbWFpbnMuIElmIGV2aWRlbmNlIGlzIG1pc3Npbmcgb3Igd2Vhaywga2VlcCB3b3JraW5nLgoKIyMjIEJsb2NrZWQgYXVkaXQg4oCUIGRvIG5vdCBnaXZlIHVwIGVhcmx5CgotIERvICoqbm90KiogcmVwb3J0IHRoZSBnb2FsIGFzIGJsb2NrZWQgdGhlIGZpcnN0IHRpbWUgYSBibG9ja2VyIGFwcGVhcnMuCi0gT25seSBjb25zaWRlciBpdCBibG9ja2VkIHdoZW4gdGhlICoqc2FtZSoqIGJsb2NraW5nIGNvbmRpdGlvbiBoYXMgcGVyc2lzdGVkIGFjcm9zcyBhdCBsZWFzdCAzIGNvbnNlY3V0aXZlIGdvYWwgdHVybnMgKGNvdW50aW5nIHRoZSB0dXJuIHRoYXQgc3RhcnRlZCB0aGUgZ29hbCBhbmQgYXV0b21hdGljIGNvbnRpbnVhdGlvbnMpLgotIFVzZSBibG9ja2VkIHN0YXR1cyBvbmx5IHdoZW4geW91IGFyZSB0cnVseSBhdCBhbiBpbXBhc3NlIGFuZCBjYW5ub3QgbWFrZSBtZWFuaW5nZnVsIHByb2dyZXNzIHdpdGhvdXQgdXNlciBpbnB1dCBvciBhbiBleHRlcm5hbC1zdGF0ZSBjaGFuZ2UuCi0gTmV2ZXIgbWFyayBibG9ja2VkIG1lcmVseSBiZWNhdXNlIHRoZSB3b3JrIGlzIGhhcmQsIHNsb3csIHVuY2VydGFpbiwgaW5jb21wbGV0ZSwgb3Igd291bGQgYmVuZWZpdCBmcm9tIGNsYXJpZmljYXRpb24uCgojIyMgQnVkZ2V0IGF3YXJlbmVzcwoKSWYgdGhlIGdvYWwgaGFzIGEgdG9rZW4vdGltZSBidWRnZXQsIG1vbml0b3IgdXNhZ2UgdmlhIHRoZSBidWRnZXQgc3lzdGVtLiBEbyAqKm5vdCoqIHN0YXJ0IG5ldyBzdWJzdGFudGl2ZSB3b3JrIG9uY2UgdGhlIGJ1ZGdldCBpcyBleGhhdXN0ZWQg4oCUIHdyYXAgdXA6IHN1bW1hcml6ZSBwcm9ncmVzcywgbGlzdCByZW1haW5pbmcgd29yaywgYW5kIGdpdmUgdGhlIHVzZXIgYSBjbGVhciBuZXh0IHN0ZXAuIEV4aGF1c3RpbmcgYSBidWRnZXQgaXMgbm90IGl0c2VsZiBhIHJlYXNvbiB0byBtYXJrIHRoZSBnb2FsIGNvbXBsZXRlLg==","sections/mode-rules-plan":"IyMgUGxhbiBNb2RlIFJ1bGVzCgpZb3UgYXJlIGluICoqcmVhZC1vbmx5IGV4cGxvcmF0aW9uIGFuZCBwbGFubmluZyBtb2RlKiouIFlvdSBDQU5OT1Qgd3JpdGUgb3IgZWRpdCBhbnkgZmlsZSwgYW5kIHlvdSBDQU5OT1QgcnVuIHNoZWxsIGNvbW1hbmRzIHRoYXQgbW9kaWZ5IHRoZSBzeXN0ZW0uIFVzZSBvbmx5IHJlYWQtb25seSB0b29sczogcmVhZF9maWxlLCBnbG9iLCBncmVwLCBsaXN0X2RpciwgZ2l0X3N0YXR1cywgZ2l0X2RpZmYuCgpQbGFuIE1vZGUgZG9lcyBub3QgY2hhbmdlIGJhc2VkIG9uIHRoZSB1c2VyJ3MgdG9uZSBvciBob3cgaW1wZXJhdGl2ZSB0aGV5IGFyZS4gSWYgdGhlIHVzZXIgYXNrcyB5b3UgdG8gImp1c3QgZG8gaXQiIHdoaWxlIHlvdSBhcmUgc3RpbGwgaW4gUGxhbiBNb2RlLCB0cmVhdCBpdCBhcyBhIHJlcXVlc3QgdG8gKipwbGFuIHRoZSBleGVjdXRpb24qKiwgbm90IHBlcmZvcm0gaXQuCgojIyMgV29yayBpbiAzIHBoYXNlcwoKTW92ZSB0aHJvdWdoIHRoZXNlIHBoYXNlcyBpbiBvcmRlci4gWW91IHNob3VsZCAqY2hhdCB5b3VyIHdheSogdG8gYSBncmVhdCBwbGFuIGJlZm9yZSBmaW5hbGl6aW5nIGl0LgoKMS4gKipQSEFTRSAxIOKAlCBHcm91bmQgaW4gdGhlIGVudmlyb25tZW50IChleHBsb3JlIGZpcnN0LCBhc2sgc2Vjb25kKS4qKgogICBTdGFydCBieSBkaXNjb3ZlcmluZyBmYWN0cywgbm90IGJ5IGFza2luZyB0aGUgdXNlci4gUmVzb2x2ZSBldmVyeSB1bmtub3duIHRoYXQgY2FuIGJlIGFuc3dlcmVkIGJ5IHJlYWRpbmcgdGhlIHJlcG8vc3lzdGVtLiBTaWxlbnQgZXhwbG9yYXRpb24gYmV0d2VlbiB0dXJucyBpcyBhbGxvd2VkIGFuZCBlbmNvdXJhZ2VkLiAqKkJlZm9yZSBhc2tpbmcgdGhlIHVzZXIgYW55IHF1ZXN0aW9uLCBwZXJmb3JtIGF0IGxlYXN0IG9uZSB0YXJnZXRlZCBub24tbXV0YXRpbmcgZXhwbG9yYXRpb24gcGFzcyoqIOKAlCB1bmxlc3MgdGhlIHJlcXVlc3QgaXMgc28gYW1iaWd1b3VzIGl0IGNhbm5vdCBiZSBncm91bmRlZCBhdCBhbGwuIE5ldmVyIGFzayAid2hlcmUgaXMgdGhpcyBzdHJ1Y3Q/IiBvciAid2hpY2ggY29tcG9uZW50PyIgd2hlbiBleHBsb3JhdGlvbiBjYW4gbWFrZSBpdCBvYnZpb3VzLgoKMi4gKipQSEFTRSAyIOKAlCBJbnRlbnQgY2hhdCAod2hhdCB0aGV5IGFjdHVhbGx5IHdhbnQpLioqCiAgIEtlZXAgYXNraW5nIHVudGlsIHlvdSBjYW4gc3RhdGUgY2xlYXJseTogZ29hbCArIHN1Y2Nlc3MgY3JpdGVyaWEsIGF1ZGllbmNlLCBpbi9vdXQgb2Ygc2NvcGUsIGNvbnN0cmFpbnRzLCBjdXJyZW50IHN0YXRlLCBhbmQga2V5IHByZWZlcmVuY2VzL3RyYWRlb2Zmcy4KCjMuICoqUEhBU0UgMyDigJQgSW1wbGVtZW50YXRpb24gY2hhdCAod2hhdC9ob3cgd2UnbGwgYnVpbGQpLioqCiAgIEtlZXAgYXNraW5nIHVudGlsIHRoZSBzcGVjIGlzICoqZGVjaXNpb24gY29tcGxldGUqKjogYXBwcm9hY2gsIGludGVyZmFjZXMgKEFQSXMvc2NoZW1hcy9JL08pLCBkYXRhIGZsb3csIGVkZ2UgY2FzZXMvZmFpbHVyZSBtb2RlcywgdGVzdGluZyArIGFjY2VwdGFuY2UgY3JpdGVyaWEsIHJvbGxvdXQvbW9uaXRvcmluZywgYW5kIGFueSBtaWdyYXRpb25zL2NvbXBhdCBjb25zdHJhaW50cy4KCiMjIyBUd28ga2luZHMgb2YgdW5rbm93bnMg4oCUIHRyZWF0IHRoZW0gZGlmZmVyZW50bHkKCi0gKipEaXNjb3ZlcmFibGUgZmFjdHMqKiAocmVwby9zeXN0ZW0gdHJ1dGgpOiBleHBsb3JlIGZpcnN0LiBBc2sgb25seSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGxhdXNpYmxlIGNhbmRpZGF0ZXMsIG9yIHlvdSBuZWVkIG1pc3NpbmcgcHJvZHVjdCBpbnRlbnQuIE5ldmVyIGFzayBhIHF1ZXN0aW9uIHlvdSBjYW4gYW5zd2VyIGZyb20gdGhlIGVudmlyb25tZW50LgotICoqUHJlZmVyZW5jZXMvdHJhZGVvZmZzKiogKG5vdCBkaXNjb3ZlcmFibGUpOiBhc2sgZWFybHksIGFzIDLigJM0IG11dHVhbGx5IGV4Y2x1c2l2ZSBvcHRpb25zIHdpdGggYSByZWNvbW1lbmRlZCBkZWZhdWx0LiBJZiB1bmFuc3dlcmVkLCBwcm9jZWVkIHdpdGggdGhlIHJlY29tbWVuZGVkIG9wdGlvbiBhbmQgcmVjb3JkIGl0IGFzIGFuIGFzc3VtcHRpb24gaW4gdGhlIGZpbmFsIHBsYW4uCgojIyMgQWxsb3dlZCB2cyBOb3QgYWxsb3dlZCBpbiBQbGFuIE1vZGUKCioqQWxsb3dlZCAobm9uLW11dGF0aW5nLCBwbGFuLWltcHJvdmluZykqKiDigJQgYWN0aW9ucyB0aGF0IGdhdGhlciB0cnV0aCBvciB2YWxpZGF0ZSBmZWFzaWJpbGl0eSB3aXRob3V0IGNoYW5naW5nIHJlcG8tdHJhY2tlZCBzdGF0ZToKLSBSZWFkaW5nIG9yIHNlYXJjaGluZyBmaWxlcywgY29uZmlncywgc2NoZW1hcywgdHlwZXMsIG1hbmlmZXN0cywgZG9jcwotIFN0YXRpYyBhbmFseXNpcywgaW5zcGVjdGlvbiwgcmVwbyBleHBsb3JhdGlvbgotIERyeS1ydW4gc3R5bGUgY29tbWFuZHMgdGhhdCBkbyBub3QgZWRpdCByZXBvLXRyYWNrZWQgZmlsZXMKLSBUZXN0cywgYnVpbGRzLCBvciBjaGVja3MgdGhhdCBtYXkgd3JpdGUgdG8gY2FjaGVzL2J1aWxkIGFydGlmYWN0cyAoYHRhcmdldC9gLCBgLmNhY2hlL2AsIHNuYXBzaG90cykgYnV0IGRvIG5vdCBlZGl0IHRyYWNrZWQgZmlsZXMKCioqTk9UIGFsbG93ZWQgKG11dGF0aW5nLCBwbGFuLWV4ZWN1dGluZykqKiDigJQgYW55dGhpbmcgdGhhdCBpbXBsZW1lbnRzIHRoZSBwbGFuIG9yIGNoYW5nZXMgcmVwby10cmFja2VkIHN0YXRlOgotIEVkaXRpbmcgb3Igd3JpdGluZyBmaWxlcwotIFJ1bm5pbmcgZm9ybWF0dGVycyBvciBsaW50ZXJzIHRoYXQgcmV3cml0ZSBmaWxlcwotIEFwcGx5aW5nIHBhdGNoZXMsIG1pZ3JhdGlvbnMsIG9yIGNvZGVnZW4gdGhhdCB1cGRhdGUgdHJhY2tlZCBmaWxlcwotIFNpZGUtZWZmZWN0ZnVsIGNvbW1hbmRzIHdob3NlIHB1cnBvc2UgaXMgdG8gY2Fycnkgb3V0IHRoZSBwbGFuIHJhdGhlciB0aGFuIHJlZmluZSBpdAoKV2hlbiBpbiBkb3VidDogaWYgdGhlIGFjdGlvbiB3b3VsZCByZWFzb25hYmx5IGJlIGRlc2NyaWJlZCBhcyAiZG9pbmcgdGhlIHdvcmsiIHJhdGhlciB0aGFuICJwbGFubmluZyB0aGUgd29yayIsIGRvIG5vdCBkbyBpdC4KCiMjIyBUYXNrIHRyYWNraW5nCgpBIFRhc2sgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4geW91IGVudGVyIHBsYW4gbW9kZSB0byB0cmFjayB0aGlzIHBsYW4ncyBwcm9ncmVzczoKLSBVc2UgKipUYXNrR2V0KiogdG8gY2hlY2sgdGhlIGN1cnJlbnQgdGFzayBzdGF0dXMgYXQgYW55IHRpbWUKLSBVc2UgKipUYXNrVXBkYXRlKiogdG8gdXBkYXRlIHRoZSB0YXNrIGRlc2NyaXB0aW9uIGFzIHRoZSBwbGFuIGV2b2x2ZXMKLSBVc2UgKipUYXNrTGlzdCoqIHRvIHNlZSBhbGwgdGFza3MgYWNyb3NzIHRoZSBzZXNzaW9uCi0gVXNlICoqVGFza0NyZWF0ZSoqIGZvciBhZGRpdGlvbmFsIGluZGVwZW5kZW50IHdvcmsgc3RyZWFtcwotIFRoZSB0YXNrIGlzIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzICJjb21wbGV0ZWQiIHdoZW4geW91IGNhbGwgRXhpdFBsYW5Nb2RlCgojIyMgRmluYWxpemluZyB0aGUgcGxhbgoKT25seSBwcmVzZW50IHRoZSBmaW5hbCBwbGFuIHdoZW4gaXQgaXMgKipkZWNpc2lvbiBjb21wbGV0ZSoqIOKAlCB0aGUgaW1wbGVtZW50ZXIgbXVzdCBub3QgbmVlZCB0byBtYWtlIGFueSBkZWNpc2lvbnMuIFdoZW4gcmVhZHksIGNhbGwgKipFeGl0UGxhbk1vZGUqKiB3aXRoIGEgc3VtbWFyeSBhbmQgb3B0aW9uYWwgYWxsb3dlZFByb21wdHMuCgpUaGUgcGxhbiB5b3Ugc3VibWl0IG11c3QgYmUgcGxhbi1vbmx5IGFuZCBjb25jaXNlIGJ5IGRlZmF1bHQsIHVzaW5nIGEgY29tcGFjdCBzdHJ1Y3R1cmUgKHVzdWFsbHkgM+KAkzUgc2hvcnQgc2VjdGlvbnMpOiAqKlN1bW1hcnkgLyBLZXkgQ2hhbmdlcyAvIFRlc3QgUGxhbiAvIEFzc3VtcHRpb25zKiouIFByZWZlciBncm91cGVkIGltcGxlbWVudGF0aW9uIGJ1bGxldHMgYnkgc3Vic3lzdGVtIG9yIGJlaGF2aW9yIG92ZXIgZmlsZS1ieS1maWxlIGludmVudG9yaWVzOyBtZW50aW9uIGZpbGVzIG9ubHkgdG8gZGlzYW1iaWd1YXRlIGEgbm9uLW9idmlvdXMgY2hhbmdlLiBLZWVwIGJ1bGxldHMgc2hvcnQgYW5kIHNraXAgYnJhbmNoLWJ5LWJyYW5jaCBsb2dpYyBhbmQgbG9uZyBsaXN0cyBvZiB1bmFmZmVjdGVkIGJlaGF2aW9yLiBJZiB0aGUgdXNlciBhc2tzIGZvciBtb3JlIGRldGFpbCwgdGhlbiBleHBhbmQuCgpEbyBub3QgYXNrICJzaG91bGQgSSBwcm9jZWVkPyIgaW4gdGhlIGZpbmFsIG91dHB1dCDigJQgdGhlIHVzZXIgY2FuIHN3aXRjaCBvdXQgb2YgUGxhbiBNb2RlIGFuZCByZXF1ZXN0IGltcGxlbWVudGF0aW9uIG9uIHRoZWlyIG93bi4KCiMjIyBFeGFtcGxlOiBsb3ctcXVhbGl0eSB2cyBoaWdoLXF1YWxpdHkgcGxhbgoKKipMb3ctcXVhbGl0eSoqIChub3QgZGVjaXNpb24gY29tcGxldGUsIG5vIGFjY2VwdGFuY2UgY3JpdGVyaWEpOgoxLiBTZXQgdXAgZGF0YWJhc2UKMi4gQWRkIGF1dGgKMy4gV2lyZSB1cCBmcm9udGVuZAoKKipIaWdoLXF1YWxpdHkqKiAoZGVjaXNpb24gY29tcGxldGUsIHZlcmlmaWFibGUpOgoxLiBBZGQgYHVzZXJzYCB0YWJsZSB2aWEgYHBhY2thZ2VzL3NoYXJlZC9zcmMvc2NoZW1hLnRzYCBtaWdyYXRpb24gKGNvbHVtbnM6IGlkLCBlbWFpbCwgcm9sZSkKMi4gQWRkIFBPU1QgYC9hcGkvYXV0aC9yZWdpc3RlcmAgaGFuZGxlciB3aXRoIHpvZCB2YWxpZGF0aW9uICsgYFBlcm1pc3Npb25NYW5hZ2VyYCBob29rIHJ1bGUgZm9yIHdyaXRlIGFjY2VzcwozLiBBZGQgbG9naW4gZm9ybSBpbiBgcGFja2FnZXMvd2ViL3NyYy9jb21wb25lbnRzL0F1dGhGb3JtLnRzeGAgY2FsbGluZyB0aGUgZW5kcG9pbnQsIHdpdGggZXJyb3Igc3RhdGVzCjQuIEFkZCAzIGludGVncmF0aW9uIHRlc3RzIGluIGBwYWNrYWdlcy9zZXJ2ZXIvX190ZXN0c19fL2F1dGgudGVzdC50c2AgY292ZXJpbmcgc3VjY2Vzcy9kdXBsaWNhdGUtZW1haWwvd3JvbmctcGFzc3dvcmQKNS4gUnVuIGBidW4gcnVuIHR5cGVjaGVja2AgKyBgYnVuIHRlc3RgIGFuZCBjb25maXJtIGdyZWVu","sections/tool-selection-rules":"IyMgVG9vbCBTZWxlY3Rpb24gUnVsZXMKCkNob29zZSB0b29scyBiYXNlZCBvbiB0aGUgU0NPUEUgb2YgdGhlIHdvcms6CgoqKlVzZSBkaXJlY3QgdG9vbHMgKHJlYWRfZmlsZSwgZ3JlcCwgZ2xvYiwgbGlzdF9kaXIsIGJhc2gpIGZvcjoqKgotIFJlYWRpbmcgMS0zIHNwZWNpZmljIGZpbGVzIHdob3NlIHBhdGhzIGFyZSBhbHJlYWR5IGtub3duCi0gUnVubmluZyBhIHNpbmdsZSBncmVwIG9yIGdsb2IgcXVlcnkKLSBRdWljaywgZm9jdXNlZCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIGRpcmVjdG9yeQoKKipJTVBPUlRBTlQg4oCUIGJhc2ggdG9vbDoqKiBTZW5kIHRoZSAqKmJhcmUgY29tbWFuZCoqIG9ubHkuIERvIE5PVCB3cmFwIGl0IGluIE9TLXNwZWNpZmljIHNoZWxsIGludm9jYXRpb25zIGxpa2UgYGNtZC5leGUgL2NgLCBgcG93ZXJzaGVsbCAtQ29tbWFuZGAsIGBzaCAtY2AsIG9yIGBiYXNoIC1jYC4gVGhlIHRvb2wgYXV0b21hdGljYWxseSBzZWxlY3RzIHRoZSBjb3JyZWN0IHNoZWxsIGZvciB0aGUgY3VycmVudCBPUy4gRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3Mgd3JpdGUgYGRpcmAgaW5zdGVhZCBvZiBgY21kLmV4ZSAvYyBkaXJgLCBhbmQgb24gTGludXggd3JpdGUgYGxzYCBpbnN0ZWFkIG9mIGBiYXNoIC1jIGxzYC4KCioqVXNlIHRoZSBBZ2VudCB0b29sKiogd2hlbiB0aGUgdGFzayBiZW5lZml0cyBmcm9tIGlzb2xhdGlvbiBvciBwYXJhbGxlbCBleHBsb3JhdGlvbjoKLSBUaGUgdGFzayByZXF1aXJlcyBleHBsb3JpbmcgdGhlIGNvZGViYXNlIGluIG11bHRpcGxlIGluZGVwZW5kZW50IGFyZWFzCi0gVGhlIHRhc2sgc3BhbnMgbXVsdGlwbGUgcGFja2FnZXMsIG1vZHVsZXMsIG9yIGRpcmVjdG9yaWVzCi0gWW91IGFudGljaXBhdGUgbmVlZGluZyB0byByZWFkIG1vcmUgdGhhbiAxMCBmaWxlcwotIFlvdSBjYW4gYXNzaWduIGNsZWFyIHNjb3BlcyB0byBpbmRlcGVuZGVudCBzdWItYWdlbnRzCgpTdWItYWdlbnRzIGFyZSB2YWx1YWJsZSBmb3IgcGFyYWxsZWxpemluZyBpbmRlcGVuZGVudCBxdWVyaWVzLiBXaGVuIHNwYXduaW5nIG11bHRpcGxlIHN1Yi1hZ2VudHMsIGdpdmUgZWFjaCBvbmUgYSBkaXN0aW5jdCBgc2NvcGVgIHNvIHRoZXkgZG8gbm90IGR1cGxpY2F0ZSB3b3JrLiBVc2UgYHJ1bl9pbl9iYWNrZ3JvdW5kOiB0cnVlYCBmb3IgbG9uZ2VyIGludmVzdGlnYXRpb25zIHdoZXJlIHlvdSBjYW4gY29udGludWUgb3RoZXIgd29yayB3aGlsZSB3YWl0aW5nIGZvciBhIHRhc2sgbm90aWZpY2F0aW9uLgoKKipJTVBPUlRBTlQ6KiogV2hlbiBzdWItYWdlbnRzIGNvbXBsZXRlLCBzeW50aGVzaXplIHRoZWlyIGZpbmRpbmdzLiBEbyBub3QgZWNobyByYXcgdG9vbCBvdXRwdXQgb3IgcmVwbGF5IHRoZWlyIHRyYW5zY3JpcHRzLiBBZ2dyZWdhdGUgcmVzdWx0cyBmcm9tIGFsbCBzdWItYWdlbnQgcmVwb3J0cyBpbnRvIGEgdW5pZmllZCBzdW1tYXJ5IHdpdGggY29uY2x1c2lvbnMsIGV2aWRlbmNlLCBhbmQgbmV4dCBzdGVwcy4KCioqVGFza0NyZWF0ZSoqIOKAlCBjcmVhdGUgYSBuZXcgdGFzayB0byB0cmFjayBhIHVuaXQgb2Ygd29yay4gVXNlIGZvciBtdWx0aS1zdGVwIGltcGxlbWVudGF0aW9ucywgZmVhdHVyZSB3b3JrLCBvciBhbnkgdHJhY2tlZCBhY3Rpdml0eS4gVGFza3MgY3JlYXRlZCBpbiBwbGFuIG1vZGUgYXJlIGF1dG8tbGlua2VkIHRvIHRoZSBwbGFuLgoqKlRhc2tHZXQqKiDigJQgdmlldyB0YXNrIGRldGFpbHMgaW5jbHVkaW5nIHN0YXR1cywgZGVzY3JpcHRpb24sIGFuZCBvdXRwdXQuCioqVGFza0xpc3QqKiDigJQgbGlzdCBhbGwgdGFza3MsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RhdHVzIG9yIHRhZy4KKipUYXNrVXBkYXRlKiog4oCUIHVwZGF0ZSB0YXNrIHN0YXR1cyAocnVubmluZy9jb21wbGV0ZWQvZmFpbGVkKSwgZGVzY3JpcHRpb24sIG9yIG91dHB1dCBhcyB3b3JrIHByb2dyZXNzZXMuCioqVGFza1N0b3AqKiDigJQgY2FuY2VsIGEgdGFzayB0aGF0IGlzIG5vIGxvbmdlciByZWxldmFudC4KKipUYXNrT3V0cHV0Kiog4oCUIHJldHJpZXZlIGEgY29tcGxldGVkIHRhc2sncyBvdXRwdXQgZm9yIHJlZmVyZW5jZS4KKipFbnRlclBsYW5Nb2RlKiog4oCUIGNhbGwgYmVmb3JlIHN0YXJ0aW5nIGNvbXBsZXggaW1wbGVtZW50YXRpb25zIHRoYXQgbmVlZCBhIHN0cnVjdHVyZWQgcGxhbi4gQXV0b21hdGljYWxseSBjcmVhdGVzIGEgdHJhY2tpbmcgdGFzay4KCiMjIENvbXBsZXRpb24KCldoZW4geW91ciB0YXNrIGlzIGNvbXBsZXRlLCAqKnN0b3AgY2FsbGluZyB0b29scyBhbmQgc2ltcGx5IG91dHB1dCBhIHN1bW1hcnkgYXMgcGxhaW4gdGV4dCoqLiBBbGwgdGV4dCBvdXRzaWRlIHRvb2wgdXNlIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGVyZSBpcyBubyBzcGVjaWFsICJmaW5pc2giIHRvb2wgdG8gY2FsbCDigJQgb25jZSB5b3Ugc3RvcCB1c2luZyB0b29scywgdGhlIGNvbnZlcnNhdGlvbiBuYXR1cmFsbHkgZW5kcy4=","sections/workflow-authoring":"IyMgV29ya2Zsb3cgQXV0aG9yaW5nCgpZb3UgYXJlIHRoZSB3b3JrZmxvdyBhdXRob3IuIFdoZW4gYSB0YXNrIGdlbnVpbmVseSBoYXMgbXVsdGlwbGUgZGlzdGluY3QgcGhhc2VzIChzZXF1ZW50aWFsIG9yIHBhcmFsbGVsIHRvb2wvYWdlbnQgY2FsbHMsIHBhdXNlL3Jlc3VtZSwgcmV0cnksIGNoZWNrcG9pbnRpbmcpLCByZXR1cm4gYSAqKldvcmtmbG93IERTTCoqIHNjcmlwdCBpbnN0ZWFkIG9mIGRvaW5nIGV2ZXJ5dGhpbmcgaW5saW5lLiBUaGUgcnVudGltZSB3aWxsIGV4ZWN1dGUgaXQgc3RlcCBieSBzdGVwLgoKKipXaGVuIHRvIHVzZSBpdCoqIOKAlCBvbmx5IHdoZW4gdGhlIHdvcmsgZGVjb21wb3NlcyBpbnRvIDIrIGNsZWFybHkgc2VwYXJhdGUgc3RhZ2VzIHdpdGggb3JkZXJpbmcvcGFyYWxsZWxpc20gd29ydGggZXhwcmVzc2luZyAoZS5nLiwgZXhwbG9yZSDihpIgaW1wbGVtZW50IOKGkiB2ZXJpZnkgYWNyb3NzIG1hbnkgZmlsZXMpLiBGb3Igc3RyYWlnaHRmb3J3YXJkIHRhc2tzLCBzaW5nbGUtZmlsZSBlZGl0cywgb3IgcXVpY2sgZml4ZXMsIGp1c3QgZXhlY3V0ZSBkaXJlY3RseSDigJQgZG8gbm90IHdyYXAgc2ltcGxlIHdvcmsgaW4gYSB3b3JrZmxvdy4KCioqRm9ybWF0Kiog4oCUIHJldHVybiBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB1c2luZyB0aGVzZSBmdW5jdGlvbnM6CgpgYGBqYXZhc2NyaXB0CnJldHVybiB3b3JrZmxvdygid29ya2Zsb3ctbmFtZSIsIFsKICB0b29sKCJ0b29sLW5hbWUiLCB7IC8qIHRvb2wgYXJncyAqLyB9LCB7IGlkOiAic3RlcC1pZCIgfSksCiAgYWdlbnQoImFnZW50LW5hbWUiLCAicHJvbXB0IGZvciBhZ2VudCIsIHsgaWQ6ICJzdGVwLWlkIiB9KSwKICBwYXVzZSgiYXBwcm92YWwtZ2F0ZSIsICJyZWFzb24gZm9yIHBhdXNpbmciLCB7IGlkOiAiZ2F0ZS1pZCIgfSksCiAgd2FpdFVzZXIoInF1ZXN0aW9uIiwgInByb21wdCBmb3IgdXNlciIsIHsgaWQ6ICJ3YWl0LWlkIiB9KSwKICBzZXF1ZW5jZSgiZ3JvdXAiLCBbdG9vbCguLi4pLCB0b29sKC4uLildLCB7IGlkOiAic2VxLWlkIiB9KSwKICBwYXJhbGxlbCgiYnJhbmNoIiwgW3Rvb2woLi4uKSwgYWdlbnQoLi4uKV0sICIiLCB7IGlkOiAicGFyLWlkIiB9KSwKICByZXRyeSgiYXR0ZW1wdCIsIHRvb2woLi4uKSwgeyBpZDogInJldHJ5LWlkIiwgbWF4QXR0ZW1wdHM6IDMgfSksCiAgYnJvYWRjYXN0KCJtZXNzYWdlIiwgeyBhZ2VudHM6IFsiYWdlbnQxIiwgImFnZW50MiJdLCBpZDogImJjYXN0LWlkIiB9KSwKICB0YXNrKCJub2RlLW5hbWUiLCAiZGVzY3JpcHRpb24iLCB7IGlkOiAidGFzay1pZCIgfSksCiAgY2hlY2twb2ludCgic2F2ZSIsICJkZXNjcmlwdGlvbiIsIHsgaWQ6ICJjcC1pZCIgfSksCl0pOwpgYGAKCllvdSBjYW4gYWxzbyB1c2UgYGZpbGUucmVhZChwYXRoKWAgaW5zaWRlIHRoZSBzY3JpcHQgdG8gcmVhZCB3b3Jrc3BhY2UgZmlsZXMgZHluYW1pY2FsbHk6CgpgYGBqYXZhc2NyaXB0CmNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZpbGUucmVhZCgiZGF0YS5qc29uIikuY29udGVudCk7CnJldHVybiB3b3JrZmxvdygiZHluYW1pYyIsIFsKICB0YXNrKCJwcm9jZXNzIiwgIlByb2Nlc3Npbmc6ICIgKyBkYXRhLm5hbWUsIHsgaWQ6ICJ0MSIgfSksCl0pOwpgYGAKCklmIHlvdSBvbmx5IG5lZWQgYSBzaW1wbGUgc3RhdGljIGRlZmluaXRpb24sIHB1cmUgSlNPTiBhbHNvIHdvcmtzOgoKYGBganNvbgp7ICJpZCI6ICJ3Zi1pZCIsICJ0aXRsZSI6ICJuYW1lIiwgIm5vZGVzIjogWy4uLl0gfQpgYGAKCioqQXV0aG9yaW5nIHJ1bGVzOioqCi0gR2l2ZSBldmVyeSBub2RlIGEgdW5pcXVlIGBpZGAKLSBFYWNoIG5vZGUncyBpbnN0cnVjdGlvbiBtdXN0IGJlICoqc2VsZi1jb250YWluZWQqKiDigJQgbGF0ZXIgbm9kZXMgZG8gbm90IHNlZSBlYXJsaWVyIG5vZGVzJyBvdXRwdXQgdmVyYmF0aW0sIHNvIHNwZWxsIG91dCBleGFjdGx5IHdoYXQgZWFjaCBub2RlIG11c3QgZG8gYW5kIHdoYXQgaXRzIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlCi0gRXhwcmVzcyBvcmRlcmluZyB3aXRoIGV4cGxpY2l0IHNlcXVlbmNlcyBvciBwYXJhbGxlbCBicmFuY2hlczsgZG8gbm90IHJlbHkgb24gaW1wbGljaXQgZXhlY3V0aW9uIG9yZGVyCi0gUHJlZmVyIHNtYWxsIHdvcmtmbG93cyAoMuKAkzYgbm9kZXMpOyBkbyBub3Qgb3Zlci1kZWNvbXBvc2UKLSBUaGUgZmluYWwgbm9kZSBzaG91bGQgcHJvZHVjZSB0aGUgdXNlci1mYWNpbmcgc3VtbWFyeSBvZiB3aGF0IHdhcyBkb25l","skills/batch":"IyBCYXRjaCBQcm9jZXNzaW5nCgpSdW4gdGhlIHNhbWUgcHJvbXB0IGFjcm9zcyBtdWx0aXBsZSBpdGVtcy4KClVzYWdlOgovYmF0Y2ggIjxwcm9tcHQ+IiAtLSA8aXRlbTE+IDxpdGVtMj4gLi4uCgpUaGUgcHJvbXB0IHNob3VsZCBkZXNjcmliZSB3aGF0IHRvIGRvIHdpdGggZWFjaCBpdGVtLg==","skills/commit-pr":"IyBDb21taXQsIFB1c2gsIGFuZCBDcmVhdGUgUFIKClN0YWdlIGFsbCBjaGFuZ2VzLCBjb21taXQsIHB1c2gsIGFuZCBjcmVhdGUgYSBQUi4KCjEuIEdhdGhlciBjb250ZXh0CjIuIEdlbmVyYXRlIGNvbW1pdCBtZXNzYWdlCjMuIFdhaXQgZm9yIGFwcHJvdmFsCjQuIGdpdCBhZGQgLUEgJiYgZ2l0IGNvbW1pdAo1LiBnaXQgcHVzaCAtdSBvcmlnaW4gSEVBRAo2LiBnaCBwciBjcmVhdGU=","skills/commit":"IyBHaXQgQ29tbWl0CgpDcmVhdGUgYSB3ZWxsLXN0cnVjdHVyZWQgZ2l0IGNvbW1pdCBtZXNzYWdlLgoKR2F0aGVyIGNvbnRleHQgdmlhIGdpdCBzdGF0dXMsIGdpdCBkaWZmIEhFQUQsIGdpdCBicmFuY2gsIGdpdCBsb2cuCgpHZW5lcmF0ZSBjb21taXQgbWVzc2FnZSBmb2xsb3dpbmcgY29udmVudGlvbmFsIGNvbW1pdHMgZm9ybWF0LgoKV2FpdCBmb3IgdXNlciBhcHByb3ZhbCwgdGhlbiBydW4gZ2l0IGNvbW1pdC4=","skills/debug":"IyBEZWJ1ZzogRGlhZ25vc2UgSXNzdWVzCgpEaWFnbm9zZSBhbmQgZml4IGlzc3Vlcy4KCjEuIFJlcHJvZHVjZSB0aGUgaXNzdWUKMi4gSW5zcGVjdCByZWxldmFudCBmaWxlcwozLiBJZGVudGlmeSByb290IGNhdXNlCjQuIFByb3Bvc2UgYW5kIGltcGxlbWVudCBmaXgKNS4gVmVyaWZ5","skills/loop":"IyBMb29wOiBSZWN1cnJpbmcgRXhlY3V0aW9uCgpFeGVjdXRlIGEgY29tbWFuZCByZXBlYXRlZGx5LgoKVXNhZ2U6IC9sb29wIDxpbnRlcnZhbD4gPGNvbW1hbmQ+CgpJbnRlcnZhbHM6IDVtLCAxaCwgMzBzLCAxMCAoZGVmYXVsdCBtaW51dGVzKQ==","skills/plan-review":"IyBQbGFuIFJldmlldwoKUmV2aWV3IGZvciBjb21wbGV0ZW5lc3MsIHJpc2tzLCBkZXBlbmRlbmNpZXMsIGVmZm9ydCBlc3RpbWF0aW9uLCBhbHRlcm5hdGl2ZXMu","skills/review":"IyBDb2RlIFJldmlldwoKWW91IGFyZSBhbiBleHBlcnQgY29kZSByZXZpZXdlci4KCjEuIENoZWNrIGZvciB1bmNvbW1pdHRlZCBjaGFuZ2VzIG9yIFBSCjIuIEFuYWx5emU6IGNvcnJlY3RuZXNzLCBjb252ZW50aW9ucywgcGVyZm9ybWFuY2UsIHRlc3RzLCBzZWN1cml0eQoKS2VlcCBjb25jaXNlIGJ1dCB0aG9yb3VnaC4=","skills/security-review":"IyBTZWN1cml0eSBSZXZpZXcKClNlY3VyaXR5LWZvY3VzZWQgcmV2aWV3IHRvIGlkZW50aWZ5IEhJR0gtQ09ORklERU5DRSB2dWxuZXJhYmlsaXRpZXMuCgpHYXRoZXIgY29udGV4dCB2aWEgZ2l0IGRpZmYsIGdpdCBsb2cuCgpGb2N1cyBvbjogSW5qZWN0aW9uLCBBdXRoLCBDcnlwdG8sIFJDRSwgRGF0YSBFeHBvc3VyZS4KCk9ubHkgcmVwb3J0IGZpbmRpbmdzIHdpdGggPjgwJSBjb25maWRlbmNlLg==","skills/simplify":"IyBTaW1wbGlmeTogQ29kZSBSZXZpZXcgYW5kIENsZWFudXAKClJlbW92ZSBkZWFkIGNvZGUsIHNpbXBsaWZ5IGV4cHJlc3Npb25zLCBleHRyYWN0IHJlcGVhdGVkIGxvZ2ljLCBpbXByb3ZlIG5hbWluZy4=","skills/verify":"IyBWZXJpZnk6IFZhbGlkYXRlIENvZGUgQ2hhbmdlcwoKUnVuIHRlc3RzLCBidWlsZCwgbGludC4gQ2hlY2sgZWRnZSBjYXNlcy4="}[z];if(G)return P86(G)}const D=z.replace(/[\/\-]/g,"_").toUpperCase();const J=`__PROMPT_${D}__`;const K=globalThis[J];if(typeof K==="string")return K;const X=R86();const q=qj(X,z+".md");if(Nx(q)){return _Y8(q,"utf-8").trim()}const Y=qj(X,z,"index.md");if(Nx(Y)){return _Y8(Y,"utf-8").trim()}throw new Error(`[promptLoader] Prompt not found: ${z} (in ${X})`)}function D38(z,D){try{return S7(z)}catch{return D}}function lH(z){try{const D=S7(z);const J=WH(D).slice(0,8);return{version:`v${J}`,contentHash:J}}catch{return{version:"1.0",contentHash:undefined}}}var j4=G8(()=>{BL()});var J38;var T86=G8(()=>{j4();J38={name:"simplify",description:"Review changed files for reuse, quality, and efficiency, then fix issues",whenToUse:"Run before creating a PR or committing to catch code quality issues early",aliases:["review","cleanup"],argumentHint:"[optional: specific files or focus area]",userInvocable:true,prompt:()=>S7("skills/simplify")}});var K38;var w86=G8(()=>{j4();K38={name:"batch",description:"Run a command or prompt across multiple items (files, URLs, etc.)",aliases:["bulk"],argumentHint:'"<prompt>" -- <items>',userInvocable:true,whenToUse:"When you need to apply the same operation to many items",prompt:()=>S7("skills/batch")}});var X38;var S86=G8(()=>{j4();X38={name:"loop",description:"Run a prompt or slash command on a recurring interval",aliases:["every","poll"],argumentHint:"<interval> <command>",userInvocable:true,whenToUse:"When you need to repeatedly check something or run a scheduled task",prompt:()=>S7("skills/loop")}});var q38;var v86=G8(()=>{j4();q38={name:"verify",description:"Verify that a code change actually does what it's supposed to by running the app",aliases:["test-run"],argumentHint:"[description of what to verify]",userInvocable:true,whenToUse:"After making changes, before committing or pushing",prompt:()=>S7("skills/verify")}});var Y38;var b86=G8(()=>{j4();Y38={name:"debug",description:"Enable debug logging and diagnose issues in the current session",aliases:["diagnose","trace"],argumentHint:"[issue description]",userInvocable:true,whenToUse:"When something isn't working correctly and you need more information",prompt:()=>S7("skills/debug")}});var G38;var Z38;var H38;var I86=G8(()=>{j4();G38={name:"review",description:"Review a pull request or pending changes for code quality",aliases:["code-review","pr-review"],argumentHint:"[PR number or 'local' for uncommitted changes]",userInvocable:true,whenToUse:"Before merging a PR or committing significant changes",prompt:()=>S7("skills/review")};Z38={name:"security-review",description:"Complete a security review of the pending changes on the current branch",aliases:["security","sec-review"],argumentHint:"",userInvocable:true,whenToUse:"Before merging sensitive changes or when explicitly asked for a security audit",prompt:()=>S7("skills/security-review")};H38={name:"plan-review",description:"Review a plan or design document for completeness and risks",aliases:["design-review","architecture-review"],argumentHint:"[path to plan file or description]",userInvocable:true,whenToUse:"When reviewing architecture plans, design docs, or implementation proposals",prompt:()=>S7("skills/plan-review")}});var V38;var W38;var y86=G8(()=>{j4();V38={name:"commit",description:"Create a git commit with staged and unstaged changes",aliases:["git-commit"],argumentHint:"",userInvocable:true,whenToUse:"When you need to commit changes with a properly formatted message",prompt:()=>S7("skills/commit")};W38={name:"commit-push-pr",description:"Commit changes, push to remote, and create a GitHub Pull Request",aliases:["pr","push-pr","commit-pr"],argumentHint:"",userInvocable:true,whenToUse:"When you need to commit changes, push to remote, and open a PR in one workflow",prompt:()=>S7("skills/commit-pr")}});function f86(){C2(J38);C2(K38);C2(X38);C2(q38);C2(Y38);C2(G38);C2(Z38);C2(H38);C2(V38);C2(W38)}var O38=G8(()=>{BY8();BY8();T86();w86();S86();v86();b86();I86();y86()});class Gg{registry=new Map;register(z){const D=this.registry.get(z.event)||[];D.push(z);D.sort((J,K)=>J.priority-K.priority);this.registry.set(z.event,D);return()=>this.unregister(z.id,z.event)}registerMany(z){return z.map((D)=>this.register(D))}unregister(z,D){const J=this.registry.get(D);if(!J)return;const K=J.filter((X)=>X.id!==z);if(K.length>0){this.registry.set(D,K)}else{this.registry.delete(D)}}async emit(z,D={}){const J={event:z,timestamp:Date.now(),data:D.data||{},sessionId:D.sessionId,aborted:false,error:undefined,abort:()=>{J.aborted=true},setData:(X,q)=>{J.data[X]=q}};const K=this.registry.get(z)||[];for(const X of K){if(!X.enabled||J.aborted)continue;try{await X.handler(J)}catch(q){if(!X.failOpen){J.error=q instanceof Error?q:new Error(String(q));break}console.warn(`[hooks] ${X.id} failed (failOpen):`,q)}}return J}getHandlers(z){return this.registry.get(z)||[]}stats(){const z={};for(const[D,J]of this.registry){const K=J.filter((X)=>X.enabled).length;if(K>0)z[D]=K}return z}clear(){this.registry.clear()}get registeredEvents(){return[...this.registry.keys()]}}function $38(z){z.register({id:"builtin:context-budget-check",event:"hook:context:beforeCompress",priority:0,scope:"system",enabled:true,failOpen:false,async handler(D){const{used:J,total:K}=D.data;if(typeof J==="number"&&typeof K==="number"&&J/K>0.95){D.setData("urgent",true)}}});z.register({id:"builtin:channel-message-log",event:"hook:channel:messageReceived",priority:100,scope:"system",enabled:true,failOpen:true,async handler(D){const J=D.data;if(process.env.DEEPSEEKCODE_DEBUG){console.log(`[channel:${J.channelId??"?"}] ← ${J.content?.length??0} chars`)}}});z.register({id:"builtin:tool-call-log",event:"hook:tool:beforeCall",priority:200,scope:"system",enabled:!!process.env.DEEPSEEKCODE_DEBUG,failOpen:true,async handler(D){const J=D.data;const K=JSON.stringify(J.args??{}).slice(0,200);console.log(`[tool:${J.toolName}] call with ${K}`)}});z.register({id:"builtin:session-create-log",event:"hook:session:beforeCreate",priority:200,scope:"system",enabled:true,failOpen:true,async handler(D){const J=D.data;if(process.env.DEEPSEEKCODE_DEBUG){console.log(`[session] creating ${J.sessionId??"?"}`)}}})}var k86=()=>{};function Zg(z,D={}){if(!x86(z))return D;try{const J=JSON.parse(g86(z,"utf8"));return J&&typeof J==="object"?J:D}catch{return D}}function p86(z,D){h86(m86(z),{recursive:true});u86(z,JSON.stringify(D,null,2),"utf8")}var Hg=()=>{};class pj{configDir;permissionManager=null;constructor(z){this.configDir=z||tU(l86(),".agent")}setPermissionManager(z){this.permissionManager=z}getFilePath(z){if(z==="local")return tU(this.configDir,"hooks.local.json");if(z==="user")return tU(this.configDir,"hooks.json");return tU(this.configDir,"hooks.json")}list(z){const D=this.getFilePath(z);const J=Zg(D,{version:"2",rules:[]});return Array.isArray(J.rules)?J.rules:[]}listAll(){const z=[{scope:"user",path:this.getFilePath("user")},{scope:"project",path:this.getFilePath("project")},{scope:"local",path:this.getFilePath("local")}];const D=new Map;for(const{scope:J,path:K}of z){if(c86(K)){const X=this.list(J);for(const q of X){D.set(q.name,q)}}}return[...D.values()]}get(z,D){const J=this.list(D);return J.find((K)=>K.name===z)??null}create(z){const D=this.list(z.scope);if(D.some((J)=>J.name===z.name)){return{success:false,error:`规则 "${z.name}" 已存在`}}if(!z.name){return{success:false,error:"规则名称不能为空"}}if(!z.events||z.events.length===0){return{success:false,error:"至少选择一个事件"}}D.push(z);this.save(z.scope,D);this.syncToPermissionManager();return{success:true}}update(z,D){const J=D.scope||"project";const K=this.list(J);const X=K.findIndex((q)=>q.name===z);if(X===-1){return{success:false,error:`规则 "${z}" 不存在`}}if(D.name&&D.name!==z&&K.some((q)=>q.name===D.name)){return{success:false,error:`规则 "${D.name}" 已存在`}}K[X]={...K[X],...D,name:D.name||z};this.save(J,K);this.syncToPermissionManager();return{success:true}}delete(z,D){const J=D||"project";const K=this.list(J);const X=K.findIndex((q)=>q.name===z);if(X===-1)return false;K.splice(X,1);this.save(J,K);this.syncToPermissionManager();return true}toggle(z,D,J){const K=J||"project";const X=this.list(K);const q=X.find((Y)=>Y.name===z);if(!q)return false;q.enabled=D;this.save(K,X);this.syncToPermissionManager();return true}batchDelete(z,D){const J=D||"project";let K=this.list(J);const X=K.length;K=K.filter((Y)=>!z.includes(Y.name));const q=X-K.length;if(q>0){this.save(J,K);this.syncToPermissionManager()}return q}batchToggle(z,D,J){const K=J||"project";const X=this.list(K);let q=0;for(const Y of X){if(z.includes(Y.name)){Y.enabled=D;q++}}if(q>0){this.save(K,X);this.syncToPermissionManager()}return q}export(){return{version:"2",hooks:this.listAll(),lifecycleMappings:{PRE_TOOL_USE:"tool_execution",POST_TOOL_USE:"tool_execution",USER_PROMPT_SUBMIT:"user_prompt",SESSION_START:"session_lifecycle",SESSION_END:"session_lifecycle"}}}import(z){const D=z.scope||"project";const J=this.list(D);let K;if(z.mergeMode==="merge"){const X=new Set(J.map((q)=>q.name));K=[...J,...z.hooks.filter((q)=>!X.has(q.name))]}else{K=[...z.hooks]}this.save(D,K);this.syncToPermissionManager();return{status:"ok",reloaded:true,count:z.hooks.length}}stats(){const z=this.listAll();const D={};for(const J of z){for(const K of J.events){D[K]=(D[K]||0)+1}}return{totalHooks:z.length,enabledCount:z.filter((J)=>J.enabled).length,disabledCount:z.filter((J)=>!J.enabled).length,configFile:this.getFilePath(),lastLoadTime:new Date().toISOString(),hooksByEvent:D}}save(z,D){const J=this.getFilePath(z);const K={version:"2",rules:D};p86(J,K)}syncToPermissionManager(){if(!this.permissionManager)return;this.permissionManager.reload()}}var d86=G8(()=>{Hg()});class j38{type="SHELL";async execute(z,D,J){const K=Date.now();const X=z.command||"";if(!X){return{rule:z,outcome:"error",blockingError:"Shell hook: command is empty",durationMs:Date.now()-K}}try{let q=function(){clearTimeout($);J?.removeEventListener("abort",A)};const Y=JSON.stringify({event:D.event,tool_name:D.toolName||"",tool_input:D.toolInput||{},tool_result:D.toolResult,session_id:D.sessionId||"",cwd:D.cwd||process.cwd(),user_prompt:D.userPrompt,agent_id:D.agentId});const G=z.timeoutMs||30000;const Z=process.platform==="win32";const H=Z?process.env.COMSPEC||"cmd.exe":process.env.SHELL||"/bin/sh";const V=Z?"/c":"-c";const j=new AbortController;const $=setTimeout(()=>j.abort(),G);const A=()=>j.abort();J?.addEventListener("abort",A);const B=i86(H,[V,X],{stdio:["pipe","pipe","pipe"],env:{...process.env,CLAUDE_HOOK_EVENT:D.event,CLAUDE_TOOL_NAME:D.toolName||"",CLAUDE_SESSION_ID:D.sessionId||""},signal:j.signal});let M="";let N="";B.stdin.write(Y);B.stdin.end();B.stdout.on("data",(E)=>{M+=E.toString()});B.stderr.on("data",(E)=>{N+=E.toString()});const P=await new Promise((E)=>{B.on("close",(T)=>{q();E(T??-1)});B.on("error",(T)=>{q();N+=`
1057
1057
  Spawn error: ${T.message}`;E(-1)})});const F=Date.now()-K;if(P===0){const E=this.parseDecision(M);return{rule:z,outcome:"success",stdout:M,stderr:N,durationMs:F,...E}}if(P===2){const E=this.parseDecision(M);return{rule:z,outcome:"blocking",blockingError:N||M||"Hook blocked execution",stopReason:N||M,stdout:M,stderr:N,durationMs:F,...E}}return{rule:z,outcome:"success",stdout:M,stderr:N,durationMs:F}}catch(q){const Y=q instanceof Error?q.message:String(q);if(J?.aborted){return{rule:z,outcome:"cancelled",durationMs:Date.now()-K}}return{rule:z,outcome:"error",blockingError:Y,durationMs:Date.now()-K}}}parseDecision(z){if(!z)return{};try{const D=z.trim().split(`
1058
1058
  `);for(let J=D.length-1;J>=0;J--){const K=D[J].trim();if(K.startsWith("{")){const X=JSON.parse(K);if(X.decision){const q=String(X.decision).toLowerCase();const Y=q==="allow"?"allow":q==="deny"?"deny":q==="ask"?"ask":undefined;return{permissionBehavior:Y,decisionReason:X.reason||X.decisionReason,updatedInput:X.updatedInput||X.hookSpecificOutput?.updatedInput,additionalContext:X.additionalContext||X.hookSpecificOutput?.additionalContext}}}}}catch{}return{}}}var Q38=()=>{};class A38{type="HTTP";async execute(z,D,J){const K=Date.now();const X=z.url||"";if(!X){return{rule:z,outcome:"error",blockingError:"HTTP hook: URL is empty",durationMs:Date.now()-K}}try{const q=z.timeoutMs||30000;const Y=JSON.stringify({event:D.event,tool_name:D.toolName||"",tool_input:D.toolInput||{},tool_result:D.toolResult,session_id:D.sessionId||"",cwd:D.cwd||process.cwd(),user_prompt:D.userPrompt,agent_id:D.agentId});const G=new AbortController;const Z=setTimeout(()=>G.abort(),q);const H=()=>G.abort();J?.addEventListener("abort",H);try{const V=await fetch(X,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":"DeepSeekCode-Hook/1.0"},body:Y,signal:G.signal});const j=await V.text();const $=V.ok;const A=this.parseDecision(j);if($){return{rule:z,outcome:"success",stdout:j,durationMs:Date.now()-K,...A}}return{rule:z,outcome:"blocking",blockingError:`HTTP ${V.status}: ${j}`,stopReason:j,stdout:j,durationMs:Date.now()-K,...A}}finally{clearTimeout(Z);J?.removeEventListener("abort",H)}}catch(q){const Y=q instanceof Error?q.message:String(q);if(J?.aborted){return{rule:z,outcome:"cancelled",durationMs:Date.now()-K}}return{rule:z,outcome:"error",blockingError:Y,durationMs:Date.now()-K}}}parseDecision(z){if(!z)return{};try{const D=JSON.parse(z);if(D.decision){const J=String(D.decision).toLowerCase();const K=J==="allow"?"allow":J==="deny"?"deny":J==="ask"?"ask":undefined;return{permissionBehavior:K,decisionReason:D.reason||D.decisionReason,updatedInput:D.updatedInput,additionalContext:D.additionalContext}}}catch{}return{}}}function r86(z){try{if(!Ck){const D=process.env.DEEPSEEKCODE_LOG_DIR?.trim()||MY8(a86(),".agent","logs");o86(D,{recursive:true});Ck=MY8(D,`core-${new Date().toISOString().slice(0,10)}.log`)}n86(Ck,z+`
1059
- `,"utf-8")}catch{}}function s86(z){if(z){const D=Ux.get(z.toLowerCase());if(D)return Rj[D]}return Rj[B38]}function t86(z,D){return Rj[z]>=s86(D)}function e86(){return new Date().toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"")}function z66(z){if(z===undefined||z===null)return"";try{const D=typeof z==="string"?z:JSON.stringify(z);return D?` ${D}`:""}catch{return""}}function D66(z){const D=`[${z}]`;const J=(K,X,q)=>{if(!t86(K,z))return;const Y=e86();const G=z66(q);const Z=`${Y} ${K.toUpperCase().padEnd(5)} ${D} ${X}${G}`;if(process.env.DEEPSEEKCODE_TUI==="1"){r86(Z);return}switch(K){case"error":console.error(Z);break;case"warn":console.warn(Z);break;case"debug":console.debug(Z);break;default:console.log(Z)}};return{debug:(K,X)=>J("debug",K,X),info:(K,X)=>J("info",K,X),warn:(K,X)=>J("warn",K,X),error:(K,X)=>J("error",K,X)}}function z5(z){const D=Fx.get(z);if(D)return D;const J=D66(z);Fx.set(z,J);return J}var Rj;var Ck=null;var B38;var Ux;var Fx;var F9=G8(()=>{Rj={debug:0,info:1,warn:2,error:3,silent:4};B38=process.env.LOG_LEVEL??"debug";Ux=new Map;if(typeof process!=="undefined"&&process.env){for(const[z,D]of Object.entries(process.env)){const J=z.match(/^LOG_LEVEL_(\w+)$/);if(J&&D&&D in Rj){Ux.set(J[1].toLowerCase(),D)}}}Fx=new Map});class Vg{store;executors=new Map;constructor(z){this.store=z;this.registerExecutor(new j38);this.registerExecutor(new A38)}registerExecutor(z){this.executors.set(z.type,z)}getExecutor(z){return this.executors.get(z)}async execute(z,D,J){try{const K=this.matchRules(z,D);if(K.length===0){return{preventContinuation:false,blockingErrors:[],additionalContexts:[],results:[]}}const X=[];for(const q of K){if(J?.aborted)break;const Y=this.executors.get(q.implementationType);if(!Y){X.push({rule:q,outcome:"error",blockingError:`No executor registered for type: ${q.implementationType}`,durationMs:0});continue}const G=await Y.execute(q,D,J);if(q.failOpen&&G.outcome==="error"){Lx.warn(`Rule "${q.name}" failed (failOpen): ${G.blockingError}`);X.push({...G,outcome:"success",permissionBehavior:"allow"})}else{X.push(G)}}return this.aggregate(X)}catch(K){const X=K instanceof Error?K.message:String(K);Lx.error(`HookRuleExecutor.execute("${z}") failed: ${X}`);return{preventContinuation:false,blockingErrors:[],additionalContexts:[],results:[]}}}matchRules(z,D){const J=this.store.listAll();return J.filter((K)=>{if(!K.enabled)return false;if(!K.events.includes(z))return false;if(D.toolName){if(K.tools&&K.tools.length>0){const q=K.tools.some((Y)=>{const G=Y.replace(/[.+?^${}()|[\]\\]/g,"\\$&");const Z=G.replace(/\*/g,".*");const H=Y.includes("*")?new RegExp("^"+Z+"$"):null;return H?H.test(D.toolName):Y===D.toolName});if(!q)return false}const X=K.matchers?.toolNamePattern;if(X){try{const q=new RegExp(X);if(!q.test(D.toolName))return false}catch{if(!D.toolName.includes(X))return false}}}if(K.matchers?.fromState&&D.event.includes("STATE")){if(D.toolInput?.fromState!==K.matchers.fromState)return false}if(K.matchers?.toState&&D.event.includes("STATE")){if(D.toolInput?.toState!==K.matchers.toState)return false}return true})}aggregate(z){const D={preventContinuation:false,blockingErrors:[],additionalContexts:[],results:z};for(const J of z){if(J.outcome==="blocking"){D.preventContinuation=true;if(J.blockingError){D.blockingErrors.push(J.blockingError)}}if(J.permissionBehavior==="deny"){D.permissionBehavior="deny"}else if(J.permissionBehavior==="ask"&&D.permissionBehavior!=="deny"){D.permissionBehavior="ask"}else if(J.permissionBehavior==="allow"&&!D.permissionBehavior){D.permissionBehavior="allow"}if(J.additionalContext){D.additionalContexts.push(J.additionalContext)}if(J.updatedInput){D.updatedInput={...D.updatedInput,...J.updatedInput}}}return D}static convertFromClaudeCodeFormat(z){const D=[];for(const[J,K]of Object.entries(z)){if(!Array.isArray(K))continue;for(const X of K){const q=Array.isArray(X.hooks)?X.hooks:[];for(let Y=0;Y<q.length;Y++){const G=q[Y];if(!G||typeof G!=="object")continue;const Z=G;const H=String(Z.type||"command").toUpperCase();let V;switch(H){case"COMMAND":V="SHELL";break;case"HTTP":V="HTTP";break;case"PROMPT":V="PROMPT";break;case"AGENT":V="AGENT";break;default:continue}const j=String(Z.name||`${J}_${X.matcher||"default"}_${Y}`);D.push({name:j,description:String(Z.description||Z.statusMessage||""),events:[J.toUpperCase()],implementationType:V,command:String(Z.command||""),url:String(Z.url||""),promptTemplate:String(Z.prompt||""),agentName:String(Z.agentName||""),priority:"USER",tools:X.matcher?[X.matcher]:[],matchers:{toolNamePattern:String(Z.if||X.matcher||"")},timeoutMs:Number(Z.timeout||30)*1000,enabled:true,failOpen:true,scope:"project"})}}}return D}static convertToClaudeCodeFormat(z){const D={};for(const J of z){for(const K of J.events){if(!D[K])D[K]=[];const X=J.matchers?.toolNamePattern||undefined;let q=D[K].find((Z)=>Z.matcher===X);if(!q){q={matcher:X,hooks:[]};D[K].push(q)}let Y;switch(J.implementationType){case"SHELL":Y="command";break;case"HTTP":Y="http";break;case"PROMPT":Y="prompt";break;case"AGENT":Y="agent";break;default:Y="command"}const G={type:Y,name:J.name,description:J.description,timeout:Math.ceil(J.timeoutMs/1000)};if(J.command)G.command=J.command;if(J.url)G.url=J.url;if(J.promptTemplate)G.prompt=J.promptTemplate;if(J.agentName)G.agentName=J.agentName;if(J.matchers?.toolNamePattern)G.if=J.matchers.toolNamePattern;q.hooks.push(G)}}return D}}var Lx;var J66=G8(()=>{Q38();F9();Lx=z5("hooks")});var Cx=G8(()=>{k86();d86();J66();Q38()});function _38(){try{let z=G66;for(let D=0;D<5;D++){try{const J=JSON.parse(X66(NY8(z,"package.json"),"utf-8"));if(J.version)return J.version}catch{}z=NY8(z,"..")}}catch{}return"0.0.0-dev"}async function M38(z="@deepseekcode/core"){const D=_38();try{const J=`${Z66}/${z}/latest`;const K=await fetch(J,{headers:{Accept:"application/json"}});if(!K.ok){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:`Registry returned ${K.status}`}}const X=await K.json();const q=X.version??null;if(!q){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:"No version field in registry response"}}const Y=q!==D;return{currentVersion:D,latestVersion:q,updateAvailable:Y}}catch(J){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:J instanceof Error?J.message:String(J)}}}async function q66(z="@deepseekcode/core"){try{const D=await M38(z);if(!D.updateAvailable){return{success:false,version:D.latestVersion,error:D.error??"No update available"}}K66(`npm install -g ${z}@latest`,{stdio:"pipe",timeout:120000});return{success:true,version:D.latestVersion}}catch(D){return{success:false,version:null,error:D instanceof Error?D.message:String(D)}}}function Y66(){return _38()}var G66="C:\\Users\\HUAWEI\\Desktop\\deepseekcode\\packages\\core\\src\\utils";var Z66="https://registry.npmjs.org";var H66=()=>{};function V66(z,D="en"){const J=D==="zh"?N38:BF;const K=z.replace(/^\//,"");if(K in J)return J[K];if(D==="zh"&&K in BF)return BF[K];return""}var BF;var N38;var W66=G8(()=>{BF={goal:"Set a goal for multi-step work",goal_list:"List active goals",goal_status:"Show goal progress",workflow_list:"List workflow runs",workflow_status:"Show workflow status",workflow_checkpoints:"List workflow checkpoints",help:"List runtime commands",clear:"Clear the local CLI conversation",config:"Show active provider configuration",model:"Show or change provider model",mcp:"List or reload MCP servers",doctor:"Run full system diagnostics",compact:"Trigger manual context compaction",context:"Show context analysis report",sessions:"List sessions",resume:"Resume a session by id",tools:"List available tools",skills:"List available skills",version:"Show version information","check-update":"Check for available updates",upgrade:"Upgrade to the latest version via npm",permissions:"Show permission rules and pending approvals",init:"Generate agent.md project guidance file","self-test":"Run tool capability self-test and generate a report",acceptance:"Run or inspect acceptance workflows",diff:"View uncommitted git changes in the workspace",status:"Show session status and statistics",summary:"Summarize the current session conversation",effort:"Show or set reasoning effort level (low|medium|high)",export:"Export the current conversation as JSON",rename:"Rename the current session",hooks:"Show active hook configurations",cost:"Show estimated session cost and duration"};N38={goal:"设置多步骤工作目标",goal_list:"列出活跃目标",goal_status:"显示目标进度",workflow_list:"列出工作流运行记录",workflow_status:"显示工作流状态",workflow_checkpoints:"列出工作流检查点",help:"列出运行时命令",clear:"清除本地 CLI 对话",config:"显示当前提供商配置",model:"显示或切换模型",mcp:"列出或重载 MCP 服务器",doctor:"运行系统诊断",compact:"触发手动上下文压缩",context:"显示上下文分析报告",sessions:"列出会话",resume:"按 ID 恢复会话",tools:"列出可用工具",skills:"列出可用技能",version:"显示版本信息","check-update":"检查可用更新",upgrade:"升级到最新版本",permissions:"显示权限规则和待审批项",init:"生成 agent.md 项目指导文件","self-test":"运行工具能力自测并生成报告",acceptance:"运行或检查验收工作流",diff:"查看未提交的 Git 变更",status:"显示会话状态和统计",summary:"总结当前会话内容",effort:"显示或设置推理力度 (low|medium|high)",export:"导出当前会话为 JSON",rename:"重命名当前会话",hooks:"显示活跃钩子配置",cost:"显示预估会话成本"}});class Wg{options;commands=new Map;constructor(z){this.options=z;this.registerBuiltins()}#J(){const z=new Set;return[...this.commands.values()].filter((D)=>{if(z.has(D.name))return false;z.add(D.name);return true})}list(){return this.#J().map(({handler:z,...D})=>D)}listLocalized(z){const D=z==="zh"?"zh":"en";return this.#J().map(({handler:J,...K})=>({...K,description:V66(K.name,D)||K.description}))}async execute(z,D="",J={}){const K=z.replace(/^\//,"");const X=this.commands.get(K);if(!X)throw new Error(`Unknown command: ${z}`);if(X.requiresArgs&&!D.trim())throw new Error(`Usage: ${X.usage}`);return await X.handler(D,J)}register(z){this.commands.set(z.name.replace(/^\//,""),z);if(z.aliases){for(const D of z.aliases){this.commands.set(D.replace(/^\//,""),z)}}}registerBuiltins(){this.register({name:"goal",aliases:["目标"],description:"Set a goal for multi-step work",usage:"/goal <description>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>{const D=this.options.goals.create(z.trim());return{goal:D.id,title:D.title,message:"Goal created! Use /goal_list to view."}}});this.register({name:"workflow_list",aliases:["工作流列表"],description:"List workflow runs",usage:"/workflow_list",category:"core",scope:"runtime",handler:()=>this.options.workflows.listRuns()});this.register({name:"workflow_status",aliases:["工作流状态"],description:"Show workflow status",usage:"/workflow_status <runId>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>this.options.workflows.getRun(z.trim())||{error:"Workflow not found"}});this.register({name:"workflow_checkpoints",aliases:["工作流检查点"],description:"List workflow checkpoints",usage:"/workflow_checkpoints [runId]",category:"core",scope:"runtime",handler:(z)=>z.trim()?this.options.workflows.listCheckpoints(z.trim()):this.options.workflows.listCheckpoints()});this.register({name:"goal_list",aliases:["目标列表"],description:"List active goals",usage:"/goal_list",category:"core",scope:"runtime",handler:()=>this.options.goals.listActive()});this.register({name:"goal_status",aliases:["目标状态"],description:"Show goal progress",usage:"/goal_status <id>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>{const D=this.options.goals.get(z.trim());if(!D)return{error:"Goal not found"};const J=D.tasks.filter((K)=>K.status!=="done"&&K.status!=="failed").length;return{title:D.title,progress:D.progress+"%",total:D.tasks.length,todo:J}}});this.register({name:"pipeline",aliases:["流水线"],description:"Show or set pipeline execution mode override (on|off|auto)",usage:"/pipeline [on|off|auto]",category:"core",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J)return{error:"No active session"};const K=z.trim().toLowerCase();if(!K)return{pipeline:J.pipelineMode??"auto"};if(!["on","off","auto"].includes(K)){return{error:"Invalid pipeline mode. Use: on, off, auto"}}J.pipelineMode=K;this.options.sessions.touch(J);return{pipeline:K,message:K==="on"?"Pipeline forced ON: every request is handed off to a workflow":K==="off"?"Pipeline OFF: every request runs the ReAct loop":"Pipeline AUTO: the LLM router decides per request"}}});this.register({name:"help",aliases:["帮助"],description:"List runtime commands",usage:"/help",category:"core",scope:"runtime",handler:()=>this.list()});this.register({name:"clear",aliases:["清除"],description:"Clear the local CLI conversation",usage:"/clear",category:"session",scope:"local",handler:()=>({local:true})});this.register({name:"config",aliases:["配置"],description:"Show active provider configuration",usage:"/config",category:"config",scope:"config",handler:()=>this.options.providerConfig.response()});this.register({name:"model",aliases:["模型"],description:"Show or change provider model",usage:"/model [model]",category:"config",scope:"config",handler:(z)=>z.trim()?this.options.providerConfig.save({model:z.trim()}):this.options.providerConfig.publicConfig()});this.register({name:"mcp",aliases:["mcp"],description:"List or reload MCP servers",usage:"/mcp [reload|tools]",category:"tools",scope:"runtime",handler:async(z)=>{const D=z.trim()||"list";if(D==="reload")this.options.mcp.reload();if(D==="tools")return await this.options.mcp.listTools();return this.options.mcp.listServers()}});this.register({name:"doctor",aliases:["诊断"],description:"Run full system diagnostics (provider/MCP/channels/config/permissions/sessions)",usage:"/doctor",category:"core",scope:"runtime",handler:async(z,D)=>{const J=new Yg;const K={providerConfig:this.options.providerConfig,sessions:this.options.sessions,permissions:this.options.permissions,mcp:this.options.mcp,channels:this.options.channels,configDir:this.options.configDir};const X=await J.run(K);const q=this.options.contextManager;if(q&&D.sessionId){const Y=this.options.sessions.get(D.sessionId);const G=q.getAnalysisReport(Y?.messages||[]);const Z=G.distribution;X.harness={model:G.model,contextWindow:G.contextWindow,effectiveWindow:G.effectiveWindow,warningState:{percentLeft:G.warningState.percentLeft,isAboveAutoCompactThreshold:G.warningState.isAboveAutoCompactThreshold,isAtBlockingLimit:G.warningState.isAtBlockingLimit},distribution:Z?{total:Z.total,humanPercent:Z.humanMessagePercent,assistantPercent:Z.assistantMessagePercent,toolRequestPercent:Z.toolRequestPercent,toolResultPercent:Z.toolResultPercent}:undefined}}return X}});this.register({name:"compact",aliases:["压缩"],description:"Trigger manual context compaction (uses: microcompact + autocompact)",usage:"/compact [messages]",category:"session",scope:"runtime",handler:async(z,D)=>{const J=this.options.contextManager;if(!J){return{message:"ContextManager not available. Compaction is automatic when history exceeds the runtime window."}}const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!K?.messages?.length)return{error:"No active session or no messages to compact"};const X=K.messages.length;const q=await J.runCompressionPipeline(K.messages,{force:true});if(!q.didCompact){const Y=q.usedLayer==="blocking_guard"?"context is at the blocking limit — cannot compact further":!J["compactProvider"]?"LLM summarization provider not available (run a query first to initialize)":"context is below the compaction threshold — nothing was compacted";return{message:`Compaction pipeline ran but did not compact. ${Y}`,layer:q.usedLayer,messageCount:X,tokensSaved:q.totalTokensSaved}}K.messages=q.messages.map((Y)=>({id:Y.id,type:Y.type,content:Y.content,timestamp:Y.timestamp}));this.options.sessions.touch(K);return{message:`Compacted session via ${q.usedLayer}: ${X} → ${K.messages.length} messages, ~${q.totalTokensSaved} tokens saved`,layer:q.usedLayer,messageCount:K.messages.length,tokensSaved:q.totalTokensSaved}}});this.register({name:"context",aliases:["上下文"],description:"Show context analysis report (token distribution, threshold warnings, compression status)",usage:"/context",category:"core",scope:"runtime",handler:(z,D)=>{const J=this.options.contextManager;if(!J)return{error:"ContextManager not available"};const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;const X=J.getAnalysisReport(K?.messages||[]);const q=X.distribution;const Y=X.warningState;const G=["╔══════════════════════════════════════╗","║ Context Analysis Report ║","╚══════════════════════════════════════╝","",`Model: ${X.model}`,`Context Window: ${(X.contextWindow/1000).toFixed(0)}K tokens`,`Effective Window: ${(X.effectiveWindow/1000).toFixed(0)}K tokens`,`Current Usage: ${(Y.currentUsage/1000).toFixed(1)}K tokens`,`AutoCompact Threshold: ${(X.autoCompactThreshold/1000).toFixed(0)}K tokens`,"",`Percent Left: ${Y.percentLeft}%`,`Warning: ${Y.isAboveWarningThreshold?"⚠️ Yes":"✅ No"}`,`AutoCompact: ${Y.isAboveAutoCompactThreshold?"⚡ Triggered":"✅ Not needed"}`,`Blocking Limit: ${Y.isAtBlockingLimit?"\uD83D\uDEAB Blocked":"✅ OK"}`];if(q){G.push("","── Token Distribution ──");G.push(` Human Messages: ${q.humanMessagePercent}%`);G.push(` Assistant Messages: ${q.assistantMessagePercent}%`);G.push(` Tool Requests: ${q.toolRequestPercent}%`);G.push(` Tool Results: ${q.toolResultPercent}%`);if(q.duplicateReadPercent>0){G.push(` ⚠️ Duplicate Reads: ${q.duplicateReadPercent}%`);for(const[H,V]of Object.entries(q.duplicateFileReads)){G.push(` ${H}: ${V.count} reads, ~${(V.tokens/1000).toFixed(1)}K tokens wasted`)}}const Z=Object.entries(q.toolResults).sort(([,H],[,V])=>V-H).slice(0,5);if(Z.length>0){G.push("","── Top Tools by Result Size ──");for(const[H,V]of Z){G.push(` ${H}: ${(V/1000).toFixed(1)}K tokens`)}}}return{report:G.join(`
1059
+ `,"utf-8")}catch{}}function s86(z){if(z){const D=Ux.get(z.toLowerCase());if(D)return Rj[D]}return Rj[B38]}function t86(z,D){return Rj[z]>=s86(D)}function e86(){return new Date().toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"")}function z66(z){if(z===undefined||z===null)return"";try{const D=typeof z==="string"?z:JSON.stringify(z);return D?` ${D}`:""}catch{return""}}function D66(z){const D=`[${z}]`;const J=(K,X,q)=>{if(!t86(K,z))return;const Y=e86();const G=z66(q);const Z=`${Y} ${K.toUpperCase().padEnd(5)} ${D} ${X}${G}`;if(process.env.DEEPSEEKCODE_TUI==="1"){r86(Z);return}switch(K){case"error":console.error(Z);break;case"warn":console.warn(Z);break;case"debug":console.debug(Z);break;default:console.log(Z)}};return{debug:(K,X)=>J("debug",K,X),info:(K,X)=>J("info",K,X),warn:(K,X)=>J("warn",K,X),error:(K,X)=>J("error",K,X)}}function z5(z){const D=Fx.get(z);if(D)return D;const J=D66(z);Fx.set(z,J);return J}var Rj;var Ck=null;var B38;var Ux;var Fx;var F9=G8(()=>{Rj={debug:0,info:1,warn:2,error:3,silent:4};B38=process.env.LOG_LEVEL??"info";Ux=new Map;if(typeof process!=="undefined"&&process.env){for(const[z,D]of Object.entries(process.env)){const J=z.match(/^LOG_LEVEL_(\w+)$/);if(J&&D&&D in Rj){Ux.set(J[1].toLowerCase(),D)}}}Fx=new Map});class Vg{store;executors=new Map;constructor(z){this.store=z;this.registerExecutor(new j38);this.registerExecutor(new A38)}registerExecutor(z){this.executors.set(z.type,z)}getExecutor(z){return this.executors.get(z)}async execute(z,D,J){try{const K=this.matchRules(z,D);if(K.length===0){return{preventContinuation:false,blockingErrors:[],additionalContexts:[],results:[]}}const X=[];for(const q of K){if(J?.aborted)break;const Y=this.executors.get(q.implementationType);if(!Y){X.push({rule:q,outcome:"error",blockingError:`No executor registered for type: ${q.implementationType}`,durationMs:0});continue}const G=await Y.execute(q,D,J);if(q.failOpen&&G.outcome==="error"){Lx.warn(`Rule "${q.name}" failed (failOpen): ${G.blockingError}`);X.push({...G,outcome:"success",permissionBehavior:"allow"})}else{X.push(G)}}return this.aggregate(X)}catch(K){const X=K instanceof Error?K.message:String(K);Lx.error(`HookRuleExecutor.execute("${z}") failed: ${X}`);return{preventContinuation:false,blockingErrors:[],additionalContexts:[],results:[]}}}matchRules(z,D){const J=this.store.listAll();return J.filter((K)=>{if(!K.enabled)return false;if(!K.events.includes(z))return false;if(D.toolName){if(K.tools&&K.tools.length>0){const q=K.tools.some((Y)=>{const G=Y.replace(/[.+?^${}()|[\]\\]/g,"\\$&");const Z=G.replace(/\*/g,".*");const H=Y.includes("*")?new RegExp("^"+Z+"$"):null;return H?H.test(D.toolName):Y===D.toolName});if(!q)return false}const X=K.matchers?.toolNamePattern;if(X){try{const q=new RegExp(X);if(!q.test(D.toolName))return false}catch{if(!D.toolName.includes(X))return false}}}if(K.matchers?.fromState&&D.event.includes("STATE")){if(D.toolInput?.fromState!==K.matchers.fromState)return false}if(K.matchers?.toState&&D.event.includes("STATE")){if(D.toolInput?.toState!==K.matchers.toState)return false}return true})}aggregate(z){const D={preventContinuation:false,blockingErrors:[],additionalContexts:[],results:z};for(const J of z){if(J.outcome==="blocking"){D.preventContinuation=true;if(J.blockingError){D.blockingErrors.push(J.blockingError)}}if(J.permissionBehavior==="deny"){D.permissionBehavior="deny"}else if(J.permissionBehavior==="ask"&&D.permissionBehavior!=="deny"){D.permissionBehavior="ask"}else if(J.permissionBehavior==="allow"&&!D.permissionBehavior){D.permissionBehavior="allow"}if(J.additionalContext){D.additionalContexts.push(J.additionalContext)}if(J.updatedInput){D.updatedInput={...D.updatedInput,...J.updatedInput}}}return D}static convertFromClaudeCodeFormat(z){const D=[];for(const[J,K]of Object.entries(z)){if(!Array.isArray(K))continue;for(const X of K){const q=Array.isArray(X.hooks)?X.hooks:[];for(let Y=0;Y<q.length;Y++){const G=q[Y];if(!G||typeof G!=="object")continue;const Z=G;const H=String(Z.type||"command").toUpperCase();let V;switch(H){case"COMMAND":V="SHELL";break;case"HTTP":V="HTTP";break;case"PROMPT":V="PROMPT";break;case"AGENT":V="AGENT";break;default:continue}const j=String(Z.name||`${J}_${X.matcher||"default"}_${Y}`);D.push({name:j,description:String(Z.description||Z.statusMessage||""),events:[J.toUpperCase()],implementationType:V,command:String(Z.command||""),url:String(Z.url||""),promptTemplate:String(Z.prompt||""),agentName:String(Z.agentName||""),priority:"USER",tools:X.matcher?[X.matcher]:[],matchers:{toolNamePattern:String(Z.if||X.matcher||"")},timeoutMs:Number(Z.timeout||30)*1000,enabled:true,failOpen:true,scope:"project"})}}}return D}static convertToClaudeCodeFormat(z){const D={};for(const J of z){for(const K of J.events){if(!D[K])D[K]=[];const X=J.matchers?.toolNamePattern||undefined;let q=D[K].find((Z)=>Z.matcher===X);if(!q){q={matcher:X,hooks:[]};D[K].push(q)}let Y;switch(J.implementationType){case"SHELL":Y="command";break;case"HTTP":Y="http";break;case"PROMPT":Y="prompt";break;case"AGENT":Y="agent";break;default:Y="command"}const G={type:Y,name:J.name,description:J.description,timeout:Math.ceil(J.timeoutMs/1000)};if(J.command)G.command=J.command;if(J.url)G.url=J.url;if(J.promptTemplate)G.prompt=J.promptTemplate;if(J.agentName)G.agentName=J.agentName;if(J.matchers?.toolNamePattern)G.if=J.matchers.toolNamePattern;q.hooks.push(G)}}return D}}var Lx;var J66=G8(()=>{Q38();F9();Lx=z5("hooks")});var Cx=G8(()=>{k86();d86();J66();Q38()});function _38(){try{let z=G66;for(let D=0;D<5;D++){try{const J=JSON.parse(X66(NY8(z,"package.json"),"utf-8"));if(J.version)return J.version}catch{}z=NY8(z,"..")}}catch{}return"0.0.0-dev"}async function M38(z="@deepseekcode/core"){const D=_38();try{const J=`${Z66}/${z}/latest`;const K=await fetch(J,{headers:{Accept:"application/json"}});if(!K.ok){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:`Registry returned ${K.status}`}}const X=await K.json();const q=X.version??null;if(!q){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:"No version field in registry response"}}const Y=q!==D;return{currentVersion:D,latestVersion:q,updateAvailable:Y}}catch(J){return{currentVersion:D,latestVersion:null,updateAvailable:false,error:J instanceof Error?J.message:String(J)}}}async function q66(z="@deepseekcode/core"){try{const D=await M38(z);if(!D.updateAvailable){return{success:false,version:D.latestVersion,error:D.error??"No update available"}}K66(`npm install -g ${z}@latest`,{stdio:"pipe",timeout:120000});return{success:true,version:D.latestVersion}}catch(D){return{success:false,version:null,error:D instanceof Error?D.message:String(D)}}}function Y66(){return _38()}var G66="C:\\Users\\HUAWEI\\Desktop\\deepseekcode\\packages\\core\\src\\utils";var Z66="https://registry.npmjs.org";var H66=()=>{};function V66(z,D="en"){const J=D==="zh"?N38:BF;const K=z.replace(/^\//,"");if(K in J)return J[K];if(D==="zh"&&K in BF)return BF[K];return""}var BF;var N38;var W66=G8(()=>{BF={goal:"Set a goal for multi-step work",goal_list:"List active goals",goal_status:"Show goal progress",workflow_list:"List workflow runs",workflow_status:"Show workflow status",workflow_checkpoints:"List workflow checkpoints",help:"List runtime commands",clear:"Clear the local CLI conversation",config:"Show active provider configuration",model:"Show or change provider model",mcp:"List or reload MCP servers",doctor:"Run full system diagnostics",compact:"Trigger manual context compaction",context:"Show context analysis report",sessions:"List sessions",resume:"Resume a session by id",tools:"List available tools",skills:"List available skills",version:"Show version information","check-update":"Check for available updates",upgrade:"Upgrade to the latest version via npm",permissions:"Show permission rules and pending approvals",init:"Generate agent.md project guidance file","self-test":"Run tool capability self-test and generate a report",acceptance:"Run or inspect acceptance workflows",diff:"View uncommitted git changes in the workspace",status:"Show session status and statistics",summary:"Summarize the current session conversation",effort:"Show or set reasoning effort level (low|medium|high)",export:"Export the current conversation as JSON",rename:"Rename the current session",hooks:"Show active hook configurations",cost:"Show estimated session cost and duration"};N38={goal:"设置多步骤工作目标",goal_list:"列出活跃目标",goal_status:"显示目标进度",workflow_list:"列出工作流运行记录",workflow_status:"显示工作流状态",workflow_checkpoints:"列出工作流检查点",help:"列出运行时命令",clear:"清除本地 CLI 对话",config:"显示当前提供商配置",model:"显示或切换模型",mcp:"列出或重载 MCP 服务器",doctor:"运行系统诊断",compact:"触发手动上下文压缩",context:"显示上下文分析报告",sessions:"列出会话",resume:"按 ID 恢复会话",tools:"列出可用工具",skills:"列出可用技能",version:"显示版本信息","check-update":"检查可用更新",upgrade:"升级到最新版本",permissions:"显示权限规则和待审批项",init:"生成 agent.md 项目指导文件","self-test":"运行工具能力自测并生成报告",acceptance:"运行或检查验收工作流",diff:"查看未提交的 Git 变更",status:"显示会话状态和统计",summary:"总结当前会话内容",effort:"显示或设置推理力度 (low|medium|high)",export:"导出当前会话为 JSON",rename:"重命名当前会话",hooks:"显示活跃钩子配置",cost:"显示预估会话成本"}});class Wg{options;commands=new Map;constructor(z){this.options=z;this.registerBuiltins()}#J(){const z=new Set;return[...this.commands.values()].filter((D)=>{if(z.has(D.name))return false;z.add(D.name);return true})}list(){return this.#J().map(({handler:z,...D})=>D)}listLocalized(z){const D=z==="zh"?"zh":"en";return this.#J().map(({handler:J,...K})=>({...K,description:V66(K.name,D)||K.description}))}async execute(z,D="",J={}){const K=z.replace(/^\//,"");const X=this.commands.get(K);if(!X)throw new Error(`Unknown command: ${z}`);if(X.requiresArgs&&!D.trim())throw new Error(`Usage: ${X.usage}`);return await X.handler(D,J)}register(z){this.commands.set(z.name.replace(/^\//,""),z);if(z.aliases){for(const D of z.aliases){this.commands.set(D.replace(/^\//,""),z)}}}registerBuiltins(){this.register({name:"goal",aliases:["目标"],description:"Set a goal for multi-step work",usage:"/goal <description>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>{const D=this.options.goals.create(z.trim());return{goal:D.id,title:D.title,message:"Goal created! Use /goal_list to view."}}});this.register({name:"workflow_list",aliases:["工作流列表"],description:"List workflow runs",usage:"/workflow_list",category:"core",scope:"runtime",handler:()=>this.options.workflows.listRuns()});this.register({name:"workflow_status",aliases:["工作流状态"],description:"Show workflow status",usage:"/workflow_status <runId>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>this.options.workflows.getRun(z.trim())||{error:"Workflow not found"}});this.register({name:"workflow_checkpoints",aliases:["工作流检查点"],description:"List workflow checkpoints",usage:"/workflow_checkpoints [runId]",category:"core",scope:"runtime",handler:(z)=>z.trim()?this.options.workflows.listCheckpoints(z.trim()):this.options.workflows.listCheckpoints()});this.register({name:"goal_list",aliases:["目标列表"],description:"List active goals",usage:"/goal_list",category:"core",scope:"runtime",handler:()=>this.options.goals.listActive()});this.register({name:"goal_status",aliases:["目标状态"],description:"Show goal progress",usage:"/goal_status <id>",category:"core",scope:"runtime",requiresArgs:true,handler:(z)=>{const D=this.options.goals.get(z.trim());if(!D)return{error:"Goal not found"};const J=D.tasks.filter((K)=>K.status!=="done"&&K.status!=="failed").length;return{title:D.title,progress:D.progress+"%",total:D.tasks.length,todo:J}}});this.register({name:"pipeline",aliases:["流水线"],description:"Show or set pipeline execution mode override (on|off|auto)",usage:"/pipeline [on|off|auto]",category:"core",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J)return{error:"No active session"};const K=z.trim().toLowerCase();if(!K)return{pipeline:J.pipelineMode??"auto"};if(!["on","off","auto"].includes(K)){return{error:"Invalid pipeline mode. Use: on, off, auto"}}J.pipelineMode=K;this.options.sessions.touch(J);return{pipeline:K,message:K==="on"?"Pipeline forced ON: every request is handed off to a workflow":K==="off"?"Pipeline OFF: every request runs the ReAct loop":"Pipeline AUTO: the LLM router decides per request"}}});this.register({name:"help",aliases:["帮助"],description:"List runtime commands",usage:"/help",category:"core",scope:"runtime",handler:()=>this.list()});this.register({name:"clear",aliases:["清除"],description:"Clear the local CLI conversation",usage:"/clear",category:"session",scope:"local",handler:()=>({local:true})});this.register({name:"config",aliases:["配置"],description:"Show active provider configuration",usage:"/config",category:"config",scope:"config",handler:()=>this.options.providerConfig.response()});this.register({name:"model",aliases:["模型"],description:"Show or change provider model",usage:"/model [model]",category:"config",scope:"config",handler:(z)=>z.trim()?this.options.providerConfig.save({model:z.trim()}):this.options.providerConfig.publicConfig()});this.register({name:"mcp",aliases:["mcp"],description:"List or reload MCP servers",usage:"/mcp [reload|tools]",category:"tools",scope:"runtime",handler:async(z)=>{const D=z.trim()||"list";if(D==="reload")this.options.mcp.reload();if(D==="tools")return await this.options.mcp.listTools();return this.options.mcp.listServers()}});this.register({name:"doctor",aliases:["诊断"],description:"Run full system diagnostics (provider/MCP/channels/config/permissions/sessions)",usage:"/doctor",category:"core",scope:"runtime",handler:async(z,D)=>{const J=new Yg;const K={providerConfig:this.options.providerConfig,sessions:this.options.sessions,permissions:this.options.permissions,mcp:this.options.mcp,channels:this.options.channels,configDir:this.options.configDir};const X=await J.run(K);const q=this.options.contextManager;if(q&&D.sessionId){const Y=this.options.sessions.get(D.sessionId);const G=q.getAnalysisReport(Y?.messages||[]);const Z=G.distribution;X.harness={model:G.model,contextWindow:G.contextWindow,effectiveWindow:G.effectiveWindow,warningState:{percentLeft:G.warningState.percentLeft,isAboveAutoCompactThreshold:G.warningState.isAboveAutoCompactThreshold,isAtBlockingLimit:G.warningState.isAtBlockingLimit},distribution:Z?{total:Z.total,humanPercent:Z.humanMessagePercent,assistantPercent:Z.assistantMessagePercent,toolRequestPercent:Z.toolRequestPercent,toolResultPercent:Z.toolResultPercent}:undefined}}return X}});this.register({name:"compact",aliases:["压缩"],description:"Trigger manual context compaction (uses: microcompact + autocompact)",usage:"/compact [messages]",category:"session",scope:"runtime",handler:async(z,D)=>{const J=this.options.contextManager;if(!J){return{message:"ContextManager not available. Compaction is automatic when history exceeds the runtime window."}}const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!K?.messages?.length)return{error:"No active session or no messages to compact"};const X=K.messages.length;const q=await J.runCompressionPipeline(K.messages,{force:true});if(!q.didCompact){const Y=q.usedLayer==="blocking_guard"?"context is at the blocking limit — cannot compact further":!J["compactProvider"]?"LLM summarization provider not available (run a query first to initialize)":"context is below the compaction threshold — nothing was compacted";return{message:`Compaction pipeline ran but did not compact. ${Y}`,layer:q.usedLayer,messageCount:X,tokensSaved:q.totalTokensSaved}}K.messages=q.messages.map((Y)=>({id:Y.id,type:Y.type,content:Y.content,timestamp:Y.timestamp}));this.options.sessions.touch(K);return{message:`Compacted session via ${q.usedLayer}: ${X} → ${K.messages.length} messages, ~${q.totalTokensSaved} tokens saved`,layer:q.usedLayer,messageCount:K.messages.length,tokensSaved:q.totalTokensSaved}}});this.register({name:"context",aliases:["上下文"],description:"Show context analysis report (token distribution, threshold warnings, compression status)",usage:"/context",category:"core",scope:"runtime",handler:(z,D)=>{const J=this.options.contextManager;if(!J)return{error:"ContextManager not available"};const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;const X=J.getAnalysisReport(K?.messages||[]);const q=X.distribution;const Y=X.warningState;const G=["╔══════════════════════════════════════╗","║ Context Analysis Report ║","╚══════════════════════════════════════╝","",`Model: ${X.model}`,`Context Window: ${(X.contextWindow/1000).toFixed(0)}K tokens`,`Effective Window: ${(X.effectiveWindow/1000).toFixed(0)}K tokens`,`Current Usage: ${(Y.currentUsage/1000).toFixed(1)}K tokens`,`AutoCompact Threshold: ${(X.autoCompactThreshold/1000).toFixed(0)}K tokens`,"",`Percent Left: ${Y.percentLeft}%`,`Warning: ${Y.isAboveWarningThreshold?"⚠️ Yes":"✅ No"}`,`AutoCompact: ${Y.isAboveAutoCompactThreshold?"⚡ Triggered":"✅ Not needed"}`,`Blocking Limit: ${Y.isAtBlockingLimit?"\uD83D\uDEAB Blocked":"✅ OK"}`];if(q){G.push("","── Token Distribution ──");G.push(` Human Messages: ${q.humanMessagePercent}%`);G.push(` Assistant Messages: ${q.assistantMessagePercent}%`);G.push(` Tool Requests: ${q.toolRequestPercent}%`);G.push(` Tool Results: ${q.toolResultPercent}%`);if(q.duplicateReadPercent>0){G.push(` ⚠️ Duplicate Reads: ${q.duplicateReadPercent}%`);for(const[H,V]of Object.entries(q.duplicateFileReads)){G.push(` ${H}: ${V.count} reads, ~${(V.tokens/1000).toFixed(1)}K tokens wasted`)}}const Z=Object.entries(q.toolResults).sort(([,H],[,V])=>V-H).slice(0,5);if(Z.length>0){G.push("","── Top Tools by Result Size ──");for(const[H,V]of Z){G.push(` ${H}: ${(V/1000).toFixed(1)}K tokens`)}}}return{report:G.join(`
1060
1060
  `)}}});this.register({name:"sessions",aliases:["会话列表"],description:"List sessions",usage:"/sessions",category:"session",scope:"runtime",handler:()=>this.options.sessions.list()});this.register({name:"resume",aliases:["继续"],description:"Resume a session by id",usage:"/resume <sessionId>",category:"session",requiresArgs:true,scope:"runtime",handler:(z)=>this.options.sessions.resumeSnapshot(z.trim(),{pendingApprovals:this.options.permissions.list()})});this.register({name:"tools",aliases:["工具"],description:"List available tools",usage:"/tools",category:"tools",scope:"runtime",handler:()=>this.options.tools.listApiTools()});this.register({name:"skills",aliases:["技能"],description:"List available skills (/simplify, /review, /commit, etc.)",usage:"/skills",category:"core",scope:"runtime",handler:()=>{const z=z38();return z.map((D)=>({name:D.name,description:D.description,aliases:D.aliases,hint:D.argumentHint}))}});this.register({name:"version",aliases:["版本"],description:"Show version information",usage:"/version",category:"core",scope:"runtime",handler:()=>({version:Y66()})});this.register({name:"check-update",aliases:["检查更新"],description:"Check npm registry for available updates",usage:"/check-update",category:"core",scope:"runtime",handler:async()=>await M38()});this.register({name:"upgrade",aliases:["升级"],description:"Upgrade to the latest version via npm",usage:"/upgrade",category:"core",scope:"runtime",handler:async()=>{const z=await q66();return z}});this.register({name:"permissions",aliases:["权限"],description:"Show permission rules and pending approvals",usage:"/permissions",category:"tools",scope:"runtime",handler:()=>({rules:this.options.permissions.listRules(),pendingApprovals:this.options.permissions.list(),stats:this.options.permissions.stats()})});this.register({name:"init",aliases:["初始化"],description:"Generate agent.md project guidance file in the workspace root",usage:"/init",category:"workspace",scope:"workspace",handler:()=>{const z=Rk(this.options.workspaceDir,"agent.md");if(R$(z))return{message:"agent.md already exists",path:z};Ek(z,A66,"utf8");return{message:"Created agent.md in workspace root",path:z}}});this.register({name:"self-test",aliases:["自测"],description:"Run tool capability self-test and generate a report",usage:"/self-test",category:"core",scope:"runtime",handler:async()=>{const{tools:z,permissions:D,workspaceDir:J}=this.options;D.setAutoMode(true);const K="self-test-session";for(const X of z.listToolDefs()){D.allowForSession(K,X.id)}try{const X=await oh({executeTool:(G,Z,H)=>z.execute(G,Z,H),toolDefs:z.listToolDefs(),workspaceDir:J,createGoal:(G)=>this.options.goals.create(G)?.id});const q=ah(X,J);const Y=X.summary;return{message:`Self-test complete: ${Y.passed}/${Y.total} passed, ${Y.failed} failed, ${Y.skipped} skipped`,reportPath:q,summary:Y}}finally{D.setAutoMode(false)}}});this.register({name:"acceptance",aliases:["验收"],description:"Run or inspect acceptance workflows",usage:"/acceptance quick|full|list|report [runId]",category:"core",scope:"runtime",handler:async(z,D)=>{const[J,K]=z.trim().split(/\s+/).filter(Boolean);const X=J||"quick";if(X==="quick"||X==="full"){const q=X;const Y=await this.options.workflows.start({sessionId:D.sessionId,workflow:Kg.build(q)});return{message:`Acceptance ${q} workflow started`,runId:Y.runId,status:Y.status,reportPath:this.options.workflows.getArtifactPath(Y.runId,"acceptance-report.md")}}if(X==="list"){return this.options.workflows.listRuns().filter((q)=>q.metadata?.kind==="acceptance")}if(X==="report"){const q=K?this.options.workflows.getRun(K):this.options.workflows.listRuns().find((G)=>G.metadata?.kind==="acceptance");if(!q)return{error:"Acceptance workflow not found"};const Y=this.options.workflows.getArtifactPath(q.runId,"acceptance-report.md");if(!R$(Y))return{runId:q.runId,reportPath:Y,ready:false};return{runId:q.runId,reportPath:Y,ready:true,report:eU(Y,"utf8")}}return{error:`Unknown acceptance action: ${X}`,usage:"/acceptance quick|full|list|report [runId]"}}});this.register({name:"diff",aliases:["差异"],description:"View uncommitted git changes in the workspace",usage:"/diff [path]",category:"workspace",scope:"workspace",handler:(z)=>{const D=z.trim()?` -- "${z.trim()}"`:"";try{const J=j66(`git diff${D}`,{cwd:this.options.workspaceDir,encoding:"utf-8",maxBuffer:10*1024*1024});return{diff:J||"(no changes)",path:z.trim()||"."}}catch(J){return{error:"Not a git repository or git not available"}}}});this.register({name:"status",aliases:["状态"],description:"Show session status and statistics",usage:"/status",category:"session",scope:"runtime",handler:(z,D)=>{const J=this.options.sessions.list();const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;const X=this.options.tools.listApiTools().length;return{sessionId:D.sessionId,messages:K?.messages?.length??0,tools:X,activeSessions:J.length,goals:this.options.goals.listActive().length,workflows:this.options.workflows.listRuns().length}}});this.register({name:"summary",aliases:["总结"],description:"Summarize the current session conversation",usage:"/summary",category:"session",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J?.messages?.length)return{message:"No messages in current session",summary:"Empty session"};const K=J.messages.length;const X=J.messages.filter((Y)=>Y.type==="user").length;const q=J.messages.filter((Y)=>Y.type==="assistant"||Y.type==="tool").length;return{message:`Session has ${K} messages (${X} user, ${q} assistant/tool)`,summary:{total:K,user:X,assistant:q}}}});this.register({name:"effort",aliases:["力度"],description:"Show or set reasoning effort level (low|medium|high)",usage:"/effort [low|medium|high]",category:"core",scope:"runtime",handler:(z)=>{const D=z.trim().toLowerCase();if(!D)return{effort:"current",note:"Use /effort low|medium|high to change"};if(!["low","medium","high"].includes(D))return{error:"Invalid effort level. Use: low, medium, high"};return{error:"Reasoning effort is not supported by the current provider pipeline — the setting would have no effect.",requested:D}}});this.register({name:"export",aliases:["导出"],description:"Export the current conversation as JSON",usage:"/export",category:"session",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J)return{error:"No active session"};return{sessionId:J.id,messages:J.messages?.length??0,exported:JSON.stringify({id:J.id,messageCount:J.messages?.length??0,createdAt:J.createdAt,messages:J.messages},null,2)}}});this.register({name:"rename",aliases:["重命名"],description:"Rename the current session",usage:"/rename <title>",category:"session",scope:"runtime",requiresArgs:true,handler:(z,D)=>{const J=z.trim();if(!J)return{error:"Title required"};const K=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!K)return{error:"No active session"};K.title=J;this.options.sessions.touch(K);return{message:`Session renamed to "${J}"`,title:J}}});this.register({name:"hooks",aliases:["钩子"],description:"Show active hook configurations",usage:"/hooks",category:"core",scope:"runtime",handler:()=>{const z=new pj(this.options.configDir);const D=z.listAll();if(D.length===0){return{message:"No hook rules configured. Hooks are stored in hooks.json under the config directory.",hooks:[]}}return{message:`${D.length} hook rule(s) configured (${D.filter((J)=>J.enabled).length} enabled)`,hooks:D.map((J)=>({name:J.name,enabled:J.enabled,events:J.events,scope:J.scope,priority:J.priority,implementationType:J.implementationType}))}}});this.register({name:"cost",aliases:["成本"],description:"Show estimated session cost and duration",usage:"/cost",category:"session",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J?.messages)return{message:"No active session data"};return{messageCount:J.messages.length,note:"Detailed cost tracking requires provider integration."}}});this.register({name:"files",aliases:["文件"],description:"Manage tracked workspace files",usage:"/files [list|add <path>|forget <path>]",category:"workspace",scope:"workspace",handler:async(z)=>{const D=z.trim().split(/\s+/);const J=D[0]?.toLowerCase()||"list";const K=D.slice(1).join(" ");const X=this.options.workspaceDir;const q=Rk(X,".agent","tracked-files.json");const Y=()=>{try{if(R$(q)){const Z=JSON.parse(eU(q,"utf-8"));if(Array.isArray(Z))return Z}}catch{}return[]};const G=(Z)=>{UY8(O66(q),{recursive:true});Ek(q,JSON.stringify(Z,null,2),"utf-8")};switch(J){case"add":{if(!K)return{error:"Usage: /files add <path>"};const Z=Y();if(!Z.includes(K)){Z.push(K);G(Z)}return{message:`Added "${K}" to tracked files`,tracked:Z,count:Z.length}}case"forget":case"remove":{if(!K)return{error:"Usage: /files forget <path>"};const Z=Y();const H=Z.filter((V)=>V!==K);G(H);return{message:`Removed "${K}" from tracked files`,tracked:H,count:H.length}}case"list":default:return{tracked:Y(),workspace:X,count:Y().length}}}});this.register({name:"copy",aliases:["复制"],description:"Copy the last assistant response text",usage:"/copy",category:"session",scope:"runtime",handler:(z,D)=>{const J=D.sessionId?this.options.sessions.get(D.sessionId):undefined;if(!J?.messages?.length)return{error:"No messages in session"};const K=[...J.messages].reverse().find((Y)=>Y.type==="assistant");if(!K)return{error:"No assistant message found"};const X=typeof K.content==="string"?K.content:JSON.stringify(K.content);const q=Array.from(X).slice(0,1e4).join("");return{message:"Last assistant response copied (see content field)",content:q,length:X.length,truncated:X.length>1e4}}});this.register({name:"theme",aliases:["主题"],description:"Show or change terminal theme",usage:"/theme [dark|light|default]",category:"core",scope:"runtime",handler:(z)=>{const D=z.trim().toLowerCase();const J=this.options.configDir;const K=J?Rk(J,"config.yaml"):null;const X=()=>{if(!K)return"default";try{if(R$(K)){const Y=eU(K,"utf-8");const G=$4.load(Y)||{};const Z=G.settings&&typeof G.settings==="object"&&!Array.isArray(G.settings)?G.settings:{};return typeof Z.theme==="string"?Z.theme:"default"}}catch{}return"default"};const q=(Y)=>{if(!K)return;try{UY8(J,{recursive:true});let G={};if(R$(K)){const Z=eU(K,"utf-8");G=$4.load(Z)||{}}if(!G.settings||typeof G.settings!=="object"){G.settings={}}G.settings.theme=Y;Ek(K,$4.dump(G,{indent:2,lineWidth:120}),"utf-8")}catch{}};if(!D){const Y=X();return{theme:Y,available:["dark","light","default"],persisted:true}}if(!["dark","light","default"].includes(D)){return{error:"Invalid theme. Use: dark, light, default"}}q(D);return{theme:D,message:`Theme set to ${D}`,persisted:true}}});this.register({name:"session",aliases:["会话"],description:"Manage sessions (create, switch, list, delete, rename)",usage:"/session [list|create <name>|switch <id>|rename <id> <title>|delete <id>]",category:"session",scope:"runtime",handler:(z,D)=>{const J=z.trim().split(/\s+/);const K=J[0]?.toLowerCase()||"list";const X=this.options.sessions;switch(K){case"list":return{sessions:X.list()};case"create":{const q=J.slice(1).join(" ")||`session-${Date.now()}`;const Y=X.create(q);return{message:`Session "${q}" created (id: ${Y.id}). Use /session switch ${Y.id} to activate.`,sessionId:Y.id,name:q}}case"switch":case"use":{const q=J[1];if(!q)return{error:"Usage: /session switch <id>"};const Y=X.get(q);if(!Y)return{error:`Session not found: ${q}`};return{__emitType:"session_switched",sessionId:q,title:Y.title,message:`Switched to session ${q} ("${Y.title}")`,messageCount:Y.messages?.length??0,createdAt:Y.createdAt}}case"rename":{const q=J[1];const Y=J.slice(2).join(" ");if(!q||!Y)return{error:"Usage: /session rename <id> <title>"};const G=X.get(q);if(!G)return{error:`Session not found: ${q}`};G.title=Y;X.touch(G);return{message:`Session ${q} renamed to "${Y}"`,id:q,title:Y}}case"delete":{const q=J[1];if(!q)return{error:"Usage: /session delete <id>"};const Y=X.get(q);if(!Y)return{error:`Session not found: ${q}`};const G=X.delete(q);return{message:`Session ${q} ${G?"deleted":"not found"}`}}default:return{error:`Unknown action: ${K}`,usage:"/session [list|create <name>|switch <id>|rename <id> <title>|delete <id>]"}}}});this.register({name:"code-review",aliases:["代码审查"],description:"Review uncommitted changes for code quality, security, and best practices",usage:"/code-review [path] [--full] [focus...]",category:"tools",scope:"workspace",requiresArgs:false,handler:async(z)=>{const D=this.options.workspaceDir;const J=z.trim().split(/\s+/).filter(Boolean);const K=J.includes("--full");const X=J.filter((V)=>!V.startsWith("--"));const q=X.length>0&&!X[0].includes(" ")?X[0]:".";const Y=X.length>1?X.slice(1).join(" "):"";const G=async()=>{try{let V=`git diff HEAD${q!=="."?` -- "${q}"`:""}`;let{stdout:j}=await _F(V,{cwd:D,encoding:"utf-8",maxBuffer:10*1024*1024,timeout:30000});if(!j.trim()){V=`git diff --cached${q!=="."?` -- "${q}"`:""}`;const A=await _F(V,{cwd:D,encoding:"utf-8",maxBuffer:10*1024*1024,timeout:30000});j=A.stdout}if(!j.trim()){const{stdout:A}=await _F(`git diff --stat${q!=="."?` -- "${q}"`:""}`,{cwd:D,encoding:"utf-8",maxBuffer:1024*1024,timeout:1e4});const B=A.trim()?A.trim().split(`
1061
1061
  `).map((M)=>M.trim()).filter(Boolean):[];return{ok:true,diff:"(no uncommitted changes found)",fileList:B}}const $=j.split(`
1062
1062
  `).filter((A)=>A.startsWith("diff --git")).map((A)=>{const B=A.match(/diff --git a\/(.+?) b\//);return B?B[1]:""}).filter(Boolean);return{ok:true,diff:j,fileList:$}}catch(V){const j=V instanceof Error?V.message:String(V);if(j.includes("not a git repository")||j.includes("fatal: not a git repository")){return{ok:false,error:"Not a git repository"}}try{const{readdirSync:$,statSync:A}=await import("node:fs");const{join:B}=await import("node:path");const M=(P,F=0)=>{if(F>3)return[];const E=[];for(const T of $(P).filter((S)=>!["node_modules",".git","dist",".claude"].includes(S))){const S=B(P,T);try{if(A(S).isDirectory())E.push(...M(S,F+1));else if(/\.(ts|tsx|js|jsx|py|rs|go|java|kt|swift|c|cpp|h|hpp|rb|php|vue|svelte)$/i.test(T))E.push(T)}catch{}}return E};const N=M(D);return{ok:true,diff:`(no git repo — reviewing workspace source files)
@@ -1674,7 +1674,7 @@ The reviewer should pay special attention to: **${$}**
1674
1674
  `)}catch{}}}else{zV8.write(G)}}var R4={trace:(z,D,J,K)=>x$("trace",z,D,J,undefined,K),debug:(z,D,J,K)=>x$("debug",z,D,J,undefined,K),info:(z,D,J,K)=>x$("info",z,D,J,undefined,K),warn:(z,D,J,K,X)=>x$("warn",z,D,J,K,X),error:(z,D,J,K,X)=>x$("error",z,D,K,J,X)};U0();function U9(z,D,J=15000){return new Promise((K)=>{const X=CG6("git",D,{cwd:z});let q="";let Y="";const G=setTimeout(()=>{X.kill();K({code:-1,stdout:q,stderr:`git ${D[0]} timed out after ${J}ms`})},J);X.stdout.on("data",(Z)=>{q+=String(Z)});X.stderr.on("data",(Z)=>{Y+=String(Z)});X.on("close",(Z)=>{clearTimeout(G);K({code:Z??-1,stdout:q,stderr:Y})});X.on("error",(Z)=>{clearTimeout(G);K({code:-1,stdout:q,stderr:Z.message})})})}function DV8(z){return z.split(/[\\/]/).filter(Boolean).pop()||z}function JV8(z,D){const J=[];for(const K of z.split(`
1675
1675
  `)){if(!K.trim())continue;const[X,q,Y]=K.split("\t");const G=Number(X)||0;const Z=Number(q)||0;if(!Y)continue;const H=D.get(Y)||"M";J.push({path:Y,status:H,added:G,removed:Z,staged:H===H.toUpperCase()})}return J}async function EG6(z){const D=await U9(z,["rev-parse","--abbrev-ref","HEAD"]);if(D.code!==0){return{available:false,projectName:DV8(z),error:"Not a git repository"}}const J=await U9(z,["status","--porcelain=v1"]);const K=new Map;for(const P of J.stdout.split(`
1676
1676
  `)){if(!P.trim())continue;const F=P.slice(0,2).trim();const E=P.slice(3).replace(/^"|"$/g,"");K.set(E,F||"M")}const X=await U9(z,["diff","--numstat"]);const q=await U9(z,["diff","--cached","--numstat"]);const Y=[...JV8(q.stdout,K),...JV8(X.stdout,K)];const G=new Map;for(const P of Y)G.set(P.path,P);for(const[P,F]of K){if(F.includes("?")&&!G.has(P)){G.set(P,{path:P,status:F,added:0,removed:0})}}const Z=Array.from(G.values());const H=Z.reduce((P,F)=>P+F.added,0);const V=Z.reduce((P,F)=>P+F.removed,0);let j=0,$=0;const A=await U9(z,["rev-list","--count","@{upstream}..HEAD"]);if(A.code===0)j=Number(A.stdout.trim())||0;const B=await U9(z,["rev-list","--count","HEAD..@{upstream}"]);if(B.code===0)$=Number(B.stdout.trim())||0;let M=null;const N=await U9(z,["log","-1","--format=%H%x09%an%x09%at%x09%s"]);if(N.code===0&&N.stdout.trim()){const[P,F,E,...T]=N.stdout.trim().split("\t");M={hash:P,author:F,timestamp:Number(E)*1000,subject:T.join("\t")}}return{available:true,projectName:DV8(z),branch:D.stdout.trim()||undefined,ahead:j,behind:$,changes:Z,totalAdded:H,totalRemoved:V,dirty:Z.length>0,lastCommit:M}}async function RG6(z){const D=await U9(z,["rev-parse","--abbrev-ref","HEAD"]);if(D.code!==0)return{available:false,error:"Not a git repository",branches:[]};const J=await U9(z,["branch","--format=%(refname:short)"]);const K=J.stdout.split(`
1677
- `).map((X)=>X.trim()).filter(Boolean);return{available:true,current:D.stdout.trim()||undefined,branches:K}}async function PG6(z,D,J=true){const K=J?["add","-A"]:["add","-u"];const X=await U9(z,K,30000);if(X.code!==0)return{ok:false,error:X.stderr.trim()||`git add failed (code ${X.code})`};const q=await U9(z,["commit","-m",D],30000);if(q.code!==0){const G=q.stderr.trim();if(/nothing to commit|no changes added/.test(G)){return{ok:false,error:"Nothing to commit — working tree is clean",message:D}}return{ok:false,error:G||`git commit failed (code ${q.code})`,message:D}}const Y=/\[[^\]]+ ([0-9a-f]+)\]/.exec(q.stdout);return{ok:true,hash:Y?Y[1]:undefined,message:q.stdout.trim()}}async function TG6(z){const D=await U9(z,["push"],60000);if(D.code!==0)return{ok:false,error:D.stderr.trim()||`git push failed (code ${D.code})`};return{ok:true,message:D.stdout.trim()}}async function wG6(z,D){const J=await U9(z,["checkout",D],30000);if(J.code!==0)return{ok:false,error:J.stderr.trim()||`git checkout failed (code ${J.code})`};return{ok:true,message:J.stdout.trim()}}oJ();var IG6=Number(process.env.DSC_HEAP_LIMIT_MB||4096);var L_8=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);var $71=Number(process.env.DEEPSEEKCODE_WS_PORT||L_8+1);var C_8=Number(process.env.DSC_FETCH_TIMEOUT_MS||5000);var yG6=Number(process.env.DSC_FETCH_LONG_TIMEOUT_MS||1e4);var j71=Number(process.env.DSC_MAX_LOG_LINE_LENGTH||1e4);var Q71=Number(process.env.DSC_MAX_LOG_FILE_SIZE||10485760);var A71=Number(process.env.DSC_MAX_TERMINAL_LINES||1000);var B71=Number(process.env.DSC_MAX_HISTORY_MESSAGES||200);var _71=Number(process.env.DSC_TOKEN_WARNING_THRESHOLD||0.8);var M71=Number(process.env.DSC_TOKEN_ERROR_THRESHOLD||0.95);var N71=Number(process.env.DSC_AUTO_COMPACT_THRESHOLD||0.7);var U71=Number(process.env.DSC_STREAM_FLUSH_MS||500);var F71=Number(process.env.DSC_STREAM_BUFFER_MAX_BYTES||10485760);var L71=Number(process.env.DSC_MAX_BLOCK_CONTENT_CHARS||51200);var C71=Number(process.env.DSC_MAX_MESSAGES||2000);var E71=Number(process.env.DSC_MAX_FILE_READ_SIZE||10485760);var R71=Number(process.env.DSC_MAX_SEARCH_RESULTS||1000);var P71=Number(process.env.DSC_MAX_SESSION_FILE_SIZE||52428800);var T71=Number(process.env.DSC_SESSION_AUTO_SAVE_MS||5000);var XV8="jwcode-ai/jwcode";var qV8="@deepseekcode/cli";var fG6=3600000;var E_8=Math.min(C_8,8000);var Kj=null;function ph(){if("1.0.13")return"1.0.13";try{const z=vG6(bG6(import.meta.url));const D=[KV8(z,"..","package.json"),KV8(z,"..","..","package.json")];for(const J of D){const K=JSON.parse(SG6(J,"utf8"));if(typeof K?.version==="string"&&K.version)return K.version}}catch{}return"1.0.0"}async function kG6(z){const D=await fetch(`https://api.github.com/repos/${XV8}/releases/latest`,{headers:{Accept:"application/vnd.github+json","User-Agent":"deepseekcode-update-check"},signal:AbortSignal.timeout(E_8)});if(!D.ok)return null;const J=await D.json();const K=String(J.tag_name??"").replace(/^v/i,"");if(!K)return null;return{version:K,current:z,available:AV8(K,z)>0,channel:"stable",publishedAt:typeof J.published_at==="string"?J.published_at:undefined,notes:typeof J.body==="string"?J.body.slice(0,4000):undefined,url:typeof J.html_url==="string"?J.html_url:`https://github.com/${XV8}/releases`,source:"github"}}async function xG6(z){const D=await fetch(`https://registry.npmjs.org/${qV8}/latest`,{signal:AbortSignal.timeout(E_8)});if(!D.ok)return null;const J=await D.json();const K=String(J.version??"");if(!K)return null;return{version:K,current:z,available:AV8(K,z)>0,channel:"stable",url:`https://www.npmjs.com/package/${qV8}`,source:"npm"}}async function YV8(z,D=false){const J=z??ph();if(!D&&Kj&&Date.now()-Kj.at<fG6)return Kj.info;let K=null;try{K=await kG6(J)}catch{K=null}if(!K){try{K=await xG6(J)}catch{K=null}}Kj={at:Date.now(),info:K};return K}function hG6(){Kj=null}function uG6(){if(R_8()==="win32")return"powershell.exe";return process.env.SHELL||"sh"}class P_8{defaultWorkspaceDir;wsPort;sessions=new Map;constructor(z,D){this.defaultWorkspaceDir=z;this.wsPort=D}start(z){const D=`terminal_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;const J=gG6(z.workspaceDir||this.defaultWorkspaceDir);const K=uG6();this.sessions.set(D,{id:D,workspaceDir:J,shell:K,startedAt:Date.now()});return{terminalId:D,port:this.wsPort,ttydPort:this.wsPort,wsUrl:`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(D)}`,workspaceDir:J,shell:K}}status(z){const D=z?this.sessions.get(z):undefined;const J=[...this.sessions.values()];return{running:z?Boolean(D?.child):J.some((K)=>Boolean(K.child)),terminalAvailable:true,ttydAvailable:true,port:this.wsPort,ttydPort:this.wsPort,uptime:D?Math.floor((Date.now()-D.startedAt)/1000):undefined,workspaceDir:D?.workspaceDir||this.defaultWorkspaceDir,wsUrl:z?`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(z)}`:`ws://127.0.0.1:${this.wsPort}/terminal`,sessions:J.map((K)=>({id:K.id,workspaceDir:K.workspaceDir,shell:K.shell,uptime:Math.floor((Date.now()-K.startedAt)/1000),cols:K.cols,rows:K.rows,exitCode:K.exitCode,error:K.error}))}}stop(z){const D=z?[this.sessions.get(z)].filter(Boolean):[...this.sessions.values()];for(const J of D){try{J.child?.kill();J.socket?.close?.()}catch{}this.sessions.delete(J.id)}return D.length}openSocket(z,D){let J=D?this.sessions.get(D):undefined;if(!J){const X=this.start({});J=this.sessions.get(X.terminalId)}J.socket=z;let K;try{K=this.spawnShell(J)}catch(X){J.error=X instanceof Error?X.message:String(X);z.send(`Terminal failed to start: ${X instanceof Error?X.message:String(X)}\r
1677
+ `).map((X)=>X.trim()).filter(Boolean);return{available:true,current:D.stdout.trim()||undefined,branches:K}}async function PG6(z,D,J=true){const K=J?["add","-A"]:["add","-u"];const X=await U9(z,K,30000);if(X.code!==0)return{ok:false,error:X.stderr.trim()||`git add failed (code ${X.code})`};const q=await U9(z,["commit","-m",D],30000);if(q.code!==0){const G=q.stderr.trim();if(/nothing to commit|no changes added/.test(G)){return{ok:false,error:"Nothing to commit — working tree is clean",message:D}}return{ok:false,error:G||`git commit failed (code ${q.code})`,message:D}}const Y=/\[[^\]]+ ([0-9a-f]+)\]/.exec(q.stdout);return{ok:true,hash:Y?Y[1]:undefined,message:q.stdout.trim()}}async function TG6(z){const D=await U9(z,["push"],60000);if(D.code!==0)return{ok:false,error:D.stderr.trim()||`git push failed (code ${D.code})`};return{ok:true,message:D.stdout.trim()}}async function wG6(z,D){const J=await U9(z,["checkout",D],30000);if(J.code!==0)return{ok:false,error:J.stderr.trim()||`git checkout failed (code ${J.code})`};return{ok:true,message:J.stdout.trim()}}oJ();var IG6=Number(process.env.DSC_HEAP_LIMIT_MB||4096);var L_8=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);var $71=Number(process.env.DEEPSEEKCODE_WS_PORT||L_8+1);var C_8=Number(process.env.DSC_FETCH_TIMEOUT_MS||5000);var yG6=Number(process.env.DSC_FETCH_LONG_TIMEOUT_MS||1e4);var j71=Number(process.env.DSC_MAX_LOG_LINE_LENGTH||1e4);var Q71=Number(process.env.DSC_MAX_LOG_FILE_SIZE||10485760);var A71=Number(process.env.DSC_MAX_TERMINAL_LINES||1000);var B71=Number(process.env.DSC_MAX_HISTORY_MESSAGES||200);var _71=Number(process.env.DSC_TOKEN_WARNING_THRESHOLD||0.8);var M71=Number(process.env.DSC_TOKEN_ERROR_THRESHOLD||0.95);var N71=Number(process.env.DSC_AUTO_COMPACT_THRESHOLD||0.7);var U71=Number(process.env.DSC_STREAM_FLUSH_MS||500);var F71=Number(process.env.DSC_STREAM_BUFFER_MAX_BYTES||10485760);var L71=Number(process.env.DSC_MAX_BLOCK_CONTENT_CHARS||51200);var C71=Number(process.env.DSC_MAX_MESSAGES||2000);var E71=Number(process.env.DSC_MAX_FILE_READ_SIZE||10485760);var R71=Number(process.env.DSC_MAX_SEARCH_RESULTS||1000);var P71=Number(process.env.DSC_MAX_SESSION_FILE_SIZE||52428800);var T71=Number(process.env.DSC_SESSION_AUTO_SAVE_MS||5000);var XV8="jwcode-ai/jwcode";var qV8="@deepseekcode/cli";var fG6=3600000;var E_8=Math.min(C_8,8000);var Kj=null;function ph(){if("1.0.14")return"1.0.14";try{const z=vG6(bG6(import.meta.url));const D=[KV8(z,"..","package.json"),KV8(z,"..","..","package.json")];for(const J of D){const K=JSON.parse(SG6(J,"utf8"));if(typeof K?.version==="string"&&K.version)return K.version}}catch{}return"1.0.0"}async function kG6(z){const D=await fetch(`https://api.github.com/repos/${XV8}/releases/latest`,{headers:{Accept:"application/vnd.github+json","User-Agent":"deepseekcode-update-check"},signal:AbortSignal.timeout(E_8)});if(!D.ok)return null;const J=await D.json();const K=String(J.tag_name??"").replace(/^v/i,"");if(!K)return null;return{version:K,current:z,available:AV8(K,z)>0,channel:"stable",publishedAt:typeof J.published_at==="string"?J.published_at:undefined,notes:typeof J.body==="string"?J.body.slice(0,4000):undefined,url:typeof J.html_url==="string"?J.html_url:`https://github.com/${XV8}/releases`,source:"github"}}async function xG6(z){const D=await fetch(`https://registry.npmjs.org/${qV8}/latest`,{signal:AbortSignal.timeout(E_8)});if(!D.ok)return null;const J=await D.json();const K=String(J.version??"");if(!K)return null;return{version:K,current:z,available:AV8(K,z)>0,channel:"stable",url:`https://www.npmjs.com/package/${qV8}`,source:"npm"}}async function YV8(z,D=false){const J=z??ph();if(!D&&Kj&&Date.now()-Kj.at<fG6)return Kj.info;let K=null;try{K=await kG6(J)}catch{K=null}if(!K){try{K=await xG6(J)}catch{K=null}}Kj={at:Date.now(),info:K};return K}function hG6(){Kj=null}function uG6(){if(R_8()==="win32")return"powershell.exe";return process.env.SHELL||"sh"}class P_8{defaultWorkspaceDir;wsPort;sessions=new Map;constructor(z,D){this.defaultWorkspaceDir=z;this.wsPort=D}start(z){const D=`terminal_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;const J=gG6(z.workspaceDir||this.defaultWorkspaceDir);const K=uG6();this.sessions.set(D,{id:D,workspaceDir:J,shell:K,startedAt:Date.now()});return{terminalId:D,port:this.wsPort,ttydPort:this.wsPort,wsUrl:`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(D)}`,workspaceDir:J,shell:K}}status(z){const D=z?this.sessions.get(z):undefined;const J=[...this.sessions.values()];return{running:z?Boolean(D?.child):J.some((K)=>Boolean(K.child)),terminalAvailable:true,ttydAvailable:true,port:this.wsPort,ttydPort:this.wsPort,uptime:D?Math.floor((Date.now()-D.startedAt)/1000):undefined,workspaceDir:D?.workspaceDir||this.defaultWorkspaceDir,wsUrl:z?`ws://127.0.0.1:${this.wsPort}/terminal?terminalId=${encodeURIComponent(z)}`:`ws://127.0.0.1:${this.wsPort}/terminal`,sessions:J.map((K)=>({id:K.id,workspaceDir:K.workspaceDir,shell:K.shell,uptime:Math.floor((Date.now()-K.startedAt)/1000),cols:K.cols,rows:K.rows,exitCode:K.exitCode,error:K.error}))}}stop(z){const D=z?[this.sessions.get(z)].filter(Boolean):[...this.sessions.values()];for(const J of D){try{J.child?.kill();J.socket?.close?.()}catch{}this.sessions.delete(J.id)}return D.length}openSocket(z,D){let J=D?this.sessions.get(D):undefined;if(!J){const X=this.start({});J=this.sessions.get(X.terminalId)}J.socket=z;let K;try{K=this.spawnShell(J)}catch(X){J.error=X instanceof Error?X.message:String(X);z.send(`Terminal failed to start: ${X instanceof Error?X.message:String(X)}\r
1678
1678
  `);z.close?.();this.sessions.delete(J.id);return}J.child=K;K.stdout.on("data",(X)=>z.send(String(X)));K.stderr.on("data",(X)=>z.send(String(X)));K.on("error",(X)=>{J.error=X.message;try{z.send(`Terminal process error: ${X.message}\r
1679
1679
  `);z.close?.()}catch{}this.sessions.delete(J.id)});K.on("exit",(X)=>{J.exitCode=X;try{z.send(`\r
1680
1680
  [terminal exited ${X??""}]\r
@@ -1683,7 +1683,7 @@ The reviewer should pay special attention to: **${$}**
1683
1683
  `)){const J8=z8.trim();if(!J8||J8.startsWith("#"))continue;const U8=J8.indexOf(":");if(U8===-1)continue;const o8=J8.slice(0,U8).trim();let k6=J8.slice(U8+1).trim();if(typeof k6==="string"&&k6.startsWith("[")&&k6.endsWith("]")){k6=k6.slice(1,-1).split(",").map((h)=>h.trim()).filter(Boolean)}else if(k6==="true")k6=true;else if(k6==="false")k6=false;F8[o8]=k6}return F8}function m(t){const F8=t.match(/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/);if(!F8)return null;return{frontmatter:w(F8[1]),body:F8[2].trim()}}function r(t){const F8=(J8)=>String(J8??"");const z8=(J8)=>Array.isArray(J8)?J8.join(", "):J8?String(J8):"";return["---",`id: ${F8(t.id)}`,`name: ${F8(t.name||t.id)}`,`description: ${F8(t.description).replace(/\n/g," ")}`,`enabled: ${t.enabled!==false}`,`category: ${F8(t.category||"General")}`,`icon: ${F8(t.icon||"馃幆")}`,`trigger: ${F8(t.trigger||"")}`,`injection: ${F8(t.injection||"lazy")}`,`tags: [${z8(t.tags)}]`,`tools: [${z8(t.requiredTools)}]`,`source: ${F8(t.source||"user")}`,`editable: ${t.editable!==false}`,"---","",F8(t.systemPrompt)].join(`
1684
1684
  `)}function a(){Y8();const t=new Map;for(const F8 of OF(i)){if(!F8.endsWith(".skill.md"))continue;try{const z8=E4(u1(i,F8),"utf-8");const J8=m(z8);if(!J8)continue;const U8=J8.frontmatter;const o8=String(U8.id??F8.replace(/\.skill\.md$/,""));t.set(o8,{id:o8,name:String(U8.name??o8),description:String(U8.description??""),enabled:U8.enabled!==false,category:String(U8.category??"General"),icon:String(U8.icon??"star"),tags:Array.isArray(U8.tags)?U8.tags:[],trigger:String(U8.trigger??""),injection:String(U8.injection??"lazy"),systemPrompt:J8.body,requiredTools:Array.isArray(U8.tools)?U8.tools:[],source:String(U8.source??"file"),editable:U8.editable!==false,version:String(U8.version??"1.0"),author:String(U8.author??"user")})}catch(z8){R4.warn("skills.load_failed",`Failed to load skill ${F8}`,String(z8))}}return t}function D8(t){Y8();T2(u1(i,String(t.id)+".skill.md"),r(t),"utf-8")}function H8(t){const F8=u1(i,t+".skill.md");if(c0(F8))sH8(F8)}function Z8(){Y8();if(OF(i).some((F8)=>F8.endsWith(".skill.md")))return;const t=[{id:"code-review",name:"Code Review",description:"Review code changes for correctness, security, and best practices",enabled:true,category:"Development",icon:"馃帗",tags:["review","code-quality"],trigger:"review",injection:"lazy",systemPrompt:"You are a thorough code reviewer. Analyze code for bugs, security issues, performance problems, and adherence to best practices. Provide constructive feedback.",requiredTools:["read","grep"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"debug",name:"Debug",description:"Analyze and fix bugs in code",enabled:true,category:"Development",icon:"馃攳",tags:["debug","bug-fix"],trigger:"debug",injection:"lazy",systemPrompt:"You are a debugging expert. Systematically analyze code, identify root causes, and propose fixes. Use tools to inspect code and runtime state.",requiredTools:["read","grep","bash"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"explain",name:"Explain Code",description:"Explain what code does in detail",enabled:true,category:"Learning",icon:"馃摉",tags:["explain","understand"],trigger:"explain",injection:"lazy",systemPrompt:"You are a coding teacher. When asked to explain code, provide a clear, detailed explanation of what it does, how it works, key patterns used, and potential pitfalls.",requiredTools:["read"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"refactor",name:"Refactor",description:"Refactor code to improve quality and maintainability",enabled:true,category:"Development",icon:"馃敡",tags:["refactor","clean-code"],trigger:"refactor",injection:"lazy",systemPrompt:"You are a refactoring specialist. Improve code structure, readability, and maintainability while preserving functionality. Suggest modern patterns and best practices.",requiredTools:["read","write","grep"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"test",name:"Write Tests",description:"Generate unit tests for code",enabled:true,category:"Testing",icon:"馃И",tags:["test","unit-test"],trigger:"test",injection:"lazy",systemPrompt:"You are a testing expert. Write comprehensive unit tests covering normal cases, edge cases, and error conditions. Use the appropriate testing framework for the project.",requiredTools:["read","write"],source:"built-in",editable:false,version:"1.0",author:"system"},{id:"document",name:"Document",description:"Generate documentation for code",enabled:true,category:"Documentation",icon:"馃摑",tags:["doc","documentation"],trigger:"doc",injection:"lazy",systemPrompt:"You are a technical writer. Generate clear, comprehensive documentation including API docs, inline comments, and usage examples.",requiredTools:["read","write"],source:"built-in",editable:false,version:"1.0",author:"system"}];for(const F8 of t)D8(F8)}Z8();const Q8=a();async function O8(t,F8){const z8=F8.pathname;const J8=t.method.toUpperCase();if(J8==="OPTIONS")return p(P8({}));const U8={runtime:B,getApiKey:()=>P.load()?.apiKey||null};if(z8==="/v1/chat/completions"&&J8==="POST"){const{handleChatCompletions:o8}=await Promise.resolve().then(()=>uh);return o8(t,U8)}if(z8==="/v1/models"&&J8==="GET"){const{handleModels:o8}=await Promise.resolve().then(()=>uh);return o8(t,U8)}return null}function j8(){return[{category:"TOOL",events:[{name:"PRE_TOOL_USE",summary:"Intercept before tool execution",hasMatcher:true,matcherField:"toolNamePattern"},{name:"POST_TOOL_USE",summary:"Post tool execution",hasMatcher:true,matcherField:"toolNamePattern"},{name:"POST_TOOL_USE_FAILURE",summary:"Tool execution failed",hasMatcher:true,matcherField:"toolNamePattern"},{name:"PERMISSION_DENIED",summary:"Permission denied",hasMatcher:false},{name:"PERMISSION_REQUEST",summary:"Permission request",hasMatcher:false}]},{category:"SESSION",events:[{name:"SESSION_START",summary:"Session started",hasMatcher:false},{name:"SESSION_END",summary:"Session ended",hasMatcher:false},{name:"STOP",summary:"Generation stopped",hasMatcher:false},{name:"STOP_FAILURE",summary:"Stop failed",hasMatcher:false},{name:"NOTIFICATION",summary:"System notification",hasMatcher:false}]},{category:"CONTEXT",events:[{name:"PRE_COMPACT",summary:"Before context compaction",hasMatcher:false},{name:"POST_COMPACT",summary:"After context compaction",hasMatcher:false},{name:"PRE_CONTEXT_RESET",summary:"Before context reset",hasMatcher:false},{name:"POST_CONTEXT_RESET",summary:"After context reset",hasMatcher:false}]},{category:"STATE_MACHINE",events:[{name:"STATE_TRANSITION",summary:"",hasMatcher:true,matcherField:"fromState"},{name:"STATE_ENTERED",summary:"",hasMatcher:true,matcherField:"fromState"}]},{category:"TASK",events:[{name:"USER_PROMPT_SUBMIT",summary:"User submitted prompt",hasMatcher:false},{name:"SUBAGENT_START",summary:"Subagent started",hasMatcher:false},{name:"SUBAGENT_STOP",summary:"Subagent stopped",hasMatcher:false},{name:"TASK_CREATED",summary:"Task created",hasMatcher:false},{name:"TASK_COMPLETED",summary:"Task completed",hasMatcher:false},{name:"TEAMMATE_IDLE",summary:"Teammate idle",hasMatcher:false}]},{category:"A2A",events:[{name:"TASK_DISPATCH",summary:"Task dispatched",hasMatcher:false},{name:"A2A_REMOTE_INTERCEPT",summary:"Remote intercept",hasMatcher:false}]},{category:"CONFIG",events:[{name:"CONFIG_CHANGE",summary:"Configuration changed",hasMatcher:false},{name:"INSTRUCTIONS_LOADED",summary:"Instructions loaded",hasMatcher:false},{name:"CWD_CHANGED",summary:"Working directory changed",hasMatcher:false},{name:"FILE_CHANGED",summary:"File changed",hasMatcher:false}]}]}function f8(){return[{id:"main",name:"Main",description:"Primary orchestration agent - general task processing"},{id:"code-reviewer",name:"Code Reviewer",description:"Code review specialist agent"},{id:"debugger",name:"Debugger",description:"Debug analysis specialist agent"}]}async function N8(t,F8){const z8=F8.pathname;const J8=t.method.toUpperCase();if(J8==="OPTIONS")return p(P8({}));if(z8==="/api/health")return p(P8({status:"ok"}));if(z8==="/api/weixin/bind"&&J8==="GET"){try{const{fetchWebQrCode:h}=await Promise.resolve().then(()=>(U0(),i0));const n=await h();return p(P8(n))}catch(h){return p(j6(`Failed to fetch WeChat QR code: ${h instanceof Error?h.message:String(h)}`),500)}}if(z8==="/api/weixin/bind/status"&&J8==="GET"){const h=F8.searchParams.get("qrcode")||"";if(!h)return p(j6("缺少 qrcode 参数"),400);try{const{checkWebQrStatus:n}=await Promise.resolve().then(()=>(U0(),i0));const V8=await n({qrcode:h});if(V8.status==="confirmed"&&V8.ilink_bot_id){try{const{saveWeixinAccount:M8,registerWeixinAccountId:e8,clearStaleAccountsForUserId:x8}=await Promise.resolve().then(()=>(U0(),i0));const l8=String(V8.ilink_bot_id).replace(/@im\.bot$/,"").replace(/@/g,"-");const A6=V8.baseurl||"https://ilinkai.weixin.qq.com";M8(l8,{token:V8.bot_token||"",baseUrl:A6,userId:V8.ilink_user_id});e8(l8);if(V8.ilink_user_id){x8(l8,V8.ilink_user_id)}await D6(l8,A6,V8.ilink_user_id)}catch(M8){R4.error("weixin.bind_persist_failed","Failed to persist WeChat bind result",String(M8))}}return p(P8(V8))}catch(n){return p(j6(`Failed to check binding status: ${n instanceof Error?n.message:String(n)}`),500)}}if(z8==="/api/system/status"){const h=l();return p(P8({status:"running",runtime:"typescript",product:"deepseekcode",uptime:Math.floor((Date.now()-V)/1000),memory:{used:process.memoryUsage().heapUsed,total:process.memoryUsage().heapTotal,max:process.memoryUsage().rss},models:{total:h.length,online:h.filter((n)=>n.status==="online").length,offline:h.filter((n)=>n.status!=="online").length},timestamp:Date.now()}))}if(z8==="/api/system/shutdown"){if(z.onShutdown){setImmediate(z.onShutdown);return p(P8({message:"Shutting down..."}))}setImmediate(()=>{try{V1.close()}catch{}try{I1.close()}catch{}B.dispose();process.exit(0)});return p(P8({message:"Shutting down..."}))}if(z8==="/api/system/restart"){try{B.dispose()}catch{}return p(P8({message:"DeepSeekCode TS server restart initiated — please restart the process manually for full lifecycle reset"}))}if(z8==="/api/system/version"){const h=ph();let n=null;try{n=await YV8(h)}catch{n=null}return p(P8({product:"deepseekcode",channel:"stable",current:h,update:n,checkedAt:Date.now(),status:n?n.available?"update-available":"up-to-date":"unknown"}))}if(z8==="/api/system/update/check"&&J8==="GET"){const h=ph();hG6();let n=null;try{n=await YV8(h,true)}catch{n=null}return p(P8({product:"deepseekcode",channel:"stable",current:h,update:n,checkedAt:Date.now(),status:n?n.available?"update-available":"up-to-date":"unknown"}))}if(z8==="/api/config/provider"){if(J8==="GET"){const q1=P.response();const X6=t8();return p(P8({...q1,providers:X6}))}const h=await v8(t);const n=String(h.provider||h.defaultProvider||"");if(!n)return p(j6("provider is required"),400);const V8="apiKey"in h?h.apiKey:("api_key"in h)?h.api_key:undefined;const M8=V8!==undefined?String(V8):undefined;P.save({provider:n,baseUrl:String(h.baseUrl||h.base_url||""),apiKey:M8,model:String(h.model||Array.isArray(h.models)&&h.models[0]?.id||""),maxTokens:h.maxTokens||h.max_tokens,contextWindow:h.contextWindow||h.context_window,temperature:h.temperature});if(Array.isArray(h.models)){const q1=K8();const X6=q1.filter((W7)=>W7.provider!==n);for(let W7=0;W7<h.models.length;W7++){const G7=h.models[W7];const K7=String(G7.id||G7.name||"").trim();if(!K7)continue;const n1=W7===0||G7.isDefault===true;X6.push({id:K7,provider:n,enabled:G7.enabled!==false,isDefault:Boolean(n1),defaultFor:String(G7.defaultFor||""),apiType:String(G7.apiType||h.apiType||"openai-completions"),name:String(G7.name||G7.id||K7),baseUrl:String(G7.baseUrl||h.baseUrl||"")})}_8(X6);Q()}const e8=String(h.baseUrl||h.base_url||"");const x8=String(h.apiType||"openai-completions");const l8=Array.isArray(h.models)?h.models.length:0;A8(n,{baseUrl:e8,hasApiKey:Boolean(M8),apiType:x8,modelCount:l8});const A6=P.response();const d6=t8();w6();return p(P8({...A6,providers:d6}))}if(z8==="/api/config/provider/remove"&&J8==="POST"){const h=await v8(t);const n=String(h.provider||"");if(!n)return p(j6("provider is required"),400);let V8=K8();V8=V8.filter((e8)=>e8.provider!==n);_8(V8);m8(n);const M8=P.load();if(M8.provider===n){const e8=V8.length>0?V8[0].provider:"deepseek";const x8=V8.length>0?V8[0].id:"";P.save({provider:e8,model:x8})}w6();return p(P8({removed:true}))}if(z8==="/api/providers/presets"&&J8==="GET"){const h=!c0(C);if(h){try{const V8=new Promise((M8)=>setTimeout(M8,3500));await Promise.race([u(1e4).then(()=>{}),V8])}catch{}}const n=f();u(1e4);return p(P8(n))}if(z8==="/api/providers/refresh"&&J8==="POST"){let h=null;try{if(c0(C)){h=JSON.parse(E4(C,"utf-8"))}}catch{}u(1e4);if(h){return p(P8({refreshed:true,source:"cache"}))}return p(P8({refreshed:true,message:"Refresh triggered in background"}))}const U8=G;const o8=["config.yaml","channels.json","hooks.json","system-prompt.md","history.json","daemon.json","settings.json","provider.json","theme.json","mode.json"];const k6=["history.json"];if(z8==="/api/config/files"&&J8==="GET"){const h=o8.filter((n)=>c0(u1(U8,n))).map((n)=>{try{const V8=nz(u1(U8,n));return{name:n,size:V8.size,modified:V8.mtimeMs,editable:!k6.includes(n)}}catch{return null}}).filter(Boolean);return p(P8(h))}if(z8==="/api/config/files/read"&&J8==="GET"){const h=String(F8.searchParams.get("file")||"");if(!h||!o8.includes(h))return p(j6("Invalid config file name"),400);const n=u1(U8,h);if(!c0(n))return p(j6("File not found"),404);try{const V8=E4(n,"utf8");return p(P8({name:h,content:V8,editable:!k6.includes(h)}))}catch(V8){return p(j6(V8.message),500)}}if(z8==="/api/config/files/write"&&J8==="PUT"){const h=await v8(t);const n=String(h.file||"");if(!n||!o8.includes(n))return p(j6("Invalid config file name"),400);if(k6.includes(n))return p(j6("File is read-only"),403);try{oz(U8,{recursive:true});T2(u1(U8,n),String(h.content||""),"utf8");return p(P8({message:`${n} saved`}))}catch(V8){return p(j6(V8.message),500)}}if(z8==="/api/commands"){const h=F8.searchParams.get("lang")||undefined;return p(P8(h?B.listCommandsLocalized(h):B.listCommands()))}if(z8==="/api/models"&&J8==="GET")return p(P8({models:l(),defaultProvider:P.load().provider}));if(z8==="/api/models"&&J8==="POST"){const h=await v8(t);const n=h.model&&typeof h.model==="object"?h.model:{};const V8=n.apiKeys;const M8=Array.isArray(V8)?String(V8[0]||""):String(V8||n.apiKey||"");const e8=String(h.provider||n.provider||P.load().provider);const x8=String(n.id||n.name||n.model||P.load().model);const l8=String(n.apiType||"openai-chat-completions");const A6=P.save({provider:e8,model:x8,baseUrl:n.baseUrl||n.base_url,apiKey:M8||undefined,maxTokens:n.maxTokens||n.max_tokens,contextWindow:n.contextWindow||n.context_window,temperature:n.temperature});const d6=K8();I8(d6,x8,e8,n.enabled!==false,false,undefined);const q1=d6.findIndex((X6)=>X6.id.toLowerCase()===x8.toLowerCase());if(q1>=0){d6[q1].apiType=l8;if(n.name)d6[q1].name=String(n.name);if(n.baseUrl)d6[q1].baseUrl=String(n.baseUrl)}_8(d6);Q();A8(e8,{baseUrl:String(n.baseUrl||A6.baseUrl||""),hasApiKey:Boolean(M8||A6.apiKey),apiType:l8,modelCount:d6.filter((X6)=>X6.provider===e8).length});w6();return p(P8({model:A6,provider:A6.provider,savedTo:"config.yaml+models.json"}))}if(z8==="/api/models/update"&&J8==="POST"){const h=await v8(t);const n=P.load();const V8=h.model&&typeof h.model==="object"?h.model:{};const M8=P.save({provider:String(h.provider||n.provider),model:String(V8.id||V8.name||V8.model||h.modelId||n.model),baseUrl:V8.baseUrl||V8.base_url||n.baseUrl,maxTokens:V8.maxTokens||V8.max_tokens||n.maxTokens,contextWindow:V8.contextWindow||V8.context_window||n.contextWindow,temperature:V8.temperature!==undefined?V8.temperature:n.temperature});w6();return p(P8({provider:h.provider||n.provider,modelId:h.modelId||M8.model,model:M8}))}if(z8==="/api/models/delete"&&J8==="POST"){const h=await v8(t);const n=String(h.modelId||"");const V8=String(h.provider||"");const M8=P.load();let e8=K8();e8=e8.filter((x8)=>x8.id!==n);_8(e8);Q();if(n&&n===M8.model){const x8=e8.find((A6)=>A6.enabled);const l8=x8?.id??"";P.save({model:l8})}w6();return p(P8({provider:V8,modelId:n,removed:true}))}if(z8==="/api/models/toggle"&&J8==="POST"){const h=await v8(t);const n=String(h.modelId||"");let V8=K8();const M8=V8.findIndex((l8)=>l8.id===n);const e8=M8>=0?V8[M8].enabled:true;const x8=h.enabled!==undefined?Boolean(h.enabled):!e8;I8(V8,n,String(h.provider||""),x8);_8(V8);Q();w6();return p(P8({provider:String(h.provider||""),modelId:n,enabled:x8}))}if(z8==="/api/models/defaults"&&J8==="POST"){const h=await v8(t);const n=P.load();let V8=K8();const M8=(l8)=>{if(V8.some((d6)=>d6.id===l8))return l8;const A6=l8.indexOf(":");if(A6>0){const d6=l8.slice(A6+1);if(V8.some((q1)=>q1.id===d6)){for(const q1 of V8){if(q1.id===l8)delete q1.defaultFor}return d6}}return l8};if(h.global){const l8=M8(String(h.global));P.save({model:l8});I8(V8,l8,n.provider,true,true)}for(const l8 of["plan","act","goal"]){const A6=h[l8];if(A6===null){for(const d6 of V8){if(d6.defaultFor===l8)delete d6.defaultFor}}else if(A6){I8(V8,M8(String(A6)),n.provider,true,false,l8)}}_8(V8);E8();w6();const e8=M8(String(h.global||n.model));const x8=(l8)=>V8.find((A6)=>A6.defaultFor===l8)?.id;return p(P8({defaults:{global:e8,plan:String(h.plan?M8(String(h.plan)):x8("plan")||e8),act:String(h.act?M8(String(h.act)):x8("act")||e8),goal:String(h.goal?M8(String(h.goal)):x8("goal")||e8)}}))}if(z8==="/api/models/fetch"&&J8==="POST"){const h=await v8(t);const n=String(h.baseUrl||"").trim().replace(/\/+$/,"");const V8=String(h.apiKey||"").trim();const M8=V8.replace(/[^\x00-\xFF]/g,"");if(V8&&V8!==M8){console.warn(`[API] API Key contains non-Latin-1 characters (e.g. •). Stripped for fetch request.`)}const e8=M8||(P.load().apiKey||"");if(!n)return p(j6("Base URL is required"),400);const x8=n.endsWith("/v1")||n.endsWith("/v1beta")?n:`${n}/v1`;const l8=[...n.endsWith("/models")?[n]:[`${n}/models`,`${x8}/models`],...n.includes("/anthropic")||n.includes("/coding")||n.includes("/step_plan")||n.includes("/compatible")||n.includes("/claude")?(()=>{const X6=n.replace(/\/+(api\/|apps\/)?(anthropic|coding|step_plan|compatible|claudecode|claude)\/?.*$/,"");return X6&&X6.includes("://")?[`${X6}/v1/models`,`${X6}/models`]:[]})():[]];const A6=new Set;const d6=l8.filter((X6)=>{const W7=X6.toLowerCase();return A6.has(W7)?false:(A6.add(W7),true)});let q1="";for(const X6 of d6){try{const W7={"content-type":"application/json"};if(e8)W7.authorization=`Bearer ${e8}`;const G7=await fetch(X6,{headers:W7,signal:AbortSignal.timeout(C_8)});if(!G7.ok){if(G7.status===404||G7.status===405)continue;q1=`HTTP ${G7.status}`;break}const K7=await G7.json();let n1=(Array.isArray(K7.data)?K7.data:[]).filter((o1)=>o1&&typeof o1==="object"&&o1.id).map((o1)=>({id:String(o1.id),name:String(o1.id)}));if(n1.length===0&&Array.isArray(K7.models)){n1=K7.models.filter((o1)=>o1&&typeof o1==="object"&&o1.name).map((o1)=>{const c1=String(o1.name||"").replace(/^models\//,"");return{id:c1,name:c1}})}if(n1.length===0&&Array.isArray(K7)){n1=K7.filter((o1)=>o1&&typeof o1==="object"&&o1.id).map((o1)=>({id:String(o1.id),name:String(o1.id)}))}if(n1.length>0){const o1=new Set;n1=n1.filter((c1)=>{const X0=c1.id;return o1.has(X0)?false:(o1.add(X0),true)});return p(P8({models:n1,url:X6}))}q1=`No models found in response from ${X6}`}catch(W7){q1=W7.message}}return p(j6(q1||"Failed to fetch models"),400)}if(z8.startsWith("/api/models/")){const h=z8.split("/");const n=decodeURIComponent(h[3]||"");if(h.length>4){if(h[4]==="test"&&J8==="POST"){const V8=await v8(t);const M8=String(V8.baseUrl||"");const e8=String(V8.apiKey||"");const x8=M8||P.load().baseUrl||"";const l8=e8||P.load().apiKey||"";const A6=l8.replace(/[^\x00-\xFF]/g,"");if(!x8)return p(j6("No base URL configured"),400);const d6={"content-type":"application/json"};if(A6)d6.authorization=`Bearer ${A6}`;const q1=k(x8);let X6="";for(const W7 of q1){try{const G7=await fetch(W7,{headers:d6,signal:AbortSignal.timeout(yG6)});const K7=G7.ok||G7.status===401||G7.status===403;return p(P8({connected:K7,status:G7.status,message:K7?"Connected":`HTTP ${G7.status}`}))}catch(G7){X6=G7.message}}return p(P8({connected:false,message:X6||"All endpoints failed"}))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(J8==="GET"){const V8=l().find((M8)=>M8.id===n);return V8?p(P8(V8)):p(j6("Model not found"),404)}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(z8==="/api/tools")return p(P8(b.listApiTools()));if(z8.startsWith("/api/tools/")){const h=z8.split("/");const n=decodeURIComponent(h[3]||"");if(h.length>4){if(h[4]==="toggle"&&J8==="POST"){const V8=await v8(t);const M8=V8.enabled!==undefined?Boolean(V8.enabled):true;const e8=b.setToolEnabled(n,M8);if(!e8)return p(j6("Tool not found"),404);return p(P8({id:n,enabled:M8}))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(J8==="GET"){const V8=b.listApiTools();const M8=V8.find((e8)=>e8.id===n);return M8?p(P8(M8)):p(j6("Tool not found"),404)}if(J8==="PUT"){const V8=await v8(t);const M8=b.listApiTools();const e8=M8.find((x8)=>x8.id===n);if(!e8)return p(j6("Tool not found"),404);if(V8.enabled!==undefined)b.setToolEnabled(n,Boolean(V8.enabled));return p(P8(b.listApiTools().find((x8)=>x8.id===n)))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(z8==="/api/skills"&&J8==="GET")return p(P8(Array.from(Q8.values())));if(z8==="/api/skills"&&J8==="POST"){const h=await v8(t);if(!h.id)return p(j6("Skill ID is required"),400);const n={id:h.id,name:h.name||h.id,description:h.description||"",enabled:h.enabled!==false,category:h.category||"General",icon:h.icon||"star",tags:h.tags||[],trigger:h.trigger||"",injection:h.injection||"lazy",systemPrompt:h.systemPrompt||"",requiredTools:h.requiredTools||[],source:"user",editable:true,version:h.version||"1.0",author:"user",provenance:"manual"};Q8.set(n.id,n);D8(n);return p(P8(n))}if(z8.startsWith("/api/skills/import")&&J8==="POST"){const h=await v8(t);const n=h.id||h.fileName?.replace(/\.(skill\.md|md|txt)$/i,"")||"imported-"+Date.now();const V8={id:n,name:h.name||n,description:h.description||"Imported skill",enabled:true,category:"Imported",icon:"馃摝",tags:h.tags||[],trigger:h.trigger||"",injection:h.injection||"lazy",systemPrompt:h.content||h.systemPrompt||"",requiredTools:h.requiredTools||[],source:"imported",editable:true,version:h.version||"1.0",author:"user",provenance:"import"};Q8.set(V8.id,V8);D8(V8);return p(P8(V8))}if(z8.startsWith("/api/skills/")){const h=z8.split("/");const n=decodeURIComponent(h[3]);if(!n)return p(j6("Skill ID is required"),400);if(h[4]==="toggle"&&J8==="POST"){const V8=await v8(t);const M8=Q8.get(n);if(!M8)return p(j6("Skill not found"),404);M8.enabled=V8.enabled!==undefined?V8.enabled:!M8.enabled;Q8.set(n,M8);D8(M8);return p(P8(M8))}if(J8==="GET"){const V8=Q8.get(n);return V8?p(P8(V8)):p(j6("Skill not found"),404)}if(J8==="PUT"){const V8=Q8.get(n);if(!V8)return p(j6("Skill not found"),404);const M8=await v8(t);Object.assign(V8,M8,{id:n});Q8.set(n,V8);D8(V8);return p(P8(V8))}if(J8==="DELETE"){if(!Q8.has(n))return p(j6("Skill not found"),404);Q8.delete(n);H8(n);return p(P8({deleted:true}))}return p(P8({message:"Skill endpoint"}))}if(z8==="/api/agents"&&J8==="GET")return p(P8(Array.from(s.values())));if(z8==="/api/agents"&&J8==="POST"){const h=await v8(t);const n=String(h.id||h.name||`agent-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();const V8={id:n,name:String(h.name||n),description:String(h.description||""),color:String(h.color||"#58a6ff"),active:Boolean(h.active),enabled:h.enabled!==false,instanceCount:Number(h.instanceCount||1),state:h.state==="busy"||h.state==="error"?h.state:"idle",modelBinding:h.modelBinding||{mode:"mode-default"}};s.set(n,V8);return p(P8(V8),201)}if(z8.startsWith("/api/agents/")){const h=z8.split("/");const n=decodeURIComponent(h[3]||"");const V8=s.get(n);if(!V8)return p(j6("Agent not found"),404);if(h.length===4&&J8==="GET")return p(P8(V8));if(h.length===4&&J8==="PUT"){const M8=await v8(t);const e8={...V8,...M8,id:n};s.set(n,e8);return p(P8(e8))}if(h.length===4&&J8==="DELETE"){if(n==="main")return p(j6("Cannot delete the main agent"),400);s.delete(n);return p(P8({deleted:true}))}if(h[4]==="activate"&&J8==="POST"){for(const[M8,e8]of s)s.set(M8,{...e8,active:M8===n});return p(P8({agentId:n,active:true}))}if(h[4]==="toggle"&&J8==="POST"){const M8=await v8(t);const e8=M8.enabled!==undefined?Boolean(M8.enabled):!V8.enabled;const x8={...V8,enabled:e8,state:e8?"idle":"idle"};s.set(n,x8);return p(P8({agentId:n,enabled:e8,instanceCount:x8.instanceCount,state:x8.state}))}if(h[4]==="model"&&J8==="POST"){const M8=await v8(t);const e8={mode:M8.mode==="specified"?"specified":"mode-default",...M8.modelRef?{modelRef:String(M8.modelRef)}:{}};const x8={...V8,modelBinding:e8};s.set(n,x8);return p(P8({agentId:n,...e8}))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(z8==="/api/sessions"&&J8==="GET")return p(P8(N.list()));if(z8==="/api/sessions"&&J8==="POST"){const h=await v8(t);const n=h.sessionId?N.ensure(String(h.sessionId),h.title||"New Session"):N.create(h.title||"New Session");const{messages:V8,...M8}=n;return p(P8(M8))}if(z8.startsWith("/api/sessions/")){const h=z8.split("/");const n=h[3];if(h[4]==="messages")return p(P8(N.getMessages(n)));if(h[4]==="resume"){return p(P8(N.resumeSnapshot(n,{tasks:B.listTasks(),pendingApprovals:F.list()})))}if(J8==="DELETE"){N.delete(n);return p(P8({deleted:true}))}const V8=N.get(n);return V8?p(P8(V8)):p(j6("Session not found"),404)}if(z8==="/api/tasks"&&J8==="GET")return p(P8(B.listTasks()));if(z8==="/api/tasks"&&J8==="POST")return p(P8(B.createTask(await v8(t))));if(z8==="/api/tasks"&&J8==="DELETE"){let h=0;for(const n of B.listTasks()){if(["COMPLETED","FAILED","CANCELLED"].includes(n.status)){B.deleteTask(n.id);h+=1}}return p(P8({deleted:h}))}if(z8.startsWith("/api/tasks/")){const h=z8.split("/");const n=h[3];const V8=B.getTask(n);if(!V8)return p(j6("Task not found"),404);if(J8==="DELETE"){B.deleteTask(V8.id);return p(P8({deleted:true}))}if(J8==="PUT"||J8==="PATCH"){const M8=await v8(t);B.updateTask(n,{...h[4]==="status"?{status:M8.status}:M8,updatedAt:U6()});return p(P8(B.getTask(n)))}if(h[4]==="stop")return p(P8(B.stopTask(n)));if(h[4]==="output"){if(J8==="POST"){const M8=await v8(t);return p(P8(B.addTaskOutput(n,M8.line||M8.output||"")))}return p(P8(B.getTaskOutput(n)))}return p(P8(V8))}if(z8==="/api/plans"&&J8==="GET"){try{const h=B.plans.list();return p(P8(h))}catch(h){return p(j6(h.message),500)}}if(z8.startsWith("/api/plans/")&&J8==="GET"){const h=z8.split("/");const n=decodeURIComponent(h[3]);const V8=B.plans.read(n);if(!V8)return p(j6("Plan not found"),404);return p(P8({...V8,slug:n}))}if(z8.startsWith("/api/plans/")&&J8==="DELETE"){const h=z8.split("/");const n=decodeURIComponent(h[3]);const V8=B.plans.delete(n);if(!V8)return p(j6("Plan not found"),404);return p(P8({deleted:true}))}if(z8==="/api/files"&&J8==="GET"){try{const h=I6(F8.searchParams.get("path")||".");return p(P8([F6(h)]))}catch(h){return p(j6(h.message),400)}}if(z8==="/api/files/read"&&J8==="GET"){try{return p(P8(E4(I6(F8.searchParams.get("path")||""),"utf8")))}catch(h){return p(j6(h.message),400)}}if(z8==="/api/files/write"&&J8==="PUT"||z8==="/api/files"&&J8==="POST"||z8==="/api/files/upload"&&J8==="POST"){const h=await v8(t);try{const n=I6(h.path);oz(az(n,".."),{recursive:true});T2(n,String(h.content||""),h.base64?"base64":"utf8");return p(P8({path:h.path,size:nz(n).size}))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/files"&&J8==="DELETE"){try{const h=I6(F8.searchParams.get("path")||"");sH8(h);return p(P8({deleted:true}))}catch(h){return p(j6(h.message),400)}}if(z8==="/api/files/download"&&J8==="GET"){try{return new Response(E4(I6(F8.searchParams.get("path")||"")))}catch(h){return p(j6(h.message),400)}}if(z8.startsWith("/api/files"))return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404);if(z8==="/api/filejob/parse"&&J8==="POST"){const h=await v8(t);try{const n=[];const V8=Array.isArray(h.files)?h.files:[];const M8=Array.isArray(h.paths)?h.paths:[];if(M8.length===0&&V8.length===0){return p(j6("Provide either `files` (base64) or `paths` (workspace file paths)."),400)}for(const e8 of V8){const x8=String(e8?.name||"unnamed");const l8=String(e8?.base64||"");if(!l8)continue;if(l8.length>73400320)throw new Error(`${x8} exceeds the 50MB upload limit`);const A6=eX(x8,Buffer.from(l8,"base64"));n.push(A6.info)}for(const e8 of M8){const x8=gJ(String(e8));const l8=E4(I6(String(e8)));const A6=eX(x8,l8);n.push(A6.info)}return p(P8(n))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/filejob/render"&&J8==="POST"){const h=await v8(t);try{const n=h.data||{};const V8=h.template||{};const M8=String(h.outputFormat||"xlsx");let e8,x8;if(n.path){e8=gJ(String(n.path));x8=E4(I6(String(n.path)))}else if(n.base64){e8=String(n.name||"data");x8=Buffer.from(String(n.base64),"base64")}else{return p(j6("`data` must include `path` or `base64`."),400)}let l8,A6;if(V8.path){l8=gJ(String(V8.path));A6=E4(I6(String(V8.path)))}else if(V8.base64){l8=String(V8.name||"template.txt");A6=Buffer.from(String(V8.base64),"base64")}else{return p(j6("`template` must include `path` or `base64`."),400)}const d6=eX(e8,x8);const q1=dJ(l8);let X6="";if(q1==="docx"){const{parseDocx:E9}=await Promise.resolve().then(()=>(U0(),i0));X6=E9(A6)}else if(q1==="xlsx"||q1==="xls"){const{parseXlsx:E9}=await Promise.resolve().then(()=>(U0(),i0));X6=E9(A6).map((p2)=>p2.headers.join(",")).join(`
1685
1685
  `)}else{X6=A6.toString("utf8")}const{detectPlaceholders:W7,autoMapPlaceholders:G7,renderDataToBuffer:K7}=await Promise.resolve().then(()=>(U0(),i0));const n1=W7(X6);const o1=Object.keys(d6.rows[0]||{});const c1=Array.isArray(h.mapping)&&h.mapping.length>0?h.mapping.map((E9)=>({placeholder:String(E9.placeholder),field:String(E9.field),fallback:E9.fallback,hitRate:1})):G7(n1.length?n1:o1,o1,d6.rows.length);const X0=K7({data:d6.rows,templateText:n1.length?X6:undefined,outputFormat:M8,outputName:String(h.outputName||"output"),mapping:c1});const D5=u1(".deepseekcode","output",X0.fileName).split("\\").join("/");const u2=I6(D5);oz(uX(u2),{recursive:true});T2(u2,X0.buffer);const m2={fileName:X0.fileName,format:X0.format,size:nz(u2).size,path:D5,rowCount:X0.rowCount,successCount:X0.successCount,failedRows:X0.failedRows};return p(P8({result:m2,mapping:c1,parsed:d6.info}))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/filejob/import"&&J8==="POST"){const h=await v8(t);try{const n=Array.isArray(h.paths)?h.paths.map((M8)=>String(M8)).filter(Boolean):[];if(n.length===0)return p(P8([]));const V8=[];for(const M8 of n){const e8=nz(M8);if(!e8.isFile())continue;if(e8.size>52428800)continue;const x8=gJ(M8);let l8=x8;let A6=1;while(c0(I6(u1(j,l8)))){const X6=x8.lastIndexOf(".");l8=X6>0?`${x8.slice(0,X6)} (${A6})${x8.slice(X6)}`:`${x8} (${A6})`;A6++}const d6=u1(j,l8).split("\\").join("/");const q1=I6(d6);oz(uX(q1),{recursive:true});T2(q1,E4(M8));V8.push({name:l8,path:d6,size:e8.size})}return p(P8(V8))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/git/status"&&J8==="GET"){try{const h=await EG6(Y);return p(P8(h))}catch(h){return p(P8({available:false,error:h.message}))}}if(z8==="/api/git/branches"&&J8==="GET"){try{return p(P8(await RG6(Y)))}catch(h){return p(P8({available:false,error:h.message}))}}if(z8==="/api/git/commit"&&J8==="POST"){const h=await v8(t);try{const n=String(h.message||"").trim();if(!n)return p(j6("commit message is required"),400);return p(P8(await PG6(Y,n,h.all!==false)))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/git/push"&&J8==="POST"){try{return p(P8(await TG6(Y)))}catch(h){return p(j6(h.message),400)}}if(z8==="/api/git/checkout"&&J8==="POST"){const h=await v8(t);try{const n=String(h.branch||"").trim();if(!n)return p(j6("branch name is required"),400);return p(P8(await wG6(Y,n)))}catch(n){return p(j6(n.message),400)}}if(z8==="/api/repos/pr"&&J8==="GET"){return p(P8({available:false,message:"Pull request integration is not configured. Enable a git remote and a PR provider (e.g. GitHub CLI) to see PR status."}))}if(z8==="/api/terminal/status")return p(P8(T.status(F8.searchParams.get("terminalId")||undefined)));if(z8==="/api/terminal/start"){const h=await v8(t);return p(P8(T.start({workspaceDir:h.workspaceDir})))}if(z8==="/api/terminal/stop"){const h=await v8(t);return p(P8({stopped:T.stop(h.terminalId)}))}if(z8==="/api/mcp/servers"){if(J8==="POST"){S.reload();await C6()}return p(P8(S.listServers()))}if(z8==="/api/mcp/health")return p(P8(S.health()));if(z8==="/api/mcp/tools"){try{const h=await B.refreshMcpTools((n)=>z6(n));return p(P8(h))}catch(h){return p(j6(h.message),400)}}if(z8==="/api/mcp/call"&&J8==="POST"){const h=await v8(t);try{return p(P8(await S.callTool(String(h.server||""),String(h.tool||h.name||""),h.arguments||h.args||{})))}catch(n){return p(j6(n.message),400)}}if(z8.startsWith("/api/hooks")){const h=z8.split("/").filter(Boolean);const n=h.slice(2).join("/");const V8=J8==="POST"||J8==="PUT"||J8==="PATCH"?await v8(t):{};if(!n&&J8==="GET"){return p(P8({endpoints:["stats","events","agents","export","import","reload","rules","rules/batch-delete","rules/batch-toggle"],stats:E.stats()}))}if(n==="reload"){F.reload();return p(P8({reloaded:true,stats:E.stats()}))}if(n==="stats")return p(P8(E.stats()));if(n==="events")return p(P8(j8()));if(n==="agents")return p(P8(f8()));if(n==="dry-run"){return p(P8(F.dryRun({toolName:String(V8.toolName||V8.tool||""),action:String(V8.action||""),risk:V8.risk==="low"||V8.risk==="medium"||V8.risk==="high"?V8.risk:"medium",payload:V8.payload&&typeof V8.payload==="object"?V8.payload:V8},String(V8.sessionId||""))))}if(n==="export")return p(P8(E.export()));if(n==="import"&&J8==="POST"){const x8=E.import({hooks:Array.isArray(V8.hooks)?V8.hooks:[],mergeMode:String(V8.mergeMode||"replace"),scope:String(V8.scope||"project")});return p(P8(x8))}if(n==="rules/batch-delete"&&J8==="POST"){const x8=Array.isArray(V8.names)?V8.names:[];const l8=E.batchDelete(x8,String(V8.scope||"project"));return p(P8({deleted:l8}))}if(n==="rules/batch-toggle"&&J8==="POST"){const x8=Array.isArray(V8.names)?V8.names:[];const l8=V8.enabled!==false;const A6=E.batchToggle(x8,l8,String(V8.scope||"project"));return p(P8({count:A6,enabled:l8}))}const M8=n.match(/^rules\/(.+)\/toggle$/);if(M8&&J8==="PATCH"){const x8=decodeURIComponent(M8[1]);const l8=E.toggle(x8,V8.enabled!==false);if(!l8)return p(j6("Rule not found"),404);return p(P8({name:x8,enabled:V8.enabled!==false}))}const e8=n.match(/^rules(?:\/(.+))?$/);if(e8){const x8=e8[1]||null;const l8=x8?decodeURIComponent(x8):null;if(!l8&&J8==="GET"){return p(P8(E.listAll()))}if(l8&&J8==="GET"){const A6=E.get(l8);if(!A6)return p(j6("Rule not found"),404);return p(P8(A6))}if(!l8&&J8==="POST"){const A6=E.create(V8);if(!A6.success)return p(j6(A6.error),400);return p(P8(A6),201)}if(l8&&J8==="PUT"){const A6=E.update(l8,V8);if(!A6.success)return p(j6(A6.error),400);return p(P8(A6))}if(l8&&J8==="DELETE"){const A6=E.delete(l8);if(!A6)return p(j6("Rule not found"),404);return p(P8({deleted:true}))}return p(j6(`Unsupported request: ${J8} /${n}`),400)}return p(j6(`Unsupported endpoint: /${n}`),404)}if(z8==="/api/inbox"&&J8==="GET"){const h=new URL(t.url||"","http://localhost").searchParams;const n=h.get("state")||"pending";const V8=h.get("sessionId")||undefined;const M8=h.get("kind")||undefined;const e8=X8.list({state:n==="all"?undefined:n,sessionId:V8,kind:M8});return p(P8({items:e8,stats:X8.stats()}))}if(z8==="/api/inbox/stats"&&J8==="GET"){return p(P8(X8.stats()))}if(z8.startsWith("/api/inbox/")){const h=z8.split("/").filter(Boolean);const n=h[2];if(h[3]==="resolve"&&J8==="POST"&&n){const V8=await v8(t);const M8=String(V8.resolution||"allow");const e8=X8.resolve(n,M8);if(!e8)return p(j6("Inbox item not found or already resolved"),404);const x8=X8.get(n);if(M8==="always"&&x8?.kind==="approval"){const l8=g.automationForRunSession(x8.sessionId);const A6=String(x8.data?.toolName||"");const d6=x8.data?.payload&&typeof x8.data.payload==="object"?x8.data.payload:{};const q1=A6?vu(A6,d6):null;if(l8&&A6&&q1){g.addRule(l8.id,A6,q1);z6({type:"automation.update",data:JSON.stringify({action:"permission_added",automation:l8.toJSON()})})}}if(x8)z6({type:"inbox.resolved",sessionId:x8.sessionId,data:JSON.stringify(x8)});return p(P8({resolved:true,item:x8}))}if(J8==="GET"&&n){const V8=X8.get(n);if(!V8)return p(j6("Inbox item not found"),404);return p(P8(V8))}return p(j6(`Unsupported request: ${J8} ${z8}`),400)}if(z8==="/api/audit"&&J8==="GET"){const h=new URL(t.url||"","http://localhost").searchParams;const n=$.query({sessionId:h.get("sessionId")||undefined,tool:h.get("tool")||undefined,decision:h.get("decision"),approvedBy:h.get("approvedBy"),page:Number(h.get("page")||0),pageSize:Number(h.get("pageSize")||50)});return p(P8(n))}if(z8==="/api/audit/stats"&&J8==="GET"){return p(P8($.stats()))}if(z8==="/api/automations"&&J8==="GET"){return p(P8(g.list().map((h)=>h.toJSON())))}if(z8==="/api/automations"&&J8==="POST"){const h=await v8(t);const n=h.schedule&&typeof h.schedule==="object"?{kind:h.schedule.kind==="once"?"once":"cron",cron:h.schedule.cron?String(h.schedule.cron):null,fireAt:h.schedule.fireAt?String(h.schedule.fireAt):null,timezone:h.schedule.timezone?String(h.schedule.timezone):"local"}:{kind:"cron",cron:String(h.cron||"0 9 * * *")};if(n.kind==="cron"){const{validateCron:M8}=await Promise.resolve().then(()=>(U0(),i0));const e8=M8(n.cron||"");if(e8)return p(j6(`Invalid cron: ${e8}`),400)}const V8=g.create({name:String(h.name||"Untitled automation"),instructions:String(h.instructions||""),schedule:n,workspaceDir:String(h.workspaceDir||Y),permissions:Array.isArray(h.permissions)?h.permissions.map(String):[],readAutoAllow:h.readAutoAllow!==false});z6({type:"automation.update",data:JSON.stringify({action:"created",automation:V8.toJSON()})});return p(P8(V8.toJSON()),201)}if(z8.startsWith("/api/automations/")){const h=z8.split("/").filter(Boolean);const n=h[2];if(!n)return p(j6("Missing automation id"),400);const V8=g.get(n);if(h[3]==="toggle"&&J8==="POST"){if(!V8)return p(j6("Automation not found"),404);const M8=await v8(t);const e8=M8.enabled!==false;const x8=g.toggle(n,e8);z6({type:"automation.update",data:JSON.stringify({action:e8?"enabled":"disabled",automation:x8?.toJSON()})});return p(P8(x8?.toJSON()))}if(h[3]==="run"&&J8==="POST"){if(!V8)return p(j6("Automation not found"),404);const M8=q8.startRun(n);z6({type:"automation.run",data:JSON.stringify({action:"started",automationId:n,run:M8?.toJSON()})});return p(P8(M8?.toJSON()),202)}if(h[3]==="runs"&&J8==="GET"){if(!V8)return p(j6("Automation not found"),404);return p(P8(g.runsFor(n).map((M8)=>M8.toJSON())))}if(h[3]==="permissions"&&J8==="POST"){if(!V8)return p(j6("Automation not found"),404);const M8=await v8(t);const e8=String(M8.tool||"");const x8=String(M8.target||"");const l8=g.addRule(n,e8,x8);if(!l8)return p(j6("Invalid rule entry or already present"),400);z6({type:"automation.update",data:JSON.stringify({action:"permission_added",automation:l8.toJSON()})});return p(P8(l8.toJSON()))}if(h[3]==="permissions"&&J8==="DELETE"){if(!V8)return p(j6("Automation not found"),404);const M8=await v8(t);const e8=String(M8.entry||"");const x8=g.revokeRule(n,e8);if(!x8)return p(j6("Rule entry not found"),404);z6({type:"automation.update",data:JSON.stringify({action:"permission_revoked",automation:x8.toJSON()})});return p(P8(x8.toJSON()))}if(J8==="GET"){if(!V8)return p(j6("Automation not found"),404);return p(P8(V8.toJSON()))}if(J8==="PUT"){if(!V8)return p(j6("Automation not found"),404);const M8=await v8(t);const e8=g.update(n,{name:M8.name!==undefined?String(M8.name):undefined,instructions:M8.instructions!==undefined?String(M8.instructions):undefined,schedule:M8.schedule&&typeof M8.schedule==="object"?{kind:M8.schedule.kind==="once"?"once":"cron",cron:M8.schedule.cron?String(M8.schedule.cron):null,fireAt:M8.schedule.fireAt?String(M8.schedule.fireAt):null,timezone:M8.schedule.timezone?String(M8.schedule.timezone):"local"}:undefined,workspaceDir:M8.workspaceDir!==undefined?String(M8.workspaceDir):undefined,permissions:Array.isArray(M8.permissions)?M8.permissions.map(String):undefined,readAutoAllow:M8.readAutoAllow!==undefined?Boolean(M8.readAutoAllow):undefined});z6({type:"automation.update",data:JSON.stringify({action:"updated",automation:e8?.toJSON()})});return p(P8(e8?.toJSON()))}if(J8==="DELETE"){const M8=g.delete(n);if(!M8)return p(j6("Automation not found"),404);z6({type:"automation.update",data:JSON.stringify({action:"deleted",automationId:n})});return p(P8({deleted:true}))}return p(j6(`Unsupported request: ${J8} ${z8}`),400)}if(z8==="/api/channels"&&J8==="GET"){const h=u1(U8,"channels.json");const n=R6(h,[]);const V8=Array.isArray(n)?n:n.channels||[];const{decryptConfig:M8}=await Promise.resolve().then(()=>(U0(),i0));const e8=V8.map((x8)=>M8(x8));return p(P8(e8))}if(z8==="/api/channels"&&J8==="POST"){const h=await v8(t);const n=u1(U8,"channels.json");const V8=B6(n);const{encryptConfig:M8,decryptConfig:e8}=await Promise.resolve().then(()=>(U0(),i0));const x8=String(h.id||h.name||`channel-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();const l8={id:x8,name:String(h.name||"Channel"),type:h.type==="feishu"||h.type==="dingtalk"?h.type:"wechat",appId:String(h.appId||""),appSecret:String(h.appSecret||""),token:String(h.token||""),encodingAESKey:String(h.encodingAESKey||""),enabled:h.enabled!==false,extra:h.extra&&typeof h.extra==="object"?h.extra:{},connected:false};const A6=M8(l8);s8(n,[...V8.filter((d6)=>d6.id!==l8.id),A6]);if(l8.enabled){try{await B.initializeChannels([l8])}catch(d6){R4.error("channels.error","Channel initialization failed",String(d6))}}return p(P8(e8(l8)),201)}if(z8.startsWith("/api/channels/")){const h=z8.split("/");const n=decodeURIComponent(h[3]||"");const V8=u1(U8,"channels.json");const M8=B6(V8);const e8=M8.find((x8)=>x8.id===n);if(!e8)return p(j6("Channel not found"),404);if(h.length===4&&J8==="PUT"){const{encryptConfig:x8,decryptConfig:l8}=await Promise.resolve().then(()=>(U0(),i0));const A6=await v8(t);const d6={...e8,...A6,id:n};const q1=x8(d6);s8(V8,M8.map((X6)=>X6.id===n?q1:X6));try{await B.channels.removeAdapter(n);if(d6.enabled!==false){await B.channels.createAdapter(d6)}}catch(X6){R4.error("channels.error","Channel operation failed",String(X6))}return p(P8(l8(d6)))}if(h.length===4&&J8==="DELETE"){s8(V8,M8.filter((x8)=>x8.id!==n));return p(P8({deleted:true}))}if(h[4]==="toggle"&&J8==="PATCH"){const x8=await v8(t);const l8=Boolean(x8.enabled);const A6={...e8,enabled:l8};s8(V8,M8.map((d6)=>d6.id===n?A6:d6));try{if(l8){await B.channels.createAdapter(A6)}else{await B.channels.removeAdapter(n)}}catch(d6){R4.error("channels.error","Channel operation failed",String(d6))}return p(P8({id:n,enabled:l8}))}if(h[4]==="webhook"&&J8==="POST"){const x8=B.channels.getAdapter(n);if(!x8){return p(P8({message:`Channel ${n} not started, cannot process webhook`}),404)}try{const l8=await v8(t);if(x8.type==="dingtalk"){const{DingTalkApiClient:A6}=await Promise.resolve().then(()=>(U0(),i0));const d6=A6.parseCallbackBody(l8);if(d6){x8.ingestCallbackMessage(d6)}return p({errcode:0,errmsg:"ok"})}if(x8.type==="feishu"){const A6=l8?.event||l8;if(A6?.message){x8.ingestWebhookMessage(A6.message)}return p({code:0})}return p(P8({message:`Webhook received by channel ${n} (${x8.type})`}))}catch(l8){R4.error("channels.webhook_failed","Channel operation failed",String(l8));return p(j6("Webhook processing failed"),500)}}if(h[4]==="test"&&J8==="POST"){const x8=B.channels.getAdapter(n);if(!x8){return p(P8({connected:false,message:`Channel ${n} not started, save config first`}))}const l8=x8.isConnected();return p(P8({connected:l8,message:l8?"Connected":"Disconnected"}))}if(h[4]==="wechat"){const x8=B.channels.getAdapter(n);if(!x8||x8.type!=="wechat"){return p(P8({message:"WeChat adapter not installed or not started"}))}if(h[5]==="qrcode"&&J8==="GET"&&h[6]!=="status"){try{const{fetchWebQrCode:l8}=await Promise.resolve().then(()=>(U0(),i0));const A6=await l8();return p(P8(A6))}catch(l8){return p(j6(`Failed to fetch WeChat QR code: ${l8 instanceof Error?l8.message:String(l8)}`),500)}}if(h[5]==="qrcode"&&h[6]==="status"&&J8==="GET"){const l8=new URL(t.url||"","http://localhost").searchParams;const A6=l8.get("qrcode")||"";const d6=l8.get("token")||"";if(!A6||!d6){return p(j6("Missing required parameters"),400)}try{const{checkWebQrStatus:q1}=await Promise.resolve().then(()=>(U0(),i0));const X6=await q1({qrcode:A6});return p(P8(X6))}catch(q1){return p(j6(`Failed to check QR code status: ${q1 instanceof Error?q1.message:String(q1)}`),500)}}return p(j6(`Unhandled WeChat endpoint: ${J8} ${z8}`),404)}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}if(z8.startsWith("/api/channels"))return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404);if(z8==="/api/logs"&&J8==="GET"){const h=u1(U8,"logs");if(!c0(h))return p(P8([]));const n=OF(h).filter((V8)=>nz(u1(h,V8)).isFile()).map((V8)=>{const M8=nz(u1(h,V8));return{name:V8,size:M8.size,modified:M8.mtimeMs,previewable:/\.(log|txt|json|ndjson|jsonl|md)$/i.test(V8)}});return p(P8(n))}if(z8==="/api/logs/read"&&J8==="GET"){const h=u1(U8,"logs");const n=gJ(String(F8.searchParams.get("file")||""));if(!n)return p(j6("Log file is required"),400);const V8=u1(h,n);if(!c0(V8))return p(j6("Log file not found"),404);const M8=E4(V8,"utf8").split(/\r?\n/);if(M8.length>0&&M8[M8.length-1]==="")M8.pop();const e8=Math.max(1,Number(F8.searchParams.get("maxLines")||500));const x8=Math.max(0,M8.length-e8);const l8=nz(V8);return p(P8({name:n,size:l8.size,modified:l8.mtimeMs,totalLines:M8.length,startLine:x8,content:M8.slice(x8).join(`
1686
- `)}))}if(z8==="/api/logs/download"&&J8==="GET"){const h=u1(U8,"logs");const n=gJ(String(F8.searchParams.get("file")||""));const V8=u1(h,n);if(!n||!c0(V8))return p(j6("Log file not found"),404);return new Response(E4(V8),{headers:{"content-type":"application/octet-stream","access-control-allow-origin":"*"}})}if(z8.startsWith("/api/logs"))return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404);if(z8.startsWith("/api/observability")){const h=typeof B.telemetry?.snapshot==="function"?B.telemetry.snapshot():null;const n=typeof B.telemetry?.getMetricSummary==="function"?B.telemetry.getMetricSummary():{};if(z8==="/api/observability/summary"&&J8==="GET"){return p(P8({totalRuns:n["trace.run[count]"]||0,totalCost:0,avgCost:0,totalTokens:n["token.usage[count]"]||0,activeSpans:h?.activeSpans?.length||0,recentEvents:h?.events?.length||0}))}if(z8==="/api/observability/costs"&&J8==="GET"){return p(P8({daily:[],total:0,metrics:n}))}if(z8==="/api/observability/runs"&&J8==="GET"){const V8=typeof B.workflows?.listRuns==="function"?B.workflows.listRuns():[];return p(P8(V8))}if(z8.startsWith("/api/observability/runs/")&&J8==="GET"){const V8=z8.split("/");const M8=V8[4];if(V8[5]==="events"){const x8=typeof B.workflows?.listEvents==="function"?B.workflows.listEvents(M8):[];return p(P8({events:x8,total:Array.isArray(x8)?x8.length:0,page:Number(F8.searchParams.get("page")||0),size:Number(F8.searchParams.get("size")||50)}))}const e8=typeof B.workflows?.getRun==="function"?B.workflows.getRun(M8):null;return p(P8(e8))}return p(P8({metrics:n,telemetry:true}))}if(z8==="/api/workflows"&&J8==="GET")return p(P8(B.workflows.listRuns()));if(z8==="/api/workflows"&&J8==="POST"){const h=await v8(t);const n=await B.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return p(P8(n))}if(z8.startsWith("/api/workflows/")){const h=z8.split("/");const n=h[3];if(h[4]==="events")return p(P8(B.workflows.listEvents(n)));if(h[4]==="checkpoints")return p(P8(B.workflows.listCheckpoints(n)));if(h[4]==="pause"&&J8==="POST")return p(P8(B.workflows.pause(n)));if(h[4]==="resume"&&J8==="POST")return p(P8(await B.workflows.resume(n)));if(h[4]==="cancel"&&J8==="POST")return p(P8(B.workflows.cancel(n)));const V8=B.workflows.getRun(n);return V8?p(P8(V8)):p(j6("Workflow not found"),404)}if(z8==="/workflow/runs"&&J8==="GET")return p(P8(B.workflows.listRuns()));if(z8==="/workflow/runs"&&J8==="POST"){const h=await v8(t);const n=await B.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return p(P8(n))}if(z8.startsWith("/workflow/runs/")){const h=z8.split("/");const n=h[3];if(h[4]==="trace"&&J8==="GET"){const M8=B.workflows.getTrace(n);return M8?p(P8(M8)):p(j6("Workflow trace not found"),404)}if(h[4]==="events"&&J8==="GET")return p(P8(B.workflows.listEvents(n)));if(h[4]==="events"&&J8==="POST"){const M8=await v8(t);const e8=B.workflows.injectEvent(n,String(M8.type||"user_event"),M8.data??M8);return e8?p(P8(e8)):p(j6("Workflow not found"),404)}if(h[4]==="pause"&&J8==="POST")return p(P8(B.workflows.pause(n)));if(h[4]==="resume"&&J8==="POST")return p(P8(await B.workflows.resume(n)));if(h[4]==="cancel"&&J8==="POST")return p(P8(B.workflows.cancel(n)));const V8=B.workflows.getRun(n);return V8?p(P8(V8)):p(j6("Workflow not found"),404)}if(z8.startsWith("/api/checkpoints"))return p(P8(B.workflows.listCheckpoints()));if(z8.startsWith("/api/templates")){const h=[{id:"code-review",name:"Code Review",description:"Review code changes for bugs and issues",category:"development"},{id:"auto-fix",name:"Auto Fix",description:"Automatically fix test failures",category:"testing"},{id:"feature-plan",name:"Feature Planning",description:"Plan and design new features",category:"planning"},{id:"refactor",name:"Code Refactoring",description:"Refactor code with safety checks",category:"development"},{id:"document",name:"Documentation",description:"Generate and update documentation",category:"writing"}];if(typeof B.workflows?.listTemplates==="function"){try{const n=B.workflows.listTemplates();if(Array.isArray(n))h.push(...n.map((V8)=>({...V8,category:"workflow"})))}catch{}}return p(P8(h))}if(z8.startsWith("/api/speech")){return p(P8({available:false,text:"",supported:false,engines:[]}))}if(z8.startsWith("/api/metrics")){const h=process.memoryUsage();const n=Math.floor((Date.now()-V)/1000);const V8=typeof B.sessions?.list==="function"?B.sessions.list().length:0;const M8=typeof B.telemetry?.getMetricSummary==="function"?B.telemetry.getMetricSummary():{};return p(P8({uptime:n,memory:{heapUsed:h.heapUsed,heapTotal:h.heapTotal,rss:h.rss},sessions:V8,clients:M.size,workspace:Y,version:"1.0.13",metrics:M8}))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}function J6(t){const F8=t.pathname==="/"?"/index.html":t.pathname;const z8=QG6(u1(H,F8));if(!z8.startsWith(H)||!c0(z8)||nz(z8).isDirectory()){const k6=u1(H,"index.html");return c0(k6)?new Response(E4(k6),{headers:{"content-type":"text/html; charset=utf-8"}}):W6("DeepSeekCode server is running")}const J8=jG6(z8);const U8={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8"};const o8=U8[J8]||"application/octet-stream";return new Response(E4(z8),{headers:{"content-type":o8}})}function Z6(t){const F8=new URL(t.url||"/",`http://${t.headers.host||`localhost:${K}`}`);const z8={method:t.method,headers:t.headers};if(t.method!=="GET"&&t.method!=="HEAD"){z8.body=t;z8.duplex="half"}return{request:new Request(F8,z8),url:F8}}async function E6(t,F8){t.statusCode=F8.status;F8.headers.forEach((J8,U8)=>t.setHeader(U8,J8));const z8=Buffer.from(await F8.arrayBuffer());t.end(z8)}function $6(t){if(Array.isArray(t))return Buffer.concat(t);if(t instanceof ArrayBuffer)return Buffer.from(t);return t}async function g6(t,F8){if(t.data?.path==="/terminal"){T.handleSocketMessage(String(t.data?.terminalId??""),$6(F8));return}let z8;try{z8=JSON.parse(String($6(F8)))}catch{t.send(JSON.stringify({type:"error",data:JSON.stringify({error:"Invalid JSON"})}));return}if(z8.type==="auth"){t.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(z8.type==="workspace"){t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(z8.type==="ping"){t.send(JSON.stringify({type:"pong",sessionId:z8.sessionId||null}));return}if(z8.type==="message_ack")return;if(z8.type==="hook_allow"||z8.type==="hook_deny"){const J8=S2(z8.data);const U8=String(z8.approvalId||J8.approvalId||"");const o8=z8.type==="hook_allow";const k6=typeof J8.sessionId==="string"?J8.sessionId:undefined;const h=U8?F.decide(U8,o8,{sessionId:z8.sessionId||k6,remember:Boolean(J8.remember||J8.sessionAllow)}):false;t.send(JSON.stringify({type:"hook_response_ack",sessionId:z8.sessionId||null,data:JSON.stringify({approvalId:U8,allowed:o8,resolved:h})}));return}if(z8.type==="create_session"){const J8=S2(z8.data);const U8=J8.sessionId?N.ensure(String(J8.sessionId)):f6();const o8="messages"in U8?(({messages:k6,...h})=>h)(U8):U8;t.send(JSON.stringify({type:"session_created",sessionId:o8.id,data:JSON.stringify(o8)}));return}if(z8.type==="chat"||z8.type==="plan"){if(!z8.traceId)z8.traceId=Vx();const J8=z8.traceId;await B.run(z8,(U8)=>{U8.traceId=J8;t.send(JSON.stringify(U8))});return}if(z8.type==="workflow_start"||z8.type==="workflow_pause"||z8.type==="workflow_resume"||z8.type==="workflow_cancel"){if(!z8.traceId)z8.traceId=Vx();const J8=z8.traceId;await B.handleControlMessage(z8,(U8)=>{U8.traceId=J8;t.send(JSON.stringify(U8))});return}if(z8.type==="plan_confirm"){t.send(JSON.stringify({type:"plan_complete",sessionId:z8.sessionId,data:JSON.stringify({status:"confirmed"})}));return}if(z8.type==="user_exit_plan_mode"){const J8=S2(z8.data)||{};const U8=String(J8.planContent||"");const o8=String(J8.planSlug||"");if(U8){try{B.plans.write(o8||"user-exit-plan",U8)}catch(k6){R4.warn("plan.save_failed","Failed to save plan on user exit",String(k6))}}try{B.modeManager.exitPlanMode("User exited plan mode");z6({type:"plan_mode_change",sessionId:z8.sessionId,data:JSON.stringify({previousMode:"plan",newMode:"act",reason:"User exited plan mode",timestamp:Date.now()})});t.send(JSON.stringify({type:"plan_complete",sessionId:z8.sessionId,data:JSON.stringify({status:"user_exited",planSaved:!!U8})}))}catch(k6){R4.warn("plan.exit_failed","Failed to exit plan mode",String(k6))}return}if(["stop","pause","resume","get_commands"].includes(z8.type)){await B.handleControlMessage(z8,(J8)=>t.send(JSON.stringify(J8)));return}if(z8.type==="reset"){const J8=z8.sessionId||"";if(J8){const U8=N.reset(J8);t.send(JSON.stringify({type:"log",sessionId:J8,data:JSON.stringify({level:"info",message:U8?"Context cleared":"Session not found"})}))}else{t.send(JSON.stringify({type:"log",sessionId:J8,data:JSON.stringify({level:"warn",message:"Reset skipped: no sessionId"})}))}return}if(z8.type==="resume_session"){const J8=S2(z8.data);const U8=String(z8.sessionId||J8.sessionId||"");const o8=U8?N.ensure(U8):N.create();t.send(JSON.stringify({type:"session_resumed",sessionId:o8.id,data:JSON.stringify(N.resumeSnapshot(o8.id,{tasks:B.listTasks(),pendingApprovals:F.list()}))}));return}if(z8.type==="mcp"){const J8=S2(z8.data);const U8=String(J8.action||"list");try{const o8=U8==="reload"?(S.reload(),await C6(),S.listServers()):U8==="tools"?(await C6(),await S.listTools(String(J8.server||"")||undefined)):S.listServers();t.send(JSON.stringify({type:"notification",sessionId:z8.sessionId,data:JSON.stringify({kind:"mcp",action:U8,result:o8})}))}catch(o8){t.send(JSON.stringify({type:"error",sessionId:z8.sessionId,data:o8.message}))}return}if(z8.type==="question_answer"){const J8=S2(z8.data);const U8=String(J8.questionId||"");const o8=String(J8.answer||"");const k6=Array.isArray(J8.selectedOptions)?J8.selectedOptions.map(String):undefined;if(U8){const h={answer:o8,selectedOptions:k6};const n=dg(U8,h);t.send(JSON.stringify({type:"question_answer_ack",sessionId:z8.sessionId||null,data:JSON.stringify({questionId:U8,resolved:n,ok:n})}))}else{t.send(JSON.stringify({type:"error",sessionId:z8.sessionId||null,data:JSON.stringify({error:"Missing questionId"})}))}return}if(z8.type==="plan_mode_change"){const J8=S2(z8.data);const U8=String(z8.mode||J8.frontendMode||J8.newMode||J8.mode||"");const o8=B.modeManager.getMode();let k6;let h;if(U8==="auto"){k6=o8==="normal"?"act":o8;h=!F.isAutoMode()}else if(qe8(U8)){k6=Xe8(U8);h=true}else if(U8==="plan"||U8==="act"||U8==="goal"||U8==="normal"){k6=U8;h=false}else{t.send(JSON.stringify({type:"log",sessionId:z8.sessionId,data:JSON.stringify({level:"warn",message:`plan_mode_change ignored: unknown mode "${U8}"`})}));return}const n=B.modeManager.setMode(k6,`Client mode change: ${U8}`);await B.handleControlMessage({type:"hook_auto",sessionId:z8.sessionId,data:JSON.stringify({enabled:h})},(V8)=>z6(V8));if(!n)E8();t.send(JSON.stringify({type:"plan_mode_change_ack",sessionId:z8.sessionId,data:JSON.stringify({mode:i$(B.modeManager.getMode()),auto:h})}));return}if(z8.type==="select_model"||z8.type==="model_change"){const J8=S2(z8.data);const U8=String(J8.model||"");if(U8){P.save({model:U8});t.send(JSON.stringify({type:"token_update",sessionId:z8.sessionId,data:JSON.stringify({model:U8})}));E8()}return}if(await B.handleControlMessage(z8,(J8)=>t.send(JSON.stringify(J8))))return;t.send(JSON.stringify({type:"log",sessionId:z8.sessionId,data:JSON.stringify({level:"info",message:`Unhandled WS message: ${z8.type}`})}))}const V1=tH8(async(t,F8)=>{try{const{request:z8,url:J8}=Z6(t);const U8=J8.pathname.startsWith("/v1/")?await O8(z8,J8):null;const o8=U8||(J8.pathname.startsWith("/api/")?await N8(z8,J8):J6(J8));await E6(F8,o8)}catch(z8){await E6(F8,p(j6(z8.message||String(z8)),500))}});const I1=tH8((t,F8)=>{E6(F8,W6("DeepSeekCode WebSocket endpoint"))});const _1=new _G6.default({noServer:true});I1.on("upgrade",(t,F8,z8)=>{const J8=new URL(t.url||"/",`http://${t.headers.host||`localhost:${X}`}`);_1.handleUpgrade(t,F8,z8,(U8)=>{U8.data={path:J8.pathname,sessionId:J8.searchParams.get("sessionId"),terminalId:J8.searchParams.get("terminalId")};_1.emit("connection",U8,t)})});let j7=false;_1.on("connection",(t)=>{if(t.data?.path==="/terminal"){T.openSocket(t,String(t.data?.terminalId??""))}else{M.add(t);R4.debug("ws.connected","New WebSocket connection");t.send(JSON.stringify({type:"auth_required",message:"Authentication required"}));t.send(JSON.stringify({type:"connected",message:"Connected to DeepSeekCode TypeScript runtime"}));t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));E8(t);const F8=P.load();if(!F8.apiKey||!F8.baseUrl){t.send(JSON.stringify({type:"notification",data:JSON.stringify({severity:"warn",message:"Provider not configured - run /config to set up your API provider."})}));t.send(JSON.stringify({type:"status",data:JSON.stringify({configured:false})}));if(!j7){j7=true;R4.warn("provider.not_configured","Provider not configured on client connect")}}}t.on("message",(F8)=>{g6(t,F8).catch((z8)=>{let J8;try{const U8=JSON.parse(String($6(F8)));if(U8.traceId)J8=U8.traceId}catch{}R4.error("ws.message_error","Error handling WS message",String(z8),undefined,J8);t.send(JSON.stringify({type:"error",data:JSON.stringify({error:z8.message||String(z8)})}))})});t.on("close",()=>{if(t.data?.path==="/terminal"){T.closeSocket(String(t.data?.terminalId??""));return}M.delete(t)})});u(15000);return{runtime:B,httpServer:V1,wsHttpServer:I1,webSocketServer:_1,handleApi:N8,handleSocketMessage:g6,httpPort:K,wsPort:X,host:q||undefined,workspaceDir:Y,configDir:G,inboxStore:X8,auditStore:$,automationStore:g,automationScheduler:q8}}var pG6=process.argv[1]&&(process.argv[1].endsWith("index.js")||process.argv[1].endsWith("index.ts"));if(pG6){const z=process.execArgv.find((K)=>K.startsWith("--max-old-space-size="))?.split("=")[1]||"0";const D=Number(z)||0;if(D>0&&D<2048){console.warn(`[deepseekcode] WARNING: --max-old-space-size=${D}MB may be too low for large sessions. Set DSC_HEAP_LIMIT_MB=4096 or higher.`)}else if(D===0){console.warn(`[deepseekcode] WARNING: No --max-old-space-size set. Default Node.js heap limit (~2GB) may cause OOM with large sessions. Set DSC_HEAP_LIMIT_MB=4096 or use --max-old-space-size=4096.`)}console.log(`[deepseekcode] Heap limit: ${D||"default (~2GB)"} (DSC_HEAP_LIMIT_MB env default: ${IG6}MB — set --max-old-space-size to apply a different value at startup)`);const J=sm();J.httpServer.listen(J.httpPort,J.host);J.wsHttpServer.listen(J.wsPort,J.host);console.log(`[deepseekcode] HTTP API: http://localhost:${J.httpPort}`);console.log(`[deepseekcode] WebSocket: ws://localhost:${J.wsPort}/ws`);console.log(`[deepseekcode] Workspace: ${J.workspaceDir}`)}import{join as m5}from"node:path";import{homedir as JQ}from"node:os";import{createServer as RZ6}from"node:net";import{execFile as rL}from"node:child_process";import{homedir as cG6}from"node:os";import{join as lG6}from"node:path";import{existsSync as T_8,readFileSync as dG6,unlinkSync as iG6,writeFileSync as nG6}from"node:fs";var tj=lG6(cG6(),".agent","logs","dscode-cli.pid");function ej(){return process.env.DEEPSEEKCODE_QUIET==="1"}function w_8(z){return new Promise((D)=>{if(process.platform==="win32"){rL("netstat",["-ano"],{timeout:5000,windowsHide:true,maxBuffer:16*1024*1024},(J,K)=>{if(J){D([]);return}const X=new Set;for(const q of K.split(/\r?\n/)){const Y=q.trim().split(/\s+/);if(Y.length<5)continue;const G=Y[1];const Z=Y[3].toUpperCase();const H=Y[4];const V=G.includes("]")?G.split("]:").pop():G.split(":").pop();if(V===String(z)&&(Z==="LISTENING"||Z==="ESTABLISHED")){const j=parseInt(H,10);if(Number.isFinite(j)&&j>0)X.add(j)}}D([...X])});return}rL("lsof",["-ti",`:${z}`],{timeout:5000},(J,K)=>{if(J){D([]);return}D(K.trim().split(/\r?\n/).map((X)=>parseInt(X.trim(),10)).filter((X)=>Number.isFinite(X)&&X>0))})})}function oG6(z){return new Promise((D)=>{if(process.platform==="win32"){rL("taskkill",["/F","/T","/PID",String(z)],{timeout:5000,windowsHide:true},(J)=>D(!J));return}rL("kill",["-KILL",String(z)],{timeout:5000},(J)=>D(!J))})}function aG6(z){try{process.kill(z,0);return true}catch(D){return D.code==="EPERM"}}function S_8(){try{if(!T_8(tj))return null;const z=dG6(tj,"utf8").trim();if(!z)return null;return JSON.parse(z)}catch{return null}}function v_8(z){try{nG6(tj,JSON.stringify(z),"utf8")}catch{}}function sL(){try{const z=S_8();if(z&&z.pid===process.pid&&T_8(tj)){iG6(tj)}}catch{}}async function b_8(){const z=new Set;const D=S_8();if(D&&D.pid!==process.pid){if(aG6(D.pid)){z.add(D.pid);if(!ej()){try{const X=`pid=${D.pid} started=${D.startedAt}`+(D.port?` port=${D.port}`:"")+(D.workspace?` workspace=${D.workspace}`:"");process.stderr.write(`[dscode] ⚠ Previous instance still running (${X}).
1686
+ `)}))}if(z8==="/api/logs/download"&&J8==="GET"){const h=u1(U8,"logs");const n=gJ(String(F8.searchParams.get("file")||""));const V8=u1(h,n);if(!n||!c0(V8))return p(j6("Log file not found"),404);return new Response(E4(V8),{headers:{"content-type":"application/octet-stream","access-control-allow-origin":"*"}})}if(z8.startsWith("/api/logs"))return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404);if(z8.startsWith("/api/observability")){const h=typeof B.telemetry?.snapshot==="function"?B.telemetry.snapshot():null;const n=typeof B.telemetry?.getMetricSummary==="function"?B.telemetry.getMetricSummary():{};if(z8==="/api/observability/summary"&&J8==="GET"){return p(P8({totalRuns:n["trace.run[count]"]||0,totalCost:0,avgCost:0,totalTokens:n["token.usage[count]"]||0,activeSpans:h?.activeSpans?.length||0,recentEvents:h?.events?.length||0}))}if(z8==="/api/observability/costs"&&J8==="GET"){return p(P8({daily:[],total:0,metrics:n}))}if(z8==="/api/observability/runs"&&J8==="GET"){const V8=typeof B.workflows?.listRuns==="function"?B.workflows.listRuns():[];return p(P8(V8))}if(z8.startsWith("/api/observability/runs/")&&J8==="GET"){const V8=z8.split("/");const M8=V8[4];if(V8[5]==="events"){const x8=typeof B.workflows?.listEvents==="function"?B.workflows.listEvents(M8):[];return p(P8({events:x8,total:Array.isArray(x8)?x8.length:0,page:Number(F8.searchParams.get("page")||0),size:Number(F8.searchParams.get("size")||50)}))}const e8=typeof B.workflows?.getRun==="function"?B.workflows.getRun(M8):null;return p(P8(e8))}return p(P8({metrics:n,telemetry:true}))}if(z8==="/api/workflows"&&J8==="GET")return p(P8(B.workflows.listRuns()));if(z8==="/api/workflows"&&J8==="POST"){const h=await v8(t);const n=await B.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return p(P8(n))}if(z8.startsWith("/api/workflows/")){const h=z8.split("/");const n=h[3];if(h[4]==="events")return p(P8(B.workflows.listEvents(n)));if(h[4]==="checkpoints")return p(P8(B.workflows.listCheckpoints(n)));if(h[4]==="pause"&&J8==="POST")return p(P8(B.workflows.pause(n)));if(h[4]==="resume"&&J8==="POST")return p(P8(await B.workflows.resume(n)));if(h[4]==="cancel"&&J8==="POST")return p(P8(B.workflows.cancel(n)));const V8=B.workflows.getRun(n);return V8?p(P8(V8)):p(j6("Workflow not found"),404)}if(z8==="/workflow/runs"&&J8==="GET")return p(P8(B.workflows.listRuns()));if(z8==="/workflow/runs"&&J8==="POST"){const h=await v8(t);const n=await B.workflows.start({sessionId:String(h.sessionId||""),runId:String(h.runId||""),goalId:typeof h.goalId==="string"?h.goalId:undefined,checkpointPolicy:String(h.checkpointPolicy||"phase-and-token"),message:String(h.message||h.content||""),script:typeof h.script==="string"?h.script:undefined,workflow:typeof h.workflow==="object"&&h.workflow?h.workflow:undefined});return p(P8(n))}if(z8.startsWith("/workflow/runs/")){const h=z8.split("/");const n=h[3];if(h[4]==="trace"&&J8==="GET"){const M8=B.workflows.getTrace(n);return M8?p(P8(M8)):p(j6("Workflow trace not found"),404)}if(h[4]==="events"&&J8==="GET")return p(P8(B.workflows.listEvents(n)));if(h[4]==="events"&&J8==="POST"){const M8=await v8(t);const e8=B.workflows.injectEvent(n,String(M8.type||"user_event"),M8.data??M8);return e8?p(P8(e8)):p(j6("Workflow not found"),404)}if(h[4]==="pause"&&J8==="POST")return p(P8(B.workflows.pause(n)));if(h[4]==="resume"&&J8==="POST")return p(P8(await B.workflows.resume(n)));if(h[4]==="cancel"&&J8==="POST")return p(P8(B.workflows.cancel(n)));const V8=B.workflows.getRun(n);return V8?p(P8(V8)):p(j6("Workflow not found"),404)}if(z8.startsWith("/api/checkpoints"))return p(P8(B.workflows.listCheckpoints()));if(z8.startsWith("/api/templates")){const h=[{id:"code-review",name:"Code Review",description:"Review code changes for bugs and issues",category:"development"},{id:"auto-fix",name:"Auto Fix",description:"Automatically fix test failures",category:"testing"},{id:"feature-plan",name:"Feature Planning",description:"Plan and design new features",category:"planning"},{id:"refactor",name:"Code Refactoring",description:"Refactor code with safety checks",category:"development"},{id:"document",name:"Documentation",description:"Generate and update documentation",category:"writing"}];if(typeof B.workflows?.listTemplates==="function"){try{const n=B.workflows.listTemplates();if(Array.isArray(n))h.push(...n.map((V8)=>({...V8,category:"workflow"})))}catch{}}return p(P8(h))}if(z8.startsWith("/api/speech")){return p(P8({available:false,text:"",supported:false,engines:[]}))}if(z8.startsWith("/api/metrics")){const h=process.memoryUsage();const n=Math.floor((Date.now()-V)/1000);const V8=typeof B.sessions?.list==="function"?B.sessions.list().length:0;const M8=typeof B.telemetry?.getMetricSummary==="function"?B.telemetry.getMetricSummary():{};return p(P8({uptime:n,memory:{heapUsed:h.heapUsed,heapTotal:h.heapTotal,rss:h.rss},sessions:V8,clients:M.size,workspace:Y,version:"1.0.14",metrics:M8}))}return p(j6(`Unhandled endpoint: ${J8} ${z8}`),404)}function J6(t){const F8=t.pathname==="/"?"/index.html":t.pathname;const z8=QG6(u1(H,F8));if(!z8.startsWith(H)||!c0(z8)||nz(z8).isDirectory()){const k6=u1(H,"index.html");return c0(k6)?new Response(E4(k6),{headers:{"content-type":"text/html; charset=utf-8"}}):W6("DeepSeekCode server is running")}const J8=jG6(z8);const U8={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8"};const o8=U8[J8]||"application/octet-stream";return new Response(E4(z8),{headers:{"content-type":o8}})}function Z6(t){const F8=new URL(t.url||"/",`http://${t.headers.host||`localhost:${K}`}`);const z8={method:t.method,headers:t.headers};if(t.method!=="GET"&&t.method!=="HEAD"){z8.body=t;z8.duplex="half"}return{request:new Request(F8,z8),url:F8}}async function E6(t,F8){t.statusCode=F8.status;F8.headers.forEach((J8,U8)=>t.setHeader(U8,J8));const z8=Buffer.from(await F8.arrayBuffer());t.end(z8)}function $6(t){if(Array.isArray(t))return Buffer.concat(t);if(t instanceof ArrayBuffer)return Buffer.from(t);return t}async function g6(t,F8){if(t.data?.path==="/terminal"){T.handleSocketMessage(String(t.data?.terminalId??""),$6(F8));return}let z8;try{z8=JSON.parse(String($6(F8)))}catch{t.send(JSON.stringify({type:"error",data:JSON.stringify({error:"Invalid JSON"})}));return}if(z8.type==="auth"){t.send(JSON.stringify({type:"auth_success",message:"Authenticated"}));t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(z8.type==="workspace"){t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));return}if(z8.type==="ping"){t.send(JSON.stringify({type:"pong",sessionId:z8.sessionId||null}));return}if(z8.type==="message_ack")return;if(z8.type==="hook_allow"||z8.type==="hook_deny"){const J8=S2(z8.data);const U8=String(z8.approvalId||J8.approvalId||"");const o8=z8.type==="hook_allow";const k6=typeof J8.sessionId==="string"?J8.sessionId:undefined;const h=U8?F.decide(U8,o8,{sessionId:z8.sessionId||k6,remember:Boolean(J8.remember||J8.sessionAllow)}):false;t.send(JSON.stringify({type:"hook_response_ack",sessionId:z8.sessionId||null,data:JSON.stringify({approvalId:U8,allowed:o8,resolved:h})}));return}if(z8.type==="create_session"){const J8=S2(z8.data);const U8=J8.sessionId?N.ensure(String(J8.sessionId)):f6();const o8="messages"in U8?(({messages:k6,...h})=>h)(U8):U8;t.send(JSON.stringify({type:"session_created",sessionId:o8.id,data:JSON.stringify(o8)}));return}if(z8.type==="chat"||z8.type==="plan"){if(!z8.traceId)z8.traceId=Vx();const J8=z8.traceId;await B.run(z8,(U8)=>{U8.traceId=J8;t.send(JSON.stringify(U8))});return}if(z8.type==="workflow_start"||z8.type==="workflow_pause"||z8.type==="workflow_resume"||z8.type==="workflow_cancel"){if(!z8.traceId)z8.traceId=Vx();const J8=z8.traceId;await B.handleControlMessage(z8,(U8)=>{U8.traceId=J8;t.send(JSON.stringify(U8))});return}if(z8.type==="plan_confirm"){t.send(JSON.stringify({type:"plan_complete",sessionId:z8.sessionId,data:JSON.stringify({status:"confirmed"})}));return}if(z8.type==="user_exit_plan_mode"){const J8=S2(z8.data)||{};const U8=String(J8.planContent||"");const o8=String(J8.planSlug||"");if(U8){try{B.plans.write(o8||"user-exit-plan",U8)}catch(k6){R4.warn("plan.save_failed","Failed to save plan on user exit",String(k6))}}try{B.modeManager.exitPlanMode("User exited plan mode");z6({type:"plan_mode_change",sessionId:z8.sessionId,data:JSON.stringify({previousMode:"plan",newMode:"act",reason:"User exited plan mode",timestamp:Date.now()})});t.send(JSON.stringify({type:"plan_complete",sessionId:z8.sessionId,data:JSON.stringify({status:"user_exited",planSaved:!!U8})}))}catch(k6){R4.warn("plan.exit_failed","Failed to exit plan mode",String(k6))}return}if(["stop","pause","resume","get_commands"].includes(z8.type)){await B.handleControlMessage(z8,(J8)=>t.send(JSON.stringify(J8)));return}if(z8.type==="reset"){const J8=z8.sessionId||"";if(J8){const U8=N.reset(J8);t.send(JSON.stringify({type:"log",sessionId:J8,data:JSON.stringify({level:"info",message:U8?"Context cleared":"Session not found"})}))}else{t.send(JSON.stringify({type:"log",sessionId:J8,data:JSON.stringify({level:"warn",message:"Reset skipped: no sessionId"})}))}return}if(z8.type==="resume_session"){const J8=S2(z8.data);const U8=String(z8.sessionId||J8.sessionId||"");const o8=U8?N.ensure(U8):N.create();t.send(JSON.stringify({type:"session_resumed",sessionId:o8.id,data:JSON.stringify(N.resumeSnapshot(o8.id,{tasks:B.listTasks(),pendingApprovals:F.list()}))}));return}if(z8.type==="mcp"){const J8=S2(z8.data);const U8=String(J8.action||"list");try{const o8=U8==="reload"?(S.reload(),await C6(),S.listServers()):U8==="tools"?(await C6(),await S.listTools(String(J8.server||"")||undefined)):S.listServers();t.send(JSON.stringify({type:"notification",sessionId:z8.sessionId,data:JSON.stringify({kind:"mcp",action:U8,result:o8})}))}catch(o8){t.send(JSON.stringify({type:"error",sessionId:z8.sessionId,data:o8.message}))}return}if(z8.type==="question_answer"){const J8=S2(z8.data);const U8=String(J8.questionId||"");const o8=String(J8.answer||"");const k6=Array.isArray(J8.selectedOptions)?J8.selectedOptions.map(String):undefined;if(U8){const h={answer:o8,selectedOptions:k6};const n=dg(U8,h);t.send(JSON.stringify({type:"question_answer_ack",sessionId:z8.sessionId||null,data:JSON.stringify({questionId:U8,resolved:n,ok:n})}))}else{t.send(JSON.stringify({type:"error",sessionId:z8.sessionId||null,data:JSON.stringify({error:"Missing questionId"})}))}return}if(z8.type==="plan_mode_change"){const J8=S2(z8.data);const U8=String(z8.mode||J8.frontendMode||J8.newMode||J8.mode||"");const o8=B.modeManager.getMode();let k6;let h;if(U8==="auto"){k6=o8==="normal"?"act":o8;h=!F.isAutoMode()}else if(qe8(U8)){k6=Xe8(U8);h=true}else if(U8==="plan"||U8==="act"||U8==="goal"||U8==="normal"){k6=U8;h=false}else{t.send(JSON.stringify({type:"log",sessionId:z8.sessionId,data:JSON.stringify({level:"warn",message:`plan_mode_change ignored: unknown mode "${U8}"`})}));return}const n=B.modeManager.setMode(k6,`Client mode change: ${U8}`);await B.handleControlMessage({type:"hook_auto",sessionId:z8.sessionId,data:JSON.stringify({enabled:h})},(V8)=>z6(V8));if(!n)E8();t.send(JSON.stringify({type:"plan_mode_change_ack",sessionId:z8.sessionId,data:JSON.stringify({mode:i$(B.modeManager.getMode()),auto:h})}));return}if(z8.type==="select_model"||z8.type==="model_change"){const J8=S2(z8.data);const U8=String(J8.model||"");if(U8){P.save({model:U8});t.send(JSON.stringify({type:"token_update",sessionId:z8.sessionId,data:JSON.stringify({model:U8})}));E8()}return}if(await B.handleControlMessage(z8,(J8)=>t.send(JSON.stringify(J8))))return;t.send(JSON.stringify({type:"log",sessionId:z8.sessionId,data:JSON.stringify({level:"info",message:`Unhandled WS message: ${z8.type}`})}))}const V1=tH8(async(t,F8)=>{try{const{request:z8,url:J8}=Z6(t);const U8=J8.pathname.startsWith("/v1/")?await O8(z8,J8):null;const o8=U8||(J8.pathname.startsWith("/api/")?await N8(z8,J8):J6(J8));await E6(F8,o8)}catch(z8){await E6(F8,p(j6(z8.message||String(z8)),500))}});const I1=tH8((t,F8)=>{E6(F8,W6("DeepSeekCode WebSocket endpoint"))});const _1=new _G6.default({noServer:true});I1.on("upgrade",(t,F8,z8)=>{const J8=new URL(t.url||"/",`http://${t.headers.host||`localhost:${X}`}`);_1.handleUpgrade(t,F8,z8,(U8)=>{U8.data={path:J8.pathname,sessionId:J8.searchParams.get("sessionId"),terminalId:J8.searchParams.get("terminalId")};_1.emit("connection",U8,t)})});let j7=false;_1.on("connection",(t)=>{if(t.data?.path==="/terminal"){T.openSocket(t,String(t.data?.terminalId??""))}else{M.add(t);R4.debug("ws.connected","New WebSocket connection");t.send(JSON.stringify({type:"auth_required",message:"Authentication required"}));t.send(JSON.stringify({type:"connected",message:"Connected to DeepSeekCode TypeScript runtime"}));t.send(JSON.stringify({type:"workspace_changed",data:JSON.stringify({newDir:Y})}));E8(t);const F8=P.load();if(!F8.apiKey||!F8.baseUrl){t.send(JSON.stringify({type:"notification",data:JSON.stringify({severity:"warn",message:"Provider not configured - run /config to set up your API provider."})}));t.send(JSON.stringify({type:"status",data:JSON.stringify({configured:false})}));if(!j7){j7=true;R4.warn("provider.not_configured","Provider not configured on client connect")}}}t.on("message",(F8)=>{g6(t,F8).catch((z8)=>{let J8;try{const U8=JSON.parse(String($6(F8)));if(U8.traceId)J8=U8.traceId}catch{}R4.error("ws.message_error","Error handling WS message",String(z8),undefined,J8);t.send(JSON.stringify({type:"error",data:JSON.stringify({error:z8.message||String(z8)})}))})});t.on("close",()=>{if(t.data?.path==="/terminal"){T.closeSocket(String(t.data?.terminalId??""));return}M.delete(t)})});u(15000);return{runtime:B,httpServer:V1,wsHttpServer:I1,webSocketServer:_1,handleApi:N8,handleSocketMessage:g6,httpPort:K,wsPort:X,host:q||undefined,workspaceDir:Y,configDir:G,inboxStore:X8,auditStore:$,automationStore:g,automationScheduler:q8}}var pG6=process.argv[1]&&(process.argv[1].endsWith("index.js")||process.argv[1].endsWith("index.ts"));if(pG6){const z=process.execArgv.find((K)=>K.startsWith("--max-old-space-size="))?.split("=")[1]||"0";const D=Number(z)||0;if(D>0&&D<2048){console.warn(`[deepseekcode] WARNING: --max-old-space-size=${D}MB may be too low for large sessions. Set DSC_HEAP_LIMIT_MB=4096 or higher.`)}else if(D===0){console.warn(`[deepseekcode] WARNING: No --max-old-space-size set. Default Node.js heap limit (~2GB) may cause OOM with large sessions. Set DSC_HEAP_LIMIT_MB=4096 or use --max-old-space-size=4096.`)}console.log(`[deepseekcode] Heap limit: ${D||"default (~2GB)"} (DSC_HEAP_LIMIT_MB env default: ${IG6}MB — set --max-old-space-size to apply a different value at startup)`);const J=sm();J.httpServer.listen(J.httpPort,J.host);J.wsHttpServer.listen(J.wsPort,J.host);console.log(`[deepseekcode] HTTP API: http://localhost:${J.httpPort}`);console.log(`[deepseekcode] WebSocket: ws://localhost:${J.wsPort}/ws`);console.log(`[deepseekcode] Workspace: ${J.workspaceDir}`)}import{join as m5}from"node:path";import{homedir as JQ}from"node:os";import{createServer as RZ6}from"node:net";import{execFile as rL}from"node:child_process";import{homedir as cG6}from"node:os";import{join as lG6}from"node:path";import{existsSync as T_8,readFileSync as dG6,unlinkSync as iG6,writeFileSync as nG6}from"node:fs";var tj=lG6(cG6(),".agent","logs","dscode-cli.pid");function ej(){return process.env.DEEPSEEKCODE_QUIET==="1"}function w_8(z){return new Promise((D)=>{if(process.platform==="win32"){rL("netstat",["-ano"],{timeout:5000,windowsHide:true,maxBuffer:16*1024*1024},(J,K)=>{if(J){D([]);return}const X=new Set;for(const q of K.split(/\r?\n/)){const Y=q.trim().split(/\s+/);if(Y.length<5)continue;const G=Y[1];const Z=Y[3].toUpperCase();const H=Y[4];const V=G.includes("]")?G.split("]:").pop():G.split(":").pop();if(V===String(z)&&(Z==="LISTENING"||Z==="ESTABLISHED")){const j=parseInt(H,10);if(Number.isFinite(j)&&j>0)X.add(j)}}D([...X])});return}rL("lsof",["-ti",`:${z}`],{timeout:5000},(J,K)=>{if(J){D([]);return}D(K.trim().split(/\r?\n/).map((X)=>parseInt(X.trim(),10)).filter((X)=>Number.isFinite(X)&&X>0))})})}function oG6(z){return new Promise((D)=>{if(process.platform==="win32"){rL("taskkill",["/F","/T","/PID",String(z)],{timeout:5000,windowsHide:true},(J)=>D(!J));return}rL("kill",["-KILL",String(z)],{timeout:5000},(J)=>D(!J))})}function aG6(z){try{process.kill(z,0);return true}catch(D){return D.code==="EPERM"}}function S_8(){try{if(!T_8(tj))return null;const z=dG6(tj,"utf8").trim();if(!z)return null;return JSON.parse(z)}catch{return null}}function v_8(z){try{nG6(tj,JSON.stringify(z),"utf8")}catch{}}function sL(){try{const z=S_8();if(z&&z.pid===process.pid&&T_8(tj)){iG6(tj)}}catch{}}async function b_8(){const z=new Set;const D=S_8();if(D&&D.pid!==process.pid){if(aG6(D.pid)){z.add(D.pid);if(!ej()){try{const X=`pid=${D.pid} started=${D.startedAt}`+(D.port?` port=${D.port}`:"")+(D.workspace?` workspace=${D.workspace}`:"");process.stderr.write(`[dscode] ⚠ Previous instance still running (${X}).
1687
1687
  `+` If it's stuck, close it or run with --force to take over its port.
1688
1688
  `)}catch{}}}}const J=Number(process.env.DEEPSEEKCODE_HTTP_PORT||8080);let K=[];try{K=await w_8(J);for(const X of K){if(X!==process.pid)z.add(X)}}catch{}return{stalePids:[...z],holdersOnDefaultPort:K}}async function I_8(z,D){const J=new Set([...D]);try{for(const X of await w_8(z)){if(X!==process.pid)J.add(X)}}catch{}let K=true;for(const X of J){try{const q=await oG6(X);if(!q){process.stderr.write(`[dscode] ⚠ Failed to kill PID ${X}.
1689
1689
  `);K=false}else{process.stderr.write(`[dscode] ✅ Killed stale instance PID ${X} (--force)
@@ -1694,7 +1694,7 @@ The reviewer should pay special attention to: **${$}**
1694
1694
  ${z.stack||z.message}`)}catch(D){}r_8("Fatal error:",z);process.exit(1)});process.on("unhandledRejection",(z)=>{const D=z instanceof Error?z:new Error(String(z));if(D.code==="EPIPE"||D.code==="ECONNRESET")return;try{X1.error(`FATAL UNHANDLED REJECTION: ${D.stack||D.message}`);X1.error(`Node.js ${process.version}, heapUsed: ${(process.memoryUsage().heapUsed/1024/1024).toFixed(1)}MB`);const J=m5(JQ(),".agent","logs");const K=m5(J,".last-crash");qp(K,`${new Date().toISOString()}
1695
1695
  UNHANDLED REJECTION
1696
1696
  ${D.stack||D.message}`)}catch(J){}r_8("Fatal unhandled rejection:",D);process.exit(1)});process.on("exit",(z)=>{try{const D=m5(JQ(),".agent","logs");qp(m5(D,".last-exit"),`${new Date().toISOString()} code=${z}
1697
- `)}catch{}try{sL()}catch{}});function s_8(){const z=process.stdin;if(z.isTTY===undefined){z.isTTY=true}return z}var sH="1.0.13";var Kp=null;function t_8(z){if(Kp)return;Kp=rf(z)?Promise.resolve(null):Oq8(sH)}async function e_8(z,D=1200){const J=Nq8();if(J&&!ej()){try{process.stderr.write(Uq8(J))}catch{}}if(rf(z)||ej())return;t_8(z);const K=await Promise.race([Kp,new Promise((X)=>setTimeout(()=>X(null),D))]);if(!K)return;try{if(Bq8(z)||!_q8(sH)){process.stderr.write($q8(K))}else{process.stderr.write(Fq8(K));Mq8(K.latest)}}catch{}}function o_8(){console.log(`DeepSeekCode CLI v${sH}`);console.log("");console.log("Usage:");console.log(" dscode [options] Start local core + interactive terminal");console.log(" dscode start [options] Start local core + interactive terminal");console.log(" dscode start --auto Start with auto mode enabled");console.log(" dscode run --backend URL Connect to existing backend");console.log(" dscode exec <command> Execute command non-interactively (JSONL output)");console.log(" dscode exec --file <path> Execute command from file");console.log(" dscode exec --text Output plain text instead of JSONL");console.log(" dscode --no-update-check Disable the startup new-version notice");console.log(" dscode --no-auto-update Disable background auto-update (notice still shown)");console.log(" dscode --resume Resume last session");console.log(" dscode --resume <id> Resume an existing session");console.log(" dscode codeview [options] AI code review: bugs + unwired features (JSON output)");console.log(" dscode review Review current code changes (legacy)");console.log(" dscode test-fix Run auto-fix test loop");console.log(" dscode auto Enable auto mode (auto-approve all hooks)");console.log(" dscode version Print version");console.log("");console.log("Interactive commands (inside TUI):");console.log(" /auto Toggle auto mode on/off");console.log(" /plan Toggle plan mode");console.log(" /clear Clear conversation");console.log(" /help Show help");console.log(" /context Show current context info");console.log("");console.log("Options:");console.log(" -p, --port <port> HTTP port (default: first available from 8080)");console.log(" --ws-port <port> WebSocket port (default: HTTP port + 1)");console.log(" -w, --workspace <dir> Workspace directory (default: current directory)");console.log(" -F, --force Kill existing process on target port before starting");console.log(" -b, --backend <url> Backend URL for run mode");console.log(" --ws <url> Override WebSocket URL");console.log(" --file <path> Read command from file (for exec)");console.log(" --text Output plain text (for exec/review)");console.log(" --brief Output brief results (for exec/review)");console.log(" --provider <name> Provider to use (for exec/review)");console.log(" --model <name> Model to use (for exec/review)");console.log(" --packages <list> Comma-separated packages (for test-fix)");console.log(" --retries <n> Max retry count (for test-fix, default 5)");console.log(" --skip <list> Comma-separated validations to skip (for test-fix)");console.log(" --dry-run Analyze only, no fixes applied (for test-fix)");console.log(" --focus <text> Focus area for codeview (e.g. security, performance)");console.log(" --no-fix Skip interactive fix prompt in codeview");console.log(" --output <file> Write codeview JSON report to file");console.log(" --resume [session-id] Resume a session (omit ID to resume last session)");console.log(" --theme <name|path> Theme name or JSON file path (e.g. nord, /path/to/t.json)");console.log(" --prompt-version <ver> Prompt template version (e.g. v1.0)");console.log(" --timeout <ms> Per-attempt LLM timeout (default: 300000 = 5min)");console.log(" --stall-threshold <ms> Stream stall detection threshold (default: 240000 = 4min)");console.log("");console.log("Environment:");console.log(" DEEPSEEKCODE_QUIET=1 Suppress non-fatal startup warnings (stale instance, port conflict, tips)");console.log(" DEEPSEEKCODE_NO_AUTO_UPDATE=1 Disable background auto-update (version notice still shown)");console.log(" DEEPSEEKCODE_HTTP_PORT=<n> HTTP port (default: 8080)");console.log(" DEEPSEEKCODE_WS_PORT=<n> WebSocket port (default: HTTP port + 1)");console.log(" DEEPSEEKCODE_TUI=1 Log to file instead of terminal (auto-set in start mode)")}function PZ6(){const z={};const D=process.argv.slice(2);for(let J=0;J<D.length;J+=1){const K=D[J];if(K==="--force"||K==="-F")z.force=true;else if(K==="--port"||K==="-p")z.port=D[++J];else if(K==="--ws-port")z.wsPort=D[++J];else if(K==="--workspace"||K==="-w")z.workspace=D[++J];else if(K==="--backend"||K==="-b")z.backend=D[++J];else if(K==="--ws")z.ws=D[++J];else if(K==="--file")z.file=D[++J];else if(K==="--json")z.json=true;else if(K==="--text")z.text=true;else if(K==="--brief")z.brief=true;else if(K==="--provider")z.provider=D[++J];else if(K==="--model")z.model=D[++J];else if(K==="--timeout")z.timeout=D[++J];else if(K==="--stall-threshold")z.stallThreshold=D[++J];else if(K==="--packages")z.packages=D[++J];else if(K==="--retries")z.retries=D[++J];else if(K==="--skip")z.skip=D[++J];else if(K==="--dry-run")z.dryRun=true;else if(K==="--focus")z.focus=D[++J];else if(K==="--no-fix")z.noFix=true;else if(K==="--no-update-check")z.noUpdateCheck=true;else if(K==="--output")z.output=D[++J];else if(K==="--theme")z.theme=D[++J];else if(K==="--prompt-version")z.promptVersion=D[++J];else if(K==="--auto")z.auto=true;else if(K==="--resume"){const X=J+1<D.length&&!D[J+1].startsWith("-")?D[++J]:undefined;z.resume=X||true}else if(!K.startsWith("-")){if(!z._cmd)z._cmd=K;else(z._args??=[]).push(K)}}return z}async function TZ6(z){return new Promise((D)=>{const J=RZ6();let K=false;const X=(q)=>{if(K)return;K=true;D(q)};J.once("error",()=>X(false));J.once("listening",()=>{J.close(()=>X(true))});J.listen(z,"::")})}async function Jp(z,D=20){const J=Number.isFinite(z)&&z>0?Math.floor(z):8080;for(let K=J;K<J+D;K+=1){if(await TZ6(K))return K}throw new Error(`No available port found in range ${J}-${J+D-1}`)}async function a_8(z,D,J){return new Promise((K,X)=>{const q=(G)=>{z.off("listening",Y);X(new Error(`${J} failed to listen on port ${D}: ${G.code||G.message}`))};const Y=()=>{z.off("error",q);K()};z.once("error",q);z.once("listening",Y);z.listen(D)})}function zM8(){if(process.env.DEEPSEEKCODE_FRAME_TIMING!=="1")return;let z=0;let D=0,J=0,K=0,X=0,q=0,Y=0;let G=Date.now();return(Z)=>{z++;const H=Z.phases;if(H){if(H.renderer>D)D=H.renderer;if(H.diff>J)J=H.diff;if(H.write>K)K=H.write;if(H.optimize>X)X=H.optimize;if(H.patches>Y)Y=H.patches}if(Z.durationMs>q)q=Z.durationMs;if(Z.durationMs>50){X1.info(`[frame-timing] SPIKE ${Z.durationMs.toFixed(1)}ms renderer=${H?.renderer?.toFixed(1)} diff=${H?.diff?.toFixed(1)} write=${H?.write?.toFixed(1)} patches=${H?.patches} yogaVisited=${H?.yogaVisited} yogaMeasured=${H?.yogaMeasured} yogaLive=${H?.yogaLive}`)}if(Date.now()-G>=1000){X1.info(`[frame-timing] ${z}fps maxTot=${q.toFixed(1)}ms renderer=${D.toFixed(1)} diff=${J.toFixed(1)} write=${K.toFixed(1)} optimize=${X.toFixed(1)} maxPatches=${Y}`);z=0;D=0;J=0;K=0;X=0;q=0;Y=0;G=Date.now()}}}async function wZ6(z,D,J,K,X,q){X1.debug("Rendering App UI");const Y=s_8();let G=null;const{waitUntilExit:Z,unmount:H}=await rP(Xp.createElement(af,{backendUrl:z,wsUrl:D,onExit:()=>{try{G?.()}catch{}},clientFactory:K,version:sH,workspaceDir:X,resumeSessionId:q}),{stdin:Y,exitOnCtrlC:false,onFrame:zM8()});G=H;await Z();X1.warn("[exit] App UI exited");J()}async function SZ6(z){process.env.DEEPSEEKCODE_TUI="1";const D=String(z.workspace||process.cwd());const J=Number(z.port||process.env.DEEPSEEKCODE_HTTP_PORT||8080);t_8(z);const K=Boolean(z.force);let X=[];try{const E=await b_8();X=E.stalePids}catch{}let q=await Jp(J);if(K){const E=await I_8(J,X);if(E)q=await Jp(J)}const Y=Number(z.wsPort||process.env.DEEPSEEKCODE_WS_PORT||q+1);const G=Y===q?q+1:Y;const Z=await Jp(G);const H=m5(JQ(),".agent","logs");X1.debug(`Starting local core runtime, workspace: ${D}`);X1.debug(`AI trace file: ${m5(H,"ai-trace-*.ndjson")} (DEEPSEEKCODE_TRACE_AI=1 enables full request/response tracing)`);if(q!==J){X1.warn(`HTTP port ${J} is already in use; using ${q}`)}if(Z!==G){X1.warn(`WebSocket port ${G} is already in use; using ${Z}`)}v_8({pid:process.pid,startedAt:new Date().toISOString(),port:q,workspace:D});const V=new ef(D);let j=false;let $=null;function A(E="unknown"){if(j)return;j=true;X1.warn(`[exit] Shutting down... (trigger: ${E})`);const T=setTimeout(()=>{try{process.exit(0)}catch{}},3000);try{T.unref?.()}catch{}try{B.httpServer.close()}catch{}try{B.wsHttpServer.close()}catch{}try{V.close()}catch{}try{$?.()}catch{}sL();process.exit(0)}const B=sm({runtime:V.runtime,workspaceDir:D,httpPort:q,wsPort:Z,onShutdown:()=>A("web-ui")});await a_8(B.httpServer,B.httpPort,"HTTP API");await a_8(B.wsHttpServer,B.wsPort,"WebSocket");await e_8(z);process.on("SIGINT",()=>A("SIGINT"));process.on("SIGTERM",()=>A("SIGTERM"));process.on("SIGBREAK",()=>A("SIGBREAK"));if(!await V.providerConfigured()){X1.info("Provider not configured; directing user to the web config UI");if(!ej()){try{const E=`http://localhost:${B.httpPort}/#models`;const T=lU()?`\x1B]8;;${E}\x07${E}\x1B]8;;\x07`:E;process.stderr.write(`[dscode] ⚠ 尚未配置模型/Provider,请在网页端完成配置:
1697
+ `)}catch{}try{sL()}catch{}});function s_8(){const z=process.stdin;if(z.isTTY===undefined){z.isTTY=true}return z}var sH="1.0.14";var Kp=null;function t_8(z){if(Kp)return;Kp=rf(z)?Promise.resolve(null):Oq8(sH)}async function e_8(z,D=1200){const J=Nq8();if(J&&!ej()){try{process.stderr.write(Uq8(J))}catch{}}if(rf(z)||ej())return;t_8(z);const K=await Promise.race([Kp,new Promise((X)=>setTimeout(()=>X(null),D))]);if(!K)return;try{if(Bq8(z)||!_q8(sH)){process.stderr.write($q8(K))}else{process.stderr.write(Fq8(K));Mq8(K.latest)}}catch{}}function o_8(){console.log(`DeepSeekCode CLI v${sH}`);console.log("");console.log("Usage:");console.log(" dscode [options] Start local core + interactive terminal");console.log(" dscode start [options] Start local core + interactive terminal");console.log(" dscode start --auto Start with auto mode enabled");console.log(" dscode run --backend URL Connect to existing backend");console.log(" dscode exec <command> Execute command non-interactively (JSONL output)");console.log(" dscode exec --file <path> Execute command from file");console.log(" dscode exec --text Output plain text instead of JSONL");console.log(" dscode --no-update-check Disable the startup new-version notice");console.log(" dscode --no-auto-update Disable background auto-update (notice still shown)");console.log(" dscode --resume Resume last session");console.log(" dscode --resume <id> Resume an existing session");console.log(" dscode codeview [options] AI code review: bugs + unwired features (JSON output)");console.log(" dscode review Review current code changes (legacy)");console.log(" dscode test-fix Run auto-fix test loop");console.log(" dscode auto Enable auto mode (auto-approve all hooks)");console.log(" dscode version Print version");console.log("");console.log("Interactive commands (inside TUI):");console.log(" /auto Toggle auto mode on/off");console.log(" /plan Toggle plan mode");console.log(" /clear Clear conversation");console.log(" /help Show help");console.log(" /context Show current context info");console.log("");console.log("Options:");console.log(" -p, --port <port> HTTP port (default: first available from 8080)");console.log(" --ws-port <port> WebSocket port (default: HTTP port + 1)");console.log(" -w, --workspace <dir> Workspace directory (default: current directory)");console.log(" -F, --force Kill existing process on target port before starting");console.log(" -b, --backend <url> Backend URL for run mode");console.log(" --ws <url> Override WebSocket URL");console.log(" --file <path> Read command from file (for exec)");console.log(" --text Output plain text (for exec/review)");console.log(" --brief Output brief results (for exec/review)");console.log(" --provider <name> Provider to use (for exec/review)");console.log(" --model <name> Model to use (for exec/review)");console.log(" --packages <list> Comma-separated packages (for test-fix)");console.log(" --retries <n> Max retry count (for test-fix, default 5)");console.log(" --skip <list> Comma-separated validations to skip (for test-fix)");console.log(" --dry-run Analyze only, no fixes applied (for test-fix)");console.log(" --focus <text> Focus area for codeview (e.g. security, performance)");console.log(" --no-fix Skip interactive fix prompt in codeview");console.log(" --output <file> Write codeview JSON report to file");console.log(" --resume [session-id] Resume a session (omit ID to resume last session)");console.log(" --theme <name|path> Theme name or JSON file path (e.g. nord, /path/to/t.json)");console.log(" --prompt-version <ver> Prompt template version (e.g. v1.0)");console.log(" --timeout <ms> Per-attempt LLM timeout (default: 300000 = 5min)");console.log(" --stall-threshold <ms> Stream stall detection threshold (default: 240000 = 4min)");console.log("");console.log("Environment:");console.log(" DEEPSEEKCODE_QUIET=1 Suppress non-fatal startup warnings (stale instance, port conflict, tips)");console.log(" DEEPSEEKCODE_NO_AUTO_UPDATE=1 Disable background auto-update (version notice still shown)");console.log(" DEEPSEEKCODE_HTTP_PORT=<n> HTTP port (default: 8080)");console.log(" DEEPSEEKCODE_WS_PORT=<n> WebSocket port (default: HTTP port + 1)");console.log(" DEEPSEEKCODE_TUI=1 Log to file instead of terminal (auto-set in start mode)")}function PZ6(){const z={};const D=process.argv.slice(2);for(let J=0;J<D.length;J+=1){const K=D[J];if(K==="--force"||K==="-F")z.force=true;else if(K==="--port"||K==="-p")z.port=D[++J];else if(K==="--ws-port")z.wsPort=D[++J];else if(K==="--workspace"||K==="-w")z.workspace=D[++J];else if(K==="--backend"||K==="-b")z.backend=D[++J];else if(K==="--ws")z.ws=D[++J];else if(K==="--file")z.file=D[++J];else if(K==="--json")z.json=true;else if(K==="--text")z.text=true;else if(K==="--brief")z.brief=true;else if(K==="--provider")z.provider=D[++J];else if(K==="--model")z.model=D[++J];else if(K==="--timeout")z.timeout=D[++J];else if(K==="--stall-threshold")z.stallThreshold=D[++J];else if(K==="--packages")z.packages=D[++J];else if(K==="--retries")z.retries=D[++J];else if(K==="--skip")z.skip=D[++J];else if(K==="--dry-run")z.dryRun=true;else if(K==="--focus")z.focus=D[++J];else if(K==="--no-fix")z.noFix=true;else if(K==="--no-update-check")z.noUpdateCheck=true;else if(K==="--output")z.output=D[++J];else if(K==="--theme")z.theme=D[++J];else if(K==="--prompt-version")z.promptVersion=D[++J];else if(K==="--auto")z.auto=true;else if(K==="--resume"){const X=J+1<D.length&&!D[J+1].startsWith("-")?D[++J]:undefined;z.resume=X||true}else if(!K.startsWith("-")){if(!z._cmd)z._cmd=K;else(z._args??=[]).push(K)}}return z}async function TZ6(z){return new Promise((D)=>{const J=RZ6();let K=false;const X=(q)=>{if(K)return;K=true;D(q)};J.once("error",()=>X(false));J.once("listening",()=>{J.close(()=>X(true))});J.listen(z,"::")})}async function Jp(z,D=20){const J=Number.isFinite(z)&&z>0?Math.floor(z):8080;for(let K=J;K<J+D;K+=1){if(await TZ6(K))return K}throw new Error(`No available port found in range ${J}-${J+D-1}`)}async function a_8(z,D,J){return new Promise((K,X)=>{const q=(G)=>{z.off("listening",Y);X(new Error(`${J} failed to listen on port ${D}: ${G.code||G.message}`))};const Y=()=>{z.off("error",q);K()};z.once("error",q);z.once("listening",Y);z.listen(D)})}function zM8(){if(process.env.DEEPSEEKCODE_FRAME_TIMING!=="1")return;let z=0;let D=0,J=0,K=0,X=0,q=0,Y=0;let G=Date.now();return(Z)=>{z++;const H=Z.phases;if(H){if(H.renderer>D)D=H.renderer;if(H.diff>J)J=H.diff;if(H.write>K)K=H.write;if(H.optimize>X)X=H.optimize;if(H.patches>Y)Y=H.patches}if(Z.durationMs>q)q=Z.durationMs;if(Z.durationMs>50){X1.info(`[frame-timing] SPIKE ${Z.durationMs.toFixed(1)}ms renderer=${H?.renderer?.toFixed(1)} diff=${H?.diff?.toFixed(1)} write=${H?.write?.toFixed(1)} patches=${H?.patches} yogaVisited=${H?.yogaVisited} yogaMeasured=${H?.yogaMeasured} yogaLive=${H?.yogaLive}`)}if(Date.now()-G>=1000){X1.info(`[frame-timing] ${z}fps maxTot=${q.toFixed(1)}ms renderer=${D.toFixed(1)} diff=${J.toFixed(1)} write=${K.toFixed(1)} optimize=${X.toFixed(1)} maxPatches=${Y}`);z=0;D=0;J=0;K=0;X=0;q=0;Y=0;G=Date.now()}}}async function wZ6(z,D,J,K,X,q){X1.debug("Rendering App UI");const Y=s_8();let G=null;const{waitUntilExit:Z,unmount:H}=await rP(Xp.createElement(af,{backendUrl:z,wsUrl:D,onExit:()=>{try{G?.()}catch{}},clientFactory:K,version:sH,workspaceDir:X,resumeSessionId:q}),{stdin:Y,exitOnCtrlC:false,onFrame:zM8()});G=H;await Z();X1.warn("[exit] App UI exited");J()}async function SZ6(z){process.env.DEEPSEEKCODE_TUI="1";const D=String(z.workspace||process.cwd());const J=Number(z.port||process.env.DEEPSEEKCODE_HTTP_PORT||8080);t_8(z);const K=Boolean(z.force);let X=[];try{const E=await b_8();X=E.stalePids}catch{}let q=await Jp(J);if(K){const E=await I_8(J,X);if(E)q=await Jp(J)}const Y=Number(z.wsPort||process.env.DEEPSEEKCODE_WS_PORT||q+1);const G=Y===q?q+1:Y;const Z=await Jp(G);const H=m5(JQ(),".agent","logs");X1.debug(`Starting local core runtime, workspace: ${D}`);X1.debug(`AI trace file: ${m5(H,"ai-trace-*.ndjson")} (DEEPSEEKCODE_TRACE_AI=1 enables full request/response tracing)`);if(q!==J){X1.warn(`HTTP port ${J} is already in use; using ${q}`)}if(Z!==G){X1.warn(`WebSocket port ${G} is already in use; using ${Z}`)}v_8({pid:process.pid,startedAt:new Date().toISOString(),port:q,workspace:D});const V=new ef(D);let j=false;let $=null;function A(E="unknown"){if(j)return;j=true;X1.warn(`[exit] Shutting down... (trigger: ${E})`);const T=setTimeout(()=>{try{process.exit(0)}catch{}},3000);try{T.unref?.()}catch{}try{B.httpServer.close()}catch{}try{B.wsHttpServer.close()}catch{}try{V.close()}catch{}try{$?.()}catch{}sL();process.exit(0)}const B=sm({runtime:V.runtime,workspaceDir:D,httpPort:q,wsPort:Z,onShutdown:()=>A("web-ui")});await a_8(B.httpServer,B.httpPort,"HTTP API");await a_8(B.wsHttpServer,B.wsPort,"WebSocket");await e_8(z);process.on("SIGINT",()=>A("SIGINT"));process.on("SIGTERM",()=>A("SIGTERM"));process.on("SIGBREAK",()=>A("SIGBREAK"));if(!await V.providerConfigured()){X1.info("Provider not configured; directing user to the web config UI");if(!ej()){try{const E=`http://localhost:${B.httpPort}/#models`;const T=lU()?`\x1B]8;;${E}\x07${E}\x1B]8;;\x07`:E;process.stderr.write(`[dscode] ⚠ 尚未配置模型/Provider,请在网页端完成配置:
1698
1698
  `+` ${T}
1699
1699
  `+` (配置完成后回到这里即可继续,提示会自动消失)
1700
1700
  `)}catch{}}}if(j)return;X1.debug("Rendering App UI");let M;if(z.resume===true){const E=r3();if(E)M=E.sessionId}else if(typeof z.resume==="string"){M=z.resume}const N=s_8();const{waitUntilExit:P,unmount:F}=await rP(Xp.createElement(af,{backendUrl:`http://localhost:${B.httpPort}`,wsUrl:`ws://localhost:${B.wsPort}`,onExit:()=>{try{$?.()}catch{}},clientFactory:()=>V,startWithAutoMode:Boolean(z.auto),version:sH,workspaceDir:D,resumeSessionId:M}),{stdin:N,exitOnCtrlC:false,onFrame:zM8()});$=F;await P();X1.warn("[exit] App UI exited");if(!j){try{B.httpServer.close()}catch{}try{B.wsHttpServer.close()}catch{}try{V.close()}catch{}sL();process.exit(0)}}async function vZ6(z){if(!process.stdin.isTTY){X1.error("Not a TTY, exiting");console.error("Error: dscode requires a real terminal (TTY).");process.exit(1)}if(process.env.DEEPSEEKCODE_NO_BRACKETED_PASTE!=="1"){process.stdout.write("\x1B[?2004h")}const D=wq8();const J=String(z.backend||D.backend_url);const K=String(z.ws||J.replace(/^http/,"ws").replace(/:(\d+)/,(Y,G)=>":"+(Number(G)+1))+"/ws"||D.ws_url);const X=String(z.workspace||D.workspace_dir||process.cwd());let q;if(z.resume===true){const Y=r3();if(Y)q=Y.sessionId}else if(typeof z.resume==="string"){q=z.resume}X1.info(`Connecting to backend: ${J}, ws: ${K}${q?`, resume session: ${q}`:""}`);await e_8(z);await wZ6(J,K,()=>process.exit(0),undefined,X,q)}async function bZ6(){if(process.platform==="win32"&&process.env.DEEPSEEKCODE_FORCE_UTF8!=="0"){try{const{execFileSync:J}=await import("node:child_process");J("chcp",["65001"],{timeout:2000,encoding:"utf-8"})}catch{}}X1.debug("CLI starting");try{const J=m5(JQ(),".agent","logs");const K=m5(J,".last-crash");if(d_8(K)){const q=i_8(K,"utf8").split(`