diff --git a/README.md b/README.md index c487c41..5aa1d53 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ > > Docker Hub Address: https://hub.docker.com/repository/docker/zyyzyykk/kkterminal/general > -> Preview: https://ssh.kkbpro.com/ (For domestic servers) or https://ssh.kkbapps.com/ (For foreign servers) +> Preview: http://ssh.kkbpro.com/ (For domestic servers) or http://ssh.kkbapps.com/ (For foreign servers) > -> Update Time: 2024-12-07 +> Update Time: 2024-12-24 >
@@ -30,7 +30,7 @@ Using the `iframe` tag in HTML web pages to quick integration: ```html - + ``` ### 🐳 Deploy with Docker @@ -65,8 +65,8 @@ docker run -d --name kkterminal -p 3000:3000 -e TITLE="kkbpro" zyyzyykk/kktermin Visit the following website: -- 🌐 For domestic servers: https://ssh.kkbpro.com/ -- 🌍 For foreign servers: https://ssh.kkbapps.com/ +- 🌐 For domestic servers: http://ssh.kkbpro.com/ +- 🌍 For foreign servers: http://ssh.kkbapps.com/  @@ -80,36 +80,44 @@ Visit the following website: ### 💡 Function Description -1.kkTerminal is a terminal for Web SSH connection. Click on the terminal icon in the upper left corner and select the connection settings to establish an SSH connection +1. kkTerminal is a terminal for Web SSH connection. Click on the terminal icon in the upper-left corner and select the connection settings to establish an SSH connection -2.Support the use of `iframe` tags in web pages for quick integration into third-party websites +2. Support the use of `iframe` tags in web pages for quick integration into third-party websites -3.Supports internationalization and language switching between Chinese and English +3. Support internationalization and language switching between Chinese and English -4.Supports local PC deployment, automatically opens browser window upon startup +4. Support local PC deployment, automatically opens browser window upon startup -5.Support adaptive window size and Chinese input +5. Support adaptive window size and Chinese input -6.Support custom preference settings, allowing users to choose the background/foreground color, font size, cursor display style and enable TCode for the terminal +6. Support custom preference settings, allowing users to choose the background/foreground color, font size, cursor display style and enable TCode for the terminal -7.Support restart: It will automatically restart after modifying SSH connection settings or custom preference settings, or can be manually restarted after SSH connection is disconnected +7. Support restart: It will automatically restart after modifying SSH connection settings or custom preference settings, or can be manually restarted after SSH connection is disconnected -8.Support copy and paste: +8. Support copy and paste: -- Copy: Same as `Git` terminal, selecting text will automatically copy it -- Paste: Same as `Cmd` terminal, right-click to paste (requires browser access permission) + - Copy: Same as `Git` terminal, selecting text will automatically copy it -9.Support file management, open the File Management Module to view, decompress, upload and download files/folders + - Paste: Same as `Cmd` terminal, right-click to paste (requires browser access permission) -10.Support shortcut key operations such as multiple/all file selection, copy and paste, cut, selection switch, open -11.Support file browsing and editing, modify the file and save it to a remote server using `ctrl+s` +9. Support file management, open the File Management Module to view, decompress, upload and download files/folders -12.Support [TCode (Terminal Code)](./doc/en_US/TCODE.md),which can achieve automated Workflow similar to Shell scripts through Customized TCode +10. Support shortcut key operations such as multiple/all file selection, copy and paste, cut, selection switch, open + +11. Support file browsing and editing, modify the file and save it to a remote server using `ctrl+s` + +12. Support [TCode (Terminal Code)](./doc/en_US/TCODE.md),which can achieve automated Workflow similar to Shell scripts through Customized TCode ### 👨💻 Update Records -##### zyyzyykk/kkterminal:3.4.2: latest +##### zyyzyykk/kkterminal:3.4.5: latest + +- Add file permission editing function +- Fix folder input upload bug caused by changing dir during upload +- Optimize page display + +##### zyyzyykk/kkterminal:3.4.2: - Implement internationalization and support language switching between Chinese and English - Refactored some logic of code @@ -120,13 +128,6 @@ Visit the following website: - Fixed folder pasting failure bug in File Module - Optimized network resources and page display -##### zyyzyykk/kkterminal:3.3.7: - -- Adaptive remote server encoding format -- Expand highlighting file types -- Add file item keyboard selection switch and open -- Optimization of hidden file icon style - [**History Update Records**](./doc/en_US/UPDATE.md) ### 🧬 Architecture diff --git a/backend/terminal/src/main/resources/application.properties b/backend/terminal/src/main/resources/application.properties index 3e5e2c3..58aafae 100644 --- a/backend/terminal/src/main/resources/application.properties +++ b/backend/terminal/src/main/resources/application.properties @@ -22,4 +22,4 @@ spring.servlet.multipart.max-file-size=20MB spring.servlet.multipart.max-request-size=100MB # PC端启用窗口 -kk.pc.window=false \ No newline at end of file +kk.pc.window=true \ No newline at end of file diff --git a/backend/terminal/src/main/resources/static/css/app.35c1da4f.css b/backend/terminal/src/main/resources/static/css/app.35c1da4f.css deleted file mode 100644 index 3587f11..0000000 --- a/backend/terminal/src/main/resources/static/css/app.35c1da4f.css +++ /dev/null @@ -1 +0,0 @@ -.no-data[data-v-139a934c]{text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}.msg[data-v-139a934c]{margin-top:10px;color:#909399;font-size:14px}.item-class[data-v-111894aa]{display:flex;align-items:center;padding:5px 10px;border-bottom:1px solid #ececec;cursor:pointer;width:100%}.item-class[data-v-111894aa]:hover,.item-selected[data-v-111894aa]{background-color:#f3f3f3}.kk-flex[data-v-111894aa]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-111894aa]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.kk-border[data-v-111894aa]{height:30.1vh;overflow-y:scroll;width:100%;border-bottom:1px solid #ececec}.ellipsis[data-v-111894aa]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.item-class[data-v-1c0552a5]{display:flex;align-items:center}.errInfo[data-v-1c0552a5]{font-size:12px;color:#ea5050;margin-top:8px}.no-select[data-v-1c0552a5]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-1c0552a5]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nowrap[data-v-1c0552a5]{white-space:nowrap}.old-option[data-v-1c0552a5]{color:#67c23a}.new-option[data-v-1c0552a5]{color:#f56c6c}.form-width[data-v-1c0552a5]{width:56px}.item-class[data-v-435fb055]{display:flex;align-items:center}.no-select[data-v-435fb055]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.form-width[data-v-435fb055]{width:60px}.kk-code-editor[data-v-ccfd029a]{height:100%;width:100%;border:1px solid #ececec}.kk-flex[data-v-2e37867e]{display:flex;align-items:center}.ellipsis[data-v-2e37867e]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px}.preview[data-v-2e37867e]{width:100%;height:100%}.kk-flex[data-v-7567fb7c]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-7567fb7c]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.errInfo[data-v-7567fb7c]{font-size:12px;color:#ea5050;margin-top:8px}.kk-flex[data-v-1644d6f2]{display:flex;align-items:center;margin-top:15px}.kk-border[data-v-1644d6f2]{padding-bottom:10px;border-bottom:1px solid #ececec}.no-select[data-v-1644d6f2]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-1644d6f2]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.nowrap[data-v-1644d6f2]{white-space:nowrap}.form-width[data-v-1644d6f2]{text-align:left;width:100px}.kk-flex[data-v-73c3d5c6]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-73c3d5c6]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.errInfo[data-v-73c3d5c6]{font-size:12px;color:#ea5050;margin-top:8px}.form-width[data-v-73c3d5c6]{width:56px}.title[data-v-ceb007a0]{background-color:#efefef;padding:4px 10px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:15px}.list-class[data-v-ceb007a0]{height:248px;overflow-y:scroll;width:100%}.item-class[data-v-ceb007a0]{display:flex;align-items:center;padding:5px 10px;border-bottom:1px solid #efefef;cursor:pointer;width:100%}.item-class[data-v-ceb007a0]:hover{background-color:#f3f3f3}.hover-class[data-v-ceb007a0]:hover{color:#409eff}.item-selected[data-v-ceb007a0]{background-color:#efefef!important;border-bottom:1px solid #d8d8d8}.no-select[data-v-ceb007a0]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-ceb007a0]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.kk-menu[data-v-ceb007a0]{position:absolute;z-index:3466;text-align:center;border-radius:8px;border-top:8px solid #fff;border-bottom:8px solid #fff;box-shadow:0 6px 12px 0 rgba(0,0,0,.15),0 3px 6px -2px rgba(0,0,0,.2),0 8px 16px 4px rgba(0,0,0,.12)}.kk-menu-item[data-v-ceb007a0]{height:30px;font-size:13px;line-height:30px;width:110px;color:#383838;background-color:#fff;cursor:pointer}.kk-menu-item[data-v-ceb007a0]:hover{background-color:#efefef}.disabled[data-v-ceb007a0]{background-color:#f5f7fa}.disabled-function[data-v-ceb007a0],.disabled[data-v-ceb007a0]{color:#a8abb2;pointer-events:none}.confirmPop[data-v-ceb007a0]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.kk-flex[data-v-5447fae9]{display:flex;align-items:center;margin-top:15px}.kk-border[data-v-5447fae9]{margin-top:3px;margin-bottom:3px;padding-bottom:5px;border-bottom:1px solid #ececec}.no-select[data-v-5447fae9]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.nowrap[data-v-5447fae9]{white-space:nowrap}.form-width[data-v-5447fae9]{width:56px}.kk-flex[data-v-807dded8]{display:flex;align-items:center}.kk-border[data-v-807dded8]{padding-bottom:10px;border-bottom:1px solid #ddd}.tocde-item[data-v-807dded8]:hover{background-color:#efefef}.no-select[data-v-807dded8]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-807dded8]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.nowrap[data-v-807dded8]{white-space:nowrap}.golbal[data-v-3a0e0d55]{position:relative;width:100%;display:flex;flex-direction:column;overflow:hidden}.bar[data-v-3a0e0d55]{display:flex;align-items:center;background-color:#f5f5f5;color:#000;width:100%;height:25px;border-top:1px solid #d7d7d7;border-bottom:1px solid #d7d7d7;border-left:1px solid #d7d7d7;border-right:1px solid #d7d7d7}.terminal-class[data-v-3a0e0d55]{width:100%}.setting[data-v-3a0e0d55]{position:absolute;left:0;top:25px;z-index:100;cursor:pointer;border:2px solid #f2f2f2}.setting-menu[data-v-3a0e0d55]{display:flex;align-items:center;justify-content:center;background-color:#f2f2f2;text-align:center;width:80px;height:25px;line-height:25px;font-size:13px;color:#383838}.setting-menu[data-v-3a0e0d55]:hover{background-color:#91c9f7}.no-select[data-v-3a0e0d55]{-webkit-user-select:none;-moz-user-select:none;user-select:none}img{-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none}.kk-dialog-class{pointer-events:none;z-index:3456}.el-dialog{pointer-events:auto}.el-popconfirm__main{-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-top:2px}:root{--link:#007fff;--pink:#f69;--text2:#61666d;--icon:#9499a0}body{margin:0;font-size:14px;color:#636d7e}*,body{padding:0}*{box-sizing:border-box;border:0;outline:0;vertical-align:middle}.a-link{text-decoration:none;color:var(--link);cursor:pointer}.el-form-item{align-items:center}.container-body{margin:0 auto;padding-top:5px}.el-button{.iconfont:before{margin-right:5px}} \ No newline at end of file diff --git a/backend/terminal/src/main/resources/static/css/app.797756a5.css b/backend/terminal/src/main/resources/static/css/app.797756a5.css new file mode 100644 index 0000000..3b15144 --- /dev/null +++ b/backend/terminal/src/main/resources/static/css/app.797756a5.css @@ -0,0 +1 @@ +.no-data[data-v-139a934c]{text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}.msg[data-v-139a934c]{margin-top:10px;color:#909399;font-size:14px}.item-class[data-v-111894aa]{display:flex;align-items:center;padding:5px 10px;border-bottom:1px solid #ececec;cursor:pointer;width:100%}.item-class[data-v-111894aa]:hover,.item-selected[data-v-111894aa]{background-color:#f3f3f3}.kk-flex[data-v-111894aa]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-111894aa]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.kk-border[data-v-111894aa]{height:30.1vh;overflow-y:scroll;width:100%;border-bottom:1px solid #ececec}.ellipsis[data-v-111894aa]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.tooltip-content[data-v-7eeec75d]{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item-class[data-v-6c16cb8e]{display:flex;align-items:center}.errInfo[data-v-6c16cb8e]{font-size:12px;color:#ea5050;margin-top:8px}.no-select[data-v-6c16cb8e]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-6c16cb8e]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nowrap[data-v-6c16cb8e]{white-space:nowrap}.old-option[data-v-6c16cb8e]{color:#67c23a}.new-option[data-v-6c16cb8e]{color:#f56c6c}.form-width[data-v-6c16cb8e]{width:56px}.item-class[data-v-aac5d314]{display:flex;align-items:center}.no-select[data-v-aac5d314]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.form-width[data-v-aac5d314]{width:60px}.kk-code-editor[data-v-ccfd029a]{height:100%;width:100%;border:1px solid #ececec}.kk-flex[data-v-2e37867e]{display:flex;align-items:center}.ellipsis[data-v-2e37867e]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:22px}.preview[data-v-2e37867e]{width:100%;height:100%}.kk-flex[data-v-7567fb7c]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-7567fb7c]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.errInfo[data-v-7567fb7c]{font-size:12px;color:#ea5050;margin-top:8px}.kk-flex[data-v-96f92c8a]{display:flex;align-items:center;margin-top:15px}.ellipsis[data-v-96f92c8a]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.nowrap[data-v-96f92c8a]{white-space:nowrap}.no-select[data-v-96f92c8a]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.form-width[data-v-96f92c8a]{width:72px}.kk-flex[data-v-496b021a]{display:flex;align-items:center;margin-top:15px}.kk-border[data-v-496b021a]{padding-bottom:10px;border-bottom:1px solid #ececec}.no-select[data-v-496b021a]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-496b021a]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.nowrap[data-v-496b021a]{white-space:nowrap}.form-width[data-v-496b021a]{text-align:left;width:100px}.kk-flex[data-v-73c3d5c6]{display:flex;align-items:center;margin-top:10px}.no-select[data-v-73c3d5c6]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.errInfo[data-v-73c3d5c6]{font-size:12px;color:#ea5050;margin-top:8px}.form-width[data-v-73c3d5c6]{width:56px}.title[data-v-898f60e0]{background-color:#efefef;padding:4px 10px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:15px}.kk-flex[data-v-898f60e0]{display:flex;align-items:center}.list-class[data-v-898f60e0]{height:248px;overflow-y:scroll;width:100%}.item-class[data-v-898f60e0]{display:flex;align-items:center;padding:5px 10px;border-bottom:1px solid #efefef;cursor:pointer;width:100%}.item-class[data-v-898f60e0]:hover{background-color:#f3f3f3}.hover-class[data-v-898f60e0]:hover{color:#409eff}.item-selected[data-v-898f60e0]{background-color:#efefef!important;border-bottom:1px solid #d8d8d8}.no-select[data-v-898f60e0]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-898f60e0]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.kk-menu[data-v-898f60e0]{position:absolute;z-index:3466;text-align:center;border-radius:8px;border-top:8px solid #fff;border-bottom:8px solid #fff;box-shadow:0 6px 12px 0 rgba(0,0,0,.15),0 3px 6px -2px rgba(0,0,0,.2),0 8px 16px 4px rgba(0,0,0,.12)}.kk-menu-item[data-v-898f60e0]{height:30px;font-size:13px;line-height:30px;width:110px;color:#383838;background-color:#fff;cursor:pointer}.kk-menu-item[data-v-898f60e0]:hover{background-color:#efefef}.disabled[data-v-898f60e0]{background-color:#f5f7fa}.disabled-function[data-v-898f60e0],.disabled[data-v-898f60e0]{color:#a8abb2;pointer-events:none}.confirmPop[data-v-898f60e0]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.dir-level[data-v-898f60e0]:hover{text-decoration:none;color:var(--link);cursor:pointer}.kk-flex[data-v-5447fae9]{display:flex;align-items:center;margin-top:15px}.kk-border[data-v-5447fae9]{margin-top:3px;margin-bottom:3px;padding-bottom:5px;border-bottom:1px solid #ececec}.no-select[data-v-5447fae9]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.nowrap[data-v-5447fae9]{white-space:nowrap}.form-width[data-v-5447fae9]{width:56px}.kk-flex[data-v-807dded8]{display:flex;align-items:center}.kk-border[data-v-807dded8]{padding-bottom:10px;border-bottom:1px solid #ddd}.tocde-item[data-v-807dded8]:hover{background-color:#efefef}.no-select[data-v-807dded8]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.ellipsis[data-v-807dded8]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.nowrap[data-v-807dded8]{white-space:nowrap}.golbal[data-v-7e8d79bd]{position:relative;width:100%;display:flex;flex-direction:column;overflow:hidden}.bar[data-v-7e8d79bd]{display:flex;align-items:center;background-color:#f5f5f5;color:#000;width:100%;height:25px;border-top:1px solid #d7d7d7;border-bottom:1px solid #d7d7d7;border-left:1px solid #d7d7d7;border-right:1px solid #d7d7d7}.terminal-class[data-v-7e8d79bd]{width:100%}.setting[data-v-7e8d79bd]{position:absolute;left:0;top:25px;z-index:100;cursor:pointer;border:2px solid #f2f2f2}.setting-menu[data-v-7e8d79bd]{display:flex;align-items:center;justify-content:center;background-color:#f2f2f2;text-align:center;width:80px;height:25px;line-height:25px;font-size:13px;color:#383838}.setting-menu[data-v-7e8d79bd]:hover{background-color:#91c9f7}.no-select[data-v-7e8d79bd]{-webkit-user-select:none;-moz-user-select:none;user-select:none}img{-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none}.kk-dialog-class{pointer-events:none;z-index:3456}.el-dialog{pointer-events:auto}.el-popconfirm__main{margin-top:2px}.el-popconfirm__main,.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--link:#007fff;--pink:#f69;--text2:#61666d;--icon:#9499a0}body{margin:0;font-size:14px;color:#636d7e}*,body{padding:0}*{box-sizing:border-box;border:0;outline:0;vertical-align:middle}.a-link{text-decoration:none;color:var(--link);cursor:pointer}.el-form-item{align-items:center}.container-body{margin:0 auto;padding-top:5px}.el-button{.iconfont:before{margin-right:5px}} \ No newline at end of file diff --git a/backend/terminal/src/main/resources/static/index.html b/backend/terminal/src/main/resources/static/index.html index b7c7e07..fed3e43 100644 --- a/backend/terminal/src/main/resources/static/index.html +++ b/backend/terminal/src/main/resources/static/index.html @@ -1 +1 @@ -=S.length&&e.value===S&&S&&e.selectionEnd!==E},F=function(e){w||(r?r=!1:B(n)?(t.selectAll(),D()):b&&n.selectionStart!=C&&D())},$=null;this.setInputHandler=function(e){$=e},this.getInputHandler=function(){return $};var P=!1,N=function(e,r){if(P&&(P=!1),y)return D(),e&&t.onPaste(e),y=!1,"";var i=n.selectionStart,o=n.selectionEnd,a=C,l=S.length-E,c=e,u=e.length-i,h=e.length-o,d=0;while(a>0&&S[d]==e[d])d++,a--;c=c.slice(d),d=1;while(l>0&&S.length-d>C-1&&S[S.length-d]==e[e.length-d])d++,l--;u-=d-1,h-=d-1;var p=c.length-d+1;if(p<0&&(a=-p,p=0),c=c.slice(0,p),!r&&!c&&!u&&!a&&!l&&!h)return"";x=!0;var f=!1;return s.isAndroid&&". "==c&&(c=" ",f=!0),c&&!a&&!l&&!u&&!h||A?t.onTextInput(c):t.onTextInput(c,{extendLeft:a,extendRight:l,restoreStart:u,restoreEnd:h}),x=!1,S=e,C=i,E=o,R=h,f?"\n":c},H=function(e){if(w)return K();if(e&&e.inputType){if("historyUndo"==e.inputType)return t.execCommand("undo");if("historyRedo"==e.inputType)return t.execCommand("redo")}var r=n.value,i=N(r,!0);(r.length>p+100||v.test(i)||b&&C<1&&C==E)&&D()},U=function(e,t,n){var r=e.clipboardData||window["clipboardData"];if(r&&!u){var i=h||n?"Text":"text/plain";try{return t?!1!==r.setData(i,t):r.getData(i)}catch(e){if(!n)return U(e,t,!0)}}},j=function(e,o){var s=t.getCopyText();if(!s)return i.preventDefault(e);U(e,s)?(m&&(D(s),r=s,setTimeout((function(){r=!1}),10)),o?t.onCut():t.onCopy(),i.preventDefault(e)):(r=!0,n.value=s,n.select(),setTimeout((function(){r=!1,D(),o?t.onCut():t.onCopy()})))},z=function(e){j(e,!0)},W=function(e){j(e,!1)},q=function(e){var r=U(e);c.pasteCancelled()||("string"==typeof r?(r&&t.onPaste(r,e),s.isIE&&setTimeout(D),i.preventDefault(e)):(n.value="",y=!0))};i.addCommandKeyListener(n,(function(e,n,r){if(!w)return t.onCommandKey(e,n,r)}),t),i.addListener(n,"select",F,t),i.addListener(n,"input",H,t),i.addListener(n,"cut",z,t),i.addListener(n,"copy",W,t),i.addListener(n,"paste",q,t),"oncut"in n&&"oncopy"in n&&"onpaste"in n||i.addListener(e,"keydown",(function(e){if((!s.isMac||e.metaKey)&&e.ctrlKey)switch(e.keyCode){case 67:W(e);break;case 86:q(e);break;case 88:z(e);break}}),t);var V=function(e){if(!w&&t.onCompositionStart&&!t.$readOnly&&(w={},!A)){e.data&&(w.useTextareaForIME=!1),setTimeout(K,0),t._signal("compositionStart"),t.on("mousedown",G);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,w.markerRange=r,w.selectionStart=C,t.onCompositionStart(w),w.useTextareaForIME?(S=n.value="",C=0,E=0):(n.msGetInputContext&&(w.context=n.msGetInputContext()),n.getInputContext&&(w.context=n.getInputContext()))}},K=function(){if(w&&t.onCompositionUpdate&&!t.$readOnly){if(A)return G();if(w.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;N(e),w.markerRange&&(w.context&&(w.markerRange.start.column=w.selectionStart=w.context.compositionStartOffset),w.markerRange.end.column=w.markerRange.start.column+E-w.selectionStart+R)}}},Y=function(e){t.onCompositionEnd&&!t.$readOnly&&(w=!1,t.onCompositionEnd(),t.off("mousedown",G),e&&H())};function G(){_=!0,n.blur(),n.focus(),_=!1}var Q,Z=l.delayedCall(K,50).schedule.bind(null,null);function X(e){27==e.keyCode&&n.value.length
");this.setHtml(g),this.$element.setAttribute("aria-live","polite"),this.isOpen||(this.setTheme(this.editor.renderer.theme),this.setClassName("ace_gutter-tooltip")),this.show(),this.editor._signal("showGutterTooltip",this)},t.prototype.hideTooltip=function(){this.$element.removeAttribute("aria-live"),this.hide(),this.editor._signal("hideGutterTooltip",this)},t.annotationsToSummaryString=function(e){var n,r,o=[],s=["error","warning","info"];try{for(var a=i(s),l=a.next();!l.done;l=a.next()){var c=l.value;if(e[c].length){var u=1===e[c].length?t.annotationLabels[c].singular:t.annotationLabels[c].plural;o.push("".concat(e[c].length," ").concat(u))}}}catch(h){n={error:h}}finally{try{l&&!l.done&&(r=a.return)&&r.call(a)}finally{if(n)throw n.error}}return o.join(", ")},t}(a);t.GutterTooltip=u})),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),o=function(){function e(e,t){this.speed,this.wheelX,this.wheelY,this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1}return e.prototype.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},e.prototype.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},e.prototype.stop=function(){this.stopPropagation(),this.preventDefault()},e.prototype.getDocumentPosition=function(){return this.$pos||(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY)),this.$pos},e.prototype.getGutterRow=function(){var e=this.getDocumentPosition().row,t=this.editor.session.documentToScreenRow(e,0),n=this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row,0);return t-n},e.prototype.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},e.prototype.getButton=function(){return r.getButton(this.domEvent)},e.prototype.getShiftKey=function(){return this.domEvent.shiftKey},e.prototype.getAccelKey=function(){return i.isMac?this.domEvent.metaKey:this.domEvent.ctrlKey},e}();t.MouseEvent=o})),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/event"),o=e("../lib/useragent"),s=200,a=200,l=5;function c(e){var t=e.editor,n=r.createElement("div");n.style.cssText="top:-100px;position:absolute;z-index:2147483647;opacity:0.5",n.textContent=" ";var c=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];c.forEach((function(t){e[t]=this[t]}),this),t.on("mousedown",this.onMouseDown.bind(e));var h,d,p,f,g,m,v,b,y,w,x,k=t.container,A=0;function _(e,n){var r=Date.now(),i=!n||e.row!=n.row,o=!n||e.column!=n.column;if(!w||i||o)t.moveCursorToPosition(e),w=r,x={x:d,y:p};else{var s=u(x.x,x.y,d,p);s>l?w=null:r-w>=a&&(t.renderer.scrollCursorIntoView(),w=null)}}function S(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,o=t.renderer.layerConfig.characterWidth,a=t.renderer.scroller.getBoundingClientRect(),l={x:{left:d-a.left,right:a.right-d},y:{top:p-a.top,bottom:a.bottom-p}},c=Math.min(l.x.left,l.x.right),u=Math.min(l.y.top,l.y.bottom),h={row:e.row,column:e.column};c/o<=2&&(h.column+=l.x.left0&&"ل"===o[c-1]&&/\u0622|\u0623|\u0625|\u0627/.test(o[c])&&(l[c-1]=l[c]=t.R_H,c++);o[o.length-1]===t.DOT&&(l[o.length-1]=t.B),""===o[0]&&(l[0]=t.RLE);for(c=0;c