From 3458890d3b570e49bab3fff80ade4777a857fc0a Mon Sep 17 00:00:00 2001 From: PingKu Date: Thu, 25 Aug 2022 10:12:28 +0800 Subject: [PATCH] v3.08.25.alpha --- .gitignore | 13 + .prettierrc | 24 + README.md | 106 + adrive sdk/ReadMe.md | 5 + adrive sdk/account.md | 76 + adrive sdk/aims.md | 258 ++ adrive sdk/album.md | 279 ++ adrive sdk/archive.md | 177 + adrive sdk/book.md | 123 + adrive sdk/contact.md | 75 + adrive sdk/drive.md | 177 + adrive sdk/file.md | 716 ++++ adrive sdk/filedir.md | 86 + adrive sdk/fileupload.md | 135 + adrive sdk/image.md | 190 + adrive sdk/member.md | 172 + adrive sdk/note.md | 325 ++ adrive sdk/offline.md | 13 + adrive sdk/recyclebin.md | 115 + adrive sdk/reddot.md | 45 + adrive sdk/sbox.md | 46 + adrive sdk/search.md | 77 + adrive sdk/sfiia.md | 45 + adrive sdk/share.md | 551 +++ adrive sdk/timeline.md | 73 + adrive sdk/token.md | 44 + adrive sdk/user.md | 487 +++ adrive sdk/video.md | 257 ++ app.ico | Bin 0 -> 110361 bytes app.png | Bin 0 -> 1238 bytes changelog.txt | 292 ++ crx/devtools.html | 10 + crx/devtools.js | 21 + crx/manifest.json | 11 + electron-builder.json | 33 + nano-staged.mjs | 8 + package.json | 57 + packages/main/index.ts | 927 +++++ packages/main/mainfile.ts | 178 + packages/main/vite.config.ts | 19 + packages/preload/index.ts | 181 + packages/preload/vite.config.ts | 20 + packages/renderer/components.d.ts | 62 + packages/renderer/index.html | 43 + packages/renderer/public/favicon.ico | Bin 0 -> 14326 bytes packages/renderer/public/font/VideoJS.woff | Bin 0 -> 4324 bytes packages/renderer/public/iconfont.css | 920 +++++ packages/renderer/public/iconfont.woff2 | Bin 0 -> 26588 bytes packages/renderer/public/lang/en.js | 89 + packages/renderer/public/lang/zh-CN.js | 90 + packages/renderer/public/loading.png | Bin 0 -> 995 bytes packages/renderer/public/main.html | 31 + packages/renderer/public/main2.html | 34 + packages/renderer/public/nodework.js | 72 + packages/renderer/public/notify.wav | Bin 0 -> 281262 bytes .../renderer/public/pinyinlite_full.min.js | 2 + .../renderer/public/prism-vsc-dark-plus.css | 328 ++ packages/renderer/public/prism.js | 266 ++ .../silvermine-videojs-quality-selector.css | 29 + ...silvermine-videojs-quality-selector.min.js | 4 + packages/renderer/public/userface.png | Bin 0 -> 8850 bytes packages/renderer/public/video-js.min.css | 1 + packages/renderer/public/video.min.js | 25 + packages/renderer/public/wasm.wasm | Bin 0 -> 169363 bytes packages/renderer/public/wasm_exec.js | 527 +++ packages/renderer/src/App.vue | 36 + packages/renderer/src/aliapi/alihttp.ts | 373 ++ packages/renderer/src/aliapi/alimodels.ts | 238 ++ packages/renderer/src/aliapi/batch.ts | 27 + packages/renderer/src/aliapi/dirfilelist.ts | 402 ++ packages/renderer/src/aliapi/dirlist.ts | 185 + packages/renderer/src/aliapi/file.ts | 390 ++ packages/renderer/src/aliapi/filecmd.ts | 135 + packages/renderer/src/aliapi/fileicon.ts | 93 + packages/renderer/src/aliapi/following.ts | 204 + packages/renderer/src/aliapi/models.ts | 169 + packages/renderer/src/aliapi/server.tsx | 184 + packages/renderer/src/aliapi/share.ts | 352 ++ packages/renderer/src/aliapi/sharelist.ts | 103 + packages/renderer/src/aliapi/trash.ts | 143 + packages/renderer/src/aliapi/upload.ts | 484 +++ packages/renderer/src/aliapi/uploadhash.ts | 238 ++ packages/renderer/src/aliapi/uploadmem.ts | 47 + packages/renderer/src/aliapi/user.ts | 136 + packages/renderer/src/aliapi/utils.ts | 204 + packages/renderer/src/assets/antd.css | 186 + packages/renderer/src/assets/fileitem.css | 603 +++ packages/renderer/src/assets/global.css | 632 ++++ packages/renderer/src/down/DownDowned.vue | 21 + packages/renderer/src/down/DownDowning.vue | 35 + packages/renderer/src/down/DownM3U8.vue | 35 + packages/renderer/src/down/DownSync.vue | 29 + packages/renderer/src/down/DownUploaded.vue | 21 + packages/renderer/src/down/DownUploading.vue | 370 ++ packages/renderer/src/down/downdal.ts | 103 + packages/renderer/src/down/downstore.ts | 22 + packages/renderer/src/down/index.vue | 58 + packages/renderer/src/down/uploaddal.ts | 368 ++ packages/renderer/src/down/uploadingstore.ts | 456 +++ packages/renderer/src/down/uploadservice.ts | 306 ++ packages/renderer/src/down/uploadstore.ts | 73 + packages/renderer/src/env.d.ts | 20 + packages/renderer/src/global.d.ts | 26 + packages/renderer/src/layout/MyLoading.vue | 9 + packages/renderer/src/layout/MyModal.vue | 99 + packages/renderer/src/layout/MySplit.vue | 75 + packages/renderer/src/layout/MySwitch.vue | 64 + packages/renderer/src/layout/MySwitchTab.vue | 143 + packages/renderer/src/layout/MyTags.vue | 77 + packages/renderer/src/layout/PageCode.vue | 132 + packages/renderer/src/layout/PageHelp.vue | 44 + packages/renderer/src/layout/PageImage.vue | 358 ++ packages/renderer/src/layout/PageLoading.vue | 45 + packages/renderer/src/layout/PageMain.vue | 544 +++ packages/renderer/src/layout/PageOffice.vue | 61 + packages/renderer/src/layout/PageVideo.vue | 171 + packages/renderer/src/layout/PageVideoXBT.vue | 381 ++ packages/renderer/src/layout/pagemain.ts | 118 + packages/renderer/src/main.ts | 115 + packages/renderer/src/pan/PanLeft.vue | 472 +++ packages/renderer/src/pan/PanRight.vue | 995 +++++ packages/renderer/src/pan/index.vue | 15 + .../renderer/src/pan/menus/DirLeftMenu.vue | 87 + .../renderer/src/pan/menus/DirTopPath.vue | 110 + .../renderer/src/pan/menus/FileRightMenu.vue | 144 + .../renderer/src/pan/menus/FileTopbtn.vue | 103 + packages/renderer/src/pan/menus/PanTopbtn.vue | 59 + .../renderer/src/pan/menus/TrashRightMenu.vue | 36 + .../renderer/src/pan/menus/TrashTopbtn.vue | 34 + packages/renderer/src/pan/pandal.ts | 248 ++ packages/renderer/src/pan/panfilestore.ts | 376 ++ packages/renderer/src/pan/pantreestore.ts | 177 + .../renderer/src/pan/topbtns/AlphaModal.vue | 83 + .../src/pan/topbtns/CreatNewDirModal.vue | 161 + .../src/pan/topbtns/CreatNewDirMultiModal.vue | 47 + .../src/pan/topbtns/CreatNewFileModal.vue | 127 + .../pan/topbtns/CreatNewShareLinkModal.vue | 201 + .../src/pan/topbtns/DLNAPlayerModal.vue | 158 + .../src/pan/topbtns/DaoRuShareLinkModal.vue | 140 + .../pan/topbtns/DaoRuShareLinkMultiModal.vue | 140 + .../src/pan/topbtns/M3U8DownloadModal.vue | 147 + .../renderer/src/pan/topbtns/RenameModal.vue | 156 + .../src/pan/topbtns/RenameMultiModal.vue | 952 +++++ .../src/pan/topbtns/SearchPanModal.vue | 224 ++ .../src/pan/topbtns/SelectPanDirModal.vue | 277 ++ .../renderer/src/pan/topbtns/ShuXingModal.vue | 349 ++ .../src/pan/topbtns/ShuXingMultiModal.vue | 47 + .../renderer/src/pan/topbtns/renamemulti.ts | 407 ++ packages/renderer/src/pan/topbtns/topbtn.ts | 507 +++ packages/renderer/src/pic/PicLeft.vue | 40 + packages/renderer/src/pic/PicRight.vue | 0 packages/renderer/src/pic/index.vue | 14 + packages/renderer/src/rss/ScanDAL.ts | 233 ++ packages/renderer/src/rss/appsame/AppSame.vue | 299 ++ packages/renderer/src/rss/appsame/same.ts | 121 + packages/renderer/src/rss/index.vue | 91 + .../src/rss/rssdrivecopy/RssDriveCopy.vue | 247 ++ .../src/rss/rssdrivecopy/drivecopy.ts | 75 + .../renderer/src/rss/rssjiami/RssJiaMi.vue | 175 + packages/renderer/src/rss/rssjiami/jiami.ts | 100 + .../renderer/src/rss/rssrename/RssRename.vue | 89 + .../src/rss/rssscanclean/RssScanClean.vue | 290 ++ .../src/rss/rssscanclean/ScanClean.ts | 218 ++ .../src/rss/rssscanenmpty/RssScanEnmpty.vue | 260 ++ .../src/rss/rssscanenmpty/scanenmpty.ts | 123 + .../src/rss/rssscanpunish/RssScanPunish.vue | 287 ++ .../src/rss/rssscanpunish/scanpunish.ts | 240 ++ .../src/rss/rssscansame/RssScanSame.vue | 306 ++ .../renderer/src/rss/rssscansame/scansame.ts | 230 ++ .../src/rss/rssusercopy/RssUserCopy.vue | 283 ++ .../renderer/src/rss/rssusercopy/usercopy.ts | 142 + packages/renderer/src/rss/rssxima/RssXiMa.vue | 132 + packages/renderer/src/rss/rssxima/xima.ts | 100 + packages/renderer/src/setting/SettingAria.vue | 187 + .../renderer/src/setting/SettingDebug.vue | 181 + packages/renderer/src/setting/SettingDown.vue | 251 ++ packages/renderer/src/setting/SettingLog.vue | 73 + packages/renderer/src/setting/SettingPan.vue | 293 ++ packages/renderer/src/setting/SettingUI.vue | 66 + packages/renderer/src/setting/ShutDown.vue | 56 + packages/renderer/src/setting/index.vue | 195 + packages/renderer/src/setting/settingstore.ts | 329 ++ .../src/share/following/FollowingDAL.ts | 112 + .../src/share/following/MyFollowingRight.vue | 294 ++ .../src/share/following/MyFollowingStore.ts | 203 + .../share/following/OtherFollowingRight.vue | 247 ++ .../share/following/OtherFollowingStore.ts | 37 + packages/renderer/src/share/index.vue | 63 + .../src/share/share/EditShareLinkModal.vue | 221 ++ .../renderer/src/share/share/MyShareRight.vue | 398 ++ .../renderer/src/share/share/MyShareStore.ts | 254 ++ .../src/share/share/OtherShareRight.vue | 302 ++ .../src/share/share/OtherShareStore.ts | 213 ++ packages/renderer/src/share/share/ShareDAL.ts | 162 + .../src/share/share/ShareSiteRight.vue | 52 + .../src/share/share/ShowShareLinkModal.vue | 485 +++ packages/renderer/src/store/appstore.ts | 234 ++ packages/renderer/src/store/footstore.ts | 86 + packages/renderer/src/store/index.ts | 54 + packages/renderer/src/store/keyboardstore.ts | 43 + packages/renderer/src/store/logstore.ts | 21 + packages/renderer/src/store/modalstore.ts | 28 + packages/renderer/src/store/serverstore.ts | 33 + packages/renderer/src/store/treestore.ts | 315 ++ packages/renderer/src/store/winstore.ts | 30 + packages/renderer/src/user/UserInfo.vue | 147 + packages/renderer/src/user/UserLogin.vue | 213 ++ packages/renderer/src/user/userdal.ts | 236 ++ packages/renderer/src/user/userstore.ts | 70 + packages/renderer/src/utils/appcache.ts | 134 + packages/renderer/src/utils/aria2c.ts | 189 + packages/renderer/src/utils/aria2c.ts.bak | 572 +++ packages/renderer/src/utils/config.ts | 8 + packages/renderer/src/utils/db.ts | 229 ++ packages/renderer/src/utils/debuglog.ts | 52 + packages/renderer/src/utils/electronhelper.ts | 30 + packages/renderer/src/utils/foot.ts | 25 + packages/renderer/src/utils/format.ts | 487 +++ packages/renderer/src/utils/idhelper.ts | 40 + packages/renderer/src/utils/keyboardhelper.ts | 254 ++ packages/renderer/src/utils/message.ts | 31 + packages/renderer/src/utils/modal.ts | 59 + packages/renderer/src/utils/openfile.ts | 421 +++ packages/renderer/src/utils/selecthelper.ts | 203 + packages/renderer/src/utils/utils.ts | 139 + packages/renderer/tsconfig.json | 20 + packages/renderer/vite.config.ts | 49 + scripts/build.mjs | 5 + scripts/watch.mjs | 66 + tsconfig.json | 16 + types.d.ts | 44 + ...47\350\203\275\346\265\213\350\257\225.md" | 61 + ...55\346\224\276\350\275\257\344\273\266.md" | 89 + yarn.lock | 3325 +++++++++++++++++ ...23\345\214\205\345\270\256\345\212\251.md" | 32 + 235 files changed, 42751 insertions(+) create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100644 adrive sdk/ReadMe.md create mode 100644 adrive sdk/account.md create mode 100644 adrive sdk/aims.md create mode 100644 adrive sdk/album.md create mode 100644 adrive sdk/archive.md create mode 100644 adrive sdk/book.md create mode 100644 adrive sdk/contact.md create mode 100644 adrive sdk/drive.md create mode 100644 adrive sdk/file.md create mode 100644 adrive sdk/filedir.md create mode 100644 adrive sdk/fileupload.md create mode 100644 adrive sdk/image.md create mode 100644 adrive sdk/member.md create mode 100644 adrive sdk/note.md create mode 100644 adrive sdk/offline.md create mode 100644 adrive sdk/recyclebin.md create mode 100644 adrive sdk/reddot.md create mode 100644 adrive sdk/sbox.md create mode 100644 adrive sdk/search.md create mode 100644 adrive sdk/sfiia.md create mode 100644 adrive sdk/share.md create mode 100644 adrive sdk/timeline.md create mode 100644 adrive sdk/token.md create mode 100644 adrive sdk/user.md create mode 100644 adrive sdk/video.md create mode 100644 app.ico create mode 100644 app.png create mode 100644 changelog.txt create mode 100644 crx/devtools.html create mode 100644 crx/devtools.js create mode 100644 crx/manifest.json create mode 100644 electron-builder.json create mode 100644 nano-staged.mjs create mode 100644 package.json create mode 100644 packages/main/index.ts create mode 100644 packages/main/mainfile.ts create mode 100644 packages/main/vite.config.ts create mode 100644 packages/preload/index.ts create mode 100644 packages/preload/vite.config.ts create mode 100644 packages/renderer/components.d.ts create mode 100644 packages/renderer/index.html create mode 100644 packages/renderer/public/favicon.ico create mode 100644 packages/renderer/public/font/VideoJS.woff create mode 100644 packages/renderer/public/iconfont.css create mode 100644 packages/renderer/public/iconfont.woff2 create mode 100644 packages/renderer/public/lang/en.js create mode 100644 packages/renderer/public/lang/zh-CN.js create mode 100644 packages/renderer/public/loading.png create mode 100644 packages/renderer/public/main.html create mode 100644 packages/renderer/public/main2.html create mode 100644 packages/renderer/public/nodework.js create mode 100644 packages/renderer/public/notify.wav create mode 100644 packages/renderer/public/pinyinlite_full.min.js create mode 100644 packages/renderer/public/prism-vsc-dark-plus.css create mode 100644 packages/renderer/public/prism.js create mode 100644 packages/renderer/public/silvermine-videojs-quality-selector.css create mode 100644 packages/renderer/public/silvermine-videojs-quality-selector.min.js create mode 100644 packages/renderer/public/userface.png create mode 100644 packages/renderer/public/video-js.min.css create mode 100644 packages/renderer/public/video.min.js create mode 100644 packages/renderer/public/wasm.wasm create mode 100644 packages/renderer/public/wasm_exec.js create mode 100644 packages/renderer/src/App.vue create mode 100644 packages/renderer/src/aliapi/alihttp.ts create mode 100644 packages/renderer/src/aliapi/alimodels.ts create mode 100644 packages/renderer/src/aliapi/batch.ts create mode 100644 packages/renderer/src/aliapi/dirfilelist.ts create mode 100644 packages/renderer/src/aliapi/dirlist.ts create mode 100644 packages/renderer/src/aliapi/file.ts create mode 100644 packages/renderer/src/aliapi/filecmd.ts create mode 100644 packages/renderer/src/aliapi/fileicon.ts create mode 100644 packages/renderer/src/aliapi/following.ts create mode 100644 packages/renderer/src/aliapi/models.ts create mode 100644 packages/renderer/src/aliapi/server.tsx create mode 100644 packages/renderer/src/aliapi/share.ts create mode 100644 packages/renderer/src/aliapi/sharelist.ts create mode 100644 packages/renderer/src/aliapi/trash.ts create mode 100644 packages/renderer/src/aliapi/upload.ts create mode 100644 packages/renderer/src/aliapi/uploadhash.ts create mode 100644 packages/renderer/src/aliapi/uploadmem.ts create mode 100644 packages/renderer/src/aliapi/user.ts create mode 100644 packages/renderer/src/aliapi/utils.ts create mode 100644 packages/renderer/src/assets/antd.css create mode 100644 packages/renderer/src/assets/fileitem.css create mode 100644 packages/renderer/src/assets/global.css create mode 100644 packages/renderer/src/down/DownDowned.vue create mode 100644 packages/renderer/src/down/DownDowning.vue create mode 100644 packages/renderer/src/down/DownM3U8.vue create mode 100644 packages/renderer/src/down/DownSync.vue create mode 100644 packages/renderer/src/down/DownUploaded.vue create mode 100644 packages/renderer/src/down/DownUploading.vue create mode 100644 packages/renderer/src/down/downdal.ts create mode 100644 packages/renderer/src/down/downstore.ts create mode 100644 packages/renderer/src/down/index.vue create mode 100644 packages/renderer/src/down/uploaddal.ts create mode 100644 packages/renderer/src/down/uploadingstore.ts create mode 100644 packages/renderer/src/down/uploadservice.ts create mode 100644 packages/renderer/src/down/uploadstore.ts create mode 100644 packages/renderer/src/env.d.ts create mode 100644 packages/renderer/src/global.d.ts create mode 100644 packages/renderer/src/layout/MyLoading.vue create mode 100644 packages/renderer/src/layout/MyModal.vue create mode 100644 packages/renderer/src/layout/MySplit.vue create mode 100644 packages/renderer/src/layout/MySwitch.vue create mode 100644 packages/renderer/src/layout/MySwitchTab.vue create mode 100644 packages/renderer/src/layout/MyTags.vue create mode 100644 packages/renderer/src/layout/PageCode.vue create mode 100644 packages/renderer/src/layout/PageHelp.vue create mode 100644 packages/renderer/src/layout/PageImage.vue create mode 100644 packages/renderer/src/layout/PageLoading.vue create mode 100644 packages/renderer/src/layout/PageMain.vue create mode 100644 packages/renderer/src/layout/PageOffice.vue create mode 100644 packages/renderer/src/layout/PageVideo.vue create mode 100644 packages/renderer/src/layout/PageVideoXBT.vue create mode 100644 packages/renderer/src/layout/pagemain.ts create mode 100644 packages/renderer/src/main.ts create mode 100644 packages/renderer/src/pan/PanLeft.vue create mode 100644 packages/renderer/src/pan/PanRight.vue create mode 100644 packages/renderer/src/pan/index.vue create mode 100644 packages/renderer/src/pan/menus/DirLeftMenu.vue create mode 100644 packages/renderer/src/pan/menus/DirTopPath.vue create mode 100644 packages/renderer/src/pan/menus/FileRightMenu.vue create mode 100644 packages/renderer/src/pan/menus/FileTopbtn.vue create mode 100644 packages/renderer/src/pan/menus/PanTopbtn.vue create mode 100644 packages/renderer/src/pan/menus/TrashRightMenu.vue create mode 100644 packages/renderer/src/pan/menus/TrashTopbtn.vue create mode 100644 packages/renderer/src/pan/pandal.ts create mode 100644 packages/renderer/src/pan/panfilestore.ts create mode 100644 packages/renderer/src/pan/pantreestore.ts create mode 100644 packages/renderer/src/pan/topbtns/AlphaModal.vue create mode 100644 packages/renderer/src/pan/topbtns/CreatNewDirModal.vue create mode 100644 packages/renderer/src/pan/topbtns/CreatNewDirMultiModal.vue create mode 100644 packages/renderer/src/pan/topbtns/CreatNewFileModal.vue create mode 100644 packages/renderer/src/pan/topbtns/CreatNewShareLinkModal.vue create mode 100644 packages/renderer/src/pan/topbtns/DLNAPlayerModal.vue create mode 100644 packages/renderer/src/pan/topbtns/DaoRuShareLinkModal.vue create mode 100644 packages/renderer/src/pan/topbtns/DaoRuShareLinkMultiModal.vue create mode 100644 packages/renderer/src/pan/topbtns/M3U8DownloadModal.vue create mode 100644 packages/renderer/src/pan/topbtns/RenameModal.vue create mode 100644 packages/renderer/src/pan/topbtns/RenameMultiModal.vue create mode 100644 packages/renderer/src/pan/topbtns/SearchPanModal.vue create mode 100644 packages/renderer/src/pan/topbtns/SelectPanDirModal.vue create mode 100644 packages/renderer/src/pan/topbtns/ShuXingModal.vue create mode 100644 packages/renderer/src/pan/topbtns/ShuXingMultiModal.vue create mode 100644 packages/renderer/src/pan/topbtns/renamemulti.ts create mode 100644 packages/renderer/src/pan/topbtns/topbtn.ts create mode 100644 packages/renderer/src/pic/PicLeft.vue create mode 100644 packages/renderer/src/pic/PicRight.vue create mode 100644 packages/renderer/src/pic/index.vue create mode 100644 packages/renderer/src/rss/ScanDAL.ts create mode 100644 packages/renderer/src/rss/appsame/AppSame.vue create mode 100644 packages/renderer/src/rss/appsame/same.ts create mode 100644 packages/renderer/src/rss/index.vue create mode 100644 packages/renderer/src/rss/rssdrivecopy/RssDriveCopy.vue create mode 100644 packages/renderer/src/rss/rssdrivecopy/drivecopy.ts create mode 100644 packages/renderer/src/rss/rssjiami/RssJiaMi.vue create mode 100644 packages/renderer/src/rss/rssjiami/jiami.ts create mode 100644 packages/renderer/src/rss/rssrename/RssRename.vue create mode 100644 packages/renderer/src/rss/rssscanclean/RssScanClean.vue create mode 100644 packages/renderer/src/rss/rssscanclean/ScanClean.ts create mode 100644 packages/renderer/src/rss/rssscanenmpty/RssScanEnmpty.vue create mode 100644 packages/renderer/src/rss/rssscanenmpty/scanenmpty.ts create mode 100644 packages/renderer/src/rss/rssscanpunish/RssScanPunish.vue create mode 100644 packages/renderer/src/rss/rssscanpunish/scanpunish.ts create mode 100644 packages/renderer/src/rss/rssscansame/RssScanSame.vue create mode 100644 packages/renderer/src/rss/rssscansame/scansame.ts create mode 100644 packages/renderer/src/rss/rssusercopy/RssUserCopy.vue create mode 100644 packages/renderer/src/rss/rssusercopy/usercopy.ts create mode 100644 packages/renderer/src/rss/rssxima/RssXiMa.vue create mode 100644 packages/renderer/src/rss/rssxima/xima.ts create mode 100644 packages/renderer/src/setting/SettingAria.vue create mode 100644 packages/renderer/src/setting/SettingDebug.vue create mode 100644 packages/renderer/src/setting/SettingDown.vue create mode 100644 packages/renderer/src/setting/SettingLog.vue create mode 100644 packages/renderer/src/setting/SettingPan.vue create mode 100644 packages/renderer/src/setting/SettingUI.vue create mode 100644 packages/renderer/src/setting/ShutDown.vue create mode 100644 packages/renderer/src/setting/index.vue create mode 100644 packages/renderer/src/setting/settingstore.ts create mode 100644 packages/renderer/src/share/following/FollowingDAL.ts create mode 100644 packages/renderer/src/share/following/MyFollowingRight.vue create mode 100644 packages/renderer/src/share/following/MyFollowingStore.ts create mode 100644 packages/renderer/src/share/following/OtherFollowingRight.vue create mode 100644 packages/renderer/src/share/following/OtherFollowingStore.ts create mode 100644 packages/renderer/src/share/index.vue create mode 100644 packages/renderer/src/share/share/EditShareLinkModal.vue create mode 100644 packages/renderer/src/share/share/MyShareRight.vue create mode 100644 packages/renderer/src/share/share/MyShareStore.ts create mode 100644 packages/renderer/src/share/share/OtherShareRight.vue create mode 100644 packages/renderer/src/share/share/OtherShareStore.ts create mode 100644 packages/renderer/src/share/share/ShareDAL.ts create mode 100644 packages/renderer/src/share/share/ShareSiteRight.vue create mode 100644 packages/renderer/src/share/share/ShowShareLinkModal.vue create mode 100644 packages/renderer/src/store/appstore.ts create mode 100644 packages/renderer/src/store/footstore.ts create mode 100644 packages/renderer/src/store/index.ts create mode 100644 packages/renderer/src/store/keyboardstore.ts create mode 100644 packages/renderer/src/store/logstore.ts create mode 100644 packages/renderer/src/store/modalstore.ts create mode 100644 packages/renderer/src/store/serverstore.ts create mode 100644 packages/renderer/src/store/treestore.ts create mode 100644 packages/renderer/src/store/winstore.ts create mode 100644 packages/renderer/src/user/UserInfo.vue create mode 100644 packages/renderer/src/user/UserLogin.vue create mode 100644 packages/renderer/src/user/userdal.ts create mode 100644 packages/renderer/src/user/userstore.ts create mode 100644 packages/renderer/src/utils/appcache.ts create mode 100644 packages/renderer/src/utils/aria2c.ts create mode 100644 packages/renderer/src/utils/aria2c.ts.bak create mode 100644 packages/renderer/src/utils/config.ts create mode 100644 packages/renderer/src/utils/db.ts create mode 100644 packages/renderer/src/utils/debuglog.ts create mode 100644 packages/renderer/src/utils/electronhelper.ts create mode 100644 packages/renderer/src/utils/foot.ts create mode 100644 packages/renderer/src/utils/format.ts create mode 100644 packages/renderer/src/utils/idhelper.ts create mode 100644 packages/renderer/src/utils/keyboardhelper.ts create mode 100644 packages/renderer/src/utils/message.ts create mode 100644 packages/renderer/src/utils/modal.ts create mode 100644 packages/renderer/src/utils/openfile.ts create mode 100644 packages/renderer/src/utils/selecthelper.ts create mode 100644 packages/renderer/src/utils/utils.ts create mode 100644 packages/renderer/tsconfig.json create mode 100644 packages/renderer/vite.config.ts create mode 100644 scripts/build.mjs create mode 100644 scripts/watch.mjs create mode 100644 tsconfig.json create mode 100644 types.d.ts create mode 100644 "v2.10.19\346\200\247\350\203\275\346\265\213\350\257\225.md" create mode 100644 "v2.11.11\350\207\252\345\256\232\344\271\211\346\222\255\346\224\276\350\275\257\344\273\266.md" create mode 100644 yarn.lock create mode 100644 "\346\272\220\347\240\201\345\274\200\345\217\221\346\211\223\345\214\205\345\270\256\345\212\251.md" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d97f89c --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +.debug.env + +tmp +**/.tmp +release + +.idea + diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..27276af --- /dev/null +++ b/.prettierrc @@ -0,0 +1,24 @@ +{ + "singleQuote": true, + "printWidth": 260, + "semi": false, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "jsxBracketSameLine": true, + "arrowParens": "always", + "requirePragma": false, + "insertPragma": false, + "wrapAttributes": false, + "sortAttributes": true, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "css", + "endOfLine": "lf", + "overrides": [ + { + "files": ".prettierrc", + "options": { "parser": "json" } + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..d37fb38 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# 阿里云盘小白羊版 + +#### 项目说明 + +基于阿里云盘网页版开发的PC客户端,支持win7-11,macOS,linux + +> **04.14:[v2.12.14版已发布](https://github.com/liupan1890/aliyunpan/issues/639),适配官网升级** + +> **2022-01-02:在憋大招,耐心等待v3版** +
+ +v1.6.29:[https://wwe.lanzoui.com/b01npsg8h](https://wwe.lanzoui.com/b01npsg8h) + +v2.12.14:[https://wwe.lanzoui.com/b01nqc4gd](https://wwe.lanzoui.com/b01nqc4gd) + +MacOS:[https://www.macwk.com/soft/aliyun-drive-xiaobaiyang](https://www.macwk.com/soft/aliyun-drive-xiaobaiyang) + +Mac版由macwk.com使用自有签名打包dmg,可以简单点击安装了(不需要输入终端命令),推荐下载此版本,已测MacOS10.12-11.4,兼容M1 +
+ +已经发布在小众软件发现频道,大爱小众[meta.appinn.net](https://meta.appinn.net) + +
+ +已发布了使用帮助文档 [https://www.yuque.com/liupan1890/xiaobaiyang](https://www.yuque.com/liupan1890/xiaobaiyang) + +`````` +2021年11月28日 已完成功能: +多账号登录、常用文件操作(新建文件夹、收藏、重命名、复制、移动、删除、详情、视频雪碧图)、 +在线播放原始视频、在线播放转码视频、在线预览图片、在线预览文本、在线预览 word/excel/ppt/pdf、 +连接到远程 Aria2 下载、上传文件、上传文件夹、批量改名、在线解压、回收站、收藏夹、 +分享文件、导入阿里云分享链接、缩略图列表、网盘内文件搜索、视频文件洗码 + +等待完成的功能: +相册功能、网盘和相册间文件互相复制、文件同步盘、重复文件扫描、帐号间文件复制 +`````` + +
+ +# + +![Image](https://raw.githubusercontent.com/liupan1890/aliyunpan/main/doc/v2.10.19.png) + +# + +#### 为什么要用小白羊? + +#### 一:因为更快 + +##### 上传和下载4.4万个json格式小文件(共24GB): + +| 程序 | 总用时 | 用时基准 | +| --- | ---: | ---: | +| 上传&小白羊版 v2.10 | 24分钟 | :zap:58% | +| 上传&PC客户端 v2.2.6 | 41分钟 | 100% | +| ... | | | | | +| 下载&小白羊版 v2.10 | 25分钟 | :zap:42% | +| 下载&PC客户端 v2.2.6 | 59分钟 | 100% | + + +##### 上传和下载33个大文件(共90GB): + +| 程序 | 总用时 | 用时基准 | +| --- | ---: | ---: | +| 上传&小白羊版 v2.10 | 1分10秒 | :zap:44% | +| 上传&PC客户端 v2.2.6 | 2分40秒 | 100% | +| ... | | | | | +| 下载&小白羊版 v2.10 | 38分钟 | :zap:52% | +| 下载&PC客户端 v2.2.6 | 72分钟 | 100% | + +
+ +详情参阅 :[v2.10.19性能测试](https://github.com/liupan1890/aliyunpan/blob/main/v2.10.19%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.md) 的性能测试文档 + +#### 二:因为更好 + +小白羊支持同时登录多个账号管理 + +小白羊特有文件夹树,可以快速方便的操作 + +小白羊支持直接在线播放网盘里的各种格式的视频并且是高清原画,支持外挂字幕/音轨/播放速度调整,比官方的格式更多更清晰 + +小白羊可以显示文件夹体积,可以文件夹和文件混合排序(文件名/体积/时间),并且文件名排序时更准确! + +小白羊可以通过远程Aria2功能把文件直接下载到远程的VPS/NAS上 + +小白羊可以批量的对 大量文件/多层嵌套的文件夹 一键重命名 + +小白羊可以快速复制文件,可以直接预览视频的雪碧图,可以直接删除文件 + +小白羊支持数万文件夹和数万文件的管理,支持一次性列出文件夹里包含的全部文件 + +小白羊支持单次上传/下载 一百万 量级的文件/文件夹 + +小白羊仍在努力开发新功能,让大家使用起来更方便! + + +# + +#### 常见问题请参阅帮助文档 + + +#### 特别感谢 @jkqxl @iD2073 @ybbluesky 等为小白羊提供了大量的优化建议 + + + diff --git a/adrive sdk/ReadMe.md b/adrive sdk/ReadMe.md new file mode 100644 index 0000000..b6d42cf --- /dev/null +++ b/adrive sdk/ReadMe.md @@ -0,0 +1,5 @@ +### 阿里云盘接口 + +> 2022-03整理的阿里云盘SDK接口数据 + +仅用来记录官方提供的接口参数,共整理了144个,比较全了,与编程语言无关,方便大家据此开发 \ No newline at end of file diff --git a/adrive sdk/account.md b/adrive sdk/account.md new file mode 100644 index 0000000..a827d05 --- /dev/null +++ b/adrive sdk/account.md @@ -0,0 +1,76 @@ +#### 刷新 token + +POST: `https://auth.aliyundrive.com/v2/account/token` + +```json +{ "grant_type": "refresh_token", "app_id": "pJZInNHN2dZWk8qg", "refresh_token": "c65bf6d104ac510885c0124d74c4a099" } +``` + +Response: + +```json +{ + "default_sbox_drive_id": "9600002", + "role": "user", + "device_id": "2909000000004f01aa28264bfc30e4ed", + "user_name": "151***111", + "need_link": false, + "expire_time": "2022-03-21T06:33:21Z", + "pin_setup": true, + "need_rp_verify": false, + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_data": { + "DingDingRobotUrl": "https://oapi.dingtalk.com/robot/send?access_token=0b4a936d0e...", + "EncourageDesc": "内测期间有效反馈前10名用户将获得终身免费会员", + "FeedBackSwitch": true, + "FollowingDesc": "34848372", + "back_up_config": { + "手机备份": { "folder_id": "605c0c29b7acf78b6ee34bf095594f7654e57d68", "photo_folder_id": "605c0c299af37539f3d34879b2f0d1c5543f27d5", "sub_folder": {}, "video_folder_id": "605c0c29e520154c22644bed904b76b25ced317a" } + }, + "ding_ding_robot_url": "https://oapi.dingtalk.com/robot/send?access_token=0b4a936d0e...", + "encourage_desc": "内测期间有效反馈前10名用户将获得终身免费会员", + "feed_back_switch": true, + "following_desc": "34848372" + }, + "token_type": "Bearer", + "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..................", + "default_drive_id": "9600002", + "domain_id": "bj29", + "refresh_token": "b2d9c244d8a24df38aa1a5dec59e2a92", + "is_first_login": false, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "myname", + "exist_link": [], + "state": "", + "expires_in": 7200, + "status": "enabled" +} +``` + +#### 退出登录 + +POST: `https://auth.aliyundrive.com/v2/account/revoke` + +```json + +``` + +Response: + +```json + +``` + +#### 检查账号是否存在 x + +POST: `https://auth.aliyundrive.com/v2/account/mobile/check_exist` + +```json +{ "app_id": "pJZInNHN2dZWk8qg", "phone_number": "151***111", "phone_region": "86" } +``` + +Response: + +```json +{ "is_exist": true } +``` diff --git a/adrive sdk/aims.md b/adrive sdk/aims.md new file mode 100644 index 0000000..fc9b801 --- /dev/null +++ b/adrive sdk/aims.md @@ -0,0 +1,258 @@ +#### 探索-列出图片分类最多的前几个分类 + +POST: `https://api.aliyundrive.com/v2/aims/list_hints` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f", "limit": 5 } +``` + +Response: + +```json +["白色", "鞋", "服装", "颜色", "黑色"] +``` + +#### 探索-列出图片分类(对应的是 label) + +POST: `https://api.aliyundrive.com/v2/aims/list_tags` + +```json +{ "all": false, "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", "video_thumbnail_process": "video/snapshot,t_7000,f_jpg,w_800,h_600,ar_auto,m_fast", "drive_id": "9600002" } +``` + +Response: + +```json +{ + "tags": [ + { + "count": 22, + "cover_file_category": "", + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_overall_score": 0.7444725632667542, + "cover_tag_confidence": 0.9806441068649292, + "cover_url": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/HCBUxQOF%2F...", + "name": "截图" + }, + { + "count": 6, + "cover_file_category": "", + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_overall_score": 0.660460352897644, + "cover_tag_confidence": 0.8765541911125183, + "cover_url": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/HCBUxQOF%2F...", + "name": "健身" + } + ] +} +``` + +#### 探索-列出一个分类(label)的全部图片 + +POST: `https://api.aliyundrive.com/v2/file/search` + +```json +{ + "return_total_count": true, + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "last_access_at DESC,updated_at DESC,image_time DESC", + "query": "(label = '截图') and category in ['video','image'] and status = 'available' and hidden = false", + "limit": 100, + "drive_id": "9600002" +} +``` + +Response: + +```json +filelist +``` + +#### 探索-列出全部回忆 + +POST: `https://api.aliyundrive.com/v2/aims/list_stories` + +```json +{ "drive_id": "9600002", "skip_stories_creation": false, "cover_image_thumbnail_process": "image/resize,m_lfit,w_800/format,jpg" } +``` + +Response: + +```json +{ + "items": [ + { + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_file_thumbnail_url": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/aUDpMBAO%2F...", + "created_at": "2022-03-13T21:31:47.210563978+08:00", + "face_group_ids": ["Group-00000000-1703-4fc8-4f56-369478ed14df"], + "story_end_time": "", + "story_file_list": [ + { "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }, + { "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } + ], + "story_id": "903C5705-0000-0000-4fc8-42B97E29C65C", + "story_name": "熟悉的TA", + "story_start_time": "", + "story_sub_type": "ImportantPerson", + "story_type": "ImportantPerson", + "updated_at": "2022-03-13T21:31:47.21056415+08:00", + "cover_file": { + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-09-08T13:45:59.755Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "jpg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { + "faces": "[{\"FaceConfidence\":0.9646940231323242,\"EmotionConfidence\":0.974002480506897,\"ImageUri\":\"\",\"FaceQuality\":0.8240875005722046,\"Similarity\":0,\"ExternalId\":\"\",\"Attractive\":0.95,\"AttractiveConfidence\":0,\"Age\":19,\"AgeConfidence\":0,\"Gender\":\"FEMALE\",\"Emotion\":\"SAD\",\"GenderConfidence\":1,\"FaceId\":\"45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3\",\"GroupId\":\"Group-00000000-1703-4fc8-5f56-369478ed14df\",\"FaceAttributes\":{\"Glasses\":\"NONE\",\"MaskConfidence\":0.9999961853027344,\"Mask\":\"NONE\",\"GlassesConfidence\":1,\"Beard\":\"NONE\",\"BeardConfidence\":1,\"FaceBoundary\":{\"Width\":558,\"Height\":787,\"Top\":318,\"Left\":1075},\"HeadPose\":{\"Pitch\":8.109945297241211,\"Roll\":-11.779093742370605,\"Yaw\":-12.086345672607422}},\"EmotionDetails\":{\"SURPRISED\":0.0010840623872354627,\"HAPPY\":0.0072783417999744415,\"ANGRY\":0.00025470455875620246,\"DISGUSTED\":0.0018990141106769443,\"SAD\":0.974002480506897,\"CALM\":0.005655393470078707,\"SCARED\":0.006041224580258131},\"SimilarFaces\":null}]", + "faces_thumbnail": [ + { + "face_group_id": "Group-00000000-1703-4fc8-5f56-369478ed14df", + "face_id": "45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3", + "face_thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ], + "height": 3600, + "image_quality": { "overall_score": 0.639841616153717 }, + "time": "2022-03-13T21:31:47.210563978+08:00", + "width": 2400 + }, + "labels": ["面部", "日常行为"], + "mime_extension": "jpg", + "mime_type": "image/jpeg", + "name": "44.jpg", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 2, + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111", + "size": 1974176, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "trashed": false, + "type": "file", + "updated_at": "2021-09-08T13:46:01.896Z", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + } + ] +} +``` + +#### 探索-读取一个回忆的信息(名称、人物、图片) + +POST: `https://api.aliyundrive.com/v2/aims/get_story` + +```json +{ "drive_id": "9600002", "story_id": "903C5705-0000-0000-4fc8-42B97E29C65C" } +``` + +Response: + +```json +{ + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_file_thumbnail_url": "https://bj29.cn-beijing.data.alicloudccp.com/RV5OBihM%2F...", + "created_at": "2022-03-13T21:31:47.210563978+08:00", + "face_group_ids": ["Group-00000000-1763-4fc8-bf56-369478ed14df"], + "story_end_time": "", + "story_file_list": [ + { + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-09-08T13:45:59.755Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "jpg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { + "faces": "[{\"FaceConfidence\":0.9646940231323242,\"EmotionConfidence\":0.974002480506897,\"ImageUri\":\"\",\"FaceQuality\":0.8240875005722046,\"Similarity\":0,\"ExternalId\":\"\",\"Attractive\":0.95,\"AttractiveConfidence\":0,\"Age\":19,\"AgeConfidence\":0,\"Gender\":\"FEMALE\",\"Emotion\":\"SAD\",\"GenderConfidence\":1,\"FaceId\":\"45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3\",\"GroupId\":\"Group-00000000-1703-4fc6-bf56-369478ed14df\",\"FaceAttributes\":{\"Glasses\":\"NONE\",\"MaskConfidence\":0.9999961853027344,\"Mask\":\"NONE\",\"GlassesConfidence\":1,\"Beard\":\"NONE\",\"BeardConfidence\":1,\"FaceBoundary\":{\"Width\":558,\"Height\":787,\"Top\":318,\"Left\":1075},\"HeadPose\":{\"Pitch\":8.109945297241211,\"Roll\":-11.779093742370605,\"Yaw\":-12.086345672607422}},\"EmotionDetails\":{\"SURPRISED\":0.0010840623872354627,\"HAPPY\":0.0072783417999744415,\"ANGRY\":0.00025470455875620246,\"DISGUSTED\":0.0018990141106769443,\"SAD\":0.974002480506897,\"CALM\":0.005655393470078707,\"SCARED\":0.006041224580258131},\"SimilarFaces\":null}]", + "faces_thumbnail": [ + { + "face_group_id": "Group-00000000-1703-4fc8-bf56-369478ed14df", + "face_id": "45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3", + "face_thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ], + "height": 3600, + "image_quality": { "overall_score": 0.639841616153717 }, + "width": 2400 + }, + "labels": [ + "面部", + "日常行为" + ], + "name": "44.jpg", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "size": 1974176, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2021-09-08T13:46:01.896Z", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ], + "story_id": "903C5705-0000-0000-4fc8-42B97E29C65C", + "story_name": "fang的高光时刻", + "story_start_time": "", + "story_sub_type": "ImportantPerson", + "story_type": "ImportantPerson", + "updated_at": "2022-03-13T21:31:47.21056415+08:00" +} +``` + +#### 清理空间-统计数量 + +POST: `https://api.aliyundrive.com/v2/aims/clutter_removal/count` + +```json +{ "drive_id": "9600002" } +``` + +Response: + +```json +{ "screenshot": 20, "text": 26 } +``` + +#### 清理空间-清理屏幕截图 + +POST: `https://api.aliyundrive.com/v2/aims/clutter_removal/list` + +```json +{ "type": "screenshot", "drive_id": "9600002" } +``` + +Response: + +```json +filelist +``` + +#### 清理空间-清理文本图片 + +POST: `https://api.aliyundrive.com/v2/aims/clutter_removal/list` + +```json +{ "type": "text", "drive_id": "9600002" } +``` + +Response: + +```json +filelist +``` diff --git a/adrive sdk/album.md b/adrive sdk/album.md new file mode 100644 index 0000000..bcd1a96 --- /dev/null +++ b/adrive sdk/album.md @@ -0,0 +1,279 @@ +#### 创建相册 + +POST: `https://api.aliyundrive.com/adrive/v1/album/create` + +```json +{ "name": "未命名", "description": "" } +``` + +Response: + +```json +{ + "owner": "ccff000000004d75b5788a481eed8386", + "name": "未命名", + "description": "", + "album_id": "cfe400000000478599575b69356c5a4962383669", + "file_count": 0, + "image_count": 0, + "video_count": 0, + "created_at": 1647851113891, + "updated_at": 1647851113891 +} +``` + +#### 修改相册 + +POST: `https://api.aliyundrive.com/adrive/v1/album/update` + +```json +{ "album_id": "cfe400000000478599575b69356c5a4962383669", "description": "ff", "name": "未命名" } +``` + +Response: + +```json +{ + "owner": "ccff000000004d75b5788a481eed8386", + "name": "未命名", + "description": "", + "album_id": "cfe400000000478599575b69356c5a4962383669", + "file_count": 0, + "image_count": 0, + "video_count": 0, + "created_at": 1647851113891, + "updated_at": 1647851113891 +} +``` + +#### 删除相册(不会删除相册内文件) + +POST: `https://api.aliyundrive.com/adrive/v1/album/delete` + +```json +{ "album_id": "cfe400000000478599575b69356c5a4962383669" } +``` + +Response: + +```json +{} +``` + +#### 读取相册 + +POST: `https://api.aliyundrive.com/adrive/v1/album/get` + +```json +{ "album_id": "cfe400000000478599575b69356c5a4962383669" } +``` + +Response: + +```json +{ + "owner": "ccff000000004d75b5788a481eed8386", + "name": "未命名", + "description": "", + "cover": { + "list": [ + { + "trashed": false, + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2022-03-21T08:27:15.671Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "jpeg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { "image_quality": {} }, + "mime_type": "image/jpeg", + "name": "fa9cb4682043bb141b48dd82.jpeg", + "parent_file_id": "root", + "punish_flag": 0, + "size": 586988, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-03-21T08:27:16.226Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "ex_fields_info": {} + } + ] + }, + "album_id": "cfe400000000478599575b69356c5a4962383669", + "file_count": 1, + "image_count": 1, + "video_count": 0, + "created_at": 1647851113891, + "updated_at": 1647851236638 +} +``` + +#### 添加文件到相册 + +POST: `https://api.aliyundrive.com/adrive/v1/album/add_files` + +```json +{ "album_id": "cfe400000000478599575b69356c5a4962383669", "drive_file_list": [{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }] } +``` + +Response: + +```json +{ + "file_list": [ + { + "trashed": false, + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2022-03-21T08:27:15.671Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "jpeg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { "image_quality": {} }, + "mime_type": "image/jpeg", + "name": "fa9cb4682043bb141b48dd82.jpeg", + "parent_file_id": "root", + "punish_flag": 0, + "size": 586988, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-03-21T08:27:16.226Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "ex_fields_info": {} + } + ] +} +``` + +#### 从相册移除文件 + +POST: `https://api.aliyundrive.com/adrive/v1/album/delete_files` + +```json +{ "album_id": "cfe400000000478599575b69356c5a4962383669", "drive_file_list": [{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }] } +``` + +Response: + +```json +{} +``` + +#### 列出相册内文件 + +POST: `https://api.aliyundrive.com/adrive/v1/album/list_files` + +```json +{ + "album_id": "cfe400000000478599575b69356c5a4962383669", + "image_thumbnail_process": "image/resize,w_400/format,jpeg", + "video_thumbnail_process": "video/snapshot,t_0,f_jpg,ar_auto,w_1000", + "image_url_process": "image/resize,w_1920/format,jpeg", + "filter": "", + "fields": "*", + "limit": 100, + "order_by": "file_image_time", + "order_direction": "DESC" +} +``` + +Response: + +```json +{ + "items": [ + { + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2022-03-21T08:27:15.671Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "jpeg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { "image_quality": {} }, + "name": "fa9cb4682043bb141b48dd82.jpeg", + "parent_file_id": "root", + "size": 586988, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-03-21T08:27:16.226Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ] +} +``` + +#### 上传文件到相册 + +POST: `https://api.aliyundrive.com/adrive/v1/biz/albums/file/create` + +```json +{ + "drive_id": "9600002", + "part_info_list": [{ "part_number": 1 }], + "parent_file_id": "root", + "name": "fa9cb4682043bb141b48dd82.jpeg", + "type": "file", + "check_name_mode": "auto_rename", + "size": 586988, + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "proof_code": "TIo2j2wSMV4=", + "proof_version": "v1" +} +``` + +Response: + +```json +{ + "type": "file", + "parent_file_id": "root", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "domain_id": "bj29", + "trashed_at": null, + "file_name": "fa9cb4682043bb141b48dd82.jpeg", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "encrypt_mode": "none", + "location": "cn-beijing", + "rapid_upload": false, + "part_info_list": [ + { + "part_number": 1, + "upload_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "internal_upload_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "content_type": "" + } + ] +} +``` diff --git a/adrive sdk/archive.md b/adrive sdk/archive.md new file mode 100644 index 0000000..dd85330 --- /dev/null +++ b/adrive sdk/archive.md @@ -0,0 +1,177 @@ +#### 在线打开压缩包 + +POST: `https://api.aliyundrive.com/v2/archive/list` + +```json +{ "archive_type": "zip", "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ "state": "Running", "file_list": {}, "task_id": "e026000000007f609bcd6aa71b8fde94" } +``` + +#### 在线打开压缩包进度 + +POST: `https://api.aliyundrive.com/v2/archive/status` + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "task_id": "e026000000007f609bcd6aa71b8fde94" } +``` + +Response: + +```json +{ "code": "LimitArchive", "message": "Archive reach limit" } +{"code":"BadArchive","message":"Archive is bad"} +{"code":"InvalidPassword","message":"Password is invalid"} +``` + +```json +{ "state": "Running", "file_list": {}, "task_id": "e026000000007f609bcd6aa71b8fde94", "progress": 0 } +``` + +```json +{ + "state": "Succeed", + "file_list": { + "filezi": { + "is_folder": true, + "items": [ + { + "is_folder": true, + "items": [ + { "is_folder": false, "items": [], "name": "filezi/electron/electron", "size": 140256360, "updated_at": "2022-03-23T04:11:45.000Z" }, + { "is_folder": false, "items": [], "name": "filezi/electron/libvk_swiftshader.so", "size": 4168528, "updated_at": "2022-03-23T04:11:45.000Z" }, + { + "is_folder": true, + "items": [ + { "is_folder": false, "items": [], "name": "filezi/electron/swiftshader/libEGL.so", "size": 256032, "updated_at": "2022-03-23T04:11:45.000Z" }, + { "is_folder": false, "items": [], "name": "filezi/electron/swiftshader/libGLESv2.so", "size": 2580600, "updated_at": "2022-03-23T04:11:45.000Z" } + ], + "name": "filezi/electron/swiftshader", + "size": 0, + "updated_at": "1970-01-01T00:00:00.000Z" + } + ], + "name": "filezi/electron", + "size": 0, + "updated_at": "1970-01-01T00:00:00.000Z" + }, + { "is_folder": false, "items": [], "name": "filezi/linux使用帮助.txt", "size": 509, "updated_at": "2022-03-23T04:11:45.000Z" } + ], + "name": "filezi", + "size": 0, + "updated_at": "1970-01-01T00:00:00.000Z" + } + }, + "task_id": "e026000000007f609bcd6aa71b8fde94", + "progress": 100 +} +``` + +#### 在线打开压缩包(rar 带密码) + +```js +//第一次,没有文件缓存 + +//POST: `https://api.aliyundrive.com/v2/archive/list` +{"code":"BadArchive","message":"Archive is bad"}//返回文件锁坏 +//POST: `https://api.aliyundrive.com/v2/archive/list` "password":"123" +//返回正常的 { "state": "Succeed", "file_list": { ... +``` + +```js +//第二次,有缓存 + +//POST: `https://api.aliyundrive.com/v2/archive/list` +{"code":"InvalidPassword","message":"Password is invalid"}//返回需要密码 +//POST: `https://api.aliyundrive.com/v2/archive/list` "password":"123" +//返回正常的 { "state": "Succeed", "file_list": { ... +``` + +#### 在线解压 + +POST: `https://api.aliyundrive.com/v2/archive/uncompress` + +```json +{ "archive_type": "zip", "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "target_drive_id": "9600002", "target_file_id": "61a300000000e67e5cf8489fab317ef345373b80" } +``` + +```json +{ + "archive_type": "zip", + "domain_id": "bj29", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_list": ["lc-design-demo/assets/views/home.xml", "lc-design-demo/assets/views/layout"], + "password": "123", + "target_drive_id": "9600002", + "target_file_id": "61a300000000e67e5cf8489fab317ef345373b80" +} +``` + +Response: + +```json +{ "state": "Running", "task_id": "e026000000007f609bcd6aa71b8fde94" } +``` + +#### 在线解压进度 + +POST: `https://api.aliyundrive.com/v2/archive/status` + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "task_id": "e026000000007f609bcd6aa71b8fde94" } +``` + +Response: + +```json +{ "state": "Running", "file_list": {}, "task_id": "e026000000007f609bcd6aa71b8fde94", "progress": -1 } +``` + +```json +{ "state": "Running", "file_list": {}, "task_id": "e026000000007f609bcd6aa71b8fde94", "progress": 15 } +``` + +```json +{ "state": "Succeed", "file_list": {}, "task_id": "e026000000007f609bcd6aa71b8fde94", "progress": 100 } +``` + +#### 打包下载 + +POST: `https://api.aliyundrive.com/v2/file/archive_files` + +```json +{ "name": "aname.zip", "drive_id": "9600002", "files": [{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }] } +``` + +Response: + +```json +{ "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb" } +``` + +#### 打包下载进度 + +POST: `https://api.aliyundrive.com/v2/async_task/get` + +```json +{ "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb" } +``` + +Response: + +```json +{ + "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb", + "state": "Succeed", + "err_code": 200, + "total_process": 167238406, + "consumed_process": 167238406, + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/archive%2F9fcb1e1d-e9dd-43d0-b30d-387e04dcafcb?response-content-disposition=attachment%3B%20filename%2A%3DUTF-8%27%27aname.zip\u0026x-oss-access-key-id=LTAIsE5mAn2F493Q\u0026x-oss-expires=1648014906\u0026x-oss-signature=5E4UEDoNKoUFDKsH41BQxlsc0BvoTeMjS4QZv5x1U%2B0%3D\u0026x-oss-signature-version=OSS2", + "punished_file_count": 0 +} +``` diff --git a/adrive sdk/book.md b/adrive sdk/book.md new file mode 100644 index 0000000..6411aa4 --- /dev/null +++ b/adrive sdk/book.md @@ -0,0 +1,123 @@ +#### 列出图书 + +POST: `https://api.aliyundrive.com/adrive/v2/book/list` + +```json +{ "book_progress_type": "ALL", "limit": 1, "marker": "", "order_by": "name asc", "show_hidden": false } +``` + +Response: + +```json +{ + "items": [ + { + "category": "doc", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-11-22T03:36:19.680Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "epub", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "name": "Republic.epub", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 128000, + "starred": false, + "status": "available", + "type": "file", + "updated_at": "2022-01-12T12:44:16.835Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}", + "user_tags": { "book_show": "true" } + } + ], + "next_marker": "" +} +``` + +#### 列出最近阅读的图书 + +POST: `https://api.aliyundrive.com/adrive/v2/book/recentList` + +```json +{ "book_progress_type": "ALL", "limit": 1, "marker": "", "order_by": "name asc", "show_hidden": false } +``` + +Response: + +```json +{ + "items": [ + { + "category": "doc", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-09-24T12:50:00.905Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "epub", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "name": "无声告白.epub", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 1027423, + "starred": false, + "status": "available", + "type": "file", + "updated_at": "2022-03-22T14:59:12.333Z", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "book_progress": "{\"bookName\":\"无声告白\",\"chapterNumber\":1,\"chapterPercent\":0.0,\"currentPageNumber\":-1,\"progress\":29,\"totalPageNumber\":-1,\"uid\":\"9400000000bc480bbcbbb1e074f55a7f\",\"updateTime\":1647961151874}", + "user_tags": { + "book_progress": "{\"bookName\":\"无声告白\",\"chapterNumber\":1,\"chapterPercent\":0.0,\"currentPageNumber\":-1,\"progress\":29,\"totalPageNumber\":-1,\"uid\":\"9400000000bc480bbcbbb1e074f55a7f\",\"updateTime\":1647961151874}", + "book_progress_percentage": "35", + "book_show": "true", + "epub_book_progress": "{\"uid\":\"9400000000bc480bbcbbb1e074f55a7f\",\"href\":\"\\/text\\/part0000.html\",\"type\":\"application\\/xhtml+xml\",\"locations\":{\"progression\":0,\"position\":2,\"totalProgression\":8.873114463176575E-4}}", + "start_read": "true" + }, + "book_name": "无声告白", + "book_progress_percentage": 29 + } + ] +} +``` + +#### 添加到阅读室 + +POST: `https://api.aliyundrive.com/adrive/v2/book/update` + +```json +{ "file_ids": ["623b00000000d89ef21d4118838aed83de7575ba"], "operation": 1 } +``` + +Response: + +```text +HTTP/1.1 200 OK +``` + +#### 从阅读室移除 + +POST: `https://api.aliyundrive.com/adrive/v2/book/update` + +```json +{ "file_ids": ["623b00000000d89ef21d4118838aed83de7575ba"], "operation": 2 } +``` + +Response: + +```text +HTTP/1.1 200 OK +``` diff --git a/adrive sdk/contact.md b/adrive sdk/contact.md new file mode 100644 index 0000000..d72df50 --- /dev/null +++ b/adrive sdk/contact.md @@ -0,0 +1,75 @@ +#### 通讯录列出 + +POST: `https://api.aliyundrive.com/adrive/v1/contact/list` + +```json +{} +``` + +Response: + +```json +{ + "items": [ + { + "id": 223963400, + "content": { + "format": "vcard", + "hash": "1a48648e8b140ae80be048f1681cfbe24a7b9579c2ffbabe2686eb79338dfe14", + "value": "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:ez-vcard 0.11.2\r\nKIND:individual\r\nFN:高青\r\nN:高;青;;;\r\nTEL;TYPE=cell:15000065001\r\nEND:VCARD\r\n", + "version": "4.0" + }, + "gmt_create": 1647864044589 + }, + { + "id": 224054214, + "content": { + "format": "vcard", + "hash": "978edd2d967b94b34d3a90c00cbd4819e239f21a6f72f6a2f87b522fe81a62f4", + "value": "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:ez-vcard 0.11.2\r\nKIND:individual\r\nFN:木门\r\nN:木;门;;;\r\nTEL;TYPE=cell:03100000981\r\nEND:VCARD\r\n", + "version": "4.0" + }, + "gmt_create": 1647864055972 + } + ], + "total_count": 2 +} +``` + +#### 通讯录删除 + +POST: `https://api.aliyundrive.com/adrive/v1/contact/delete` + +```json +{ "ids": [224206708] } +``` + +Response: + +```json +{} +``` + +#### 通讯录备份添加 + +POST: `https://api.aliyundrive.com/adrive/v1/contact/add` + +```json +{ + "items": [ + { + "hash": "978edd2d967b94b34d3a90c00cbd4819e239f21a6f72f6a2f87b522fe81a62f4", + "version": "4.0", + "value": "BEGIN:VCARD\r\nVERSION:4.0\r\nN:木;门\r\nTEL;TYPE=cell:03000080981\r\nKIND:individual\r\nEND:VCARD\r\n", + "avatar": "", + "format": "vcard" + } + ] +} +``` + +Response: + +```json +{ "items": [{ "id": 223963801, "content": { "format": "vcard", "hash": "978edd2d967b94b34d3a90c00cbd4819e239f21a6f72f6a2f87b522fe81a62f4", "version": "4.0" } }] } +``` diff --git a/adrive sdk/drive.md b/adrive sdk/drive.md new file mode 100644 index 0000000..27ad80e --- /dev/null +++ b/adrive sdk/drive.md @@ -0,0 +1,177 @@ +#### 全部 drive + +POST: `https://api.aliyundrive.com/v2/drive/list` + +```json +{ "owner": "ccff000000004d75b5788a481eed8386" } +``` + +Response: + +```json +{ + "items": [ + { + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "alibum", + "description": "", + "creator": "", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 739272268, + "total_size": -1, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-03-29T04:02:57.981Z", + "permission": null, + "subdomain_id": "" + }, + { + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "Default", + "description": "Created by system", + "creator": "System", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 7186746146291, + "total_size": 10737418240, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-03-18T04:55:06.893Z", + "permission": null, + "subdomain_id": "" + }, + { + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "note_drive", + "description": "", + "creator": "", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 502382874, + "total_size": -1, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-10-24T11:29:12.773Z", + "permission": null, + "subdomain_id": "" + }, + { + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "Default", + "description": "Created by system", + "creator": "System", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 227511979353, + "total_size": 10737418240, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-03-18T04:55:06.936Z", + "permission": null, + "subdomain_id": "" + } + ], + "next_marker": "" +} +``` + +#### 全部 drive + +POST: `https://api.aliyundrive.com/v2/drive/list_my_drives` + +```json +{ "owner": "ccff000000004d75b5788a481eed8386" } +``` + +Response: + +```json +同上 +``` + +#### 默认 drive(网盘) + +POST: `https://api.aliyundrive.com/v2/drive/get_default_drive` + +```json + +``` + +Response: + +```json +{ + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "Default", + "description": "Created by system", + "creator": "System", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 7186746146291, + "total_size": 17536351469568, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-03-18T04:55:06.893Z", + "permission": null, + "subdomain_id": "" +} +``` + +#### 指定 drive + +POST: `https://api.aliyundrive.com/v2/drive/get` + +```json +{ "drive_id": "9600002" } +``` + +Response: + +```json +{ + "domain_id": "bj29", + "drive_id": "9600002", + "drive_name": "alibum", + "description": "", + "creator": "", + "owner": "ccff000000004d75b5788a481eed8386", + "owner_type": "user", + "drive_type": "normal", + "status": "enabled", + "used_size": 742962124, + "total_size": 17536351469568, + "store_id": "b5e90000000041d084733b520ea8b57d", + "relative_path": "", + "encrypt_mode": "none", + "encrypt_data_access": false, + "created_at": "2021-03-29T04:02:57.981Z", + "permission": null, + "subdomain_id": "" +} +``` diff --git a/adrive sdk/file.md b/adrive sdk/file.md new file mode 100644 index 0000000..093a613 --- /dev/null +++ b/adrive sdk/file.md @@ -0,0 +1,716 @@ +#### 一个文件的信息 + +POST: `https://api.aliyundrive.com/v2/file/get` + +```json +{ + "drive_id": "9600002", + "office_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "video_thumbnail_process": "video/snapshot,t_0,f_jpg,m_lfit,w_256,ar_auto,m_fast", + "permanently": false, + "image_url_process": "image/resize,m_lfit,w_1080/format,webp", + "url_expire_sec": 1800 +} +``` + +Response: + +```json +{ + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "父文件夹23", + "type": "folder", + "created_at": "2021-11-05T12:23:02.914Z", + "updated_at": "2022-01-24T10:53:36.469Z", + "hidden": false, + "starred": false, + "status": "available", + "user_meta": "{\"shares\":[\"2eVphedN4QT\"],\"client\":\"web\"}", + "parent_file_id": "root", + "encrypt_mode": "none", + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "revision_id": "", + "ex_fields_info": { "image_count": 0 }, + "trashed": false +} +``` + +#### 一个文件的信息 get_by_path + +POST: `https://api.aliyundrive.com/v2/file/get_by_path` + +```json +{ "drive_id": "9600002", "file_path": "/zip23" } +``` + +Response: + +```json +{ + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "zip23", + "type": "folder", + "created_at": "2021-08-28T02:54:02.561Z", + "updated_at": "2022-01-24T10:53:36.474Z", + "hidden": false, + "starred": false, + "status": "available", + "user_meta": "{\"shares\":[\"mUo000000ka\"]}", + "parent_file_id": "root", + "encrypt_mode": "none", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "revision_id": "", + "trashed": false +} +``` + +#### 一个文件的路径(root[不含] -> file_id 本身) + +POST: `https://api.aliyundrive.com/adrive/v1/file/get_path` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ + "items": [ + { + "trashed": false, + "created_at": "2021-11-06T02:51:06.833Z", + "domain_id": "bj29", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "name": "donghua", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "starred": false, + "status": "available", + "type": "folder", + "updated_at": "2021-11-06T02:51:06.833Z", + "user_meta": "{\"client\":\"web\"}", + "ex_fields_info": { "image_count": 0 } + }, + { + "trashed": false, + "created_at": "2021-11-05T12:23:02.914Z", + "domain_id": "bj29", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "name": "父文件夹23", + "parent_file_id": "root", + "starred": false, + "status": "available", + "type": "folder", + "updated_at": "2022-01-24T10:53:36.469Z", + "user_meta": "{\"shares\":[\"mUo000000ka\"],\"client\":\"web\"}", + "ex_fields_info": { "image_count": 0 } + } + ] +} +``` + +#### 直接下载 + +GET: `https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&image_thumbnail_process=image%2Fresize%2Cm_lfit%2Cw_256%2Climit_0%2Fformat%2Cjpg%7Cimage%2Fformat%2Cwebp` + +```json + +``` + +Response: + +```text +Moved Permanently. +``` + +#### 单个下载地址 + +GET: `https://api.aliyundrive.com/v2/file/get_download_url` + +```json +{ "drive_id": "9600002", "expires_sec": 0, "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ + "method": "GET", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "internal_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "expiration": "2022-03-22T14:54:28.057Z", + "size": 13, + "ratelimit": { "part_speed": -1, "part_size": -1 }, + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1" +} +``` + +#### 打包下载(失效) + +GET: `https://api.aliyundrive.com/adrive/v1/file/multiDownloadUrl` + +```json +{ "archive_name": "archive_name", "download_infos": [{ "drive_id": "9600002", "files": [{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }] }] } +``` + +Response: + +```json +{ "download_url": "https://file.aliyundrive.com/files/archive?task_id=c3f2cd02-0000-0000-8c5a-e80fb1e6f35d&uid=ccff000000004d74b5788a481eed8386" } +``` + +#### 预览地址(Office) + +POST: `https://api.aliyundrive.com/v2/file/get_office_preview_url` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ "preview_url": "https://office-cn-beijing.imm.aliyuncs.com/office/w/623b00000000d89ef21d4118838aed83de7575ba?_w_tokentype=1&hidecmb=1&simple=1", "access_token": "9eedf665d2464dfcbcabcef640211f0av3" } +``` + +#### 预览地址(OfficeEdit) + +POST: `https://api.aliyundrive.com/v2/file/get_office_edit_url` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "option": { "readonly": false } } +``` + +Response: + +```json +{ + "edit_url": "https://office-cn-beijing.imm.aliyuncs.com/office/p/623b00000000d89ef21d4118838aed83de7575ba?_w_tokentype=1", + "office_access_token": "75d3976f75a44e4980439ae8ac58ccf1v3", + "office_refresh_token": "ca61bb7e51394b62924a09552de868e3v3" +} +``` + +#### 预览地址(Video) + +POST: `https://api.aliyundrive.com/v2/file/get_video_preview_play_info` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "template_id": "", "url_expire_sec": 3600, "get_subtitle_info": true, "category": "live_transcoding", "drive_id": "9600002" } +``` + +Response: + +```json +{ + "domain_id": "bj29", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "video_preview_play_info": { + "category": "live_transcoding", + "meta": { "duration": 6728.747, "width": 3840, "height": 2160, "live_transcoding_meta": { "ts_segment": 10, "ts_total_count": 673, "ts_pre_count": 3 } }, + "live_transcoding_task_list": [ + { + "template_id": "SD", + "template_name": "pdsSD", + "status": "finished", + "stage": "stage_all", + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/lt/E85700000000F9AF45055D714AF43EE744E7262F_51495704429__sha1_bj29/SD/media.m3u8?di=bj29&dr=9600002&f=623b00000000d89ef21d4118838aed83de7575ba&u=9400000000bc480bbcbbb1e074f55a7f&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648039409&x-oss-process=hls%2Fsign&x-oss-signature=qBAS4aI%2F3hT7TFv2mAlgeigtDNtoEK2Vk3BHkCYMXUI%3D&x-oss-signature-version=OSS2" + }, + { + "template_id": "HD", + "template_name": "pdsHD", + "status": "finished", + "stage": "stage_all", + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/lt/E85700000000F9AF45055D714AF43EE744E7262F_51495704429__sha1_bj29/HD/media.m3u8?di=bj29&dr=9600002&f=623b00000000d89ef21d4118838aed83de7575ba&u=9400000000bc480bbcbbb1e074f55a7f&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648039409&x-oss-process=hls%2Fsign&x-oss-signature=xv2x1WcvwqHpadUysuVyG%2FqsC4SGemy8kuXTUQ6G8qA%3D&x-oss-signature-version=OSS2" + }, + { + "template_id": "FHD", + "template_name": "pdsFHD", + "status": "finished", + "stage": "stage_all", + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/lt/E85700000000F9AF45055D714AF43EE744E7262F_51495704429__sha1_bj29/FHD/media.m3u8?di=bj29&dr=9600002&f=623b00000000d89ef21d4118838aed83de7575ba&u=9400000000bc480bbcbbb1e074f55a7f&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648039409&x-oss-process=hls%2Fsign&x-oss-signature=EK6lF3iznE9mW7PHfAQDT5vUZfQRV99aQ%2BS06Ir5P9I%3D&x-oss-signature-version=OSS2" + } + ], + "live_transcoding_subtitle_task_list": [ + { + "language": "chi", + "status": "finished", + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/lt/E85700000000F9AF45055D714AF43EE744E7262F_51495704429__sha1_bj29/subtitle/chi_0.vtt?di=bj29&dr=9600002&f=623b00000000d89ef21d4118838aed83de7575ba&u=9400000000bc480bbcbbb1e074f55a7f&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648039409&x-oss-signature=%2Bywa3xJQWhSbqwhfj0namnSgH0Da5mYg%2F7cEU6hbsOI%3D&x-oss-signature-version=OSS2" + } + ] + } +} +``` + +#### 预览地址(VideoUrl) + +POST: `https://api.aliyundrive.com/v2/file/get_video_preview_url` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "template_id": "HD", "url_expire_sec": 14400 } +``` + +Response: + +```json +{ + "preview_url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/bj29/sha1_1ADDEFFAB9820EDC1ECEAFA8F9D6511456A4053C_167238406_/HD/master.mp4?di=bj29&dr=9600002&f=623b00000000d89ef21d4118838aed83de7575ba&u=9400000000bc480bbcbbb1e074f55a7f&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648018799&x-oss-signature=KZikIyRSw4c9WkYa2M3Mk4NQjAkdmmg60R6z3I2UJDY%3D&x-oss-signature-version=OSS2" +} +``` + +#### 预览地址(Audio) + +POST: `https://api.aliyundrive.com/v2/databox/get_audio_play_info` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ + "template_list": [ + { + "template_id": "LQ", + "status": "finished", + "url": "https://ccp-bj29-video-preview.oss-cn-beijing.aliyuncs.com/bj29/sha1_4E2B9BBE6B93AE7DAAF932966EDF43CD307EC5A1_4030744_/LQ/master.mp3?di=bj29\u0026dr=9600002\u0026f=623b00000000d89ef21d4118838aed83de7575ba\u0026u=9400000000bc480bbcbbb1e074f55a7f\u0026x-oss-access-key-id=LTAIsE5mAn2F493Q\u0026x-oss-expires=1647960250\u0026x-oss-signature=S5pC%2BAje9NY4%2FYCYchj%2BC5LnsLZffAezK3%2F24CEjrvk%3D\u0026x-oss-signature-version=OSS2\u0026x-oss-traffic-limit=31457280" + } + ] +} +``` + +#### 重命名 + +POST: `https://api.aliyundrive.com/v3/file/update` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "name": "Screenshot_2021-11-23-09-34-20-248_com.tencet.mm.jpg", "check_name_mode": "refuse" } +``` + +Response: + +```json +file +``` + +#### 移动 + +POST: `https://api.aliyundrive.com/v3/file/move` + +```json +{ "auto_rename": false, "overwrite": false, "drive_id": "9600002", "to_drive_id": "9600002", "to_parent_file_id": "613800000000336ae9164455b135a9729a298c9c", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +#### 复制 + +POST: `https://api.aliyundrive.com/v3/file/copy` + +```json +{ "auto_rename": false, "drive_id": "9600002", "to_drive_id": "9600002", "to_parent_file_id": "root", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "new_name": "" } +``` + +Response: + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +#### 列表 list + +POST: `https://api.aliyundrive.com/v2/file/list` + +```json +{ + "fields": "*", + "drive_id": "9600002", + "office_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_direction": "DESC", + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "name", + "limit": 50, + "video_thumbnail_process": "video/snapshot,t_0,f_jpg,m_lfit,w_256,ar_auto,m_fast", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "all": false, + "image_url_process": "image/resize,m_lfit,w_1080/format,webp" +} +``` + +Response: + +```json +{ + "items": [ + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "试看版", + "type": "folder", + "created_at": "2021-11-06T03:15:19.060Z", + "updated_at": "2021-11-06T03:15:19.060Z", + "hidden": false, + "starred": false, + "status": "available", + "user_meta": "{\"client\":\"web\"}", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "encrypt_mode": "none", + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "creator_name": "myname", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_name": "myname", + "revision_id": "" + }, + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "压缩包.zip", + "type": "file", + "content_type": "application/oct-stream", + "created_at": "2021-11-06T03:31:13.518Z", + "updated_at": "2021-11-06T03:31:13.518Z", + "file_extension": "zip", + "mime_type": "application/zip", + "mime_extension": "zip", + "hidden": false, + "size": 604818808, + "starred": false, + "status": "available", + "user_meta": "{\"client\":\"web\"}", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "category": "zip", + "encrypt_mode": "none", + "punish_flag": 0, + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "creator_name": "myname", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_name": "myname", + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111" + }, + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "夫知間.jpg", + "type": "file", + "content_type": "application/oct-stream", + "created_at": "2021-11-06T03:16:33.170Z", + "updated_at": "2021-11-06T03:16:33.390Z", + "file_extension": "jpg", + "mime_type": "image/jpeg", + "mime_extension": "jpg", + "hidden": false, + "size": 294767, + "starred": false, + "status": "available", + "user_meta": "{\"client\":\"web\"}", + "labels": ["其他事物", "艺术品"], + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "category": "image", + "encrypt_mode": "none", + "image_media_metadata": { + "width": 1627, + "height": 2310, + "exif": "{\"FileSize\":{\"value\":\"294767\"},\"Format\":{\"value\":\"jpg\"},\"ImageHeight\":{\"value\":\"2310\"},\"ImageWidth\":{\"value\":\"1627\"},\"ResolutionUnit\":{\"value\":\"2\"},\"XResolution\":{\"value\":\"300/1\"},\"YResolution\":{\"value\":\"300/1\"}}", + "image_quality": { "overall_score": 0.7194659113883972 } + }, + "punish_flag": 2, + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_name": "myname", + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111" + }, + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "麻冬.zip", + "type": "file", + "content_type": "application/oct-stream", + "created_at": "2021-11-06T03:16:58.189Z", + "updated_at": "2021-11-06T03:16:58.189Z", + "file_extension": "zip", + "mime_type": "application/zip", + "mime_extension": "zip", + "hidden": false, + "size": 575786476, + "starred": false, + "status": "available", + "user_meta": "{\"client\":\"web\"}", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "category": "zip", + "encrypt_mode": "none", + "punish_flag": 0, + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "creator_name": "myname", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_name": "myname", + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111" + } + ], + "next_marker": "", + "punished_file_count": 0 +} +``` + +#### 列表 walk + +POST: `https://api.aliyundrive.com/v2/file/walk` + +```json +{ + "all": false, + "drive_id": "9600002", + "fields": "*", + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg|image/format,webp", + "image_url_process": "image/resize,m_lfit,w_1080/format,webp", + "limit": 1000, + "marker": "", + "office_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg|image/format,webp", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "video_thumbnail_process": "video/snapshot,t_120000,f_jpg,m_lfit,w_256,ar_auto,m_fast" +} +``` + +```json +{ + "all": false, + "drive_id": "9600002", + "fields": "*", + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg|image/format,webp", + "image_url_process": "image/resize,m_lfit,w_1080/format,webp", + "limit": 800, + "marker": "", + "office_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg|image/format,webp", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "video_thumbnail_process": "video/snapshot,t_120000,f_jpg,m_lfit,w_256,ar_auto,m_fast", + "return_total_count": true, + "type": "folder" +} +``` + +Response: + +```json +filelist +``` + +#### 列表(全量) scan + +POST: `https://api.aliyundrive.com/v2/file/scan` + +```json +{ + "drive_id": "9600002", + "category": "image", + "limit": 1000 +} +``` + +Response: + +```json +filelist +``` + +#### 收藏列表 + +POST: `https://api.aliyundrive.com/v2/file/list_by_custom_index_key` + +```json +{ + "fields": "*", + "drive_id": "9600002", + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "limit": 50, + "video_thumbnail_process": "video/snapshot,t_0,f_jpg,m_lfit,w_256,ar_auto,m_fast", + "parent_file_id": "root", + "all": false, + "image_url_process": "image/resize,m_lfit,w_1080/format,webp", + "custom_index_key": "starred_yes" +} +``` + +Response: + +```json +filelist +``` + +#### 收藏文件 + +POST: `https://api.aliyundrive.com/v3/file/update` + +```json +{ "hidden": false, "drive_id": "9600002", "starred": false, "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "custom_index_key": "" } +``` + +```json +{ "hidden": false, "drive_id": "9600002", "starred": true, "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "custom_index_key": "starred_yes" } +``` + +Response: + +```json +file +``` + +#### 删除文件(从回收站彻底删除) + +POST: `https://api.aliyundrive.com/v3/file/delete` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002" } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 增加文件 user_tags + +POST: `https://api.aliyundrive.com/v2/file/put_usertags` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002", "user_tags": [{ "key": "k", "value": "0" }] } +``` + +Response: + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +#### 删除文件 user_tags + +POST: `https://api.aliyundrive.com/v2/file/delete_usertags` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002", "key_list": ["k"] } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 未知 list_delta(向相册中上传文件时触发) + +POST: `https://api.aliyundrive.com/v2/file/list_delta` + +```json +{ "cursor": "MDAwMDAwMDA6MDAwNWRhYjNiYjQ2YTFkMzowMDAwMDAwMQ==", "drive_id": "9600002", "limit": 1000 } +``` + +Response: + +```json +{ + "items": [ + { + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "op": "create", + "file": { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "ic_acloud_launcher.png", + "type": "file", + "content_type": "image/png", + "created_at": "2022-03-22T04:28:47.498Z", + "updated_at": "2022-03-22T04:28:47.498Z", + "file_extension": "png", + "hidden": false, + "size": 6414, + "starred": false, + "status": "available", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "parent_file_id": "root", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "category": "image", + "encrypt_mode": "none", + "image_media_metadata": { "image_quality": {} }, + "characteristic_hash": "e14f000000004eb4ae91b8a4a723c2a11361928f", + "revision_id": "" + }, + "current_category": "image" + }, + { + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "op": "update", + "file": { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "labels": ["其他事物", "蓝色"], + "category": "image", + "image_media_metadata": { + "width": 108, + "height": 108, + "image_quality": { "overall_score": 0.4490000009536743 } + }, + "revision_id": "" + }, + "current_category": "image" + } + ], + "has_more": false, + "cursor": "MDAwMDAwMDA6MDAwNWRhYzcwYzk2ZTM4OTowMDAwMDAwMQ==" +} +``` diff --git a/adrive sdk/filedir.md b/adrive sdk/filedir.md new file mode 100644 index 0000000..f62c6b2 --- /dev/null +++ b/adrive sdk/filedir.md @@ -0,0 +1,86 @@ +#### 文件夹大小 + +POST: `https://api.aliyundrive.com/adrive/v1/file/get_folder_size_info` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ "size": 67200, "folder_count": 0, "file_count": 600, "reach_limit": true } +``` + +#### 批量读取文件夹封面 + +POST: `https://api.aliyundrive.com/adrive/v1/file/cover/batchGet` + +```json +{ "drive_id": "9600002", "file_ids": ["623b00000000d89ef21d4118838aed83de7575ba", "6061000000001af7c3034e3590ea7d5a50f58015"] } +``` + +Response: + +```json +{ + "items": [ + { + "folder_file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_file_thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/RV5OBihM%2F...", + "cover_file_name": "反贪5.mp4", + "cover_file_category": "video" + }, + { "folder_file_id": "623b00000000d89ef21d4118838aed83de7575ba", "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", "cover_file_name": "bbbc", "cover_file_category": "others" } + ] +} +``` + +#### 读取文件夹封面 + +POST: `https://api.aliyundrive.com/adrive/v1/file/cover/get` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```json +{ + "folder_file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_file_thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/RV5OBihM%2F...", + "cover_file_name": "firmware.3911(1).dat", + "cover_file_category": "video" +} +``` + +#### 设置-读取开启文件夹封面 + +POST: `https://api.aliyundrive.com/adrive/v1/file/cover/config/get` + +```json +{} +``` + +Response: + +```json +{"enable":true} +``` + +#### 设置-保存开启文件夹封面 + +POST: `https://api.aliyundrive.com/adrive/v1/file/cover/config/set` + +```json +{"enable":true} +``` + +Response: + +```text +HTTP/1.1 200 OK +``` diff --git a/adrive sdk/fileupload.md b/adrive sdk/fileupload.md new file mode 100644 index 0000000..f9e1297 --- /dev/null +++ b/adrive sdk/fileupload.md @@ -0,0 +1,135 @@ +#### 上传文件 pre_hash + +POST: `https://api.aliyundrive.com/v2/file/create_with_proof` + +```json +{ + "auto_rename": true, + "content_type": "application/octet-stream", + "drive_id": "9600002", + "hidden": false, + "name": "Version 89", + "parent_file_id": "root", + "part_info_list": [{ "part_number": 1, "part_size": 4094816 }], + "pre_hash": "BF9800000000645AAAE912D616759A7C96CC8BFA", + "size": 4094816, + "type": "file" +} +``` + +Response: + +```json +{ "parent_file_id": "", "file_name": "Version 89", "pre_hash": "BF9800000000645AAAE912D616759A7C96CC8BFA", "code": "PreHashMatched", "message": "Pre hash matched." } +``` + +#### 上传文件 + +POST: `https://api.aliyundrive.com/v2/file/create_with_proof` + +```json +{ + "auto_rename": true, + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/octet-stream", + "drive_id": "9600002", + "hidden": false, + "name": "Version 89", + "parent_file_id": "root", + "part_info_list": [{ "part_number": 1, "part_size": 4094816 }], + "proof_code": "h49KOtR0okk=", + "proof_version": "v1", + "size": 4094816, + "type": "file" +} +``` + +Response: + +```json +//秒传了 +{ + "parent_file_id": "root", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "rapid_upload": true, + "type": "file", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "domain_id": "bj29", + "drive_id": "9600002", + "file_name": "Version 89", + "encrypt_mode": "none", + "location": "cn-beijing" +} +``` + +```json +//正常上传 +{ + "parent_file_id": "root", + "part_info_list": [ + { + "part_number": 1, + "part_size": 950, + "upload_url": "https://bj29.cn-beijing.data.alicloudccp.com/AfD0AB6n%2F9600002%2F623b00000000d89ef21d4118838aed83de7575ba%2F623b000000006480042148a5bb586d3c2f053ec8?partNumber=1&uploadId=1382108D9D2C4182B2D4B9AEBB53E2E4&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648043319&x-oss-signature=rIWzJDDihQwWO%2FoAxPPjQV2Y0%2F8FXH3h7rd01w%2Biin8%3D&x-oss-signature-version=OSS2", + "internal_upload_url": "http://ccp-bj29-bj-1592982087.oss-cn-beijing-internal.aliyuncs.com/AfD0AB6n%2F9600002%2F623b00000000d89ef21d4118838aed83de7575ba%2F623b000000006480042148a5bb586d3c2f053ec8?partNumber=1&uploadId=1382108D9D2C4182B2D4B9AEBB53E2E4&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648043319&x-oss-signature=rIWzJDDihQwWO%2FoAxPPjQV2Y0%2F8FXH3h7rd01w%2Biin8%3D&x-oss-signature-version=OSS2", + "content_type": "" + } + ], + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "rapid_upload": false, + "type": "file", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "domain_id": "bj29", + "drive_id": "9600002", + "file_name": "FiddlerRoot.crt", + "encrypt_mode": "none", + "location": "cn-beijing" +} +``` + +//循环上传分片数据 + +PUT `https://bj29.cn-beijing.data.alicloudccp.com/AfD0AB6n%2F9600002%2F623b00000000d89ef21d4118838aed83de7575ba%2F623b000000006480042148a5bb586d3c2f053ec8?partNumber=1&uploadId=1382108D9D2C4182B2D4B9AEBB53E2E4&x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1648043319&x-oss-signature=rIWzJDDihQwWO%2FoAxPPjQV2Y0%2F8FXH3h7rd01w%2Biin8%3D&x-oss-signature-version=OSS2` + +#### 合并分片 + +POST: `https://api.aliyundrive.com/v2/file/complete` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "upload_id": "ED12000000004724833D47B5D5D3C8B9" } +``` + +Response: + +```json +{ + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "FiddlerRoot.crt", + "type": "file", + "content_type": "application/x-x509-ca-cert", + "created_at": "2022-03-23T12:48:39.888Z", + "updated_at": "2022-03-23T12:48:40.449Z", + "file_extension": "crt", + "hidden": false, + "size": 950, + "starred": false, + "status": "available", + "user_meta": "{\"client\":\"Android\"}", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "parent_file_id": "root", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "category": "others", + "encrypt_mode": "none", + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111", + "location": "cn-beijing" +} +``` diff --git a/adrive sdk/image.md b/adrive sdk/image.md new file mode 100644 index 0000000..673643d --- /dev/null +++ b/adrive sdk/image.md @@ -0,0 +1,190 @@ +#### 探索-人物列表 + +POST: `https://api.aliyundrive.com/v2/image/list_facegroups` + +```json +{ "drive_id": "9600002", "limit": 100 } +``` + +Response: + +```json +{ + "items": [ + { + "group_id": "Group-00000000-1703-4fc0-bf56-369478ed14df", + "group_name": " ", + "image_count": 15, + "created_at": "2021-09-08T21:46:02.413048705+08:00", + "updated_at": "2021-11-08T13:58:11.452257679+08:00", + "group_cover_url": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/nIaV4oIe%2F...", + "group_cover_file_id": "613800000000c99442f44b99b93b3bdd40e21836", + "group_cover_face_boundary": { "Width": 445, "Height": 532, "Top": 328, "Left": 650 } + } + ], + "next_marker": "" +} +``` + +#### 探索-人物照片列表 + +POST: `https://api.aliyundrive.com/v2/file/search` + +```json +{ + "drive_id": "9600002", + "limit": 100, + "order_by": "created_at DESC", + "query": "type = 'file' and category in ['image', 'video'] and face_group_id = 'Group-00000000-1703-4fc0-bf56-369478ed14df' and status = 'available' and hidden = false", + "return_total_count": true +} +``` + +Response: + +```json +{ + "items": [ + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "43.jpg", + "type": "file", + "content_type": "application/oct-stream", + "created_at": "2021-09-08T13:46:00.764Z", + "updated_at": "2021-09-08T13:46:02.889Z", + "file_extension": "jpg", + "mime_type": "image/jpeg", + "mime_extension": "jpg", + "hidden": false, + "size": 2178603, + "starred": false, + "status": "available", + "labels": ["日常行为", "职业&角色"], + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "category": "image", + "encrypt_mode": "none", + "image_media_metadata": { + "width": 2400, + "height": 3600, + "faces": "[{\"FaceConfidence\":0.9466279149055481,\"EmotionConfidence\":0.9990111589431763,\"ImageUri\":\"\",\"FaceQuality\":0.7725782990455627,\"Similarity\":0,\"ExternalId\":\"\",\"Attractive\":0.93,\"AttractiveConfidence\":0,\"Age\":23,\"AgeConfidence\":0,\"Gender\":\"FEMALE\",\"Emotion\":\"HAPPY\",\"GenderConfidence\":1,\"FaceId\":\"45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3\",\"GroupId\":\"Group-00000000-1703-4fc0-bf56-369478ed14df\",\"FaceAttributes\":{\"Glasses\":\"NONE\",\"MaskConfidence\":1,\"Mask\":\"NONE\",\"GlassesConfidence\":1,\"Beard\":\"NONE\",\"BeardConfidence\":1,\"FaceBoundary\":{\"Width\":445,\"Height\":532,\"Top\":328,\"Left\":650},\"HeadPose\":{\"Pitch\":18.937170028686523,\"Roll\":30.32413101196289,\"Yaw\":9.59316635131836}},\"EmotionDetails\":{\"SURPRISED\":0.0000041519870137562975,\"HAPPY\":0.9990111589431763,\"ANGRY\":0.0000027373464490665356,\"DISGUSTED\":0.000007709058991167694,\"SAD\":0.0001263682497665286,\"CALM\":0.0008296924061141908,\"SCARED\":0.0000020987527022953145},\"SimilarFaces\":null}]", + "faces_thumbnail": [ + { + "face_id": "45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3", + "face_group_id": "Group-00000000-1703-4fc0-bf56-369478ed14df", + "face_thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ], + "image_quality": { "overall_score": 0.6911791563034058 } + }, + "punish_flag": 2, + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111" + } + ], + "next_marker": "", + "total_count": 15 +} +``` + +#### 探索-从人物的照片中移除一张 + +POST: `https://api.aliyundrive.com/v2/albums/unassign_facegroup_item` + +```json +{ "face_group_id": "Group-00000000-1703-4fc0-bf56-369478ed14df", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002" } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 探索-修改人物 name,头像,remarks + +POST: `https://api.aliyundrive.com/v2/image/update_facegroup_info` + +```json +{ "drive_id": "9600002", "group_cover_face_id": "45f700000000ac19ffbf56adcaa98e3944f28c087cd36b9bc1acde5ae5829fa3", "group_id": "Group-00000000-1703-4fc0-bf56-369478ed14df", "group_name": "fang", "remarks": "-" } +``` + +Response: + +```json +{ "drive_id": "9600002", "group_id": "Group-00000000-1703-4fc0-bf56-369478ed14df" } +``` + +#### 探索-地点列表 + +POST: `https://api.aliyundrive.com/v2/image/list_address_groups` + +```json +{ "all": false, "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", "video_thumbnail_process": "video/snapshot,t_7000,f_jpg,w_800,h_600,ar_auto,m_fast", "drive_id": "9600002" } +``` + +Response: + +```json +{ "items": [], "next_marker": "" } +``` + +#### 探索-地点列表 + +POST: `https://api.aliyundrive.com/v2/image/list_address_groups` + +```json +{ "drive_id": "9600002", "address_names": ["杭州市", "北京市"] } +``` + +Response: + +```json +{ "items": [] } +``` + +#### 探索-标记列表 + +POST: `https://api.aliyundrive.com/v2/image/list_tags` + +```json +{ "all": false, "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", "video_thumbnail_process": "video/snapshot,t_7000,f_jpg,w_800,h_600,ar_auto,m_fast", "drive_id": "9600002" } +``` + +Response: + +```json +{ + "tags": [ + { + "name": "摄影", + "count": 75, + "cover_url": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/ew5HgHNJ%2F...", + "cover_file_id": "6061000000001af7c3034e3590ea7d5a50f58015", + "cover_file_category": "", + "cover_tag_confidence": 1, + "cover_overall_score": 0.7421030402183533 + } + ] +} +``` + +#### drive 内图片总数 + +POST: `https://api.aliyundrive.com/v2/image/get_photo_count` + +```json +{ "drive_id": "9600002" } +``` + +Response: + +```json +{ "image_count": 126 } +``` diff --git a/adrive sdk/member.md b/adrive sdk/member.md new file mode 100644 index 0000000..385fb0e --- /dev/null +++ b/adrive sdk/member.md @@ -0,0 +1,172 @@ +#### 列出已订阅 + +POST: `https://api.aliyundrive.com/adrive/v1/member/list_following` + +```json +{ "limit": 50, "order_by": "updated_at", "order_direction": "DESC" } +``` + +Response: + +```json +{ + "items": [ + { + "description": "中国国家地理景观官方账号,带你领略目酣神醉的壮美景观、发现中国各地独具特色的人文胜迹。", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "中国国家地理景观", + "phone": "136***902", + "is_following": true, + "has_unread_message": true, + "latest_messages": [ + { + "creator": { + "description": "中国国家地理景观官方账号,带你领略目酣神醉的壮美景观、发现中国各地独具特色的人文胜迹。", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "中国国家地理景观", + "phone": "136***902" + }, + "action": "sharelink.create", + "content": { + "share": { + "popularity": 6019, + "share_id": "6RRP4gDWwzE", + "share_msg": "「广东100个最美观景拍摄点-...拍摄季节:四季).jpg」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "share_name": "广东100个最美观景拍摄点-...拍摄季节:四季).jpg", + "description": "", + "expiration": "", + "expired": false, + "share_pwd": "", + "share_url": "https://www.aliyundrive.com/s/6RRP4gDWwzE", + "creator": "01d1ea604d644cfb83ac7e9be530db8e", + "drive_id": "347756450", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "preview_count": 2139, + "save_count": 802, + "download_count": 27, + "status": "enabled", + "created_at": "2022-03-20T13:55:42.630Z", + "updated_at": "2022-03-21T08:04:11.464Z", + "first_file": { + "trashed": false, + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2022-02-28T09:09:54.329Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "347756450", + "encrypt_mode": "none", + "file_extension": "jpg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { + "height": 1464, + "image_quality": { "overall_score": 0.6488162279129028 }, + + "width": 2500 + }, + "labels": ["旅游&地理", "体育运动", "植物", "徒步", "自然景观", "植被", "高地", "山脊", "山峰", "丘陵", "山", "云", "山中避暑地", "山脉", "雾", "天空", "荒野", "雾景", "森林"], + "mime_type": "image/jpeg", + "name": "广东100个最美观景拍摄点-油岭瑶寨(最佳拍摄季节:四季).jpg", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 3829229, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-02-28T09:09:57.283Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"desktop\"}" + }, + "allow_subscribe": false, + "current_sync_status": 3, + "popularity_str": "6K", + "popularity_emoji": "\uD83D\uDD25", + "full_share_msg": "「广东100个最美观景拍摄点-...拍摄季节:四季).jpg」https://www.aliyundrive.com/s/6RRP4gDWwzE\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "display_name": "广东100个最美观景拍摄点-油岭瑶寨(最佳拍摄季节:四季).jpg" + }, + "share_id": "6RRP4gDWwzE", + "drive_id": "347756450", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "file_list": [ + { + "category": "image", + "created_at": "2022-02-28T09:09:54.329Z", + "domain_id": "bj29", + "drive_id": "347756450", + "file_extension": "jpg", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "image_media_metadata": { "height": 1464, "width": 2500 }, + "mime_type": "image/jpeg", + "name": "广东100个最美观景拍摄点-油岭瑶寨(最佳拍摄季节:四季).jpg", + "parent_file_id": "root", + "punish_flag": 0, + "share_id": "6RRP4gDWwzE", + "size": 3829229, + "thumbnail": "https://pdsapi.aliyundrive.com/v2/redirect?id=5c2b8c638c27409f8516c5fce2c320bc", + "type": "file", + "updated_at": "2022-02-28T09:09:57.283Z" + } + ] + }, + "created": 1647784542657, + "creator_id": "01d1ea604d644cfb83ac7e9be530db8e", + "sequence_id": 1647784542661000, + "display_action": "分享了 广东100个最美观景拍摄点-油岭瑶寨(最佳拍摄季节:四季).jpg" + } + ] + } + ], + "total_count": 2 +} +``` + +#### 标记已读(订阅的一个用户有动态) + +POST: `https://api.aliyundrive.com/adrive/v1/member/mark_read` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f" } +``` + +Response: + +```json +{} +``` + +#### 取消订阅 + +POST: `https://api.aliyundrive.com/adrive/v1/member/unfollow_user` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f" } +``` + +Response: + +```json +{} +``` + +#### 增加订阅 + +POST: `https://api.aliyundrive.com/adrive/v1/member/follow_user` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f" } +``` + +Response: + +```json +{} +``` diff --git a/adrive sdk/note.md b/adrive sdk/note.md new file mode 100644 index 0000000..d225696 --- /dev/null +++ b/adrive sdk/note.md @@ -0,0 +1,325 @@ +#### 笔记-drive_id + +POST: `https://api.aliyundrive.com/anote/v1/drive/info` + +```json + +``` + +Response: + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f", "drive_id": "9600002" } +``` + +#### 笔记列表 + +POST: `https://api.aliyundrive.com/anote/v1/note/list` + +```json +{ "order_direction": "desc", "order_by": 2, "media_category_list": ["image"], "limit": 100, "status": 0 } +``` + +Response: + +```json +{ + "result": [ + { + "status": 0, + "top": 0, + "title": "高三总复习CETV.mp4", + "summary": " 回顾改革\n三生俄文\n", + "media": "[]", + "type": "common", + "value": null, + "version": null, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1647859789126, + "updated_at": 1647860036653, + "media_list": [] + }, + { + "status": 0, + "top": 0, + "title": "iyvxb", + "summary": "", + "media": "[]", + "type": "common", + "value": null, + "version": null, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1635075204623, + "updated_at": 1635075211182, + "media_list": [] + }, + { + "status": 0, + "top": 0, + "title": "ggg", + "summary": "ggc\n", + "media": "[]", + "type": "common", + "value": null, + "version": null, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1635074956002, + "updated_at": 1635074983777, + "media_list": [] + }, + { + "status": 0, + "top": 0, + "title": "欢迎使用笔记", + "summary": "阿里云盘「笔记」是你在数字生活中的又一个伙伴,帮助你随时记录生活、学习、工作中的各种重要信息。你的每一次起心动念,都会留下属于自己的思想痕迹。抓住它们、记录它们,它们会是你在数字世界中重要的资产。 · 笔记能做什么?\n · 阿里云盘「笔记」将有两大核心能力:\n · 1. 在云盘中跨云服务记录想法 · 1. 管理信息、知识 · \uD83D\uDC47下面我们简单为大家介绍一下笔记的具体功能:\n · 灵活强大的编辑器\n", + "media": "[]", + "type": "common", + "value": null, + "version": null, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1635074953183, + "updated_at": 1635074953183, + "media_list": [ + { "fileId": "61754388dab29ac982464de485c38a5f67d07bc1", "driveId": "9600002", "resourceType": null, "dataPreviewUrl": null, "dataSrc": null, "dataAppId": null, "dataObjectId": null, "dataCategory": null }, + { "fileId": "61754389b1a68525c17d4235af597722dbd32370", "driveId": "9600002", "resourceType": null, "dataPreviewUrl": null, "dataSrc": null, "dataAppId": null, "dataObjectId": null, "dataCategory": null }, + { "fileId": "61754389ead68e4cce6b4499b5512585d94a011b", "driveId": "9600002", "resourceType": null, "dataPreviewUrl": null, "dataSrc": null, "dataAppId": null, "dataObjectId": null, "dataCategory": null } + ] + } + ], + "marker": "", + "total_count": 4 +} +``` + +#### 一个笔记的简介 + +POST: `https://api.aliyundrive.com/anote/v1/note/getNote` + +```json +{ "exclude_fields": ["value"], "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d" } +``` + +Response: + +```json +{ + "status": 0, + "top": 0, + "title": "欢迎使用笔记", + "summary": "阿里云盘「笔记」是你在数字生活中的又一个伙伴,帮助你随时记录生活、学习、工作中的各种重要信息。你的每一次起心动念,都会留下属于自己的思想痕迹。抓住它们、记录它们,它们会是你在数字世界中重要的资产。 · 笔记能做什么?\n · 阿里云盘「笔记」将有两大核心能力:\n · 1. 在云盘中跨云服务记录想法 · 1. 管理信息、知识 · \uD83D\uDC47下面我们简单为大家介绍一下笔记的具体功能:\n · 灵活强大的编辑器\n", + "media": "[]", + "type": "common", + "value": null, + "version": 1, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1635074953183, + "updated_at": 1635074953183, + "media_list": [ + { + "fileId": null, + "driveId": null, + "resourceType": null, + "dataPreviewUrl": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "dataSrc": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "dataAppId": "anote", + "dataObjectId": "9600002_61754389ead68e4cce6b4499b5512585d94a011b", + "dataCategory": "image" + } + ] +} +``` + +#### 一个笔记的完整内容 + +POST: `https://api.aliyundrive.com/anote/v1/note/getNote` + +```json +{ "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d" } +``` + +Response: + +```json +{ + "status": 0, + "top": 0, + "title": "欢迎使用笔记", + "summary": "阿里云盘「笔记」是你在数字生活中的又一个伙伴,帮助你随时记录生活、学习、工作中的各种重要信息。你的每一次起心动念,都会留下属于自己的思想痕迹。抓住它们、记录它们,它们会是你在数字世界中重要的资产。 · 笔记能做什么?\n · 阿里云盘「笔记」将有两大核心能力:\n · 1. 在云盘中跨云服务记录想法 · 1. 管理信息、知识 · \uD83D\uDC47下面我们简单为大家介绍一下笔记的具体功能:\n · 灵活强大的编辑器\n", + "media": "[]", + "type": "common", + "value": [ + "root", + {}, + [ + "p", + {}, + [ + "span", + { "data-type": "text" }, + [ + "span", + { "data-type": "leaf" }, + "阿里云盘「笔记」是你在数字生活中的又一个伙伴,帮助你随时记录生活、学习、工作中的各种重要信息。你的每一次起心动念,都会留下属于自己的思想痕迹。抓住它们、记录它们,它们会是你在数字世界中重要的资产。" + ] + ] + ], + [ + "h2", + { "spacing": { "before": 14.666666666666668, "after": 14.666666666666668, "line": 0.8529411764705882 } }, + ["span", { "data-type": "text" }, ["span", { "bold": true, "sz": 16, "szUnit": "pt", "data-type": "leaf" }, "笔记能做什么?\n"]] + ], + ["p", { "ind": { "left": 0 } }, ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, "阿里云盘「笔记」将有两大核心能力:\n"]]], + [ + "p", + { + "ind": { "left": 0 }, + "list": { "listId": "kak98pl4pzh", "level": 0, "isOrdered": true, "isTaskList": false, "listStyleType": "DEC_LEN_LROM_P", "symbolStyle": {}, "listStyle": { "format": "decimal", "text": "%1.", "align": "left" }, "hideSymbol": false } + }, + ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, "在云盘中跨"], ["span", { "bold": true, "data-type": "leaf" }, "云服务"], ["span", { "data-type": "leaf" }, "记录想法"]] + ], + + [ + "p", + {}, + ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, ""]], + [ + "object", + { + "dataCategory": "image", + "dataId": "0079012b-d4c9-43b0-ad46-a394ef944aa4", + "dataAppId": "anote", + "dataObjectId": "9600002_61754388dab29ac982464de485c38a5f67d07bc1", + "dataResourceType": "file", + "dataMetadata": { "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }, + "aslMetadata": {}, + "dataPreviewUrl": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "dataSrc": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + }, + ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, ""]] + ], + ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, "\n"]] + ] + ], + "version": 1, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1635074953183, + "updated_at": 1635074953183, + "media_list": [ + { + "fileId": null, + "driveId": null, + "resourceType": null, + "dataPreviewUrl": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "dataSrc": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "dataAppId": "anote", + "dataObjectId": "9600002_61754389b1a68525c17d4235af597722dbd32370", + "dataCategory": "image" + } + ] +} +``` + +#### 更新一个笔记标题 + +POST: `https://api.aliyundrive.com/anote/v1/note/updateTitle` + +```json +{ "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", "title": "我" } +``` + +Response: + +```text +HTTP/1.1 200 OK +``` + +#### 更新一个笔记内容 + +POST: `https://api.aliyundrive.com/anote/v1/note/patch` + +```json +{ + "ops": [ + { "op": "add", "path": "/5", "value": ["p", {}, ["span", { "data-type": "text" }, ["span", { "data-type": "leaf" }, "三生俄文将和 v 将祸福倚伏具有肌肤光滑"]]] }, + { "op": "remove", "path": "/6" } + ], + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "version": 7, + "summary": " 回顾改革\n三生俄文将和 v 将祸福倚伏具有肌肤光滑\n" +} +``` + +Response: + +```json +{ "docId": "feb400000000a0a7f69588aeed0567c8e5c31d1d", "version": 8 } +``` + +https://www.aliyundrive.com/static/note-mobile-editor?docId=feb4c7c1f55fa0a7f69588aeed0567c8e5c31d1d + +#### 置顶一个笔记 + +POST: `https://api.aliyundrive.com/anote/v1/note/batchUpdate` + +```json +{ "doc_ids": ["feb400000000a0a7f69588aeed0567c8e5c31d1d"], "operation": 1 } +``` + +Response: + +```json +{ "result": [] } +``` + +#### 删除一个笔记 + +POST: `https://api.aliyundrive.com/anote/v1/note/batchUpdate` + +```json +{ "doc_ids": ["feb400000000a0a7f69588aeed0567c8e5c31d1d"], "operation": 2 } +``` + +Response: + +```json +{ "result": [] } +``` + +#### 新建一个笔记 + +POST: `https://api.aliyundrive.com/anote/v1/note/create` + +```json +{ "value": ["root", {}], "title": "", "drive_id": "" } +``` + +Response: + +```json +{ + "status": 0, + "top": 0, + "title": "", + "summary": "", + "media": "[]", + "type": "common", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "doc_id": "feb400000000a0a7f69588aeed0567c8e5c31d1d", + "drive_id": "9600002", + "created_at": 1647862805027, + "updated_at": 1647862805027, + "media_list": null +} +``` diff --git a/adrive sdk/offline.md b/adrive sdk/offline.md new file mode 100644 index 0000000..97cf2df --- /dev/null +++ b/adrive sdk/offline.md @@ -0,0 +1,13 @@ +#### 离线任务列表 + +POST: `https://api.aliyundrive.com/adrive/v1/offline/jobsList` + +```json +{} +``` + +Response: + +```json +{ "maxResults": 10, "nextToken": "", "result": [] } +``` diff --git a/adrive sdk/recyclebin.md b/adrive sdk/recyclebin.md new file mode 100644 index 0000000..40a4edf --- /dev/null +++ b/adrive sdk/recyclebin.md @@ -0,0 +1,115 @@ +#### 列出回收站 + +POST: `https://api.aliyundrive.com/v2/recyclebin/list` + +```json +{ "fields": "*", "all": false, "drive_id": "9600002", "limit": 50 } +``` + +Response: + +```json +{ + "items": [ + { + "drive_id": "9600002", + "domain_id": "bj29", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "name": "[1.3.1].mp4", + "type": "file", + "content_type": "application/oct-stream", + "created_at": "2022-01-19T04:51:12.832Z", + "updated_at": "2022-03-10T03:10:04.074Z", + "trashed_at": "2022-03-10T03:10:04.074Z", + "file_extension": "mp4", + "mime_type": "application/octet-stream", + "mime_extension": "unknown", + "hidden": false, + "size": 94814980, + "starred": false, + "status": "available", + "labels": ["艺术品"], + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "crc64_hash": "1548000000008183211", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "category": "video", + "encrypt_mode": "none", + "video_media_metadata": { + "width": 1280, + "height": 720, + "video_media_video_stream": [{ "duration": "1530.680000", "clarity": "720", "fps": "25/1", "code_name": "h264" }], + "video_media_audio_stream": [{ "duration": "1530.581333", "channels": 2, "channel_layout": "stereo", "bit_rate": "143625", "code_name": "aac", "sample_rate": "48000" }], + "duration": "1530.701333" + }, + "punish_flag": 0, + "creator_type": "User", + "creator_id": "9400000000bc480bbcbbb1e074f55a7f", + "creator_name": "myname", + "last_modifier_type": "User", + "last_modifier_id": "9400000000bc480bbcbbb1e074f55a7f", + "last_modifier_name": "myname", + "revision_id": "6138000000000b81a8164550b1e7cba1d7fbe111" + } + ], + "next_marker": "" +} +``` + +#### 恢复文件 + +POST: `https://api.aliyundrive.com/v2/recyclebin/restore` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002" } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 删除文件(放入回收站) + +POST: `https://api.aliyundrive.com/v2/recyclebin/trash` + +```json +{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 删除文件(从回收站彻底删除) + +POST: `https://api.aliyundrive.com/v3/file/delete` + +```json +{ "permanently": true, "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002" } +``` + +Response: + +```text +HTTP/1.1 204 No Content +``` + +#### 清空回收站 + +POST: `https://api.aliyundrive.com/v2/recyclebin/clear` + +```json +{ "drive_id": "9600002" } +``` + +Response: + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "task_id": "e026000000007f609bcd6aa71b8fde94" } +``` diff --git a/adrive sdk/reddot.md b/adrive sdk/reddot.md new file mode 100644 index 0000000..42fae9e --- /dev/null +++ b/adrive sdk/reddot.md @@ -0,0 +1,45 @@ +#### 订阅的账号有更新 + +POST: `https://api.aliyundrive.com/adrive/v1/reddot/get` + +```json +{} +``` + +Response: + +```json +{ + "items": [ + { + "code": "followed_user_has_new_activity", + "context": { + "creator": { + "description": "中国国家地理景观官方账号,带你领略目酣神醉的壮美景观、发现中国各地独具特色的人文胜迹。", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "中国国家地理景观", + "phone": "136***902" + } + } + } + ] +} +``` + +#### 标记已读 + +POST: `https://api.aliyundrive.com/adrive/v1/reddot/read` + +```json +{"code":"followed_user_has_new_activity"} +``` + +Response: + +```json +{} +``` + + + diff --git a/adrive sdk/sbox.md b/adrive sdk/sbox.md new file mode 100644 index 0000000..27b3fea --- /dev/null +++ b/adrive sdk/sbox.md @@ -0,0 +1,46 @@ +#### 保险箱 + +POST: `https://api.aliyundrive.com/v2/sbox/get` + +```json +{} +``` + +Response: + +```json +{ "drive_id": "9600002", "sbox_used_size": 0, "sbox_real_used_size": 0, "sbox_total_size": 53687091200, "recommend_vip": "svip", "pin_setup": true, "locked": true, "insurance_enabled": false } +``` + +#### 解锁 + +POST: `https://api.aliyundrive.com/v2/sbox/unlock` + +```json +{ + "drive_id": "9600002", + "app_id": "25dzX3vbYqktVxyX", + "encrypted_pin": "pteN00000000/gLZpQaFKA==", + "encrypted_key": "nNaV......r13doYbpmJxag==" +} +``` + +Response: + +```json +{ "drive_id": "9600002" } +``` + +#### 重新锁定 + +POST: `https://api.aliyundrive.com/v2/sbox/lock` + +```json +{"drive_id":"9600002"} +``` + +Response: + +```json +{ "drive_id": "9600002" } +``` diff --git a/adrive sdk/search.md b/adrive sdk/search.md new file mode 100644 index 0000000..631a1be --- /dev/null +++ b/adrive sdk/search.md @@ -0,0 +1,77 @@ +#### 首页 widgets + +POST: `https://api.aliyundrive.com/v2/file/search` + +```json +//截图 +{ + "return_total_count": true, + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "last_access_at DESC,updated_at DESC,image_time DESC", + "query": "(label = '手机截图' or label = '截图') and category in ['video','image'] and status = 'available' and hidden = false", + "limit": 100, + "drive_id": "9600002" +} +``` + +```json +//证件 +{ + "return_total_count": true, + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "last_access_at DESC,updated_at DESC,image_time DESC", + "query": "(label = '身份证明' or label = '证件' or label = '身份证' or label = '银行卡' or label = '护照') and category in ['video','image'] and status = 'available' and hidden = false", + "limit": 100, + "drive_id": "9600002" +} +``` + +```json +//最近图片 +{ + "return_total_count": true, + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "last_access_at DESC,updated_at DESC,image_time DESC", + "query": "category = 'image' and status = 'available' and hidden = false", + "limit": 100, + "drive_id": "9600002" +} +``` + +```json +//最近视频 +{ + "return_total_count": true, + "image_thumbnail_process": "image/resize,m_lfit,w_256,limit_0/format,jpg", + "order_by": "last_access_at DESC,updated_at DESC,image_time DESC", + "query": "category = 'video' and status = 'available' and hidden = false", + "limit": 100, + "drive_id": "9600002" +} +``` + +Response: + +```json +filelist +``` + +#### 列出人物(face)的图片 + +POST: `https://api.aliyundrive.com/v2/file/search` + +```json +{ + "drive_id": "9600002", + "limit": 100, + "order_by": "created_at DESC", + "query": "type = 'file' and category in ['image', 'video'] and face_group_id = 'Group-00000000-1703-4fc0-bf56-369478ed14df' and status = 'available' and hidden = false", + "return_total_count": true +} +``` + +Response: + +```json +filelist +``` diff --git a/adrive sdk/sfiia.md b/adrive sdk/sfiia.md new file mode 100644 index 0000000..4f2a707 --- /dev/null +++ b/adrive sdk/sfiia.md @@ -0,0 +1,45 @@ +#### 文件中的图片 + +POST: `https://api.aliyundrive.com/adrive/v1/sfiia/get_recommends` + +```json +{ "drive_id": "9600002" } +``` + +Response: + +```json +{ + "items": [ + { + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-10-16T02:10:51.625Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "png", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "labels": ["衣服", "外貌特征", "其他事物", "艺术品", "笑脸", "墨镜", "护目镜", "微笑", "颜色", "动画", "黄色"], + "mime_type": "image/png", + "name": "cool_11.png", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 80480, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2021-10-16T02:10:51.625Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..." + } + ], + "total_image_count": 28943 +} +``` diff --git a/adrive sdk/share.md b/adrive sdk/share.md new file mode 100644 index 0000000..5a4dc7f --- /dev/null +++ b/adrive sdk/share.md @@ -0,0 +1,551 @@ +#### 我创建的分享链接 + +POST: `https://api.aliyundrive.com/adrive/v3/share_link/list` + +```json +{ "category": "file,album", "order_direction": "DESC", "order_by": "created_at", "creator": "9400000000bc480bbcbbb1e074f55a7f", "limit": 100 } +``` + +Response: + +```json +{ + "items": [ + { + "popularity": 6, + "share_id": "9Q00000000L", + "share_msg": "「testali.alimc」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "share_name": "testali.alimc", + "description": "", + "expiration": "2022-04-08T10:29:22.000Z", + "expired": false, + "share_pwd": "", + "share_url": "https://www.aliyundrive.com/s/9Q00000000L", + "creator": "9400000000bc480bbcbbb1e074f55a7f", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "preview_count": 2, + "save_count": 0, + "download_count": 0, + "status": "enabled", + "created_at": "2022-03-09T10:29:23.272Z", + "updated_at": "2022-03-19T04:54:26.435Z", + "first_file": { + "trashed": false, + "category": "others", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2022-03-09T10:29:02.190Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "alimc", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "mime_type": "text/plain; charset=utf-8", + "name": "testali.alimc", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 7318, + "starred": false, + "status": "available", + "type": "file", + "updated_at": "2022-03-09T10:29:51.415Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}" + }, + "current_sync_status": 1, + "next_sync_status": 2, + "full_share_msg": "「testali.alimc」https://www.aliyundrive.com/s/9Q00000000L\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "popularity_str": "6", + "display_name": "testali.alimc" + }, + { + "album": { + "owner": "ccff000000004d75b5788a481eed8386", + "name": "fff", + "description": "", + "album_id": "cfe400000000478599575b69356c5a4962383669", + "file_count": 0, + "image_count": 0, + "video_count": 0, + "created_at": 1642306691089, + "updated_at": 1642306691089, + "is_sharing": true + }, + "popularity": 9, + "share_id": "9Q00000000L", + "share_msg": "我用阿里云盘分享了相簿「fff」,复制这段内容打开「阿里云盘」APP 即可获取。\n提取码: ni5u", + "share_name": "fff", + "description": "", + "expiration": "2022-04-06T03:56:13.839Z", + "expired": false, + "share_pwd": "ni5u", + "share_url": "https://www.aliyundrive.com/s/9Q00000000L", + "creator": "9400000000bc480bbcbbb1e074f55a7f", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "album_id": "cfe400000000478599575b69356c5a4962383669", + "preview_count": 4, + "save_count": 0, + "download_count": 0, + "status": "enabled", + "created_at": "2022-03-07T03:56:13.789Z", + "updated_at": "2022-03-09T13:37:25.895Z", + "full_share_msg": "相簿分享「fff」https://www.aliyundrive.com/s/9Q00000000L 提取码: ni5u\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP,使用相册备份节省手机空间,体验智能分类和回忆自动生成。", + "popularity_str": "9", + "display_name": "相簿 ∙ fff" + } + ], + "next_marker": "" +} +``` + +#### 读取一条自己的分享链接的信息 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/get` + +```json +{ "share_id": "9Q00000000L" } +``` + +Response: + +```json +{ + "popularity": 3, + "share_id": "9Q00000000L", + "share_msg": "「返回.gif」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "share_name": "返回.gif", + "description": "", + "expiration": "2022-04-20T04:41:04.509Z", + "expired": false, + "share_pwd": "", + "share_url": "https://www.aliyundrive.com/s/9Q00000000L", + "creator": "9400000000bc480bbcbbb1e074f55a7f", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "preview_count": 0, + "save_count": 0, + "download_count": 0, + "status": "enabled", + "created_at": "2021-11-09T17:47:43.516Z", + "updated_at": "2022-03-21T04:41:05.159Z", + "first_file": { + "trashed": false, + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-11-05T13:40:00.994Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "gif", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { + "exif": "{\"FileSize\":{\"value\":\"58391\"},\"Format\":{\"value\":\"gif\"},\"ImageHeight\":{\"value\":\"556\"},\"ImageWidth\":{\"value\":\"608\"}}", + "height": 556, + "image_quality": { "overall_score": 0.6453010439872742 }, + "width": 608 + }, + "labels": ["其他场景", "其他事物", "日常用品", "颜色", "文本", "手机截图", "信", "蓝色"], + "mime_type": "image/gif", + "name": "返回.gif", + "parent_file_id": "root", + "punish_flag": 0, + "size": 58391, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-01-24T10:53:36.473Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}" + }, + "current_sync_status": 1, + "next_sync_status": 2, + "popularity_str": "3", + "full_share_msg": "「返回.gif」https://www.aliyundrive.com/s/9Q00000000L\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "display_name": "返回.gif" +} +``` + +#### 复制分享链接到剪切板 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/get_share_msg` + +```json +{ "share_id": "9Q00000000L" } +``` + +Response: + +```json +{ "full_share_msg": "「返回.gif」https://www.aliyundrive.com/s/9Q00000000L\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", "share_url": "https://www.aliyundrive.com/s/9Q00000000L" } +``` + +#### 修改分享链接 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/update` + +```json +{ "share_id": "9Q00000000L", "expiration": "2022-04-20T04:41:04.509Z" } +``` + +Response: + +```json +{ + "popularity": 3, + "share_id": "9Q00000000L", + "share_msg": "「返回.gif」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "share_name": "返回.gif", + "description": "", + "expiration": "2022-04-20T04:41:04.509Z", + "expired": false, + "share_pwd": "", + "share_url": "https://www.aliyundrive.com/s/9Q00000000L", + "creator": "9400000000bc480bbcbbb1e074f55a7f", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "preview_count": 0, + "save_count": 0, + "download_count": 0, + "status": "enabled", + "created_at": "2021-11-09T17:47:43.516Z", + "updated_at": "2022-03-21T04:41:05.159Z", + "first_file": { + "trashed": false, + "category": "image", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-11-05T13:40:00.994Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "gif", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "image_media_metadata": { + "height": 556, + "image_quality": { "overall_score": 0.6453010439872742 }, + "width": 608 + }, + "labels": ["其他场景", "其他事物", "日常用品", "颜色", "文本", "手机截图", "信", "蓝色"], + "mime_type": "image/gif", + "name": "返回.gif", + "parent_file_id": "root", + "punish_flag": 0, + "size": 58391, + "starred": false, + "status": "available", + "thumbnail": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "type": "file", + "updated_at": "2022-01-24T10:53:36.473Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}" + }, + "current_sync_status": 1, + "next_sync_status": 2, + "popularity_str": "3", + "full_share_msg": "「返回.gif」https://www.aliyundrive.com/s/9Q00000000L\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "display_name": "返回.gif" +} +``` + +#### 删除分享链接 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/cancel` + +```json +{ "share_id": "9Q00000000L" } +``` + +Response: + +```text +HTTP/1.1 200 OK +``` + +#### 创建分享链接 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/create` + +```json +{ "drive_id": "9600002", "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], "expiration": "2022-04-20T08:01:05.278Z" } +``` + +Response: + +```json +{ + "popularity": 3, + "share_id": "9Q00000000L", + "share_msg": "「dotull_x86.exe」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "share_name": "dotull_x86.exe", + "description": "", + "expiration": "2022-04-20T08:01:05.278Z", + "expired": false, + "share_pwd": "", + "share_url": "https://www.aliyundrive.com/s/9Q00000000L", + "creator": "9400000000bc480bbcbbb1e074f55a7f", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_id_list": ["6228000000002c31be704ca28671f09712894f4f"], + "preview_count": 0, + "save_count": 0, + "download_count": 0, + "status": "enabled", + "created_at": "2022-03-21T08:01:03.739Z", + "updated_at": "2022-03-21T08:01:03.739Z", + "first_file": { + "trashed": false, + "category": "others", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-12-05T02:05:08.125Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "exe", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "mime_type": "application/vnd.microsoft.portable-executable", + "name": "dotull_x86.exe", + "parent_file_id": "root", + "punish_flag": 0, + "size": 50449456, + "starred": false, + "status": "available", + "type": "file", + "updated_at": "2021-12-05T02:05:08.125Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}" + }, + "is_photo_collection": false, + "sync_to_homepage": false, + "full_share_msg": "「dotull_x86.exe」https://www.aliyundrive.com/s/9Q00000000L\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。", + "popularity_str": "3", + "display_name": "dotull_x86.exe" +} +``` + +#### 检查是否可以分享 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/check_available` + +```json +{ "drive_file_list": [{ "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba" }] } +``` + +Response: + +```json +{ + "invalid_items": [ + { + "trashed": false, + "category": "others", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "content_hash_name": "sha1", + "content_type": "application/oct-stream", + "crc64_hash": "1548000000008183211", + "created_at": "2021-12-05T02:42:36.249Z", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "drive_id": "9600002", + "encrypt_mode": "none", + "file_extension": "qrc", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "hidden": false, + "mime_type": "application/octet-stream", + "name": "赵希予 - 克莱因蓝 - 186 - 克莱因蓝_qm.qrc", + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "punish_flag": 0, + "size": 3979, + "starred": false, + "status": "available", + "type": "file", + "updated_at": "2022-03-21T13:16:16.209Z", + "upload_id": "ED12000000004724833D47B5D5D3C8B9", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}" + } + ] +} +``` + +#### 分析出 shareid(必须是规范的格式) + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/extract_code` + +```json +{ "content": "「The.Battle.at.L...获取更多免费资源.mkv」https://www.aliyundrive.com/s/9Q00000000L 提取码: f259\n点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。" } +``` + +Response: + +```json +{ "code": "200", "message": "success", "data": { "share_id": "9Q00000000L", "share_pwd": "f259" }, "resultCode": "200" } +``` + +#### 读取分享链接信息 + +POST: `https://api.aliyundrive.com/adrive/v2/share_link/get_share_by_anonymous` + +```json +{ "share_id": "9Q00000000L" } +``` + +Response: + +```json +{ + "creator_id": "deb7000972d84bb6bfa74e42b22beb07", + "creator_name": "霸***组", + "creator_phone": "157***610", + "expiration": "", + "updated_at": "2022-03-22T03:16:01.088Z", + "vip": "non-vip", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "share_name": "军检察官多伯曼犬", + "file_count": 1, + "allow_subscribe": false, + "is_creator_followable": true, + "is_following_creator": true, + "display_name": "军检察官多伯曼犬", + "file_infos": [{ "type": "folder", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "file_name": "军检察官多伯曼犬" }] +} +``` + +#### 打开分享链接 + +POST: `https://api.aliyundrive.com/v2/share_link/get_share_token` + +```json +{ "share_id": "9Q00000000L", "share_pwd": "" } +``` + +Response: + +```json +{ + "share_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjdXN0b21Kc29uIjoie1wiZG9tYWluX2lkXCI6XCJiajI5XCIsXCJzaGFyZV9pZFwiOlwiaTJRVllCVVVWQ1dcIixcImNyZWF0b3JcIjpcImNjZmY3ZDYwZWZkZjRkNzRiNTc4OGE0ODFlZWQ4Mzg2XCIsXCJ1c2VyX2lkXCI6XCJhbm9ueW1vdXNcIn0iLCJjdXN0b21UeXBlIjoic2hhcmVfbGluayIsImV4cCI6MTY0Nzg3NjM0MCwiaWF0IjoxNjQ3ODY5MDgwfQ.O-wrga-HmgbN4KUWFEhUDozvFu5qV0sn0ntjzbfGpExWQ9yzPCdxVNi-A-wmXtOHNJ5xwnA2GZnX-FsZZ1EQauaOjSswmcc5xsjEenx1ohJVpXPKgl0iKhd9BmmpURZ_4uByhgXFIcEux-Rob22wyt3_NvvfZotVKrvW-pn0Ne8", + "expire_time": "2022-03-21T15:25:40.247Z", + "expires_in": 7200 +} +``` + +#### 分享链接内文件的下载地址 + +POST: `https://api.aliyundrive.com/v2/file/get_share_link_download_url` + +```json +{ "drive_id": "9600002", "share_id": "9Q00000000L", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "expire_sec": 600 } +``` + +Response: + +```json +{ + "download_url": "https://pdsapi.aliyundrive.com/v2/redirect?id=a8c5bda295434d4987610b391010bbd5", + "url": "https://pdsapi.aliyundrive.com/v2/redirect?id=8b59b11717984cab801f651f6503f064", + "thumbnail": "https://pdsapi.aliyundrive.com/v2/redirect?id=e511a261a19949399d9a2ab7cb0bc31a" +} +``` + +#### 分享链接内文件的预览地址 + +POST: `https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info` + +```json +{ "share_id": "9Q00000000L", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "category": "live_transcoding", "template_id": "", "get_preview_url": true } +``` + +Response: + +```json +{ + "share_id": "9Q00000000L", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "video_preview_play_info": { + "category": "live_transcoding", + "meta": { "duration": 1464.669, "width": 672, "height": 504, "live_transcoding_meta": { "ts_segment": 10, "ts_total_count": 147, "ts_pre_count": 3 } }, + "live_transcoding_task_list": [ + { + "template_id": "SD", + "template_name": "pdsSD", + "status": "finished", + "stage": "stage_none", + "url": "https://pdsapi.aliyundrive.com/v2/redirect?id=15b59a72f8904636bbca16bfa64fbd6d", + "preview_url": "https://pdsapi.aliyundrive.com/v2/redirect?id=467363f46e1e490fa5811ba52c320744", + "keep_original_resolution": true + } + ] + } +} +``` + +#### 标记一个分享链接已读 + +POST: `https://api.aliyundrive.com/adrive/v1/share_link/subscription/update` + +```json +{ "share_id": "9Q00000000L", "update_last_seen": true } +``` + +Response: + +```json +{} +``` + +#### 导入分享 + +POST: `https://api.aliyundrive.com/adrive/v1/file/copy` + +```json +{"body":{"auto_rename":true,"addition_data":{"umidtoken":"EmdLeXVLOsU9pTV/tFcskzsD8K4J80Ol"},"to_drive_id":"9600002","to_parent_file_id":"root","share_id":"ob7csMtYs9S","file_id":"619b000000006a42a4c143a99dd261777b2e149d"} +``` + +Response: + +```json +{ "domain_id": "bj29", "drive_id": "9600002", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb" } +``` + +POST: `https://api.aliyundrive.com/v2/async_task/get` + +```json +{ "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb" } +``` + +Response: + +```json +{ "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb", "state": "Running", "message": "task is running", "total_process": 0, "consumed_process": 0, "punished_file_count": 0 } +``` + +```json +{ "async_task_id": "9fcb1e1d-0000-0000-b30d-387e04dcafcb", "state": "Succeed", "total_process": 0, "consumed_process": 0, "punished_file_count": 0 } +``` diff --git a/adrive sdk/timeline.md b/adrive sdk/timeline.md new file mode 100644 index 0000000..99b2146 --- /dev/null +++ b/adrive sdk/timeline.md @@ -0,0 +1,73 @@ +#### 用户信息 + +POST: `https://api.aliyundrive.com/adrive/v1/timeline/user/get` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f" } +``` + +Response: + +```json +{ + "description": "", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "myname", + "phone": "151***111", + "is_following": false, + "follower_count": 0, + "homepage_visibility": 1, + "latest_messages": [], + "homepage_visible_time_range_text": "三个月", + "homepage_visible_time_range_in_millis": 7776000000 +} +``` + +#### 用户发布的动态 + +POST: `https://api.aliyundrive.com/adrive/v1/timeline/homepage/list_message` + +```json +{ "order_direction": "DESC", "user_id": "9400000000bc480bbcbbb1e074f55a7f", "limit": 10 } +``` + +Response: + +```json +{ "items": [], "pin_items": [] } +``` + +#### 推荐订阅 + +POST: `https://api.aliyundrive.com/adrive/v1/timeline/user/recommend` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f", "limit": 20, "order_by": "updated_at", "order_direction": "DESC" } +``` + +Response: + +```json +{ + "items": [ + { + "description": "Hi~小可爱!感恩关注~盘盘酱会不定时发放福利哦!让盘酱陪伴你更久✧( •˓◞•̀ ) ", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "阿里盘盘酱", + "phone": "131***325", + "is_following": true + }, + { + "description": "中国国家地理景观官方账号,带你领略目酣神醉的壮美景观、发现中国各地独具特色的人文胜迹。", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "中国国家地理景观", + "phone": "136***902", + "is_following": true + } + ], + "next_marker": "MjA=" +} +``` diff --git a/adrive sdk/token.md b/adrive sdk/token.md new file mode 100644 index 0000000..8ef30c5 --- /dev/null +++ b/adrive sdk/token.md @@ -0,0 +1,44 @@ +#### 网页版登录 + +POST: `https://api.aliyundrive.com/token/get` + +```json +{ "code": "f98788cef51641728f2aad9c64a96a63", "loginType": "normal", "deviceId": "CPH800000000AbfFPI5QSJjO" } +``` + +Response: + +```json +{ + "default_sbox_drive_id": "9600002", + "role": "user", + "user_name": "151***111", + "need_link": false, + "expire_time": "2022-03-21T09:48:46Z", + "pin_setup": true, + "need_rp_verify": false, + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "user_data": { + "DingDingRobotUrl": "https://oapi.dingtalk.com/robot/send?access_token=0b4a00000000c08608cd99f693393c18fa905aa0868215485a28497501916fec", + "EncourageDesc": "内测期间有效反馈前10名用户将获得终身免费会员", + "FeedBackSwitch": true, + "FollowingDesc": "34848372", + "ding_ding_robot_url": "https://oapi.dingtalk.com/robot/send?access_token=0b4a00000000c08608cd99f693393c18fa905aa0868215485a28497501916fec", + "encourage_desc": "内测期间有效反馈前10名用户将获得终身免费会员", + "feed_back_switch": true, + "following_desc": "34848372" + }, + "token_type": "Bearer", + "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9......aixJ4k", + "default_drive_id": "9600002", + "domain_id": "bj29", + "refresh_token": "82ad000000004fbda61b01b5a5cf103b", + "is_first_login": false, + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "nick_name": "mynane", + "exist_link": [], + "state": "", + "expires_in": 7200, + "status": "enabled" +} +``` diff --git a/adrive sdk/user.md b/adrive sdk/user.md new file mode 100644 index 0000000..3a194a9 --- /dev/null +++ b/adrive sdk/user.md @@ -0,0 +1,487 @@ +#### 首页 widgets + +POST: `https://api.aliyundrive.com/apps/v1/users/apps/widgets` + +```json + +``` + +Response: + +```json +最近转存,你订阅的分享者有更新了... +``` + +#### 用户信息 + +POST: `https://api.aliyundrive.com/v2/user/get` + +```json +{} +``` + +Response: + +```json +{ + "domain_id": "bj29", + "user_id": "9400000000bc480bbcbbb1e074f55a7f", + "avatar": "https://ccp-bj29-bj-1592982087.oss-cn-beijing.aliyuncs.com/2GhCur3G%2F...", + "created_at": 1623212076923, + "updated_at": 1636164094577, + "email": "", + "nick_name": "mynane", + "phone": "15100000111", + "role": "user", + "status": "enabled", + "user_name": "151***111", + "description": "", + "default_drive_id": "9600002", + "user_data": {}, + "deny_change_password_by_self": false, + "need_change_password_next_login": false, + "creator": "", + "permission": null +} +``` + +#### 用户信息 + +POST: `https://api.aliyundrive.com/v2/user/update` + +```json +{ "user_id": "9400000000bc480bbcbbb1e074f55a7f", "nick_name": "n_mynane4" } +//用户可以修改自己的description,nick_name,avatar +``` + +Response: + +```json +同上userinfo +``` + +#### 已用空间 + +POST: `https://api.aliyundrive.com/adrive/v1/user/driveCapacityDetails` + +```json + +``` + +Response: + +```json +{ "drive_used_size": 7436100078094 } +``` + +#### 相册 driveId + +POST: `https://api.aliyundrive.com/adrive/v1/user/albums_info` + +```json +{} +``` + +Response: + +```json +{ "code": "200", "message": "success", "data": { "driveId": "9600002", "driveName": "alibum" }, "resultCode": "200" } +``` + +#### 实名信息 + +POST: `https://api.aliyundrive.com/adrive/v1/user_verify/get` + +```json +{} +``` + +Response: + +```json +{ "name": "*名子", "rp_verify_status": "pass", "card_number": "1****************3" } +``` + +#### 用户信息(vip+空间) + +POST: `https://api.aliyundrive.com/v2/databox/get_personal_info` + +```json +{} +``` + +Response: + +```json +{ + "personal_rights_info": { + "spu_id": "non-vip", + "name": "普通用户", + "is_expires": false, + "privileges": [ + { "feature_id": "download", "feature_attr_id": "speed_limit", "quota": -1 }, + { "feature_id": "drive", "feature_attr_id": "size_limit", "quota": 107374182400 }, + { "feature_id": "safe_box", "feature_attr_id": "size_limit", "quota": 53687091200 }, + { "feature_id": "upload", "feature_attr_id": "size_limit", "quota": 2199023255552 }, + { "feature_id": "video", "feature_attr_id": "backup", "quota": 1 }, + { "feature_id": "video", "feature_attr_id": "clarity_limit", "quota": 3 } + ] + }, + "personal_space_info": { "used_size": 7436100078094, "total_size": 8946416877568 } +} +``` + +#### 云服务授权管理 + +POST: `https://api.aliyundrive.com/apps/v1/users/list_app_permissions` + +```json + +``` + +Response: + +```json +{ "result": [] } +``` + +#### 登录设备列表 + +POST: `https://api.aliyundrive.com/users/v1/users/device_list` + +```json + +``` + +Response: + +```json +{ + "result": [ + { "deviceId": "q2e900000000ASdqMZ/pXgt7", "deviceName": "Chrome浏览器", "modelName": "Windows网页版", "city": "北京市", "loginTime": "2022-03-20 08:52" }, + { "deviceId": "SyQo00000000AbfHgMQi2AXv", "deviceName": "Chrome浏览器", "modelName": "Windows网页版", "city": "北京市", "loginTime": "2022-03-01 08:28" } + ] +} +``` + +#### 登录设备列表下线 + +> 需要先短信验证,获取 umidToken +> POST: `https://api.aliyundrive.com/users/v1/users/device_offline` + +```json +{ "deviceId": "q2e900000000ASdqMZ/pXgt7", "token": "CN-SPLIT-AQiE_......zdaLa2BOqAzuwCl3TS5Vp68qw", "umidToken": "dhhL00000000BzV/qXrSsXhU3k6buc1a" } +``` + +Response: + +```json +{ "result": true } +``` + +#### 未知(相册合并?) + +POST: `https://api.aliyundrive.com/adrive/v1/user/albums_migration` + +```json +{} +``` + +Response: + +```json +{ "code": "200", "message": "success", "data": { "hasMigrateData": false, "drive": { "driveId": "9600002", "driveName": "alibum" } }, "resultCode": "200" } +``` + +#### 上报登录设备 + +POST: `https://api.aliyundrive.com/users/v1/users/device` + +```json +{ + "modelName": "iPad4,4", + "refreshToken": "3b920000000043f19fbc6b65c8dea11c", + "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9......", + "deviceName": "iPad" +} +``` + +Response: + +```json +{ "result": true } +``` + +#### 兑换福利码 + +POST: `https://member.aliyundrive.com/v1/users/rewards` + +```json +{ "code": "山山水水" } +``` + +Response: + +```json +{ "success": false, "code": "30002", "message": "请输入有效的福利码", "totalCount": null, "nextToken": null, "maxResults": null, "result": { "message": "请输入有效的福利码" }, "arguments": null } +``` + +#### 容量明细 + +https://pages.aliyundrive.com/mobile-page/capacitymanager.html?disableNav=YES + +POST: `https://api.aliyundrive.com/adrive/v1/user/capacityDetails` + +```json + +``` + +Response: + +```json +{ + "capacity_details": [ + { "type": "MEMBER_TASK", "size": 107374182400, "expired": "2022-10-14T05:01:48.935Z", "description": "完成福利社任务", "latest_receive_time": "2021-07-09T11:15:42.845Z" }, + { "type": "NEW_USER", "size": 107374182400, "expired": "permanent", "description": "新用户赠礼", "latest_receive_time": "2021-05-14T07:11:03.521Z" }, + { "type": "REWARD_CODE", "size": 536870912000, "expired": "permanent", "description": "兑换福利码", "latest_receive_time": "2022-02-21T12:08:58.000Z" }, + { "type": "BETA", "size": 3298534883328, "expired": "permanent_condition", "description": "内测专享", "latest_receive_time": "2021-03-18T05:01:21.118Z" }, + { "type": "MEMBER_TASK", "size": 107374182400, "expired": "2021-07-08T11:15:42.905Z", "description": "完成福利社任务", "latest_receive_time": "2021-03-18T05:02:28.160Z" } + ] +} +``` + +#### 福利社任务列表 + +POST: `https://member.aliyundrive.com/v1/users/task_list` + +```json + +``` + +Response: + +```json +{ + "success": true, + "code": null, + "message": null, + "totalCount": null, + "nextToken": null, + "maxResults": null, + "result": [ + { + "idempotent": "5dd6000000004283a4be19f4a5ab647a", + "position": 10, + "id": "51", + "name": "邀请好友用云盘", + "code": "referral", + "actionType": "openLink", + "action": "smartdrive://vipcenter/referral", + "url": "https://pages.aliyundrive.com/mobile-page/web/invitefriends.html", + "appName": null, + "description": "+800G/人", + "backgroundImage": "https://img.alicdn.com/imgextra/i4/O1CN016LFIjK1SRL72iovyX_!!6000000002243-2-tps-819-456.png", + "backgroundColor": "#D9E8FF", + "darkBackgroundColor": "#D9E8FF", + "textColor": "#6FBEEB", + "darkTextColor": "#6FBEEB", + "status": "unfinished", + "createdAt": 1644718396417, + "finishedAt": null, + "notice": "容量一年有效", + "topRightCorner": "限时任务", + "detailName": "", + "detailDescription": "https://pages.aliyundrive.com/mobile-page/web/beinvited.html?code=", + "detailBackgroundImage": "", + "detailIntroduction": null, + "rewards": [{ "icon": "https://img.alicdn.com/imgextra/i1/O1CN015KvMU11Yj65cGXGCp_!!6000000003094-2-tps-72-72.png", "name": "", "description": "有效期一年" }], + "detailRewardNotice": "", + "process": { "current": 0, "max": 0 }, + "statusNotice": "", + "explain": null, + "referral": null, + "monthlyCard": null, + "popUps": null, + "shareFissions": null, + "subTasks": null, + "shareAction": null, + "darenShareViewModel": null + }, + { + "idempotent": "80bf00000000442b90368c27a7ec3443", + "position": 3, + "id": "66", + "name": "第四周·周任务", + "code": "adrive", + "actionType": "openNative", + "action": "smartdrive://vipcenter/opentaskcarddetail?taskId=66", + "url": "", + "appName": null, + "description": "阿里云盘VIP免费领", + "backgroundImage": "https://img.alicdn.com/imgextra/i3/O1CN01HK76N21tBlGdfXcjm_!!6000000005864-2-tps-1029-612.png", + "backgroundColor": null, + "darkBackgroundColor": null, + "textColor": "#FFD601", + "darkTextColor": "#FFD601", + "status": "finished", + "createdAt": 1645953637620, + "finishedAt": 1647857247562, + "notice": "一个月 VIP", + "topRightCorner": "周年庆", + "detailName": "第四周·周任务", + "detailDescription": "阿里云盘VIP免费领", + "detailBackgroundImage": "https://img.alicdn.com/imgextra/i3/O1CN01HK76N21tBlGdfXcjm_!!6000000005864-2-tps-1029-612.png", + "detailIntroduction": null, + "rewards": [{ "icon": "https://gw.alicdn.com/imgextra/i3/O1CN01nl3rNq1PWQc5cpUWQ_!!6000000001848-2-tps-72-72.png", "name": "阿里云盘VIP", "description": "完成两个任务即可获得1个月阿里云盘VIP " }], + "detailRewardNotice": "", + "process": { "current": 2, "max": 0 }, + "statusNotice": "领取阿里云盘VIP", + "explain": { "title": "活动说明:\r\n1. 活动期为2022年3月21日-3月27日。\r\n2. 任务福利将于4月30日开启兑换,所有会员福利最晚兑换时间为2022年6月30日,过期后不可兑换。", "description": "" }, + "referral": null, + "monthlyCard": null, + "popUps": null, + "shareFissions": null, + "subTasks": null, + "shareAction": null, + "darenShareViewModel": null + } + ], + "arguments": null +} +``` + +#### 福利社任务详情 + +POST: `https://member.aliyundrive.com/v1/users/task_detail` + +```json +{ "taskId": "51" } +``` + +Response: + +```json +{ + "idempotent": "5dd6000000004283a4be19f4a5ab647a", + "position": 10, + "id": "51", + "name": "邀请好友用云盘", + "code": "referral", + "actionType": "openLink", + "action": "smartdrive://vipcenter/referral", + "url": "https://pages.aliyundrive.com/mobile-page/web/invitefriends.html", + "appName": null, + "description": "+800 GB/人 一年有效", + "backgroundImage": "https://img.alicdn.com/imgextra/i4/O1CN016LFIjK1SRL72iovyX_!!6000000002243-2-tps-819-456.png", + "backgroundColor": "#D9E8FF", + "darkBackgroundColor": "#D9E8FF", + "textColor": "#FFD601", + "darkTextColor": "#FFD601", + "status": "unfinished", + "createdAt": 1644718396417, + "finishedAt": null, + "notice": "", + "topRightCorner": "限时任务", + "detailName": "", + "detailDescription": "https://pages.aliyundrive.com/mobile-page/web/beinvited.html?code=", + "detailBackgroundImage": "", + "detailIntroduction": null, + "rewards": [{ "icon": "https://img.alicdn.com/imgextra/i1/O1CN015KvMU11Yj65cGXGCp_!!6000000003094-2-tps-72-72.png", "name": "", "description": "有效期一年" }], + "detailRewardNotice": "", + "process": { "current": 0, "max": 0 }, + "statusNotice": "", + "explain": null, + "referral": { + "reward": 300, + "userSignupAmount": 10, + "userAmount": 10, + "newUserTask": 10, + "availableReward": 0, + "verificationReward": 8000, + "limitReward": 8000, + "shortURL": "https://pages.aliyundrive.com/mobile-page/web/beinvited.html?code=0000007" + }, + "monthlyCard": null, + "popUps": null, + "shareFissions": null, + "subTasks": null, + "shareAction": null, + "darenShareViewModel": null +} +``` + +#### 福利社任务批量详情 + +POST: `https://member.aliyundrive.com/v1/users/batch_task_detail` + +```json +{ "taskIds": ["52", "55", "58", "66", "69"] } +``` + +Response: + +```json +[ + { + "idempotent": "80bf00000000442b90368c27a7ec3443", + "position": 3, + "id": "66", + "name": "第四周·周任务", + "code": "adrive", + "actionType": "openNative", + "action": "smartdrive://vipcenter/opentaskcarddetail?taskId=66", + "url": "", + "appName": null, + "description": "阿里云盘VIP免费领", + "backgroundImage": "https://img.alicdn.com/imgextra/i3/O1CN01HK76N21tBlGdfXcjm_!!6000000005864-2-tps-1029-612.png", + "backgroundColor": null, + "darkBackgroundColor": null, + "textColor": "#FFD601", + "darkTextColor": "#FFD601", + "status": "finished", + "createdAt": 1645953637620, + "finishedAt": 1647857247562, + "notice": "一个月 VIP", + "topRightCorner": "周年庆", + "detailName": "第四周·周任务", + "detailDescription": "阿里云盘VIP免费领", + "detailBackgroundImage": "https://img.alicdn.com/imgextra/i3/O1CN01HK76N21tBlGdfXcjm_!!6000000005864-2-tps-1029-612.png", + "detailIntroduction": null, + "rewards": [{ "icon": "https://gw.alicdn.com/imgextra/i3/O1CN01nl3rNq1PWQc5cpUWQ_!!6000000001848-2-tps-72-72.png", "name": "阿里云盘VIP", "description": "完成两个任务即可获得1个月阿里云盘VIP " }], + "detailRewardNotice": "", + "process": { "current": 2, "max": 0 }, + "statusNotice": "领取阿里云盘VIP", + "explain": { "title": "活动说明:\r\n1. 活动期为2022年3月21日-3月27日。\r\n2. 任务福利将于4月30日开启兑换,所有会员福利最晚兑换时间为2022年6月30日,过期后不可兑换。", "description": "" }, + "referral": null, + "monthlyCard": null, + "popUps": null, + "shareFissions": null, + "subTasks": [ + { + "id": 67, + "name": "订阅一个云盘订阅号", + "actionType": "openNative", + "action": "smartdrive://app/subscription", + "url": "", + "idempotent": "0c260000000042d493714b53fc6da210", + "status": "finished", + "statusNotice": "已完成", + "position": 0 + }, + { + "id": 68, + "name": "转存一个订阅号分享的文件", + "actionType": "openNative", + "action": "smartdrive://userpage/openroot?userId=ec11691148db442aa7aa374ca707543c", + "url": "", + "idempotent": "369f000000004f188d85e7f682f9633f", + "status": "finished", + "statusNotice": "已完成", + "position": 0 + } + ], + "shareAction": null, + "darenShareViewModel": null + } +] +``` diff --git a/adrive sdk/video.md b/adrive sdk/video.md new file mode 100644 index 0000000..c39c1c2 --- /dev/null +++ b/adrive sdk/video.md @@ -0,0 +1,257 @@ +#### 放映室-列出全部专辑 + +POST: `https://api.aliyundrive.com/adrive/v2/video/list` + +```json +{ "use_compilation": true, "duration": 0, "order_by": "created_at desc", "hidden_type": "NO_HIDDEN", "limit": 50 } +``` + +Response: + +```json +{ + "items": [ + { + "name": "hotel.2022.mp4", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_120000,f_jpg,w_480,ar_auto,m_fast", + "type": "file", + "category": "video", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "size": 2623499628, + "starred": false, + "duration": "0", + "independent": true, + "parent_file_id": "root", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_extension": "mp4", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"client\":\"web\"}", + "content_type": "application/oct-stream", + "created_at": "2022-03-20T04:26:18.082+00:00", + "updated_at": "2022-03-20T04:26:18.082+00:00", + "trashed_at": null, + "punish_flag": 1, + "video_type": "COMMON", + "video_hidden": false, + "play_cursor": "0", + "video_media_metadata": {}, + "video_preview_metadata": { "bitrate": "3996225", "duration": "5251.955000", "height": 1040, "width": 1920, "audio_format": "aac", "frame_rate": "24000/1001" }, + "compilation_id": "9600002_6236000000001b86cee34bdab3a5ad1d4d0cd676", + "grand_parent_file_id": null + }, + { + "name": "总复习", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_120000,f_jpg,w_480,ar_auto,m_fast", + "created_at": "2022-01-23T04:21:54.470+00:00", + "updated_at": "2022-01-23T04:21:54.743+00:00", + "trashed_at": null, + "video_type": "COMPILATION", + "video_hidden": false, + "video_nums": "7", + "compilation_id": "9600002_61ec000000009a6068fe4c67936d781b6c2fced2" + } + ], + "next_marker": "" +} +``` + +#### 放映室-最近播放 + +POST: `https://api.aliyundrive.com/adrive/v2/video/recentList` + +```json +{} +``` + +Response: + +```json +{ + "items": [ + { + "name": "综合复习.mp4", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_125201,f_jpg,w_480,ar_auto,m_fast", + "size": 167238406, + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_extension": "mp4", + "drive_id": "9600002", + "duration": "1800.80", + "play_cursor": "125.201", + "last_played_at": "2022-03-19T13:46:04.000+00:00", + "compilation_id": "9600002_61ec000000009a6068fe4c67936d781b6c2fced2" + } + ] +} +``` + +#### 列出一个专辑包含的文件 + +POST: `https://api.aliyundrive.com/adrive/v2/video/compilation/list` + +```json +{ "duration": 0, "hidden_type": "NO_HIDDEN", "name": "总复习", "limit": 50 } +``` + +Response: + +```json +{ + "items": [ + { + "name": "热点复习.mp4", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_120000,f_jpg,w_480,ar_auto,m_fast", + "type": "file", + "category": "video", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "size": 181714186, + "starred": false, + "duration": "1800.080000", + "labels": ["其他场景", "内部场景"], + "independent": false, + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_extension": "mp4", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "content_type": "application/oct-stream", + "created_at": "2022-01-23T04:21:54.563+00:00", + "updated_at": "2022-01-23T04:21:54.563+00:00", + "trashed_at": null, + "punish_flag": 0, + "video_type": "COMMON", + "video_hidden": false, + "play_cursor": "0", + "video_media_metadata": { + "duration": "1800.080000", + "height": 1080, + "width": 1920 + }, + "video_preview_metadata": { "bitrate": "807582", "duration": "1800.080000", "height": 1080, "width": 1920, "audio_format": "aac", "frame_rate": "25/1", "template_list": [{ "status": "finished", "template_id": "HD" }] }, + "compilation_id": "9600002_61ec000000009a6068fe4c67936d781b6c2fced2", + "grand_parent_file_id": null + } + ], + "next_marker": "" +} +``` + +#### 从专辑里隐藏一个文件 + +POST: `https://api.aliyundrive.com/adrive/v2/video/update` + +```json +{ "play_cursor": "0", "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "drive_id": "9600002", "hidden": true } +``` + +Response: + +```json +{ + "name": "热点复习.mp4", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_0,f_jpg,w_480,ar_auto,m_fast", + "type": "file", + "category": "video", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "size": 181714186, + "starred": false, + "duration": "1800.080000", + "labels": ["其他场景", "内部场景"], + "independent": true, + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_extension": "mp4", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "content_type": "application/oct-stream", + "created_at": "2022-01-23T04:21:54.563+00:00", + "updated_at": "2022-01-23T04:21:54.563+00:00", + "trashed_at": null, + "punish_flag": 0, + "video_hidden": true, + "play_cursor": "0", + "video_media_metadata": { + "duration": "1800.080000", + "height": 1080, + "width": 1920 + }, + "video_preview_metadata": { "bitrate": "807582", "duration": "1800.080000", "height": 1080, "width": 1920, "audio_format": "aac", "frame_rate": "25/1", "template_list": [{ "status": "finished", "template_id": "HD" }] }, + "grand_parent_file_id": null +} +``` + +#### 播放列表(根据一个文件,列出同专辑的文件列表) + +POST: `https://api.aliyundrive.com/adrive/v2/video/compilation/listByFileInfo` + +```json +{ "file_id": "623b00000000d89ef21d4118838aed83de7575ba", "limit": "100", "drive_id": "9600002" } +``` + +Response: + +```json +{ + "items": [ + { + "name": "热点复习.mp4", + "thumbnail": "https://api.aliyundrive.com/v2/file/download?drive_id=9600002&file_id=623b00000000d89ef21d4118838aed83de7575ba&video_thumbnail_process=video/snapshot,t_120000,f_jpg,w_480,ar_auto,m_fast", + "type": "file", + "category": "video", + "url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "size": 181714186, + "starred": false, + "duration": "1800.080000", + "labels": ["其他场景", "内部场景"], + "independent": false, + "parent_file_id": "613800000000336ae9164455b135a9729a298c9c", + "drive_id": "9600002", + "file_id": "623b00000000d89ef21d4118838aed83de7575ba", + "file_extension": "mp4", + "content_hash": "4DBF0000000023E6E756C29AF6AC487217921D53", + "domain_id": "bj29", + "download_url": "https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F...", + "user_meta": "{\"play_cursor\":\"0\"}", + "content_type": "application/oct-stream", + "created_at": "2022-01-23T04:21:54.563+00:00", + "updated_at": "2022-03-21T09:39:07.226+00:00", + "trashed_at": null, + "punish_flag": 0, + "video_type": "COMMON", + "video_hidden": true, + "play_cursor": "0", + "video_media_metadata": { + "duration": "1800.080000", + "height": 1080, + "width": 1920 + }, + "video_preview_metadata": { "bitrate": "807582", "duration": "1800.080000", "height": 1080, "width": 1920, "audio_format": "aac", "frame_rate": "25/1", "template_list": [{ "status": "finished", "template_id": "HD" }] }, + "compilation_id": "9600002_61ec000000009a6068fe4c67936d781b6c2fced2", + "grand_parent_file_id": null + } + ], + "next_marker": "" +} +//警告:无用的next_marker +``` + + +#### 播放-更新播放进度 + +POST: `https://api.aliyundrive.com/adrive/v2/video/update` + +```json +{"drive_id":"9600002","duration":"616.235","file_extension":"mp4","file_id":"623b00000000d89ef21d4118838aed83de7575ba","name":"样本.mp4","play_cursor":"148.298","thumbnail":"https://bj29.cn-beijing.data.alicloudccp.com/2GhCur3G%2F..."} +``` + +Response: + +```json +file +``` \ No newline at end of file diff --git a/app.ico b/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..a928c374cf2f0010c26cd81f4953c4e0e90014ac GIT binary patch literal 110361 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 literal 0 HcmV?d00001 diff --git a/app.png b/app.png new file mode 100644 index 0000000000000000000000000000000000000000..636f60fc07de44ff232e0292d2cbd8fbe5f0ba19 GIT binary patch literal 1238 zcmV;{1S$K8P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Zzn|K~!i%?OIDu z6Hyqg8lxNIk8x+B-Du>|$_z?G|Qt8;j!a_R3Qb#(I z>sTh|jm+J%Zk=ysG#al+XHv%!0Yzj4Y-jGCva+&Ok;vpON)zWx9uyFXeB8<0{|nIK z&mSO_l9T7$Kv4yR!@$+6Kp>#zl`Fu=hzN3sq6tW+fm^qLy?f=naYMNiPEj-gGc!PK ztvq@1_;FxrN(4JV(F8nx4D8z{PoCtt2MSPZe2CAym$EvG=XjC+^3D*VC9&g_UDl65=Ub_Y~G^md;rmxSLrMfO)ZVqT{ zR42NBKk)P^(AK6tPM$dfeETLE+koo=-o6D69#khuH=-*I4e8JEH;>zes{-i#t*z<= z$(-kZ{R*5qr9Xf3rqb39Tou5peBy*UIZmG!FO>7_wX;)wp5z^xo>pS4!c_rJp6I>5 zt`0~fL_h|^!@!|K>KL}+x?u;d37DUkdq2yG{OQ4mTSJI06GsErXE3o!Ej)2D&iSrH_`*qHvA zA-P&xSrZ%!ka<7Z-7TL!Ij{=7a6#XWw)^?B2r>c30)j!k_j4+k*)rb0ub)P_y2&gY z38431zN}7wWV!I^lk%_@;^?S+8gb9ezRkdq0D3>`d~E`(`&ngj!74-weawI_xnviGZ!>t8j9^)Sk@s^RJ9)dn z*Nn%G>H9r;6o|(~kOYj0Q$1b`)Q}#>pI22 zfHLp3{hvP%{QN0`G_WM#-8;GWvn;T>5s|^j-MD+>E=~s10*t($?CCML>@Nn6!FNR3 z{yB||%5&2KI7gp71Mb~Zlk?M!_xw3bWQsWL7-T3U|3k#IfKtUjC?Fc&xzzsX4u?Nh zWCifw?ojCc=43LJ`_!Q1IiF09heB^QW&f$?7a%@g?b=7dp|V%6!@FM&j_xUCGRKF( z*ISsg^7V@N;KS?Px_bTkZEKbSnQQh#50A(57q#{c*1!+tC;$Ke07*qoM6N<$f>BgV A)&Kwi literal 0 HcmV?d00001 diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..eb16f64 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,292 @@ +#### 2022/05/23 + +v3.5.23alpha 开发人员测试版本 + +1. Fix 偶发的登录后显示空白窗口的 BUG +2. Fix 登录太多账号时切换账号弹窗不能正确显示的 BUG +3. 优化长时间不用后需要重新登录的问题 +4. Fix 偶发的下载中显示空白列表的 BUG +5. Fix 多次弹出升级提示窗口的 BUG +6. Fix 目录下超过 200 个文件夹不能显示的 BUG +7. 重制 APP 设置页面,分组设置,配置保存到 setting.config +8. 优化快捷键(现在很多操作都支持键盘快捷键) + +-- + +v3.05.23.alpha 新增加的功能 + +文件恢复,放映室,网页版播放器,彻底删除菜单,文件属性菜单,所有列表支持右键菜单, +整盘高级搜索,文件快速筛选,右侧文件拖放移动,文件标记,文件夹快捷方式,我订阅的公众号, +重复文件清理,扫描大文件,扫描重复文件,扫描违规文件,扫描空文件夹,网盘相册间复制, +批量重命名 + + + +#### 2022/04/14 + + +1. 修正因阿里云盘官网升级导致的无法使用 +2. 优化访问频次问题 +3. 修正违禁视频详情BUG + + +#### 2021/12/05 + + +1. 修正网盘内文件路径过长时下载失败 BUG +2. 优化快捷键功能(帮助文档里有完整的快捷键说明) +3. 增加收藏夹的搜索功能 +4. 优化后退按钮(以前是返回父文件夹,现在是后退,最多后退 20 步) +5. 增加优先下载小文件选项 +6. 增加雪碧图里视频信息的显示和保存雪碧图按钮 +7. 网盘页顶部路径默认隐藏需要在设置里勾选显示 +8. 修正m3u8播放链接15分钟后失效的 BUG (现在4小时) +9. 修正之前部分版本代理设置被覆盖的 BUG +10. 增加自定义缓存位置功能 +11. 增加帮助文档 + + +#### 2021/11/29 + +1. 修正 2.11.28 下载显示出错的 BUG +1. 修正登录时遇到二次验证导致点击登录按钮无反应的 BUG +2. 修正自 v2.11.07 开始不能上传体积为 0 的文件的 BUG +3. 修正 v2.11.16 上传文件时占用内存过多的问题 +4. 11.16 里 60 文件同时上传会占用大量内存,11.28 里优化为只占用 400MB 以内的内存 + +5. 修正传输完自动关机触发时机不准确的 BUG +6. 修正上传时遇到没有访问权限的文件/文件夹时上传中队列卡住的 BUG +7. 增加视频文件洗码功能 +8. 增加右侧文件拖动到左侧文件夹树(移动文件)功能 +9. 优化远程 Aria2 下载功能并修复断线后自动重连 +10. 优化本地 Aria2,无法连接时会尝试自动重启一次 Aria2 进程 +11. 增加任务栏的下载中上传中进度提示(win/mac) +12. 底部状态栏显示总传输的预估剩余时间 +13. 增加上传时跳过同名文件的设置项 +14. 优化盘内文件搜索支持选择分类 +15. 一些细节优化 + + + +#### 2021/11/14 +1. 增加创建分享、编辑分享、管理分享功能 +2. 完善导入分享功能,支持部分导入和完整导入 +3. 增加网盘内文件搜索功能 +4. 增加下载时自动过滤违规文件的设置 +5. 增加对禁止分享的文件的图标 +6. 增加文件/文件夹置顶功能 +7. 增加主题跟随系统 +8. 增加下载上传完成后自动关机设置 +9. 完善 mac 和 linux 下自定义播放软件功能 +10. 恢复视频文件雪碧图,增加复制 M3U8 链接和原始视频链接功能 +11. 修正 linux 下上传时会自动过滤软链接文件 + + + +#### 2021/11/07 + +1. 优化一次性上传或下载大量文件时的界面卡顿(参阅 挑战一百万.md) +2. 创建日期文件夹支持编号了 +3. 新增定时清理回收站功能 +4. 新增我创建的分享列表功能(没做完) +5. 增加文件列表显示限制(减少加载中) +6. 恢复导入阿里云盘分享链接功能(仅全部导入) +7. 恢复新建文件功能 +8. 恢复版本升级提示功能 +9. 修正 windows 下载位置不能选择根目录的 BUG +10. 修正不能上传大于 97.6GB 的文件的问题 +11. 修正上传速度显示不准确的 BUG +12. 修正不能同时下载同一个文件(下载到不同的位置)的 BUG +13. 优化部分文件格式图标 + + + +#### 2021/10/31 + +1. 增加文件列表的缩略图模式 +2. 修正v2.10.17和v2.10.19版本里一个严重的BUG(删除文件时可能会错误选中父文件夹一起删除) +3. 去除彻底删除按钮 +4. 回收站增加清理回收站按钮(一键删除回收站内全部文件) +5. 增加上传和下载的文件过滤功能(自动跳过特定格式的文件) +6. 修正左侧文件夹树和右侧文件列表的互动关联 +7. 恢复重命名功能和移动复制功能 + + +#### 2021/10/19 + +1. 优化文件列出逻辑,节省一半的等待加载中时间 + +2. 优化v2.9一个文件夹直接包含大量子文件夹时的卡顿和内存剧增问题 + 一个文件夹里直接包含 17000 个子文件夹时,打开文件夹 v2.9 需要占用 700MB 内存, v2.10 需要占用 190MB 内存 + v2.9 当一个文件夹里包含 3000 个以上的子文件夹时,小白羊文件夹树会卡顿 + v2.10 无所谓多少个子文件夹,不会卡顿 + +3. 优化v2.9网盘包含有巨量文件夹时,启动后前几秒会卡顿的问题 + +4. 优化v2.9上下传记录的本地数据库体积 + 长期大量上传下载会产生较大的本地记录数据,现在会自动清理 + +5. 修正v2.9统计文件夹体积功能的本地缓存和运行时CPU内存占用 + 开启统计文件夹体积功能后,我网盘里有 2 万个文件夹和 31 万个文件,v2.9 会产生 167MB 的缓存,v2.10 会产生 8MB 的缓存 + 修正了一个会导致 CPU 和内存占用高的 BUG(用户账号 token 失效时,会因为定时统计功能导致 CPU 和内存占用很高) + +6. 优化在线预览视频现在支持很多种播放器了 + 当前只适配了 windows (测试了 MPV,Potplayer,VLC media player,KMPlayer,恒星播放器,SMPlayer) + macos 和 linux 稍后会适配,现在仍旧只能用 mpv 播放器 + +7. 增加在线预览 word/excel/ppt/pdf 文件的功能 + 当前,大部分音视频格式,大部分图片格式,word/excel/ppt/pdf/txt,200 余种常见文本格式 都可以在线预览了 + +8. 修正在文件夹里搜索后,拖动搜索结果里的文件上传,上传文件名错误的 BUG + +9. 优化上传前的 sha1 校验速度,提升上传速度 + +10. 美化了一下界面 +11. 增加是否按照完整网盘路径保存的设置 +12. 增加关闭窗口立即退出的设置 +13. 增加双击才打开文件、文件夹的设置 +14. 增加清理缓存的设置 +15. 增加运行日志的设置 +16. 文件夹树的宽度可以拖动调整了 +17. 图片、Office、文本预览现在是单独窗口了 +18. 修正一些文件格式识别不准确的 BUG + +#### 2021/09/24 + +1. 修正上传 20GB 以上的文件时,断点续传时进度不准确的 BUG +2. 取消文件列表的加载中状态提示,快速展现文件列表 +3. 更新文件列表缓存方式,数据库文件体积减少 73% (14 万个文件从 240MB 降低为 60MB) +4. 增加是否统计文件夹体积的设置开关,减少网盘内文件过多时的白屏问题 +5. 同步 v2.9.24 源码到 github + +#### 2021/09/19 + +1. 删除秒传相关功能 +2. 修正 v2.8.30 里 aria2 远程模式连接失败的 BUG +3. 修正偶发文件列表只显示占位符不显示文件名的 BUG +4. 修正移动文件后选中文件数显示错误的 BUG +5. 修正批量重命名取消勾选文件夹时子文件名计算错误的 BUG +6. 修正批量重命名点击刷新后因一直加载,不能关闭的 BUG +7. 增加对文件名结尾的点和空格的清理,修正这些文件下载失败的 BUG +8. 修正闲置长时间后上传文件可能出现获取上传地址失败的 BUG +9. 减少因并发数太高容易出现的操作失败 BUG +10. 修正等宽图片预览时,切换下一张后滚动条没有自动回到顶部的 BUG +11. 增加文件列表(F5 键刷新文件,Back 键返回上级文件夹),等宽图片预览(← 上一张,→ 下一张)的快捷键 +12. 增加点击头像图片时自动刷新网盘空间用量 +13. 增加文件夹独立排序选项 +14. 增加直接彻底删除文件的右键菜单 + +15. 升级数据库架构,提升了加载文件列表的性能,本周重点就是此项,性能提升涉及方方面面的细节,大部分以前加载慢的功能都有了极明显的提升,例如一次性上传包含 10 万个文件的文件夹,不会出现任何卡顿了 + +16. 修正 v2.9.15 里长时间后上传文件时出现获取上传地址失败的 BUG +17. 增加上传/下载任务出错后等 1 分钟自动重试功能,可以放心挂机下载、挂机上传了 + +#### 2021/08/30 +1. Fix 修正 v1.6.29 大量上传下载后会生成大体积的 数据库 的 BUG +2. Fix 修正 v1.6.29 导入阿里云盘分享链接失败的 BUG +3. Fix 修正 v1.6.29 上传途中重启程序后,重新上传不会断点续传的 BUG +4. Fix 修正部分违规视频不能播放的 BUG,现在可以使用"优先播放转码视频"模式播放了 + +# + +1. Add 增加阿里云盘官方登录接口(手机短信、账号密码、APP 扫码登录) +2. Add 增加多个账号同时登录、切换功能 +3. Add 增加 Aria 远程连接设置,可以把文件直接下载到远程电脑/VPS/NAS/Docker +4. Add 增加文件名颜色标记,批量标记功能,观看视频自动标记功能 +5. Add 增加文件、文件夹详情功能(文件夹大小,包含文件数),视频文件的雪碧图 +6. Add 增加新的图片预览模式,可以放大/缩小/旋转/幻灯片播放 +7. Add 增加代码高亮/ json 格式化显示 / txt 在线预览功能 +8. Add 增加快速创建日期格式的文件夹 +9. Add 增加可选择文件夹是否和文件一起排序了 +10. Add 增加所有文件夹体积的显示,可以按照体积排序文件夹了 +11. Add windows 上支持 Potplayer 播放器了 +12. Add 顶部快捷路径跳转和区间选择功能 + +# + +1. Pro 优化文件复制功能,可极速复制 TB 级/上万文件 到网盘的其他位置 +2. Pro 优化导入分享功能,在导入时可以选择网盘里的保存位置,可以勾选要保存的 文件/文件夹 +3. Pro 优化上传功能,现在部分不能秒传的大文件,上传前不再需要计算 sha1 了(减少上传时间) +4. Pro 优化 sha1 计算逻辑和性能,同时最多 3 个文件计算 sha1,机械硬盘不会掉速,CPU 不会爆满 +5. Pro 现在 windows/macos/linux 都支持拖拽文件、文件夹上传了 +6. Pro 优化批量重命名功能,支持勾选文件,支持重命名多级子文件夹,支持 替换/删除/增加/序号/随机字符 等方式 +7. Pro 优化在线解压功能,支持全部解压和勾选文件解压,支持有密码的压缩包 + +#### 2021/06/29 +Fix 优化重命名、搜索输入框大小 +Fix 修正下载中、上传中页面因进度条动画导致的GPU占用过高的BUG +Fix 中文名导致偶有macos启动失败的BUG +Add 导入阿里云盘分享链接的功能 +Add 导入115网盘分享链接的功能 + + +#### 2021/06/21 +Fix 显示用户昵称和头像 +Fix 完善对字体的支持(可以随意更换自己喜欢的字体了),完善文字大小设置功能 +Fix 完善在线预览图片功能(支持旋转,文件夹内全部图片上一张下一张查看) +Fix 文件名是.(点)时导致的创建下载任务失败的BUG +Fix 创建文件夹太快偶发点击文件夹名不能进入的BUG +Add Windows上支持批量拖拽文件/文件夹上传 +Add 选择文件/文件夹计算秒传信息保存到网盘内txt文件的功能 +Add 导入txt文件类型的秒传链接(支持文件夹嵌套) +Add 新增相册功能(文件可以在相册和网盘之间移动复制) + + +#### 2021/06/13 +Fix 在下载大文件时Aria在某些系统上强制分配硬盘BUG导致下载进度卡死 +Fix 优化Aria的连接性,减少出错崩溃 +Fix Mac版输出大量无用日志的BUG +Fix 一堆UI细节上的完善 +Add 复制文件到...的功能(官方只有移动到...) +Add 批量重命名功能(替换/删除字符,增加前缀,正则表达式替换) +Add 聚合搜索功能(当前搜不到什么,要等以后大家主动分享) +Add 初步支持在线解压缩(zip,rar) +Ver 更新到Flutter2.2.1 + + +#### 2021/06/10 +Fix 因阿里云盘API升级导致的无法加载文件列表的BUG +Fix 选择上传文件夹时 可能 需要长时间等待的BUG +Fix 批量下载大量子文件夹时 可能 需要长时间等待的BUG +Fix 修正回收站内文件无法在线播放的BUG +Fix 增加一些在线播放视频格式的支持(m2ts/hevc....) +Add 增加对违规文件的标识 +Add 增加深色模式 +Add 下载失败时的一些错误提示 +Del 去除创建秒传链接的功能,仅支持导入秒传链接(115:// 、aliyun://) + +#### 2021/06/06 +1. Fix 批量下载时只解析了第一个选中的文件夹的严重BUG +2. Fix 大量操作更新为异步操作,极大的减少了操作等待时间 +3. Fix 因阿里云盘升级导致扫码登陆失败的BUG +4. Add 支持导入李恒道版本秒传链接 + + + +#### 2021/06/05 +1. Add 秒传短链接功能(创建秒传链接、导入别人分享的短链接、短链接本地历史记录) +2. Add 增加115链接批量导入功能(靠运气) +3. Add 增加在线预览文本文件功能 + +4. Fix 因阿里云盘升级导致扫码登陆失败的BUG +5. Fix 阿里云盘对单次批量操作最多限制100条的限制 +6. Fix 在线预览图片时图片大小缩放BUG +7. Fix 按文件名排序时不准确的BUG + + +#### 2021/05/31 +1. Add 上传文件、文件夹功能 +2. Add 在线预览图片 +3. Add 移动文件、文件夹功能 +4. Fix 优化启动时启动后台提示 +5. Fix 延长下载链接时效(15分钟->4小时) +6. Fix 文件夹内包含大量文件时多次操作可能回重复拉取的BUG + + + +#### 2021/05/25 +1. 上传第一个开发中版本仅供测试 +2. 支持 扫码登录/Cookie登录 +3. 支持 阿里云盘基本功能 +4. 支持 在线预览全格式原画视频(非转码) +5. 支持 批量下载文件/文件夹,只要阿里云不限速,就是满速下载 diff --git a/crx/devtools.html b/crx/devtools.html new file mode 100644 index 0000000..bad5cff --- /dev/null +++ b/crx/devtools.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/crx/devtools.js b/crx/devtools.js new file mode 100644 index 0000000..62bcd2c --- /dev/null +++ b/crx/devtools.js @@ -0,0 +1,21 @@ +chrome.devtools.network.onRequestFinished.addListener(function (detail) { + let url = detail.request.url; + if (url.indexOf("api.aliyundrive.com") > 0) return; + if (url.indexOf("_tmd_") > 0) return; + if (url.indexOf(".aliyundrive.com") <= 0) return; + if (detail.request.method != "POST") return; + + detail.getContent(function (content, mimeType) { + try { + if (typeof content == "string" && content.indexOf('"bizExt"') > 0) { + const data = JSON.parse(content); + const bizExt = data.content?.data?.bizExt || ""; + if (bizExt) { + chrome.devtools.inspectedWindow.eval( + "console.log('" + JSON.stringify({ bizExt: bizExt }) + "')" + ); + } + } + } catch {} + }); +}); diff --git a/crx/manifest.json b/crx/manifest.json new file mode 100644 index 0000000..478810c --- /dev/null +++ b/crx/manifest.json @@ -0,0 +1,11 @@ +{ + "manifest_version": 2, + "name": "demo", + "version": "1.0.0", + "description": "demo", + "devtools_page": "devtools.html", + "permissions": [ + "http://*/*", + "https://*/*" + ] +} \ No newline at end of file diff --git a/electron-builder.json b/electron-builder.json new file mode 100644 index 0000000..fdf70dd --- /dev/null +++ b/electron-builder.json @@ -0,0 +1,33 @@ +{ + "appId": "YouAppID", + "asar": true, + "directories": { + "output": "release" + }, + "files": [ + "dist" + ], + "mac": { + "artifactName": "${productName}_${version}.${ext}", + "target": [ + "dmg" + ] + }, + "win": { + "target": [ + { + "target": "nsis", + "arch": [ + "x64" + ] + } + ], + "artifactName": "${productName}_${version}.${ext}" + }, + "nsis": { + "oneClick": false, + "perMachine": false, + "allowToChangeInstallationDirectory": true, + "deleteAppDataOnUninstall": false + } +} diff --git a/nano-staged.mjs b/nano-staged.mjs new file mode 100644 index 0000000..c6ce9aa --- /dev/null +++ b/nano-staged.mjs @@ -0,0 +1,8 @@ +export default { + // eslint + '*.{js,ts,tsx,jsx}': ['prettier --write', 'eslint --cache --fix'], + '*.{vue}': ['stylelint --fix', 'prettier --write', 'eslint --cache --fix'], + '*.{less,css}': ['stylelint --fix', 'prettier --write'], + // typecheck + 'packages/renderer/**/{*.ts,*.tsx,*.vue,tsconfig.json}': ({ filenames }) => 'npm run typecheck' +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..55289b6 --- /dev/null +++ b/package.json @@ -0,0 +1,57 @@ +{ + "name": "alixby", + "version": "3.08.25", + "main": "dist/main/index.js", + "author": "", + "license": "", + "scripts": { + "dev": "node scripts/watch.mjs", + "build": "vue-tsc --noEmit --p packages/renderer/tsconfig.json && node scripts/build.mjs && electron-builder --dir" + }, + "engines": { + "node": ">=14.17.0" + }, + "dependencies": { + }, + "devDependencies": { + "@arco-design/web-vue": "^2.35.1", + "@electron/remote": "^2.0.8", + "@types/lodash": "^4.14.184", + "@types/node": "^17.0.45", + "@vitejs/plugin-vue": "^3.0.3", + "@vitejs/plugin-vue-jsx": "^2.0.0", + "ant-design-vue": "^3.2.11", + "axios": "^0.27.2", + "dayjs": "^1.11.5", + "dexie": "^3.2.2", + "dom-to-image": "^2.6.0", + "electron": "20.0.3", + "electron-builder": "^23.3.3", + "fuzzysort": "^2.0.1", + "isomorphic-fetch": "^3.0.0", + "jschardet": "^3.0.0", + "lodash": "^4.17.21", + "nano-staged": "^0.8.0", + "pinia": "^2.0.20", + "typescript": "^4.7.4", + "unplugin-vue-components": "^0.22.4", + "viewerjs": "^1.10.5", + "vite": "^3.0.9", + "vite-plugin-electron-renderer": "^0.9.0", + "vite-plugin-resolve": "^2.1.0", + "vue": "^3.2.37", + "vue-tsc": "^0.40.1", + "terser": "^5.15.0" + }, + "env": { + "VITE_DEV_SERVER_HOST": "127.0.0.1", + "VITE_DEV_SERVER_PORT": 3344 + }, + "keywords": [ + "electron", + "rollup", + "vite", + "vue3", + "vue" + ] +} diff --git a/packages/main/index.ts b/packages/main/index.ts new file mode 100644 index 0000000..c1cb06f --- /dev/null +++ b/packages/main/index.ts @@ -0,0 +1,927 @@ +import { getAsarPath, getCrxPath, getResourcesPath, getUserDataPath, mkAriaConf } from './mainfile' +import { release } from 'os' +import { app, BrowserWindow, dialog, Menu, MenuItem, Tray, ipcMain, shell, nativeTheme, session, net, screen } from 'electron' +import remote from '@electron/remote/main' +remote.initialize() +import { exec, spawn, SpawnOptions } from 'child_process' +import { existsSync, readFileSync, writeFileSync } from 'fs' +import path from 'path' + +app.commandLine.appendSwitch('no-sandbox') +app.commandLine.appendSwitch('disable-web-security') +app.commandLine.appendSwitch('disable-renderer-backgrounding') +app.commandLine.appendSwitch('disable-site-isolation-trials') +app.commandLine.appendArgument('--disable-web-security') +app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure') +app.commandLine.appendSwitch('ignore-connections-limit', 'bj29.cn-beijing.data.alicloudccp.com,alicloudccp.com,api.aliyundrive.com,aliyundrive.com') +app.commandLine.appendSwitch('ignore-certificate-errors') +app.commandLine.appendSwitch('proxy-bypass-list', '') +app.commandLine.appendSwitch('wm-window-animations-disabled') + +if (release().startsWith('6.1')) app.disableHardwareAcceleration() +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' + +let userData = getResourcesPath('userdir.config') +try { + if (existsSync(userData)) { + let configdata = readFileSync(userData, 'utf-8') + if (configdata) app.setPath('userData', configdata) + } +} catch {} +let proxyData = getResourcesPath('proxy.config') +try { + if (existsSync(proxyData)) { + let configdata = readFileSync(proxyData, 'utf-8') + if (configdata) app.commandLine.appendSwitch('proxy-server', configdata) + } +} catch {} + +//app.commandLine.appendSwitch('proxy-server', '192.168.31.74:8888') + +let ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55' +let Referer = 'https://www.aliyundrive.com/' +app.setAppUserModelId('com.github.liupan1890') +app.name = 'alixby3' +const gotTheLock = app.requestSingleInstanceLock() +const isDbu = false +const DEBUGGING = process.env.NODE_ENV === 'development' || !app.isPackaged +let mainWindow: Electron.BrowserWindow | null = null +let workerWindow: Electron.BrowserWindow | null = null + +if (DEBUGGING == false) { + if (!gotTheLock) { + app.exit() + } else { + app.on('second-instance', (event, commandLine, workingDirectory) => { + if (commandLine && commandLine.join(' ').indexOf('exit') >= 0) { + app.exit() + } else if (mainWindow && mainWindow.isDestroyed() == false) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.show() + mainWindow.focus() + } + }) + } +} +if (process.argv && process.argv.join(' ').indexOf('exit') >= 0) { + app.exit() +} +process.on('uncaughtException', (err) => { + const stack = err.stack || '' + if (app.isReady()) ShowErrorAndExit('发生未定义的异常', err.message + '\n' + stack) +}) + +function createWindow() { + Menu.setApplicationMenu(null) + let winWidth = 0 + let winHeight = 0 + let bgcolor = '#ffffff' + + try { + const configjson = getUserDataPath('config.json') + if (existsSync(configjson)) { + let configdata = JSON.parse(readFileSync(configjson, 'utf-8')) + winWidth = configdata.width + winHeight = configdata.height + } + } catch {} + try { + const themejson = getUserDataPath('theme.json') + if (existsSync(themejson)) { + let themedata = JSON.parse(readFileSync(themejson, 'utf-8')) + bgcolor = themedata.theme == 'dark' ? '#23232e' : '#ffffff' + } + } catch {} + if (winWidth <= 0) { + winWidth = 680 + winHeight = 500 + + try { + let size = screen.getPrimaryDisplay().workAreaSize + let width = size.width * 0.677 + let height = size.height * 0.866 + if (width > winWidth) winWidth = width + if (size.width >= 970 && width < 970) width = 970 + if (winWidth > 1080) winWidth = 1080 + if (height > winHeight) winHeight = height + if (winHeight > 720) winHeight = 720 + } catch { + winWidth = 970 + winHeight = 600 + } + } + + mainWindow = new BrowserWindow({ + show: false, + width: winWidth, + height: winHeight, + center: true, + minWidth: 680, + minHeight: 500, + icon: getResourcesPath('app.ico'), + useContentSize: true, + frame: false, + hasShadow: true, + autoHideMenuBar: true, + backgroundColor: bgcolor, + webPreferences: { + spellcheck: false, + devTools: isDbu || DEBUGGING, + webviewTag: true, + nodeIntegration: true, + nodeIntegrationInWorker: true, + sandbox: false, + webSecurity: false, + allowRunningInsecureContent: true, + contextIsolation: false, + backgroundThrottling: false, + enableWebSQL: true, + //nativeWindowOpen: true, + disableBlinkFeatures: 'OutOfBlinkCors,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure', + preload: getAsarPath('dist/main/preload.js') + } + }) + mainWindow.removeMenu() + if (DEBUGGING) { + const url = `http://${process.env['VITE_DEV_SERVER_HOST']}:${process.env['VITE_DEV_SERVER_PORT']}/index.html` + mainWindow.loadURL(url, { + userAgent: ua, + httpReferrer: Referer + }) + } else { + mainWindow.loadURL('file://' + getAsarPath('dist/renderer/main.html'), { + userAgent: ua, + httpReferrer: Referer + }) + } + + if (isDbu || DEBUGGING) { + mainWindow.webContents.openDevTools() + } else { + mainWindow.webContents.on('devtools-opened', () => { + if (mainWindow) mainWindow.webContents.closeDevTools() + }) + } + remote.enable(mainWindow.webContents) + mainWindow.on('resize', () => { + debounce(function () { + try { + if (mainWindow && mainWindow.isMaximized() == false && mainWindow.isMinimized() == false && mainWindow.isFullScreen() == false) { + let s = mainWindow!.getSize() + const configjson = getUserDataPath('config.json') + writeFileSync(configjson, `{"width":${s[0].toString()},"height": ${s[1].toString()}}`, 'utf-8') + } + } catch {} + }, 3000) + }) + + mainWindow.on('close', (event) => { + if (process.platform === 'darwin') { + } else { + event.preventDefault() + mainWindow?.hide() + } + }) + + mainWindow.on('closed', (event: any) => { + app.quit() + }) + + mainWindow.on('ready-to-show', function () { + mainWindow!.webContents.send('setPage', { page: 'PageMain' }) + mainWindow!.webContents.send('setTheme', { + dark: nativeTheme.shouldUseDarkColors + }) + mainWindow!.setTitle('阿里云盘小白羊版') + mainWindow!.show() + }) + mainWindow.webContents.on('render-process-gone', function (event, details) { + if (details.reason == 'crashed' || details.reason == 'oom' || details.reason == 'killed') { + ShowErrorAndRelanch('(⊙o⊙)?小白羊遇到错误崩溃了', details.reason) + } + }) + mainWindow.webContents.on('did-create-window', (childWindow) => { + if (process.platform === 'win32') { + childWindow.setMenu(null) + } + }) + + creatWorker() +} + +function creatWorker() { + if (workerWindow != null) return + workerWindow = new BrowserWindow({ + show: false, + width: 10, + height: 10, + center: false, + useContentSize: true, + frame: false, + hasShadow: false, + autoHideMenuBar: true, + webPreferences: { + devTools: isDbu || DEBUGGING, + nodeIntegration: true, + nodeIntegrationInWorker: true, + sandbox: false, + webSecurity: false, + allowRunningInsecureContent: true, + contextIsolation: false, + backgroundThrottling: false, + enableWebSQL: true, + disableBlinkFeatures: 'OutOfBlinkCors,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure', + preload: getAsarPath('dist/main/preload.js') + } + }) + if (DEBUGGING) { + const url = `http://${process.env['VITE_DEV_SERVER_HOST']}:${process.env['VITE_DEV_SERVER_PORT']}` + workerWindow.loadURL(url, { + userAgent: ua, + httpReferrer: Referer + }) + } else { + workerWindow.loadURL('file://' + getAsarPath('dist/renderer/main2.html'), { + userAgent: ua, + httpReferrer: Referer + }) + } + remote.enable(workerWindow.webContents) + workerWindow.on('ready-to-show', function () { + workerWindow!.webContents.send('setPage', { page: 'PageWorker' }) + }) + + if (isDbu || DEBUGGING) { + //workerWindow.setSize(800, 600) + //workerWindow.show() + //workerWindow.webContents.openDevTools() + } else { + workerWindow.webContents.on('devtools-opened', () => { + if (workerWindow) workerWindow.webContents.closeDevTools() + }) + } + + workerWindow.webContents.on('render-process-gone', function (event, details) { + if (details.reason == 'crashed' || details.reason == 'oom' || details.reason == 'killed' || details.reason == 'integrity-failure') { + try { + workerWindow?.destroy() + } catch {} + workerWindow = null + creatWorker() + } + }) +} + +function creatAria() { + try { + let basePath = path.resolve(app.getAppPath(), '..') + if (DEBUGGING) basePath = path.resolve(app.getAppPath(), '..') + let ariaPath = '' + if (process.platform === 'win32') { + ariaPath = 'aria2c.exe' + } else if (process.platform === 'darwin') { + ariaPath = 'aria2c' + } else if (process.platform === 'linux') { + ariaPath = 'aria2c' + } + let ariaPath2 = path.join(basePath, ariaPath) + if (existsSync(ariaPath2) == false) { + ShowError('找不到Aria程序文件', ariaPath2) + return + } + + let confPath = path.join(basePath, 'aria2.conf') + if (existsSync(confPath) == false) mkAriaConf(confPath) + + process.chdir(basePath) + const options:SpawnOptions = { detached: true, stdio: 'ignore', cwd: basePath } + const subprocess = spawn( + ariaPath, + [ + '--stop-with-process=' + process.pid, + '-D', + '--enable-rpc=true', + '--rpc-allow-origin-all=true', + '--rpc-listen-all=false', + '--rpc-listen-port=29387', + '--rpc-secret=S4znWTaZYQi3cpRNb', + '--rpc-secure=false', + '--auto-file-renaming=false', + '--check-certificate=false', + '--async-dns=false', + '--conf-path=aria2.conf' + ], + options + ) + subprocess.unref() + } catch (e: any) { + console.log(e) + } +} + +let timer: NodeJS.Timeout | null = null +const debounce = (fn: any, wait: number) => { + if (timer) clearTimeout(timer) + timer = setTimeout(() => { + fn() + }, wait) +} + +app.on('window-all-closed', () => { + app.quit() +}) + +app.on('activate', () => { + if (mainWindow == null || mainWindow.isDestroyed()) createWindow() + else { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.show() + mainWindow.focus() + } +}) + +app.on('will-quit', () => { + try { + if (appTray) { + appTray.destroy() + appTray = null + } + } catch { + + } +}) + + +var appTray: Electron.Tray | null = null + +function createTray() { + + var trayMenuTemplate = [ + { + label: '显示主界面', + click: function () { + if (mainWindow && mainWindow.isDestroyed() == false) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.show() + mainWindow.focus() + } else { + createWindow() + } + } + }, + { + label: '彻底退出并停止下载', + click: function () { + if (mainWindow) { + mainWindow.destroy() + mainWindow = null + } + app.quit() + } + } + ] + + + let icon = getResourcesPath('app.ico') + appTray = new Tray(icon) + + const contextMenu = Menu.buildFromTemplate(trayMenuTemplate) + + appTray.setToolTip('阿里云盘小白羊版') + + appTray.setContextMenu(contextMenu) + + appTray.on('click', () => { + if (mainWindow && mainWindow.isDestroyed() == false) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.show() + mainWindow.focus() + } else { + createWindow() + } + }) +} +var menuEdit: Electron.Menu | null = null +var menuCopy: Electron.Menu | null = null + +function createMenu() { + menuEdit = new Menu() + menuEdit.append(new MenuItem({ label: '剪切', role: 'cut' })) + menuEdit.append(new MenuItem({ label: '复制', role: 'copy' })) + menuEdit.append(new MenuItem({ label: '粘贴', role: 'paste' })) + menuEdit.append(new MenuItem({ label: '删除', role: 'delete' })) + menuEdit.append(new MenuItem({ label: '全选', role: 'selectAll' })) + + menuCopy = new Menu() + menuCopy.append(new MenuItem({ label: '复制', role: 'copy' })) + menuCopy.append(new MenuItem({ label: '全选', role: 'selectAll' })) +} +function ShowErrorAndExit(title: string, errmsg: string) { + dialog + .showMessageBox({ + type: 'error', + buttons: ['ok'], + title: title + ',小白羊将自动退出', + message: '错误信息:' + errmsg + }) + .then((_) => { + setTimeout(() => { + try { + app.exit() + } catch {} + }, 100) + }) +} +function ShowErrorAndRelanch(title: string, errmsg: string) { + dialog + .showMessageBox({ + type: 'error', + buttons: ['ok'], + title: title + ',小白羊将自动退出', + message: '错误信息:' + errmsg + }) + .then((_) => { + setTimeout(() => { + app.relaunch() + try { + app.exit() + } catch {} + }, 100) + }) +} +function ShowError(title: string, errmsg: string) { + dialog + .showMessageBox({ + type: 'error', + buttons: ['ok'], + title: title, + message: '错误信息:' + errmsg + }) + .then((_) => {}) +} + +app.setAboutPanelOptions({ + applicationName: '阿里云盘小白羊版', + copyright: 'liupan1890', + website: 'https://github.com/liupan1890/aliyunpan', + iconPath: getResourcesPath('app.png'), + applicationVersion: '30' +}) + +let usertoken: { access_token: string; user_id: string; refresh: boolean } = { + access_token: '', + user_id: '', + refresh: false +} + +app + .whenReady() + /* + .then(() => { + ShowError('getAppPath', app.getAppPath()) + ShowError('__dirname', __dirname) + }) + */ + .then(() => { + session.defaultSession.webRequest.onBeforeSendHeaders((details, cb) => { + + const should115referer = details.url.indexOf('.115.com') > 0 + const shouldgieereferer = details.url.indexOf('gitee.com') > 0 + const shouldaliOrigin = details.url.indexOf('.aliyundrive.com') > 0 + + const shouldaliReferer = should115referer == false && shouldgieereferer == false && (details.referrer == undefined || details.referrer.trim() === '' || /(\/localhost:)|(^file:\/\/)|(\/127.0.0.1:)/.exec(details.referrer) !== null) + const shouldtoken = details.url.indexOf('/file/download?') > 0 + + + cb({ + cancel: false, + requestHeaders: { + ...details.requestHeaders, + ...(should115referer && { + Referer: 'http://115.com/s/swn4bs33z88', + Origin: 'http://115.com' + }), + ...(shouldgieereferer && { + Referer: 'https://gitee.com/' + }), + ...(shouldaliOrigin && { + Origin: 'https://www.aliyundrive.com' + }), + ...(shouldaliReferer && { + Referer: 'https://www.aliyundrive.com/' + }), + ...(shouldtoken && { + Authorization: usertoken.access_token + }), + 'X-Canary': 'client=web,app=adrive,version=v3.0.0', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55', + 'Accept-Language': 'zh-CN,zh;q=0.9' + } + }) + }) + + session.defaultSession.loadExtension(getCrxPath(), { allowFileAccess: true }).then((le) => { + console.log('loadExtension success', le) + //creatAria() + createMenu() + createTray() + createWindow() + }) + }) + .catch((e) => { + console.log(e) + }) + + +nativeTheme.on('updated', () => { + if (mainWindow && !mainWindow.isDestroyed()) + mainWindow.webContents.send('setTheme', { + dark: nativeTheme.shouldUseDarkColors + }) +}) + +ipcMain.on('winmsgmain', (event, data) => { + if (mainWindow && !mainWindow.isDestroyed()) mainWindow.webContents.send('winmsg', data) +}) +ipcMain.on('winmsgui', (event, data) => { + if (workerWindow && !workerWindow.isDestroyed()) workerWindow.webContents.send('winmsg', data) +}) + +ipcMain.on('WebToElectron', (event, data) => { + if (data.cmd && data.cmd === 'close') { + if (mainWindow && !mainWindow.isDestroyed()) mainWindow.hide() + } else if (data.cmd && data.cmd === 'exit') { + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.destroy() + mainWindow = null + } + try { + app.exit() + } catch {} + } else if (data.cmd && data.cmd === 'minsize') { + if (mainWindow && !mainWindow.isDestroyed()) mainWindow.minimize() + } else if (data.cmd && data.cmd === 'maxsize') { + if (mainWindow && !mainWindow.isDestroyed()) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + } else { + mainWindow.maximize() + } + } + } else if (data.cmd && data.cmd === 'menuedit') { + if (menuEdit) menuEdit.popup() + } else if (data.cmd && data.cmd === 'menucopy') { + if (menuCopy) menuCopy.popup() + } else { + event.sender.send('ElectronToWeb', 'mainsenddata') + } +}) + +ipcMain.on('WebToElectronCB', (event, data) => { + if (data.cmd && data.cmd === 'maxsize') { + if (mainWindow && !mainWindow.isDestroyed()) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + event.returnValue = 'unmaximize' + } else { + mainWindow.maximize() + event.returnValue = 'maximize' + } + } + } else { + event.returnValue = 'backdata' + } +}) + +ipcMain.on('WebShowOpenDialogSync', (event, config) => { + dialog.showOpenDialog(mainWindow!, config).then((result) => { + event.returnValue = result.filePaths + }) +}) + +ipcMain.on('WebShowSaveDialogSync', (event, config) => { + dialog.showSaveDialog(mainWindow!, config).then((result) => { + event.returnValue = result.filePath || '' + }) +}) + +ipcMain.on('WebShowItemInFolder', (event, fullpath) => { + for (let i = 0; i < 5; i++) { + if (existsSync(fullpath)) break + if (fullpath.lastIndexOf(path.sep) > 0) { + fullpath = fullpath.substring(0, fullpath.lastIndexOf(path.sep)) + } else return + } + if (fullpath.length > 2) shell.showItemInFolder(fullpath) +}) +ipcMain.on('WebPlatformSync', (event) => { + let basePath = path.resolve(app.getAppPath(), '..') + let findMPV = process.platform !== 'win32' || existsSync(path.join(basePath, 'MPV', 'mpv.exe')) + let appPath = app.getPath('userData') + event.returnValue = { + platform: process.platform, + arch: process.arch, + version: process.version, + execPath: process.execPath, + appPath: appPath, + argv0: process.argv0, + findMPV + } +}) + +ipcMain.on('WebSpawnSync', (event, data) => { + try { + const options = { ...data.options } + options.detached = true + options.stdio = 'ignore' + if (data.command === 'potplayer') { + if (process.platform === 'win32') { + let basePath = path.resolve(app.getAppPath(), '..') + data.command = path.join(basePath, 'PotPlayer', 'PotPlayer.exe') + } + } + if (data.command === 'mpv') { + let basePath = path.resolve(app.getAppPath(), '..') + if (process.platform === 'win32') { + data.command = path.join(basePath, 'MPV', 'mpv.exe') + } else if (process.platform === 'darwin') { + data.command = path.join(basePath, 'mpv') + } else if (process.platform === 'linux') { + data.command = 'mpv' + } + } + if (process.platform === 'win32' && existsSync(data.command) == false) { + event.returnValue = { error: '找不到文件' + data.command } + ShowError('找不到文件', data.command) + } else { + const subprocess = spawn(data.command, data.args, options) + const ret = { + data: data, + exitCode: subprocess.exitCode, + pid: subprocess.pid, + spawnfile: subprocess.spawnfile, + command: data.command + } + subprocess.unref() + event.returnValue = ret + } + } catch (e: any) { + event.returnValue = { error: e } + } +}) +ipcMain.on('WebExecSync', (event, data) => { + try { + let cmdarguments = [] + if (data.command === 'mpv') { + let basePath = path.resolve(app.getAppPath(), '..') + if (process.platform === 'win32') { + const exe = path.join(basePath, 'MPV', 'mpv.exe') + if (existsSync(exe) == false) { + event.returnValue = { error: '找不到文件' + data.command + ' ' + exe } + ShowError('找不到文件', data.command + ' ' + exe) + return + } + cmdarguments.push('"' + exe + '"') + } else if (process.platform === 'darwin') { + const exe = path.join(basePath, 'mpv') + if (existsSync(exe) == false) { + event.returnValue = { error: '找不到文件' + data.command + ' ' + exe } + ShowError('找不到文件', data.command + ' ' + exe) + return + } + cmdarguments.push("'" + exe + "'") + } else if (process.platform === 'linux') { + cmdarguments.push('mpv') + } + } else { + cmdarguments.push(data.command) + } + + if (data.args) cmdarguments.push(...data.args) + + const finalcmd = cmdarguments.join(' ') + + exec(finalcmd, (err: any) => { + event.returnValue = err + }) + event.returnValue = '' + } catch (e: any) { + event.returnValue = { error: e } + } +}) + +ipcMain.on('WebClearCookies', (event, data) => { + session.defaultSession.clearStorageData(data) +}) +ipcMain.on('WebSaveTheme', (event, data) => { + try { + const themejson = getUserDataPath('theme.json') + writeFileSync(themejson, `{"theme":"${data.theme || ''}"}`, 'utf-8') + } catch {} +}) + +ipcMain.on('WebClearCache', (event, data) => { + if (data.cache) { + session.defaultSession.clearCache() + session.defaultSession.clearAuthCache() + } else { + session.defaultSession.clearStorageData(data) + } +}) + +ipcMain.on('WebUserToken', (event, data) => { + if (data.login) { + usertoken = data + } else if (usertoken.user_id == data.user_id) { + usertoken = data + //ShowError('WebUserToken', 'update' + data.name) + } else { + //ShowError('WebUserToken', 'nothing' + data.name) + } +}) +ipcMain.on('WebReload', (event, data) => { + if (mainWindow && !mainWindow.isDestroyed()) mainWindow.reload() +}) +ipcMain.on('WebRelaunch', (event, data) => { + app.relaunch() + try { + app.exit() + } catch {} +}) + +ipcMain.on('WebRelaunchAria', (event, data) => { + debounce(function () { + try { + creatAria() + } catch {} + }, 2000) +}) + +ipcMain.on('WebSetProgressBar', (event, data) => { + if (mainWindow && !mainWindow.isDestroyed()) { + if (data.pro) mainWindow.setProgressBar(data.pro) + else mainWindow.setProgressBar(-1) + } +}) + +ipcMain.on('WebSetCookies', (event, data) => { + for (let i = 0, maxi = data.length; i < maxi; i++) { + const cookie = { + url: data[i].url, + name: data[i].name, + value: data[i].value, + domain: '.' + data[i].url.substring(data[i].url.lastIndexOf('/') + 1), + secure: data[i].url.indexOf('https://') == 0, + expirationDate: data[i].expirationDate + } + session.defaultSession.cookies.set(cookie).catch((e) => console.error(e)) + } +}) + +ipcMain.on('WebShutDown', (event, data) => { + if (process.platform === 'darwin') { + const shutdownCmd = 'osascript -e \'tell application "System Events" to shut down\'' + exec(shutdownCmd, (err: any) => { + if (data.quitapp) { + try { + app.exit() + } catch {} + } + }) + } else { + const cmdarguments = ['shutdown'] + if (process.platform === 'linux') { + if (data.sudo) { + cmdarguments.unshift('sudo') + } + cmdarguments.push('-h') + cmdarguments.push('now') + } + if (process.platform === 'win32') { + cmdarguments.push('-s') + cmdarguments.push('-f') + cmdarguments.push('-t 0') + } + + const finalcmd = cmdarguments.join(' ') + + exec(finalcmd, (err: any) => { + if (data.quitapp) { + try { + app.exit() + } catch {} + } + }) + } +}) + +process.on('unhandledRejection', (reason, p) => { + console.log('Unhandled Rejection at:', p, 'reason:', reason) +}) +ipcMain.on('WebOpenWindow', (event, data) => { + let width = mainWindow && !mainWindow.isDestroyed() ? mainWindow.getSize() : [900, 700] + let win = new BrowserWindow({ + show: false, + width: width[0], + height: width[1], + center: true, + minWidth: 680, + minHeight: 500, + icon: getResourcesPath('app.ico'), + useContentSize: true, + frame: false, + hasShadow: true, + autoHideMenuBar: true, + backgroundColor: data.theme && data.theme == 'dark' ? '#23232e' : '#ffffff', + webPreferences: { + spellcheck: false, + devTools: isDbu || DEBUGGING, + webviewTag: true, + nodeIntegration: true, + nodeIntegrationInWorker: true, + sandbox: false, + webSecurity: false, + allowRunningInsecureContent: true, + contextIsolation: false, + backgroundThrottling: false, + enableWebSQL: false, + disableBlinkFeatures: 'OutOfBlinkCors,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure', + preload: getAsarPath('dist/main/preload.js') + } + }) + win.removeMenu() + if (DEBUGGING) { + const url = `http://${process.env['VITE_DEV_SERVER_HOST']}:${process.env['VITE_DEV_SERVER_PORT']}/index.html` + win.loadURL(url, { + userAgent: ua, + httpReferrer: Referer + }) + } else { + win.loadURL('file://' + getAsarPath('dist/renderer/main2.html'), { + userAgent: ua, + httpReferrer: Referer + }) + } + remote.enable(win.webContents) + if (isDbu || DEBUGGING) { + win.webContents.openDevTools() + } else { + win.webContents.on('devtools-opened', () => { + if (win) win.webContents.closeDevTools() + }) + } + + win.on('ready-to-show', function () { + win.webContents.send('setPage', data) + win.setTitle('预览窗口') + win.show() + }) + + win.webContents.on('did-create-window', (childWindow) => { + if (process.platform === 'win32') { + childWindow.setMenu(null) + } + }) +}) + +ipcMain.on('WebOpenUrl', (event, data) => { + let width = mainWindow && !mainWindow.isDestroyed() ? mainWindow.getSize() : [900, 700] + let win = new BrowserWindow({ + show: false, + width: width[0], + height: width[1], + center: true, + minWidth: 680, + minHeight: 500, + icon: getResourcesPath('app.ico'), + useContentSize: true, + frame: true, + hasShadow: true, + autoHideMenuBar: true, + backgroundColor: data.theme && data.theme == 'dark' ? '#23232e' : '#ffffff', + webPreferences: { + spellcheck: false, + devTools: isDbu || DEBUGGING, + sandbox: false, + webSecurity: false, + allowRunningInsecureContent: true, + backgroundThrottling: false, + enableWebSQL: false, + disableBlinkFeatures: 'OutOfBlinkCors,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure' + } + }) + win.removeMenu() + win.loadURL(data.PageUrl, { + userAgent: ua, + httpReferrer: Referer + }) + remote.enable(win.webContents) + win.webContents.on('devtools-opened', () => { + if (win) win.webContents.closeDevTools() + }) + + win.on('ready-to-show', function () { + win.setTitle('预览窗口') + win.show() + }) +}) diff --git a/packages/main/mainfile.ts b/packages/main/mainfile.ts new file mode 100644 index 0000000..b4e341b --- /dev/null +++ b/packages/main/mainfile.ts @@ -0,0 +1,178 @@ +import { app } from 'electron' +import path from 'path' +import { existsSync, mkdirSync, writeFileSync, copyFileSync, rmSync } from 'fs' +const DEBUGGING = process.env.NODE_ENV === 'development' + + +let NewCopyed = false +let NewSaved = false +export function getAsarPath(filename: string) { + if (DEBUGGING) { + let basePath = path.resolve(app.getAppPath()) + return path.join(basePath, filename) + } else { + let basePath = path.resolve(app.getAppPath()) + let baseNew = path.join(basePath, '..', 'app.new') + let baseSave = path.join(basePath, '..', 'default_app.asar') + if (NewCopyed == false) { + if (existsSync(baseNew)) { + try { + console.log('copyFileSync', baseNew, '-->', baseSave) + copyFileSync(baseNew, baseSave) + rmSync(baseNew, { force: true }) + NewCopyed = true + } catch (e) { + console.log(e) + } + } + } + if (NewSaved == false) NewSaved = existsSync(baseSave) + if (NewSaved) return path.join(baseSave, filename) + return path.join(basePath, filename) + } +} + +export function getResourcesPath(filename: string) { + if (DEBUGGING) { + let basePath = path.resolve(app.getAppPath()) + return path.join(basePath, filename) + } else { + let basePath = path.resolve(app.getAppPath(), '..') + + if (filename == 'app.ico' && process.platform !== 'win32') { + filename = 'app.png' + } + + if (filename == 'app.ico') { + try { + let png = path.join(basePath, filename) + if (!existsSync(png)) { + let bufferData = Buffer.from(appicon, 'base64') + writeFileSync(png, bufferData) + } + } catch {} + } + + if (filename == 'app.png') { + try { + let png = path.join(basePath, filename) + if (!existsSync(png)) { + let bufferData = Buffer.from(apppng, 'base64') + writeFileSync(png, bufferData) + } + } catch {} + } + + return path.join(basePath, filename) + } +} +export function getCrxPath() { + if (DEBUGGING) { + let basePath = path.resolve(app.getAppPath()) + return path.join(basePath, 'crx') + } else { + let basePath = path.resolve(app.getAppPath(), '..') + basePath = path.join(basePath, 'crx') + try { + if (!existsSync(basePath)) mkdirSync(basePath) + } catch {} + try { + let manifest = path.join(basePath, 'manifest.json') + if (!existsSync(manifest)) writeFileSync(manifest, crxmanifest, 'utf-8') + } catch {} + try { + let devtoolshtml = path.join(basePath, 'devtools.html') + if (!existsSync(devtoolshtml)) writeFileSync(devtoolshtml, crxdevtoolshtml, 'utf-8') + } catch {} + try { + let devtoolsjs = path.join(basePath, 'devtools.js') + if (!existsSync(devtoolsjs)) writeFileSync(devtoolsjs, crxdevtoolsjs, 'utf-8') + } catch {} + + return basePath + } +} + +export function getUserDataPath(filename: string) { + return path.join(app.getPath('userData'), filename) +} + + +export function mkAriaConf(filePath: string) { + try { + if (!existsSync(filePath)) writeFileSync(filePath, ariaconf, 'utf-8') + } catch {} +} + +const appicon = + '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BF8/Pwh1OjoNY0Y4EmpKPxh7XFQhgmhiJ4VnYSqCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuCXlgrgl5YK4JeWCuFZ2EqgmhiJ3tcVCFqSj8YY0Y4EnU6Og1fPz8Ifz8/BH9/fwIAAAABAAAAAVVVVQN/VVUGc0VFC3FGOBKHZ18gyLu3T+Ha2Irj29um4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avi3Nmr4tzZq+Lc2avj29um4drYisi7t0+HZ18gcUY4EnNFRQt/VVUGVVVVAwAAAAF/f38Cfz8/BF8/PwhtSEgOjHJpHdbMzGv29fXP+/v79f39/fz9/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f39/fz7+/v19vX1z9bMzGuMcmkdbUhIDl8/Pwh/Pz8Ef39/An9/fwJ/Pz8EZkxMCnFGRhLPwb5L9vPzz/39/f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f399vPzz8/BvktxRkYSZkxMCn8/PwR/f38Cf39/AmYzMwVzRUULf2JiGuTc3If8+/v1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+/v15Nzch39iYhpzRUULZjMzBX9/fwJVVVUDVSoqBmo/PwyIbm4e5d/fov39/Pz///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/Pzl39+iiG5uHmo/PwxVKioGVVVVAz8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////z8///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///7+////v7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7///v7///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///9/f/////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////+/v//2tr//7Ky//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7m5///t7f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4///tLT//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//tLT//+Dg//////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////7+///Y2P//hYX//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//f3///8rK///+/v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//7i4//97e///eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//+Kiv//4OD//////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////Hx//+cnP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//qKj///f3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7v//l5f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6Wl///19f/////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////Pz//7+///98fP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Njf//5ub//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9TU//+Cgv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//9+fv//ycn///7+//////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////4eH//4qK//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///IyP///v7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//srL//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5CQ///o6P///////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////29v//p6f//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6am///29v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr//+Skv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//95ef//r6////n5///////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////7+///Ly///f3///3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///jIz//+Tk///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//z8///4CA//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4KC///T0////v7///////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////+rq//+Skv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//99ff//xsb///7+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4//+srP//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///mJj//+/v/////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////+vr//7Oz//96ev//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+lpf//9fX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//46O//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3t7//+7u///+/v////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////+/v//19f//4SE//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4uL///j4/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///Jyf//fn7//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///h4f//93d//////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////x8f//nJz//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fX3//8XF///9/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb//6am//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+iov//9PT//////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////z8//+/v///fHz//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//o6P///X1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4///i4v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fX3//8bG///+/v/////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////+Hh//+Kiv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Jif//4uL//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f3//8PD//98fP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Ojv//5ub///////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////9vb//6am//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3x8///Dw////f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////09P//oaH//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eXn//62t///4+P///////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////+/v//ysr//35+//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6Gh///09P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////97e//+Hh///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Bgf//0dH///7+///////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////p6f//kZH//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///iIj//+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P//vb3//3t7//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5aW///t7f////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////n5//+ysv//eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//98fP//wcH///39//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Hx//+bm///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//96ev//uLj///v7/////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9bW//+Dg///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+goP//8/P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2dn//4SE//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4aG///b2//////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////8PD//5ub//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4eH///e3v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//+3t///enr//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//oKD///Pz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P//vr7//3x8//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///e3v//7+////9/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7//5eX//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///ExP///f3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////h4f//ior//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//np7///Ly//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///U1P//goL//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///jIz//+Tk///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b2//+mpv//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Ghv//3Nz/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//7Gx//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+rq///9/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//8rK//9+fv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3t7//+9vf//+/v///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///p6f//kpL//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///gID//8/P///+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6en//5GR//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5KS//+/v///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//8PD///Dw///w8P//66u//9+fv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+UlP//7Oz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//srL//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///e3v//3t7//97e///enr//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///enr//7a2///6+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///W1v//g4P//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Fhf//2dn//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Dw//+bm///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//56e///y8v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pz//76+//97e///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//98fP//wcH///39//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4OD//4mJ//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4uL///i4v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////29v//pqb//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//qKj///b2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///Kyv//fn7//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//39////MzP///v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+np//+Rkf//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///kpL//+rq/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//7Ky//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3p6//+zs///+vr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//1tb//4OD//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///g4P//9fX///+/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8P//m5v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+bm///8fH//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8//++vv//e3v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//98fP//ior//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//jIz//4yM//+MjP//goL//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fHz//76+///8/P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Dg//+Jif//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4iI///U1P//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+rq///q6v//6ur//+bm//+pqf//eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Jif//4OD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb//6am//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fn7//8vL///+/v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7//5eX//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6am///29v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//ysr//35+//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//qan///f3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///U1P//goL//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//9+fv//ysr///7+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////p6f//kZH//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Njf//5ub/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//7Oz//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5GR///o6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5//+xsf//eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///IyP///v7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////r6///lJT//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//95ef//sbH///n5/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9XV//+Dg///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6am///29v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9DQ//+AgP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4KC///U1P///v7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8PD//5qa//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///i4v//+Pj///////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//rq7//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///mZn//+/v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P//vb3//3t7//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//99ff//xcX///39/////////////////////////////////////////////////////////////////////////////////////////////////////////////+np//+QkP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3t7//+8vP///Pz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f3///iYn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+jo///9fX////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//zMz//39///93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///iIj//97e///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////X1//+lpf//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4mJ///h4f////////////////////////////////////////////////////////////////////////////////////////////////////////f3//+qqv//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+jo///9fX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//8nJ//9+fv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fHz//8HB///9/f//////////////////////////////////////////////////////////////////////////////////////////////////5ub//42N//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fX3//8fH///+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6Oj//5GR//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//oKD///Pz//////////////////////////////////////////////////////////////////////////////////////////////7+///Hx///fX3//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Pj///5+f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//sbH//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Hh///3t7/////////////////////////////////////////////////////////////////////////////////////////////9vb//6am//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eXn//66u///4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///V1f//g4P//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3t7//++vv///Pz////////////////////////////////////////////////////////////////////////////////////////j4///i4v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Bgf//0tL///7+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Dw//+amv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//52d///y8v///////////////////////////////////////////////////////////////////////////////////f3//8PD//98fP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5eX///u7v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pz//729//97e///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///hYX//9vb///////////////////////////////////////////////////////////////////////////////////09P//oqL//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//96ev//ubn///v7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39///4mJ//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//96ev//u7v///z8/////////////////////////////////////////////////////////////////////////////9/f//+IiP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4aG///c3P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19f//paX//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+amv//8PD////////////////////////////////////////////////////////////////////////9/f//v7///3t7//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//oKD///Pz///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///Jyf//fn7//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4SE///Z2f////////////////////////////////////////////////////////////////////////Ly//+env//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///ExP///f3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jo//+QkP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///enr//7e3///7+///////////////////////////////////////////////////////////////////29v//4WF//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///jY3//+Xl/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//6+v//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///mJj//+/v//////////////////////////////////////////////////////////////z8//+6uv//enr//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+rq///9/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//1NT//4KC//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Cgv//1tb///7+////////////////////////////////////////////////////////8PD//5qa//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///gID//9DQ///+/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7///mZn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3l5//+1tf//+vr////////////////////////////////////////////////////////Y2P//hIT//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Vlf//7Oz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8//+8vP//e3v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5WV///t7f//////////////////////////////////////////////////+/v//7e3//96ev//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///enr//7e3///6+v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f//+IiP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///gYH//9PT///+/v/////////////////////////////////////////////u7v//l5f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Fhf//2dn///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9fX//6Sk//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//95ef//sLD///n5/////////////////////////////////////////v7//9TU//+Cgv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//56e///y8v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//yMj//35+//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Skv//6+v////////////////////////////////////////5+f//srL//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//98fP//wsL///39///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6P//kJD//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4CA///Q0P///v7//////////////////////////////////+vr//+Tk///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4uL///j4/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5//+vr///eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//66u///5+f/////////////////////////////+/v//0ND//4CA//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//qan///f3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9TU//+Cgv//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///kJD//+np//////////////////////////////n5//+urv//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//39////Nzf///v7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///5mZ//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//9/f///zMz///7+////////////////////////6en//5CQ//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///k5P//+vr//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P//vLz//3t7//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+qqv//+Pj///////////////////7+///Ly///fn7//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3p6//+0tP//+vr//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f3///iIj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//46O///m5v//////////////////9/f//6mp//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///hIT//9fX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////X1//+kpP//eHj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fn7//8nJ///+/v/////////////m5v//jY3//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+cnP//8fH///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//8jI//99ff//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//p6f///b2/////////v7//8fH//99ff//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fHz//7+////8/P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//4+P//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+MjP//5OT////////29v//pqb//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Kiv//4eH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+f//r6///3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///Hx////f3//+Tk//+Li///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6am///29v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///T0///goL//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eHj//6qq///39///zMz//35+//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//9+fv//ysr///7+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//+Zmf//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///lJT//+rq//+1tf//eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5GR///p6f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pz//7u7//97e///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Ghv//1NT//6Gh//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//95ef//srL///n5//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3t7//4iI//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//35+//+6uv//kJD//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4OD///V1f///v7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19f//o6P//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///enr//5qa//+EhP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///mpr///Dw///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///Hx///fX3//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fHz//3l5//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3t7//+9vf///Pz///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//+Pj///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///iIj//9/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fn//6+v//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+kpP//9fX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//09P//4KC//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fX3//8jI///+/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7///mZn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Pj///5+f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z8//+7u///e3v//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///eXn//66u///5+f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////97e//+IiP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Bgf//0tL///7+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PT//6Oj//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//5iY///u7v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//x8f//319//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//96ev//urr///v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5///j4///3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4eH///d3f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j4//+urv//eXn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//oaH///T0/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7//9LS//+Bgf//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//319///Fxf///f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7u7//5iY//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//eHj//3h4//94eP//jo7//+bm//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///0ND//7Gx//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw//+wsP//sLD//7Cw///IyP//+fn//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///z8///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BD8/PwRVKioGaj8/DJB3bh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQd24eaj8/DFUqKgY/Pz8EPz8/BFUqKgZqPz8MkHduHuTg3qb9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95ODeppB3bh5qPz8MVSoqBj8/PwQ/Pz8EVSoqBmo/PwyQd24e5ODepv38/P3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/P3k4N6mkHduHmo/PwxVKioGPz8/BFVVVQNmMzMFaj8/DJBubh7k4N6m/fz8/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz8/eTg3qaQbm4eaj8/DGYzMwVVVVUDf39/An8/PwRzRUULjHJyHebg4KX9/Pz9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/Pz95uDgpYxych1zRUULfz8/BH9/fwJ/f38Cfz8/BHFUVAmYenoZ5+DgoP38/Pz///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////38/Pzn4OCgmHp6GXFUVAl/Pz8Ef39/An9/fwJ/Pz8EbUhIB5txcRLr5eOB/fz89P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////fz89Ovl44GbcXESbUhIB38/PwR/f38CAAAAAVVVVQNVVVUGc0VFC9zU1EL49vbM/f39/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f349vbM3NTUQnNFRQtVVVUGVVVVAwAAAAEAAAAAf39/An8/PwRtSEgHm42NEuLa12H39vbM/Pz89P38/fz9/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/P39/Pz9/fz8/f38/fz8/Pz09/b2zOLa12GbjY0SbUhIB38/PwR/f38CAAAAAAAAAAD///8BVVVVA38/PwRtSEgHpYeHEd/b10Dq5uZ/6ePjnerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6uTkoerk5KHq5OSh6ePjnerm5n/f29dApYeHEW1ISAd/Pz8EVVVVA////wEAAAAAAAAAAAAAAAAAAAABVVVVA38/PwRmZjMFf19fCKN/fw6pjY0SpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSljIwUpYyMFKWMjBSpjY0So39/Dn9fXwhmZjMFfz8/BFVVVQMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf39/AlVVVQN/Pz8Efz8/BH8/PwRmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBWYzMwVmMzMFZjMzBX8/PwR/Pz8Efz8/BFVVVQN/f38CAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///wH///8B////Af///wH///8BVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA////wH///8B////Af///wH///8BAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAf/////////////////////ygAAABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT8/PwRtSEgHcTg4CWYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCmYzMwpmMzMKZjMzCnE4OAltSEgHPz8/BAAAAAEAAAAAAAAAAX8/PwRqPz8MhGVbGYx4ciaMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMcmwojHJsKIxybCiMeHImhGVbGWo/Pwx/Pz8EAAAAAX9/fwJmMzMKwK2tNe/r6qHz8e/K8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/DwzPPw8Mzz8PDM8/Hvyu/r6qHAra01ZjMzCn9/fwJVVVUDk2trE/Dt7Z/9/f39///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f398O3tn5NraxNVVVUDZjMzBZqIfxz08vDI//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8MiaiH8cZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf//////////////////////////////////////9PT//9XV///T0///09P//9PT///T0///09P//9PT///X1///9/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////X1///V1f//09P//9PT///T0///09P//9PT///T0///1dX///X1///////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn//////////////////////////////////////+3t//+MjP//enr//3p6//96ev//enr//3p6//96ev//f3///9fX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////MzP//fHz//3p6//96ev//enr//3p6//96ev//enr//4+P///w8P//////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////8/P//q6v//3d3//93d///d3f//3d3//93d///d3f//3d3//+vr////f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+v//o6P//3d3//93d///d3f//3d3//93d///d3f//3d3//+xsf///f3///////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf///////////////////////////////////////////9bW//99ff//d3f//3d3//93d///d3f//3d3//93d///jo7///Hx////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6Oj//4aG//93d///d3f//3d3//93d///d3f//3d3//9+fv//2tr////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////z8///kpL//3d3//93d///d3f//3d3//93d///d3f//3x8///U1P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8XF//95ef//d3f//3d3//93d///d3f//3d3//93d///lpb///X1////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ/////////////////////////////////////////////v7//7q6//94eP//d3f//3d3//93d///d3f//3d3//93d///ra3///39//////////////////////////////////////////////////////////////////////////////////////////////////////////////j4//+dnf//d3f//3d3//93d///d3f//3d3//93d///eHj//76+///+/v////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////i4v//goL//3d3//93d///d3f//3d3//93d///d3f//4yM///v7//////////////////////////////////////////////////////////////////////////////////////////////////////////////j4///goL//3d3//93d///d3f//3d3//93d///d3f//4SE///l5f/////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////+Pj//56e//93d///d3f//3d3//93d///d3f//3d3//97e///09P////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//vr7//3h4//93d///d3f//3d3//93d///d3f//3d3//+hof//+vr/////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////////////////////IyP//eXn//3d3//93d///d3f//3d3//93d///d3f//6ur///8/P//////////////////////////////////////////////////////////////////////////////////////////////////9vb//5eX//93d///d3f//3d3//93d///d3f//3d3//96ev//y8v///////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf//////////////////////////////////////////////////////6+v//4mJ//93d///d3f//3d3//93d///d3f//3d3//+Li///7u7//////////////////////////////////////////////////////////////////////////////////////////////////97e//9/f///d3f//3d3//93d///d3f//3d3//93d///i4v//+3t///////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn///////////////////////////////////////////////////////z8//+rq///d3f//3d3//93d///d3f//3d3//93d///e3v//9DQ//////////////////////////////////////////////////////////////////////////////////////////////7+//+3t///eHj//3d3//93d///d3f//3d3//93d///d3f//66u///9/f//////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ////////////////////////////////////////////////////////////1tb//319//93d///d3f//3d3//93d///d3f//3d3//+oqP//+fn///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///x8f//kpL//3d3//93d///d3f//3d3//93d///d3f//319///Y2P////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf////////////////////////////////////////////////////////////Pz//+Skv//d3f//3d3//93d///d3f//3d3//93d///gYH//5+f//+hof//oaH//6Gh//+hof//oaH//6Gh//+hof//oaH//6Gh//+hof//oaH//6Gh//+hof//oaH//6Gh//+hof//mpr//3t7//93d///d3f//3d3//93d///d3f//3d3//+UlP//9PT////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////////////////////+/v//ubn//3h4//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//u7v///7+////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ/////////////////////////////////////////////////////////////////+Hh//+Bgf//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///goL//+Li//////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////////////////////4+P//nZ3//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//56e///5+f/////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn//////////////////////////////////////////////////////////////////////8jI//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3l5///Jyf//////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////////////////////////////////////r6///iYn//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+Jif//6+v///////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf///////////////////////////////////////////////////////////////////////Pz//6qq//93d///d3f//3d3//93d///d3f//3d3//9/f///sbH//7u7//+7u///u7v//7u7//+7u///u7v//7u7//+7u///u7v//7u7//+7u///u7v//6Wl//95ef//d3f//3d3//93d///d3f//3d3//93d///q6v///z8///////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////////////////////////////////////V1f//fX3//3d3//93d///d3f//3d3//93d///fX3//9fX//////////////////////////////////////////////////////////////7+//+3t///eHj//3d3//93d///d3f//3d3//93d///fHz//9XV////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ////////////////////////////////////////////////////////////////////////////8/P//5KS//93d///d3f//3d3//93d///d3f//3d3//+vr////f3////////////////////////////////////////////////////////z8///k5P//3d3//93d///d3f//3d3//93d///d3f//5GR///y8v////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf////////////////////////////////////////////////////////////////////////////7+//+4uP//eHj//3d3//93d///d3f//3d3//93d///jY3///Dw////////////////////////////////////////////////////////2dn//35+//93d///d3f//3d3//93d///d3f//3h4//+4uP///v7////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////////////////////////////////////4eH//4GB//93d///d3f//3d3//93d///d3f//3x8///T0////////////////////////////////////////////////////f3//7Ky//93d///d3f//3d3//93d///d3f//3d3//+Bgf//4OD/////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ//////////////////////////////////////////////////////////////////////////////////j4//+dnf//d3f//3d3//93d///d3f//3d3//93d///q6v///z8//////////////////////////////////////////////Hx//+Pj///d3f//3d3//93d///d3f//3d3//93d///nJz///j4//////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf//////////////////////////////////////////////////////////////////////////////////////x8f//3l5//93d///d3f//3d3//93d///d3f//4uL///u7v/////////////////////////////////////////////V1f//fHz//3d3//93d///d3f//3d3//93d///eXn//8XF///////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn//////////////////////////////////////////////////////////////////////////////////////+vr//+IiP//d3f//3d3//93d///d3f//3d3//97e///0ND////////////////////////////////////////9/f//ra3//3d3//93d///d3f//3d3//93d///d3f//4eH///p6f//////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////////////////////////////////////////////////////8/P//qqr//3d3//93d///d3f//3d3//93d///d3f//6io///8/P//////////////////////////////////7u7//4yM//93d///d3f//3d3//93d///d3f//3d3//+oqP//+/v///////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf///////////////////////////////////////////////////////////////////////////////////////////9XV//98fP//d3f//3d3//93d///d3f//3d3//+Jif//7Oz//////////////////////////////////9DQ//97e///d3f//3d3//93d///d3f//3d3//97e///0tL////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////////////////////////////////////////////////////y8v//kZH//3d3//93d///d3f//3d3//93d///enr//8zM//////////////////////////////z8//+oqP//d3f//3d3//93d///d3f//3d3//93d///j4////Hx////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ/////////////////////////////////////////////////////////////////////////////////////////////v7//7i4//94eP//d3f//3d3//93d///d3f//3d3//+kpP//+/v////////////////////////s7P//iYn//3d3//93d///d3f//3d3//93d///eHj//7W1///+/v////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////////////////////////////////////////////////////g4P//gYH//3d3//93d///d3f//3d3//93d///h4f//+np////////////////////////y8v//3p6//93d///d3f//3d3//93d///d3f//4CA///e3v/////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////////////////////////////////////////////////////+Pj//5yc//93d///d3f//3d3//93d///d3f//3l5///IyP//////////////////+vr//6Oj//93d///d3f//3d3//93d///d3f//3d3//+Zmf//9/f/////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////////////////////////////////////////////////////////////////////Hx///eXn//3d3//93d///d3f//3d3//93d///oaH///r6/////////////+jo//+Ghv//d3f//3d3//93d///d3f//3d3//95ef//w8P///////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf//////////////////////////////////////////////////////////////////////////////////////////////////////6+v//4iI//93d///d3f//3d3//93d///d3f//4WF///n5//////////////Gxv//eXn//3d3//93d///d3f//3d3//93d///hob//+fn///////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn///////////////////////////////////////////////////////////////////////////////////////////////////////z8//+pqf//d3f//3d3//93d///d3f//3d3//95ef//xcX////////5+f//n5///3d3//93d///d3f//3d3//93d///d3f//6Wl///7+///////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ////////////////////////////////////////////////////////////////////////////////////////////////////////////1NT//3x8//93d///d3f//3d3//93d///d3f//52d///5+f//5eX//4OD//93d///d3f//3d3//93d///d3f//3t7///Pz/////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf////////////////////////////////////////////////////////////////////////////////////////////////////////////Ly//+Rkf//d3f//3d3//93d///d3f//3d3//+Dg///5OT//8LC//94eP//d3f//3d3//93d///d3f//3d3//+Njf//7+/////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v//t7f//3h4//93d///d3f//3d3//93d///eXn//8TE//+hof//d3f//3d3//93d///d3f//3d3//93d///srL///39////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Dg//+Bgf//d3f//3d3//93d///d3f//3d3//+goP//jIz//3d3//93d///d3f//3d3//93d///f3///9vb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+P//nJz//3d3//93d///d3f//3d3//93d///gYH//3x8//93d///d3f//3d3//93d///d3f//5eX///19f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8bG//95ef//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3h4//+/v////v7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////q6v//iIj//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+EhP//5eX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pz//6mp//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///oqL///r6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////U1P//fHz//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///enr//83N////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8vL//5CQ//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//4uL///u7v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+//+4uP//enr//3p6//96ev//enr//3p6//96ev//enr//3p6//+vr////f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///9PT///T0///09P//9PT///T0///09P//9PT///T0///7e3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFZjMzBZ6Dgx308vLJ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smeg4MdZjMzBWYzMwWeg4Md9PLyyf/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////08vLJnoODHWYzMwVmMzMFnoODHfTy8sn/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9PLyyZ6Dgx1mMzMFfz8/BKOIiBz08vLJ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ty8smjiIgcfz8/BFVVVQOjjo4Z9fPzxv/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////18/PGo46OGVVVVQN/f38CkX9/DvXx8Zv+/v78///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v789fHxm5F/fw5/f38CAAAAAX8/PwTZzc0p9vT0mff09MX28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f28/PH9vPzx/bz88f39PTF9vT0mdnNzSl/Pz8EAAAAAQAAAAAAAAABVVVVA6KLiwu7rq4Ttp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vtp2dFbadnRW2nZ0Vu66uE6KLiwtVVVUDAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAF/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38Cf39/An9/fwJ/f38CAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAB4AAAAAAAAAcoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQNfPz8IYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNYjo6DWI6Og1iOjoNXz8/CFVVVQMAAAAAf39/AohmZg/UycZI3NPRcNvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLb0tBy29LQctvS0HLc09Fw08nFR4hmZg9/f38CZjMzBdrOzkX7+vri/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38/f39/P39/fz9/f38+vr54dXOzkRmMzMFSEhIB+bf3Wr9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/OTc3GlISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////6+v//zMz//7+///+/v///v7///7+////AwP//6Oj//////////////////////////////////////////////////////////////////////////////////////////////////+Pj//+/v///v7///7+///+/v///v7///87O///7+////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////8/P//rKz//3d3//93d///d3f//3d3//93d///tLT///7+/////////////////////////////////////////////////////////////////////////////////////////Pz//6mp//93d///d3f//3d3//93d///eHj//7Ky///9/f///////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////19f//319//93d///d3f//3d3//93d///kZH///Pz////////////////////////////////////////////////////////////////////////////////////////7Oz//4mJ//93d///d3f//3d3//93d///f3///9zc/////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////9PT//5OT//93d///d3f//3d3//93d///fX3//9jY////////////////////////////////////////////////////////////////////////////////////////y8v//3p6//93d///d3f//3d3//93d///l5f///b2/////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////v7//7u7//94eP//d3f//3d3//93d///d3f//7Gx///9/f/////////////////////////////////////////////////////////////////////////////6+v//o6P//3d3//93d///d3f//3d3//94eP//wMD///7+/////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////+Li//+Cgv//d3f//3d3//93d///d3f//4+P///y8v/////////////////////////////////////////////////////////////////////////////o6P//hYX//3d3//93d///d3f//3d3//+EhP//5ub//////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39//////////////////////////////////n5//+env//d3f//3d3//93d///d3f//3x8///W1v/////////////////////////////////////////////////////////////////////////////ExP//eXn//3d3//93d///d3f//3d3//+iov//+vr//////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////Jyf//eXn//3d3//93d///d3f//3d3//+vr////f3///////////////////////////////////////////////////////////////////j4//+cnP//d3f//3d3//93d///d3f//3p6///Nzf///////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////s7P//iYn//3d3//93d///d3f//3d3//+Njf//7e3///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr///r6///6+v//+vr//+Dg//+Cgv//d3f//3d3//93d///d3f//4uL///u7v///////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////8/P//rKz//3d3//93d///d3f//3d3//96ev//lJT//5ub//+bm///m5v//5ub//+bm///m5v//5ub//+bm///m5v//5ub//+bm///m5v//4+P//94eP//d3f//3d3//93d///d3f//6+v///9/f///////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////1tb//319//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///fn7//9nZ/////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////8/P//5OT//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///lZX///T0/////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////v7//7q6//94eP//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//94eP//vb3///7+/////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////+Li//+Cgv//d3f//3d3//93d///d3f//35+//+QkP//kZH//5GR//+Rkf//kZH//5GR//+Rkf//kZH//5GR//+Ojv//e3v//3d3//93d///d3f//3d3//+Dg///4+P//////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39//////////////////////////////////////////////////n5//+env//d3f//3d3//93d///d3f//46O///p6f//9fX///X1///19f//9fX///X1///19f//9fX///X1///b2///gYH//3d3//93d///d3f//3d3//+goP//+fn//////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////Jyf//eXn//3d3//93d///d3f//319///Z2f/////////////////////////////////////////////AwP//eHj//3d3//93d///d3f//3p6///Kyv///////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////r6///iYn//3d3//93d///d3f//3d3//+ysv///f3///////////////////////////////////f3//+Zmf//d3f//3d3//93d///d3f//4qK///s7P///////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////8/P//q6v//3d3//93d///d3f//3d3//+Pj///8fH//////////////////////////////////+Dg//+Bgf//d3f//3d3//93d///d3f//6ys///8/P///////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////////////////////1tb//3x8//93d///d3f//3d3//98fP//1tb//////////////////////////////v7//7u7//94eP//d3f//3d3//93d///fX3//9bW/////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////////////////////8/P//5KS//93d///d3f//3d3//93d///rq7///39////////////////////////9fX//5WV//93d///d3f//3d3//93d///k5P///Pz/////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////v7//7q6//94eP//d3f//3d3//93d///jY3///Dw////////////////////////3Nz//39///93d///d3f//3d3//94eP//ubn///7+/////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////+Li//+Bgf//d3f//3d3//93d///e3v//9LS///////////////////+/v//tbX//3d3//93d///d3f//3d3//+Bgf//4eH//////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39//////////////////////////////////////////////////////////////////n5//+dnf//d3f//3d3//93d///d3f//6qq///8/P/////////////z8///kZH//3d3//93d///d3f//3d3//+dnf//+Pj//////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////IyP//eXn//3d3//93d///d3f//4qK///t7f/////////////Y2P//fX3//3d3//93d///d3f//3l5///Hx////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////r6///iYn//3d3//93d///d3f//3p6///Pz/////////39//+wsP//d3f//3d3//93d///d3f//4iI///q6v///////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////8/P//q6v//3d3//93d///d3f//3d3//+mpv//+/v///Dw//+Ojv//d3f//3d3//93d///d3f//6mp///8/P///////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////////////////////////////////////1tb//3x8//93d///d3f//3d3//+IiP//6+v//9TU//98fP//d3f//3d3//93d///fHz//9TU/////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////////////////////////////////////8/P//5KS//93d///d3f//3d3//96ev//ysr//6ys//93d///d3f//3d3//93d///kJD///Ly/////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////v7//7m5//94eP//d3f//3d3//93d///oqL//5GR//93d///d3f//3d3//94eP//trb///7+/////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////+Hh//+Bgf//d3f//3d3//93d///goL//35+//93d///d3f//3d3//+AgP//39///////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39//////////////////////////////////////////////////////////////////////////////////j4//+dnf//d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+amv//9/f//////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////////////////////Hx///eXn//3d3//93d///d3f//3d3//93d///d3f//3l5///ExP///////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////////////////////r6///iIj//3d3//93d///d3f//3d3//93d///d3f//4aG///o6P///////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39///////////////////////////////////////////////////////////////////////////////////////8/P//qqr//3d3//93d///d3f//3d3//93d///d3f//6am///7+////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39////////////////////////////////////////////////////////////////////////////////////////////3Nz//6Gh//+fn///n5///5+f//+fn///oKD//9nZ/////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////////////////v7///v7///7+///+/v///v7///7+///+/v///7+/////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHSEhIB+Xd3Wz9/f39/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/OTd3WpISEgHZjMzBebf32n9/Pz9/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/Obe3mdmMzMFVVVVA+be3j/8+/vi/f39/P39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f38/Pv74Obe3j5VVVUDAAAAAJ+fnwjm4uI/7ejoZuvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjr5uZo6+bmaOvm5mjt5uZm6uXlPZ+fnwgAAAAAAAAAAAAAAAAAAAABfwAAAn9/fwJVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA1VVVQNVVVUDVVVVA39/fwJ/AAACAAAAAQAAAAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAEAAMAAAAAAAwAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAH9/AAKbjY0Ss56eJbWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEmtaGhJrWhoSa1oaEms56eJZuNjRJ/fwACqpmZD/Lv75L59vbX9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn39vXZ9/b12ff29dn59vbX8u/vkqqZmQ/DsrIe+vn51f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6+fnVw7KyHsW0tB/6+fnW//////////////////7+///9/f///f3///39///+/v///////////////////////////////////////////////////////////////////v7///39///9/f///f3///7+//////////////////r5+dbFtLQfxbS0H/r5+db/////////////////09P//6io//+oqP//qKj//8nJ///+/v////////////////////////////////////////////////////////39///Gxv//qKj//6io//+oqP//1dX/////////////////+vn51sW0tB/FtLQf+vn51v/////////////////a2v//fn7//3d3//93d///kpL///T0////////////////////////////////////////////////////////8PD//46O//93d///d3f//39////c3P/////////////////6+fnWxbS0H8W0tB/6+fnW//////////////////X1//+Wlv//d3f//3d3//9+fv//2tr////////////////////////////////////////////////////////T0///e3v//3d3//93d///l5f///b2//////////////////r5+dbFtLQfxbS0H/r5+db//////////////////v7//76+//94eP//d3f//3d3//+zs////v7//////////////////////////////////////////////Pz//6qq//93d///d3f//3h4///AwP//////////////////////+vn51sW0tB/FtLQf+vn51v//////////////////////5eX//4SE//93d///d3f//5GR///z8//////////////////////////////////////////////s7P//iYn//3d3//93d///hIT//+bm///////////////////////6+fnWxbS0H8W0tB/6+fnW///////////////////////6+v//oaH//3d3//93d///fX3//9TU///29v//9vb///b2///29v//9vb///b2///29v//9vb//8nJ//96ev//d3f//3d3//+jo///+vr///////////////////////r5+dbFtLQfxbS0H/r5+db////////////////////////////MzP//enr//3d3//93d///iIj//5OT//+Tk///k5P//5OT//+Tk///k5P//5OT//+Tk///hYX//3d3//93d///enr//83N////////////////////////////+vn51sW0tB/FtLQf+vn51v///////////////////////////+7u//+Li///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//93d///d3f//3d3//+MjP//7u7////////////////////////////6+fnWxbS0H8W0tB/6+fnW/////////////////////////////f3//6+v//93d///d3f//3d3//95ef//e3v//3t7//97e///e3v//3t7//97e///eXn//3d3//93d///d3f//6+v///9/f////////////////////////////r5+dbFtLQfxbS0H/r5+db/////////////////////////////////2dn//35+//93d///d3f//56e///Y2P//2dn//9nZ///Z2f//2dn//9XV//+Tk///d3f//3d3//9+fv//2tr/////////////////////////////////+vn51sW0tB/FtLQf+vn51v/////////////////////////////////19f//lZX//3d3//93d///kpL///T0////////////////////////6+v//4iI//93d///d3f//5WV///19f/////////////////////////////////6+fnWxbS0H8W0tB/6+fnW//////////////////////////////////7+//+9vf//eHj//3d3//99ff//2tr////////////////////////Kyv//eXn//3d3//94eP//vb3///7+//////////////////////////////////r5+dbFtLQfxbS0H/r5+db//////////////////////////////////////+Xl//+Dg///d3f//3d3//+ysv///v7/////////////+vr//6Gh//93d///d3f//4OD///k5P//////////////////////////////////////+vn51sW0tB/FtLQf+vn51v//////////////////////////////////////+vr//6Gh//93d///d3f//4+P///y8v/////////////n5///hYX//3d3//93d///oKD///r6///////////////////////////////////////6+fnWxbS0H8W0tB/6+fnW////////////////////////////////////////////zMz//3p6//93d///fHz//9bW/////////////8XF//95ef//d3f//3p6///Kyv////////////////////////////////////////////r5+dbFtLQfxbS0H/r5+db////////////////////////////////////////////u7v//i4v//3d3//93d///rq7///39///5+f//nZ3//3d3//93d///ior//+3t////////////////////////////////////////////+vn51sW0tB/FtLQf+vn51v////////////////////////////////////////////39//+vr///d3f//3d3//+Njf//8PD//+Tk//+Dg///d3f//3d3//+srP///f3////////////////////////////////////////////6+fnWxbS0H8W0tB/6+fnW/////////////////////////////////////////////////9nZ//99ff//d3f//3t7///S0v//v7///3h4//93d///fX3//9fX//////////////////////////////////////////////////r5+dbFtLQfxbS0H/r5+db/////////////////////////////////////////////////9fX//5WV//93d///d3f//6am//+Zmf//d3f//3d3//+Tk///8/P/////////////////////////////////////////////////+vn51sW0tB/FtLQf+vn51v/////////////////////////////////////////////////+/v//vb3//3h4//93d///g4P//4CA//93d///eHj//7q6///+/v/////////////////////////////////////////////////6+fnWxbS0H8W0tB/6+fnW///////////////////////////////////////////////////////k5P//g4P//3d3//93d///d3f//3d3//+Bgf//4uL///////////////////////////////////////////////////////r5+dbFtLQfxbS0H/r5+db///////////////////////////////////////////////////////r6//+goP//d3f//3d3//93d///d3f//52d///5+f//////////////////////////////////////////////////////+vn51sW0tB/FtLQf+vn51v///////////////////////////////////////////////////////////83N//+Bgf//f3///39///+Bgf//ycn////////////////////////////////////////////////////////////6+fnWxbS0H8W0tB/6+fnW////////////////////////////////////////////////////////////+Pj//+Pj///i4v//4uL//+Pj///39/////////////////////////////////////////////////////////////r5+dbFtLQfxbS0H/r5+db/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vn51sW0tB/KuLgd+/r61P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+vrUyri4HdC5uQv19PSN+/r60/v6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r61Pv6+tT7+vrU+/r60/X09I3QubkLAAAAAMzMzArf1NQY183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrXzc0a183NGtfNzRrf1NQYzMzMCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAASgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAADg29sy7urqfe3p6YDt6emA7enpgO3p6YDt6emA7enpgO3p6YDt6emA7enpgO3p6YDt6emA7enpgO7q6n3g29sy8vDwef7+/v7//Pz///j4///5+f///v7////////////////////////+/v//+fn///j4///8/P/+/v7+8vDwefLw8Hv//////+jo//+dnf//qan///b2////////////////////////9PT//6en//+env//6en///////Lw8Hvy8PB7///////29v//l5f//39////d3f///////////////////////9nZ//99ff//mJj///b2///////y8PB78vDwe////////////8DA//95ef//s7P///Ly///z8///8/P///Ly//+urv//eHj//8HB////////////8vDwe/Lw8Hv////////////m5v//hIT//39///+Njf//jY3//42N//+Njf//fn7//4WF///n5/////////////Lw8Hvy8PB7////////////+/v//6Oj//94eP//mZn//6ur//+rq///lpb//3d3//+jo///+/v////////////y8PB78vDwe//////////////////Ozv//e3v//7e3///9/f///Pz//66u//96ev//zs7/////////////////8vDwe/Lw8Hv/////////////////7+///42N//+Tk///9PT///Dw//+Njf//jIz//+/v//////////////////Lw8Hvy8PB7//////////////////39//+xsf//fn7//9vb///S0v//e3v//7Cw///9/f/////////////////y8PB78vDwe///////////////////////29v//39///+xsf//qan//35+///a2v//////////////////////8vDwe/Lw8Hv///////////////////////b2//+Xl///hob//4SE//+Wlv//9fX///////////////////////Lw8Hvy8PB7////////////////////////////wMD//3l5//94eP//vr7///7+///////////////////////y8PB78vDwe////////////////////////////+zs//+1tf//tbX//+vr////////////////////////////8vDwe/Ty8nj+/v7+/////////////////////////////v7///7+/////////////////////////////v7+/vTy8njz7e0t+Pb2dfj29nf49vZ3+Pb2d/j29nf49vZ3+Pb2d/j29nf49vZ3+Pb2d/j29nf49vZ3+Pb2d/j29nXz7e0tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==' +const apppng = + 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARrSURBVGhD7VpLTxNRGK0aoxvjj3Fnot1o5A+wNnFRxbgwbsQXBV9BDCqgMSpYH4mJQngFSMQYXfiqaFVEBWktFGkQrBHxRVs89nRuk87MnTKvJsV4krPozHfv/c7MnXO/Ox1PHpZ5PP7lfr9/eXl5+YpSJHNjjkqueQgEAqtjsbh3airhi8dndpQ2E77JyekNzDmbPJV9+BD3plLp2MLCQjrDUkc6k+tYJueNzN2zbp1vZTQar0hnUscSAUVkBGxn7p6ysrJVkcjkLkoT50seFBCJfNzJ3P8L0OLPHyCVkpPn3EBRBYTDwNWrQCCg5pUrwMiICHKIoglIp4Fbt4C9e+W8cUO5E05RNAEzM0BtrTx58vhxYGpKBDtA0QQ8fgzs2ydPnuS5Bw9EsAMURcDv30BLizzxfF68CPz6JRrZRFEEjI8DNTXqZA8fBqqq1Meqq4FoVDSyCdcF0B5v3wYqK9XJXrsGNDSojzGmr8+ZpbouYG4OaGxUJ7p/P/D0KdDWpj5OnjkDfPsmGtuA6wLevgUOHlQnSTeiKw0N6c/xN4/bhasC6P2treoEyZznf/0KnDqlP3/zptLWDlwVwKt84oQ6OU6fFy+U8+y1s1N9nuQdmp5WYqzCVQFPnui9v64OSCREQAbDw8ChQ+oYtuG6YQeuCZifl3s/y4n86cGHXOtGJNty/bAK1wTEYnrvP3AAGBwUAQK0zN5edRzJtlw/rMIVAUyqv1/v/fX1yoOrBatUv18dy7ZcP6yuCa4IkHk/2d7OAURQHn78AM6d08c3NSl9WYErAmTez988LgOv8p07+jvGh9uojREcCzDy/tOngdlZESTB2Jj+mSG5WltZExwLkHk/2d0tnz45sAq9cEHfjrb7+bMIMgHHAoJBvfdzKpjZMt6/r59GubrJLBwJoPdfvqxOgGS58OmT8rAW4uiofBpxz8y+zcCRAHo/63xtAqz7WWVywSpECuVaoW1/5AgwMSEGWQS2BRh5vxtkn3fvmlsTbAugX9O3ZQm4Qa4T37+LwQrAtgD6tbYoc5OchmaMwJYA+rRsd0UHOXsWuHTJGrlmyKZiRwcTFIMawJYA+rTM+1n7sHROJq2Ri5rMDE6eBL58EYMawJYAmfeTZq6YDCyjm5v1/fGOPn8uggxgWYCR9xeqfcyAL7lkF4VvM3iXjGBZgJH3cx47ebvA14zHjun7PXoUiMdFkASWBBhVkWRXl73pkwOv8vXr+n45FksOozXBkgD6ssz7aafc6zrFwIAy77X9nz8P/PwpgjSwJODdO7n3syywuhGRwcjduHvjLk4G0wKMvJ/s6TG37C8GjsF3RNr+OY2MynPTAjhHnz0D7t1Tk/PTjff8OUxkijjtGGQoJP9DxLSAUsU/KCAa37nU/ugOhz9WZAXw3+5Q6P3mZDKV+9Sg5DmfTI6HQm82Zf+p5xcgPl/t2kfBobJXr8O7Xw6O7illMseHwddbmLPy9Yr44MPr3bp6/fpta5YCmWv2Qw+Px/MXtfYN1sAP5SgAAAAASUVORK5CYII=' + +const crxmanifest = `{"manifest_version": 2,"name": "demo","version": "1.0.0","description": "demo","devtools_page": "devtools.html","permissions": ["http://*/*", "https://*/*"]}` + +const crxdevtoolshtml = `` + +const crxdevtoolsjs = `chrome.devtools.network.onRequestFinished.addListener(function (detail) { + let url = detail.request.url; + if (url.indexOf("api.aliyundrive.com") > 0) return; + if (url.indexOf("_tmd_") > 0) return; + if (url.indexOf(".aliyundrive.com") <= 0) return; + if (detail.request.method != "POST") return; + + detail.getContent(function (content, mimeType) { + try { + if (typeof content == "string" && content.indexOf('"bizExt"') > 0) { + const data = JSON.parse(content); + const bizExt = data.content?.data?.bizExt || ""; + if (bizExt) { + chrome.devtools.inspectedWindow.eval( + "console.log('" + JSON.stringify({ bizExt: bizExt }) + "')" + ); + } + } + } catch {} + }); +}); + + ` + +const ariaconf = `# debug, info, notice, warn or error + log-level=error + file-allocation=trunc + user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 + max-concurrent-downloads=64 + max-connection-per-server=16 + enable-rpc=true + rpc-allow-origin-all=true + rpc-listen-all=false + rpc-listen-port=29387 + rpc-secret=S4znWTaZYQi3cpRNb + rpc-secure=false + pause-metadata=true + http-no-cache=true + disk-cache=32M + continue=true + allow-overwrite=true + auto-file-renaming=false + max-download-result=1000 + no-netrc=true + reuse-uri=true + quiet=true + disable-ipv6=false + check-certificate=false + save-session= + save-session-interval=0 + follow-metalink=false + follow-torrent=false + enable-dht=false + enable-dht6=false + bt-enable-lpd=false + enable-peer-exchange=false + bt-request-peer-speed-limit=1 + dht-file-path= + dht-file-path6= + seed-time=0 + force-save=false + bt-save-metadata=false + ` diff --git a/packages/main/vite.config.ts b/packages/main/vite.config.ts new file mode 100644 index 0000000..194e576 --- /dev/null +++ b/packages/main/vite.config.ts @@ -0,0 +1,19 @@ +import { builtinModules } from "module"; +import { defineConfig } from "vite"; + +export default defineConfig({ + root: __dirname, + build: { + outDir: "../../dist/main", + lib: { + entry: "index.ts", + formats: ["cjs"], + fileName: () => "[name].js", + }, + minify: process.env./* from mode option */ NODE_ENV === "production", + emptyOutDir: false, + rollupOptions: { + external: ["electron", ...builtinModules], + }, + }, +}); diff --git a/packages/preload/index.ts b/packages/preload/index.ts new file mode 100644 index 0000000..36a7363 --- /dev/null +++ b/packages/preload/index.ts @@ -0,0 +1,181 @@ +import fs from 'fs' +import electron, { ipcRenderer } from 'electron' + +window.Electron = electron +process.noAsar = true +window.platform = process.platform + +ipcRenderer.on('winmsg', function (event, arg) { + try { + if (window.WinMsg) window.WinMsg(JSON.parse(arg)) + } catch {} +}) +window.WinMsgToMain = function (data: any) { + try { + ipcRenderer.send('winmsgmain', JSON.stringify(data)) + } catch {} +} +window.WinMsgToUI = function (data: any) { + try { + ipcRenderer.send('winmsgui', JSON.stringify(data)) + } catch {} +} +window.WebToElectron = function (data: any) { + try { + ipcRenderer.send('WebToElectron', data) + } catch {} +} + +window.WebToElectronCB = function (data: any, callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebToElectronCB', data) + callback(backdata) + } catch {} +} + +ipcRenderer.on('ElectronToWeb', function (event, arg) { + +}) +ipcRenderer.on('MainSendToken', function (event, arg) { + try { + window.postMessage(arg) + } catch {} +}) + +window.WebSpawnSync = function (data: any, callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebSpawnSync', data) + callback(backdata) + } catch {} +} +window.WebExecSync = function (data: any, callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebExecSync', data) + callback(backdata) + } catch {} +} +window.WebShowOpenDialogSync = function (config: any, callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebShowOpenDialogSync', config) + callback(backdata) + } catch {} +} + +window.WebShowSaveDialogSync = function (config: any, callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebShowSaveDialogSync', config) + callback(backdata) + } catch {} +} +window.WebShowItemInFolder = function (fullpath: string) { + try { + ipcRenderer.send('WebShowItemInFolder', fullpath) + } catch {} +} + +window.WebPlatformSync = function (callback: any) { + try { + const backdata = ipcRenderer.sendSync('WebPlatformSync') + callback(backdata) + } catch {} +} + +window.WebClearCookies = function (data: any) { + try { + ipcRenderer.send('WebClearCookies', data) + } catch {} +} +window.WebClearCache = function (data: any) { + try { + ipcRenderer.send('WebClearCache', data) + } catch {} +} +window.WebUserToken = function (data: any) { + try { + ipcRenderer.send('WebUserToken', data) + } catch {} +} +window.WebSaveTheme = function (data: any) { + try { + ipcRenderer.send('WebSaveTheme', data) + } catch {} +} + +window.WebReload = function (data: any) { + try { + ipcRenderer.send('WebReload', data) + } catch {} +} +window.WebRelaunch = function (data: any) { + try { + ipcRenderer.send('WebRelaunch', data) + } catch {} +} +window.WebRelaunchAria = function () { + try { + ipcRenderer.send('WebRelaunchAria') + } catch {} +} +window.WebSetProgressBar = function (data: any) { + try { + ipcRenderer.send('WebSetProgressBar', data) + } catch {} +} +window.WebSetCookies = function (cookies: any) { + try { + ipcRenderer.send('WebSetCookies', cookies) + } catch {} +} + +window.WebOpenWindow = function (data: any) { + try { + ipcRenderer.send('WebOpenWindow', data) + } catch {} +} +window.WebOpenUrl = function (data: any) { + try { + ipcRenderer.send('WebOpenUrl', data) + } catch {} +} +window.WebShutDown = function (data: any) { + try { + ipcRenderer.send('WebShutDown', data) + } catch {} +} + +function createRightMenu() { + window.addEventListener( + 'contextmenu', + (e) => { + try { + if (e) e.preventDefault() + if (isEleEditable(e.target)) { + ipcRenderer.send('WebToElectron', { cmd: 'menuedit' }) + } else { + + let selectText = window.getSelection()?.toString() + if (!!selectText) ipcRenderer.send('WebToElectron', { cmd: 'menucopy' }) + } + } catch {} + }, + false + ) +} +/** + * 判断点击区域可编辑 + */ +function isEleEditable(e: any): boolean { + if (!e) { + return false + } + + if ((e.tagName === 'INPUT' && e.type !== 'checkbox') || e.tagName === 'TEXTAREA' || e.contentEditable == 'true') { + return true + } else { + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return isEleEditable(e.parentNode) + } +} + +createRightMenu() diff --git a/packages/preload/vite.config.ts b/packages/preload/vite.config.ts new file mode 100644 index 0000000..d17eb38 --- /dev/null +++ b/packages/preload/vite.config.ts @@ -0,0 +1,20 @@ +import { builtinModules } from 'module' +import { defineConfig } from 'vite' + +export default defineConfig({ + root: __dirname, + build: { + outDir: '../../dist/main', + lib: { + entry: 'index.ts', + formats: ['cjs'], + fileName: () => 'preload.js' + }, + minify: process.env./* from mode option */ NODE_ENV === 'production', + + emptyOutDir: false, + rollupOptions: { + external: ['electron', ...builtinModules] + } + } +}) diff --git a/packages/renderer/components.d.ts b/packages/renderer/components.d.ts new file mode 100644 index 0000000..0935eb8 --- /dev/null +++ b/packages/renderer/components.d.ts @@ -0,0 +1,62 @@ +// generated by unplugin-vue-components +// We suggest you to commit this file into source control +// Read more: https://github.com/vuejs/vue-next/pull/3399 +import '@vue/runtime-core' + +declare module '@vue/runtime-core' { + export interface GlobalComponents { + AAlert: typeof import('ant-design-vue/es')['Alert'] + AAutoComplete: typeof import('ant-design-vue/es')['AutoComplete'] + AAvatar: typeof import('ant-design-vue/es')['Avatar'] + ABadge: typeof import('ant-design-vue/es')['Badge'] + AButton: typeof import('ant-design-vue/es')['Button'] + AButtonGroup: typeof import('ant-design-vue/es')['ButtonGroup'] + ACard: typeof import('ant-design-vue/es')['Card'] + ACardGrid: typeof import('ant-design-vue/es')['CardGrid'] + ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] + ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup'] + ACol: typeof import('ant-design-vue/es')['Col'] + ADatePicker: typeof import('ant-design-vue/es')['DatePicker'] + ADivider: typeof import('ant-design-vue/es')['Divider'] + ADropdown: typeof import('ant-design-vue/es')['Dropdown'] + AEmpty: typeof import('ant-design-vue/es')['Empty'] + AForm: typeof import('ant-design-vue/es')['Form'] + AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AImage: typeof import('ant-design-vue/es')['Image'] + AImagePreviewGroup: typeof import('ant-design-vue/es')['ImagePreviewGroup'] + AInput: typeof import('ant-design-vue/es')['Input'] + AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] + AInputSearch: typeof import('ant-design-vue/es')['InputSearch'] + ALayout: typeof import('ant-design-vue/es')['Layout'] + ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] + ALayoutFooter: typeof import('ant-design-vue/es')['LayoutFooter'] + ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] + ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] + AList: typeof import('ant-design-vue/es')['List'] + AListItem: typeof import('ant-design-vue/es')['ListItem'] + AMenu: typeof import('ant-design-vue/es')['Menu'] + AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] + AModal: typeof import('ant-design-vue/es')['Modal'] + APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] + APopover: typeof import('ant-design-vue/es')['Popover'] + AProgress: typeof import('ant-design-vue/es')['Progress'] + ARadio: typeof import('ant-design-vue/es')['Radio'] + ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] + ARow: typeof import('ant-design-vue/es')['Row'] + ASelect: typeof import('ant-design-vue/es')['Select'] + ASpin: typeof import('ant-design-vue/es')['Spin'] + AStep: typeof import('ant-design-vue/es')['Step'] + ASteps: typeof import('ant-design-vue/es')['Steps'] + ASwitch: typeof import('ant-design-vue/es')['Switch'] + ATabPane: typeof import('ant-design-vue/es')['TabPane'] + ATabs: typeof import('ant-design-vue/es')['Tabs'] + ATag: typeof import('ant-design-vue/es')['Tag'] + ATextarea: typeof import('ant-design-vue/es')['Textarea'] + ATree: typeof import('ant-design-vue/es')['Tree'] + ATypography: typeof import('ant-design-vue/es')['Typography'] + ATypographyParagraph: typeof import('ant-design-vue/es')['TypographyParagraph'] + ATypographyText: typeof import('ant-design-vue/es')['TypographyText'] + } +} + +export {} diff --git a/packages/renderer/index.html b/packages/renderer/index.html new file mode 100644 index 0000000..f162ce7 --- /dev/null +++ b/packages/renderer/index.html @@ -0,0 +1,43 @@ + + + + + 阿里云盘小白羊版 + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + diff --git a/packages/renderer/public/favicon.ico b/packages/renderer/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..01583abc154dfda63778dd020ff29dc4ff8c5cb0 GIT binary patch literal 14326 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 literal 0 HcmV?d00001 diff --git a/packages/renderer/public/font/VideoJS.woff b/packages/renderer/public/font/VideoJS.woff new file mode 100644 index 0000000000000000000000000000000000000000..4b846ae5e03637378a8e75b8fbc27f968d6e6b14 GIT binary patch literal 4324 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 literal 0 HcmV?d00001 diff --git a/packages/renderer/public/lang/en.js b/packages/renderer/public/lang/en.js new file mode 100644 index 0000000..ef630d1 --- /dev/null +++ b/packages/renderer/public/lang/en.js @@ -0,0 +1,89 @@ +videojs.addLanguage('en', { + "Audio Player": "Audio Player", + "Video Player": "Video Player", + "Play": "Play", + "Pause": "Pause", + "Replay": "Replay", + "Current Time": "Current Time", + "Duration": "Duration", + "Remaining Time": "Remaining Time", + "Stream Type": "Stream Type", + "LIVE": "LIVE", + "Seek to live, currently behind live": "Seek to live, currently behind live", + "Seek to live, currently playing live": "Seek to live, currently playing live", + "Loaded": "Loaded", + "Progress": "Progress", + "Progress Bar": "Progress Bar", + "progress bar timing: currentTime={1} duration={2}": "{1} of {2}", + "Fullscreen": "Fullscreen", + "Non-Fullscreen": "Exit Fullscreen", + "Mute": "Mute", + "Unmute": "Unmute", + "Playback Rate": "Playback Rate", + "Subtitles": "Subtitles", + "subtitles off": "subtitles off", + "Captions": "Captions", + "captions off": "captions off", + "Chapters": "Chapters", + "Descriptions": "Descriptions", + "descriptions off": "descriptions off", + "Audio Track": "Audio Track", + "Volume Level": "Volume Level", + "You aborted the media playback": "You aborted the media playback", + "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.", + "No compatible source was found for this media.": "No compatible source was found for this media.", + "The media is encrypted and we do not have the keys to decrypt it.": "The media is encrypted and we do not have the keys to decrypt it.", + "Play Video": "Play Video", + "Close": "Close", + "Close Modal Dialog": "Close Modal Dialog", + "Modal Window": "Modal Window", + "This is a modal window": "This is a modal window", + "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.", + ", opens captions settings dialog": ", opens captions settings dialog", + ", opens subtitles settings dialog": ", opens subtitles settings dialog", + ", opens descriptions settings dialog": ", opens descriptions settings dialog", + ", selected": ", selected", + "captions settings": "captions settings", + "subtitles settings": "subtitles settings", + "descriptions settings": "descriptions settings", + "Text": "Text", + "White": "White", + "Black": "Black", + "Red": "Red", + "Green": "Green", + "Blue": "Blue", + "Yellow": "Yellow", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Background", + "Window": "Window", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-Transparent", + "Opaque": "Opaque", + "Font Size": "Font Size", + "Text Edge Style": "Text Edge Style", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Font Family", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Reset", + "restore all settings to the default values": "restore all settings to the default values", + "Done": "Done", + "Caption Settings Dialog": "Caption Settings Dialog", + "Beginning of dialog window. Escape will cancel and close the window.": "Beginning of dialog window. Escape will cancel and close the window.", + "End of dialog window.": "End of dialog window.", + "{1} is loading.": "{1} is loading.", + "Exit Picture-in-Picture": "Exit Picture-in-Picture", + "Picture-in-Picture": "Picture-in-Picture" +}); \ No newline at end of file diff --git a/packages/renderer/public/lang/zh-CN.js b/packages/renderer/public/lang/zh-CN.js new file mode 100644 index 0000000..b469850 --- /dev/null +++ b/packages/renderer/public/lang/zh-CN.js @@ -0,0 +1,90 @@ +videojs.addLanguage('zh-CN', { + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完成", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Picture-in-Picture": "画中画", + "Exit Picture-in-Picture": "退出画中画", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重新播放", + "Progress Bar": "进度条", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "窗口", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重置", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定窗口", + "Beginning of dialog window. Escape will cancel and close the window.": "打开对话窗口。Escape键将取消并关闭对话窗口", + "End of dialog window.": "结束对话窗口", + "Seek to live, currently behind live": "尝试直播,当前为延时播放", + "Seek to live, currently playing live": "尝试直播,当前为实时播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "正在加载 {1}。", + "Open quality selector menu":"选择清晰度" +}); \ No newline at end of file diff --git a/packages/renderer/public/loading.png b/packages/renderer/public/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..59e18d9ae2fe4e69bb9639744a9018a326c9a168 GIT binary patch literal 995 zcmV<9104K`P)Px#32;bRa{vGqB>(^xB>_oNB=7(L04-2VR7FQ{Oj~&W zT6q6ic>h#&|5kVZSa<(NZ~shj|4(!ON^t*0ZvRel|5J7UQFQ;?urn3_000kkQchC< z4<9gPQ$gUlmdy01c7>-K*}VV&10+dAK~zY`jh5YO(@+@3Pd`=_bhJTl1f@yX@M_d_ z7A8!pB=f3cx~4EtDbz(o6ox{iLGeOdDZNot%%}x#?98n~l_OrSP{ohlh@?zWq-gUu z_@1oo(lt5ty-6B=eV*sM=gnyma+YsmzELRDpDrTrI`FpuRV);XFV1=(z6*_wjSWIU z8IRnVb3LZ8zHS)C-KYz*)M%7Sg|3oK4MQ^xC|jwprDPcQhB6bTRC+(hA;e#NVnfEK z9cJY+q54aoEgD8Xe{(R_OdXI9vF!(eHK3}`olHnCm&;BDA^)0@SF1_Klcjp2UXKkX z7%Nt*>Wu**y?k=#TBabCx-B)M>-EROT{*3)>h=E8fYDw08(3ATUDv<6?bH#F zde)1r>y@w@G9+P>=T?_SVB zkRowIm5Ltof(;H0TP(D`?8HHfhiMnh)D{12!#0{VmB zppQI}(~T&4rQBA=9Kz0SZIpV6*v|4*B5JGgDt^j4uLE zpxG4ZZV@0;sU~e!B18$Lo8kh^Ekb%dEsCc`Lcx?M(cEk(Ac|s?2HAoDEl}KSh=iK+ zf*7U?je%6mTWD*L`~aQtfH;Qf-cC!B3!RmmL=IuisKlz z|6xD)x%{PIIF5^KzweSH%SVS(LpcnN$!R$gbzxZN(UF#Ac`-c5@Pk4KO#mck9FKgw zAaLBExQ{@~N + + + + 阿里云盘小白羊版 + + + + + + + + + + + + + +
+ + + + + diff --git a/packages/renderer/public/main2.html b/packages/renderer/public/main2.html new file mode 100644 index 0000000..999a69f --- /dev/null +++ b/packages/renderer/public/main2.html @@ -0,0 +1,34 @@ + + + + + 阿里云盘小白羊版 + + + + + + + + + + + + + + + + + + + +
+ + + + + + + diff --git a/packages/renderer/public/nodework.js b/packages/renderer/public/nodework.js new file mode 100644 index 0000000..845c582 --- /dev/null +++ b/packages/renderer/public/nodework.js @@ -0,0 +1,72 @@ +const worker = self +const fspromises = global.require('fs/promises') +var crypto = global.require('crypto') +let running = false +process.noAsar = true +worker.addEventListener('message', (event) => { + if (event.data.hash && event.data.hash == 'sha1') { + const localFilePath = event.data.localFilePath + const access_token = event.data.access_token + fileSha1(localFilePath, access_token).catch((e) => { + worker.postMessage({ hash: 'sha1', sha1: 'error', proof_code: e.message }) + running = false + close() + }) + } + if (event.data.stop) { + running = false + } +}) +worker.addEventListener('error', (e) => { + worker.postMessage({ hash: 'sha1', sha1: 'error', proof_code: e.message }) +}) + +async function fileSha1(localFilePath, access_token) { + running = true + let hash = '' + var sha1 = crypto.createHash('sha1') + const filehandle = await fspromises.open(localFilePath, 'r') + if (filehandle) { + const stat = await filehandle.stat() + const size = stat.size + const buff = Buffer.alloc(1024 * 1024) + let readlen = 0 + while (true) { + if (!running) break + const len = await filehandle.read(buff, 0, buff.length, null) + if (len.bytesRead > 0 && len.bytesRead == buff.length) { + sha1.update(buff) + } else if (len.bytesRead > 0) { + sha1.update(buff.slice(0, len.bytesRead)) + } + readlen += len.bytesRead + const message = '计算sha1(' + Math.floor((readlen * 100) / size).toString() + '%)' + worker.postMessage({ hash: 'sha1', readlen, size, message }) + if (len.bytesRead <= 0) break + } + let proof_code = '' + if (running) { + hash = sha1.digest('hex') + hash = hash.toUpperCase() + const m = unescape(encodeURIComponent(access_token)) + const buffa = Buffer.from(m) + const md5a = crypto.createHash('md5').update(buffa).digest('hex') + const start = Number(BigInt('0x' + md5a.substr(0, 16)) % BigInt(size)) + const end = Math.min(start + 8, size) + const buffb = Buffer.alloc(end - start) + await filehandle.read(buffb, 0, buffb.length, start) + proof_code = buffb.toString('base64') + } else { + hash = 'error' + proof_code = 'stop' + } + await filehandle?.close() + worker.postMessage({ hash: 'sha1', sha1: hash, proof_code }) + running = false + close() + } else { + worker.postMessage({ hash: 'sha1', sha1: 'error', proof_code: 'failopenfile' }) + running = false + close() + } +} diff --git a/packages/renderer/public/notify.wav b/packages/renderer/public/notify.wav new file mode 100644 index 0000000000000000000000000000000000000000..6bf41a35d1f6b83dd60f037f00bcc93d8f287da7 GIT binary patch literal 281262 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

H9v!Bp~ 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 O#}PP=!2e%I;Qt1lqV-Pz literal 0 HcmV?d00001 diff --git a/packages/renderer/public/pinyinlite_full.min.js b/packages/renderer/public/pinyinlite_full.min.js new file mode 100644 index 0000000..e9e335b --- /dev/null +++ b/packages/renderer/public/pinyinlite_full.min.js @@ -0,0 +1,2 @@ +var pinyinlite=function(n){function a(u){if(i[u])return i[u].exports;var e=i[u]={exports:{},id:u,loaded:!1};return n[u].call(e.exports,e,e.exports,a),e.loaded=!0,e.exports}var i={};return a.m=n,a.c=i,a.p="",a(0)}([function(n,a,i){var u=i(3);n.exports=i(1)(u)},function(n,a){"use strict";n.exports=function(n){function a(n,i){for(var u=n,e=i,o=g[u],r=h[u];uo&&u>1,i=g[a],ni))return a;u=a+1}return-1}function u(){var n=g[0],a=0;r=new Array(o),r[0]=0;var i,u;for(i=1,u=o;i=97&&l<=122||l>=65&&l<=90||l>=48&&l<=57?d[u]=[n.charAt(u)]:d[u]=[];else if(s=i(l),s!==-1){for(g=r[s],t=r[s+1],z=new Array(t-g),c=0;g code[class*='language-'] { + padding: 0.1em 0.3em; + border-radius: 0.3em; + color: #db4c69; + background: #f9f2f4; +} +/********************************************************* +* Tokens +*/ +.namespace { + opacity: 0.7; +} + +.token.doctype .token.doctype-tag { + color: #569cd6; +} + +.token.doctype .token.name { + color: #9cdcfe; +} + +.token.comment, +.token.prolog { + color: #6a9955; +} + +.token.punctuation, +.language-html .language-css .token.punctuation, +.language-html .language-javascript .token.punctuation { + color: #d4d4d4; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.inserted, +.token.unit { + color: #b5cea8; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.deleted { + color: #ffa726; +} + +.language-css .token.string.url { + text-decoration: underline; +} + +.token.operator, +.token.entity { + color: #d4d4d4; +} + +.token.operator.arrow { + color: #569cd6; +} + +.token.atrule { + color: #f3a281; +} + +.token.atrule .token.rule { + color: #c586c0; +} + +.token.atrule .token.url { + color: #9cdcfe; +} + +.token.atrule .token.url .token.function { + color: #dcdcaa; +} + +.token.atrule .token.url .token.punctuation { + color: #d4d4d4; +} + +.token.keyword { + color: #569cd6; +} + +.token.keyword.module, +.token.keyword.control-flow { + color: #c586c0; +} + +.token.function, +.token.function .token.maybe-class-name { + color: #dcdcaa; +} + +.token.regex { + color: #d16969; +} + +.token.important { + color: #569cd6; +} + +.token.italic { + font-style: italic; +} + +.token.constant { + color: #9cdcfe; +} + +.token.class-name, +.token.maybe-class-name { + color: #4ec9b0; +} + +.token.console { + color: #9cdcfe; +} + +.token.parameter { + color: #9cdcfe; +} + +.token.interpolation { + color: #9cdcfe; +} + +.token.punctuation.interpolation-punctuation { + color: #569cd6; +} + +.token.boolean { + color: #569cd6; +} + +.token.property, +.token.variable, +.token.imports .token.maybe-class-name, +.token.exports .token.maybe-class-name { + color: #9cdcfe; +} + +.token.selector { + color: #d7ba7d; +} + +.token.escape { + color: #d7ba7d; +} + +.token.tag { + color: #569cd6; +} + +.token.tag .token.punctuation { + color: #808080; +} + +.token.cdata { + color: #808080; +} + +.token.attr-name { + color: #9cdcfe; +} + +.token.attr-value, +.token.attr-value .token.punctuation { + color: #f3a281; +} + +.token.attr-value .token.punctuation.attr-equals { + color: #d4d4d4; +} + +.token.entity { + color: #569cd6; +} + +.token.namespace { + color: #4ec9b0; +} +/********************************************************* +* Language Specific +*/ + +pre[class*='language-javascript'], +code[class*='language-javascript'], +pre[class*='language-jsx'], +code[class*='language-jsx'], +pre[class*='language-typescript'], +code[class*='language-typescript'], +pre[class*='language-tsx'], +code[class*='language-tsx'] { + color: #9cdcfe; +} + +pre[class*='language-css'], +code[class*='language-css'] { + color: #f3a281; +} + +pre[class*='language-html'], +code[class*='language-html'] { + color: #d4d4d4; +} + +.language-regex .token.anchor { + color: #dcdcaa; +} + +.language-html .token.punctuation { + color: #808080; +} +/********************************************************* +* Line highlighting +*/ +pre[data-line] { + position: relative; +} + +pre[class*='language-'] > code[class*='language-'] { + position: relative; + z-index: 1; +} + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: inherit 0; + margin-top: 1em; + background: #f7ebc6; + box-shadow: inset 5px 0 0 #f7d87c; + z-index: 0; + pointer-events: none; + line-height: inherit; + white-space: pre; +} +/* works for line-numbers below 1000 lines */ +pre[class*='language-'].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} + +pre[class*='language-'].line-numbers > code { + position: relative; + white-space: inherit; +} + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.line-numbers-rows > span { + display: block; + counter-increment: linenumber; +} + +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; +} diff --git a/packages/renderer/public/prism.js b/packages/renderer/public/prism.js new file mode 100644 index 0000000..4fe8933 --- /dev/null +++ b/packages/renderer/public/prism.js @@ -0,0 +1,266 @@ +/* PrismJS 1.24.1 +https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+agda+al+antlr4+apacheconf+apex+apl+applescript+aql+arduino+arff+asciidoc+aspnet+asm6502+autohotkey+autoit+bash+basic+batch+bbcode+birb+bison+bnf+brainfuck+brightscript+bro+bsl+c+csharp+cpp+cfscript+chaiscript+cil+clojure+cmake+cobol+coffeescript+concurnas+csp+coq+crystal+css-extras+csv+cypher+d+dart+dataweave+dax+dhall+diff+django+dns-zone-file+docker+dot+ebnf+editorconfig+eiffel+ejs+elixir+elm+etlua+erb+erlang+excel-formula+fsharp+factor+false+firestore-security-rules+flow+fortran+ftl+gml+gcode+gdscript+gedcom+gherkin+git+glsl+go+graphql+groovy+haml+handlebars+haskell+haxe+hcl+hlsl+hoon+http+hpkp+hsts+ichigojam+icon+icu-message-format+idris+ignore+inform7+ini+io+j+java+javadoc+javadoclike+javastacktrace+jexl+jolie+jq+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+js-templates+julia+keyman+kotlin+kumir+latex+latte+less+lilypond+liquid+lisp+livescript+llvm+log+lolcode+lua+makefile+markdown+markup-templating+matlab+mel+mizar+mongodb+monkey+moonscript+n1ql+n4js+nand2tetris-hdl+naniscript+nasm+neon+nevod+nginx+nim+nix+nsis+objectivec+ocaml+opencl+openqasm+oz+parigp+parser+pascal+pascaligo+psl+pcaxis+peoplecode+perl+php+phpdoc+php-extras+plsql+powerquery+powershell+processing+prolog+promql+properties+protobuf+pug+puppet+pure+purebasic+purescript+python+qsharp+q+qml+qore+r+racket+jsx+tsx+reason+regex+rego+renpy+rest+rip+roboconf+robotframework+ruby+rust+sas+sass+scss+scala+scheme+shell-session+smali+smalltalk+smarty+sml+solidity+solution-file+soy+sparql+splunk-spl+sqf+sql+squirrel+stan+iecst+stylus+swift+t4-templating+t4-cs+t4-vb+tap+tcl+tt2+textile+toml+turtle+twig+typescript+typoscript+unrealscript+uri+v+vala+vbnet+velocity+verilog+vhdl+vim+visual-basic+warpscript+wasm+wiki+wolfram+xeora+xml-doc+xojo+xquery+yaml+yang+zig&plugins=line-numbers+show-invisibles+normalize-whitespace+treeview */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var b=m.value;if(t.length>n.length)return;if(!(b instanceof W)){var k,x=1;if(h){if(!(k=z(v,y,n,f)))break;var w=k.index,A=k.index+k[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(t,j,O),y+=O.length),q(t,j,x);var C=new W(o,g?M.tokenize(S,g):S,d,S);if(m=I(t,j,C),L&&I(t,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var t=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(t&&(M.filename=t.src,t.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var a=document.readyState;"loading"===a||"interactive"===a&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.abap={comment:/^\*.*/m,string:/(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,"string-template":{pattern:/([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,lookbehind:!0,alias:"string"},"eol-comment":{pattern:/(^|\s)".*/m,lookbehind:!0,alias:"comment"},keyword:{pattern:/(\s|\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\/MM\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\/DD\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\/MM\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\/DD\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\b/i,lookbehind:!0},number:/\b\d+\b/,operator:{pattern:/(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,lookbehind:!0},"string-operator":{pattern:/(\s)&&?(?=\s)/,lookbehind:!0,alias:"keyword"},"token-operator":[{pattern:/(\w)(?:->?|=>|[~|{}])(?=\w)/,lookbehind:!0,alias:"punctuation"},{pattern:/[|{}]/,alias:"punctuation"}],punctuation:/[,.:()]/}; +!function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";Prism.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(); +Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:Prism.languages.markup}}); +Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/i,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/i,keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|new|return|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|not|null|of|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:true|false)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}; +Prism.languages.agda={comment:/\{-[\s\S]*?(?:-\}|$)|--.*/,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},punctuation:/[(){}⦃⦄.;@]/,"class-name":{pattern:/((?:data|record) +)\S+/,lookbehind:!0},function:{pattern:/(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,lookbehind:!0},operator:{pattern:/(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,lookbehind:!0},keyword:/\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/}; +Prism.languages.al={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},function:{pattern:/(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,lookbehind:!0},keyword:[/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i],number:/\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|U(?:LL?)?|LL?)?\b/i,boolean:/\b(?:false|true)\b/i,variable:/\b(?:Curr(?:FieldNo|Page|Report)|RequestOptionsPage|x?Rec)\b/,"class-name":/\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,operator:/\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,punctuation:/[()\[\]{}:.;,]/}; +Prism.languages.antlr4={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,string:{pattern:/'(?:\\.|[^\\'\r\n])*'/,greedy:!0},"character-class":{pattern:/\[(?:\\.|[^\\\]\r\n])*\]/,greedy:!0,alias:"regex",inside:{range:{pattern:/([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,lookbehind:!0,alias:"punctuation"},escape:/\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,punctuation:/[\[\]]/}},action:{pattern:/\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,greedy:!0,inside:{content:{pattern:/(\{)[\s\S]+(?=\})/,lookbehind:!0},punctuation:/[{}]/}},command:{pattern:/(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,lookbehind:!0,inside:{function:/\b\w+(?=\s*(?:[,(]|$))/,punctuation:/[,()]/}},annotation:{pattern:/@\w+(?:::\w+)*/,alias:"keyword"},label:{pattern:/#[ \t]*\w+/,alias:"punctuation"},keyword:/\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,definition:[{pattern:/\b[a-z]\w*(?=\s*:)/,alias:["rule","class-name"]},{pattern:/\b[A-Z]\w*(?=\s*:)/,alias:["token","constant"]}],constant:/\b[A-Z][A-Z_]*\b/,operator:/\.\.|->|[|~]|[*+?]\??/,punctuation:/[;:()=]/},Prism.languages.g4=Prism.languages.antlr4; +Prism.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|Type|UserFile|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferSize|BufferedLogs|CGIDScriptTimeout|CGIMapExtension|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DTracePrivileges|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtFilterDefine|ExtFilterOptions|ExtendedStatus|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|KeepAlive|KeepAliveTimeout|KeptBodySize|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|LanguagePriority|Limit(?:InternalRecursion|Request(?:Body|FieldSize|Fields|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|MMapFile|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|ModMimeUsePathInfo|ModemStandard|MultiviewsMatch|Mutex|NWSSLTrustedCerts|NWSSLUpgradeable|NameVirtualHost|NoProxy|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|RLimitCPU|RLimitMEM|RLimitNPROC|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|SSIETag|SSIEndTag|SSIErrorMsg|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|SRPUnknownUserSeed|SRPVerifierFile|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UseStapling|UserName|VerifyClient|VerifyDepth)|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadStackSize|ThreadsPerChild|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/}; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +!function(e){var t=/\b(?:abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|get(?=\s*[{};])|(?:after|before)(?=\s+[a-z])|(?:inherited|with|without)\s+sharing)\b/i,n="\\b(?:(?=[a-z_]\\w*\\s*[<\\[])|(?!))[A-Z_]\\w*(?:\\s*\\.\\s*[A-Z_]\\w*)*\\b(?:\\s*(?:\\[\\s*\\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*".replace(//g,function(){return t.source});function i(e){return RegExp(e.replace(//g,function(){return n}),"i")}var a={keyword:t,punctuation:/[()\[\]{};,:.<>]/};e.languages.apex={comment:e.languages.clike.comment,string:e.languages.clike.string,sql:{pattern:/((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,lookbehind:!0,greedy:!0,alias:"language-sql",inside:e.languages.sql},annotation:{pattern:/@\w+\b/,alias:"punctuation"},"class-name":[{pattern:i("(\\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\\s+\\w+\\s+on)\\s+)"),lookbehind:!0,inside:a},{pattern:i("(\\(\\s*)(?=\\s*\\)\\s*[\\w(])"),lookbehind:!0,inside:a},{pattern:i("(?=\\s*\\w+\\s*[;=,(){:])"),inside:a}],trigger:{pattern:/(\btrigger\s+)\w+\b/i,lookbehind:!0,alias:"class-name"},keyword:t,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,operator:/[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<{1,3}=?/,punctuation:/[()\[\]{};,.]/}}(Prism); +Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,function:/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺⍥]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}}; +Prism.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,class:{pattern:/\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\b/,alias:"builtin"},punctuation:/[{}():,¬«»《》]/}; +Prism.languages.aql={comment:/\/\/.*|\/\*[\s\S]*?\*\//,property:{pattern:/([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(["'´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,greedy:!0},variable:/@@?\w+/,keyword:[{pattern:/(\bWITH\s+)COUNT(?=\s+INTO\b)/i,lookbehind:!0},/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,{pattern:/(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,lookbehind:!0},{pattern:/(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,lookbehind:!0},{pattern:/\bOPTIONS(?=\s*\{)/i}],function:/\b(?!\d)\w+(?=\s*\()/,boolean:/\b(?:true|false)\b/i,range:{pattern:/\.\./,alias:"operator"},number:[/\b0b[01]+/i,/\b0x[0-9a-f]+/i,/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i],operator:/\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,punctuation:/::|[?.:,;()[\]{}]/}; +Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean; +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:module|import)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b[a-z_]\w*\s*<(?:[^<>]|<(?:[^<>])*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +Prism.languages.arduino=Prism.languages.extend("cpp",{constant:/\b(?:DIGITAL_MESSAGE|FIRMATA_STRING|ANALOG_MESSAGE|REPORT_DIGITAL|REPORT_ANALOG|INPUT_PULLUP|SET_PIN_MODE|INTERNAL2V56|SYSTEM_RESET|LED_BUILTIN|INTERNAL1V1|SYSEX_START|INTERNAL|EXTERNAL|DEFAULT|OUTPUT|INPUT|HIGH|LOW)\b/,keyword:/\b(?:setup|if|else|while|do|for|return|in|instanceof|default|function|loop|goto|switch|case|new|try|throw|catch|finally|null|break|continue|boolean|bool|void|byte|word|string|String|array|int|long|integer|double)\b/,builtin:/\b(?:KeyboardController|MouseController|SoftwareSerial|EthernetServer|EthernetClient|LiquidCrystal|LiquidCrystal_I2C|RobotControl|GSMVoiceCall|EthernetUDP|EsploraTFT|HttpClient|RobotMotor|WiFiClient|GSMScanner|FileSystem|Scheduler|GSMServer|YunClient|YunServer|IPAddress|GSMClient|GSMModem|Keyboard|Ethernet|Console|GSMBand|Esplora|Stepper|Process|WiFiUDP|GSM_SMS|Mailbox|USBHost|Firmata|PImage|Client|Server|GSMPIN|FileIO|Bridge|Serial|EEPROM|Stream|Mouse|Audio|Servo|File|Task|GPRS|WiFi|Wire|TFT|GSM|SPI|SD|runShellCommandAsynchronously|analogWriteResolution|retrieveCallingNumber|printFirmwareVersion|analogReadResolution|sendDigitalPortPair|noListenOnLocalhost|readJoystickButton|setFirmwareVersion|readJoystickSwitch|scrollDisplayRight|getVoiceCallStatus|scrollDisplayLeft|writeMicroseconds|delayMicroseconds|beginTransmission|getSignalStrength|runAsynchronously|getAsynchronously|listenOnLocalhost|getCurrentCarrier|readAccelerometer|messageAvailable|sendDigitalPorts|lineFollowConfig|countryNameWrite|runShellCommand|readStringUntil|rewindDirectory|readTemperature|setClockDivider|readLightSensor|endTransmission|analogReference|detachInterrupt|countryNameRead|attachInterrupt|encryptionType|readBytesUntil|robotNameWrite|readMicrophone|robotNameRead|cityNameWrite|userNameWrite|readJoystickY|readJoystickX|mouseReleased|openNextFile|scanNetworks|noInterrupts|digitalWrite|beginSpeaker|mousePressed|isActionDone|mouseDragged|displayLogos|noAutoscroll|addParameter|remoteNumber|getModifiers|keyboardRead|userNameRead|waitContinue|processInput|parseCommand|printVersion|readNetworks|writeMessage|blinkVersion|cityNameRead|readMessage|setDataMode|parsePacket|isListening|setBitOrder|beginPacket|isDirectory|motorsWrite|drawCompass|digitalRead|clearScreen|serialEvent|rightToLeft|setTextSize|leftToRight|requestFrom|keyReleased|compassRead|analogWrite|interrupts|WiFiServer|disconnect|playMelody|parseFloat|autoscroll|getPINUsed|setPINUsed|setTimeout|sendAnalog|readSlider|analogRead|beginWrite|createChar|motorsStop|keyPressed|tempoWrite|readButton|subnetMask|debugPrint|macAddress|writeGreen|randomSeed|attachGPRS|readString|sendString|remotePort|releaseAll|mouseMoved|background|getXChange|getYChange|answerCall|getResult|voiceCall|endPacket|constrain|getSocket|writeJSON|getButton|available|connected|findUntil|readBytes|exitValue|readGreen|writeBlue|startLoop|isPressed|sendSysex|pauseMode|gatewayIP|setCursor|getOemKey|tuneWrite|noDisplay|loadImage|switchPIN|onRequest|onReceive|changePIN|playFile|noBuffer|parseInt|overflow|checkPIN|knobRead|beginTFT|bitClear|updateIR|bitWrite|position|writeRGB|highByte|writeRed|setSpeed|readBlue|noStroke|remoteIP|transfer|shutdown|hangCall|beginSMS|endWrite|attached|maintain|noCursor|checkReg|checkPUK|shiftOut|isValid|shiftIn|pulseIn|connect|println|localIP|pinMode|getIMEI|display|noBlink|process|getBand|running|beginSD|drawBMP|lowByte|setBand|release|bitRead|prepare|pointTo|readRed|setMode|noFill|remove|listen|stroke|detach|attach|noTone|exists|buffer|height|bitSet|circle|config|cursor|random|IRread|setDNS|endSMS|getKey|micros|millis|begin|print|write|ready|flush|width|isPIN|blink|clear|press|mkdir|rmdir|close|point|yield|image|BSSID|click|delay|read|text|move|peek|beep|rect|line|open|seek|fill|size|turn|stop|home|find|step|tone|sqrt|RSSI|SSID|end|bit|tan|cos|sin|pow|map|abs|max|min|get|run|put)\b/}); +Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/}; +!function(t){var n={pattern:/(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\1)[^\\]|\\.)*\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\]|\\.)*'/,inside:{punctuation:/^'|'$/}},string:/"(?:[^"\\]|\\.)*"/,variable:/\w+(?==)/,punctuation:/^\[|\]$|,/,operator:/=/,"attr-value":/(?!^\s+$).+/}},a=t.languages.asciidoc={"comment-block":{pattern:/^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,alias:"comment"},table:{pattern:/^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,inside:{specifiers:{pattern:/(?!\|)(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*])?(?:[<^>](?:\.[<^>])?|\.[<^>])?[a-z]*)(?=\|)/,alias:"attr-value"},punctuation:{pattern:/(^|[^\\])[|!]=*/,lookbehind:!0}}},"passthrough-block":{pattern:/^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^\++|\++$/}},"literal-block":{pattern:/^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\.+)|(?:-+|\.+)$/}},"other-block":{pattern:/^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,inside:{punctuation:/^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/}},"list-punctuation":{pattern:/(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,lookbehind:!0,alias:"punctuation"},"list-label":{pattern:/(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,lookbehind:!0,alias:"symbol"},"indented-block":{pattern:/((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,lookbehind:!0},comment:/^\/\/.*/m,title:{pattern:/^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,alias:"important",inside:{punctuation:/^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/}},"attribute-entry":{pattern:/^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,alias:"tag"},attributes:n,hr:{pattern:/^'{3,}$/m,alias:"punctuation"},"page-break":{pattern:/^<{3,}$/m,alias:"punctuation"},admonition:{pattern:/^(?:TIP|NOTE|IMPORTANT|WARNING|CAUTION):/m,alias:"keyword"},callout:[{pattern:/(^[ \t]*)/m,lookbehind:!0,alias:"symbol"},{pattern:/<\d+>/,alias:"symbol"}],macro:{pattern:/\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:{function:/^[a-z\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,inside:n.inside}}},inline:{pattern:/(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,lookbehind:!0,inside:{attributes:n,url:{pattern:/^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,inside:{punctuation:/^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/}},"attribute-ref":{pattern:/^\{.+\}$/,inside:{variable:{pattern:/(^\{)[a-z\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\{|\}$|::?/}},italic:{pattern:/^(['_])[\s\S]+\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\*[\s\S]+\*$/,inside:{punctuation:/^\*\*?|\*\*?$/}},punctuation:/^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/}},replacement:{pattern:/\((?:C|TM|R)\)/,alias:"builtin"},entity:/&#?[\da-z]{1,8};/i,"line-continuation":{pattern:/(^| )\+$/m,lookbehind:!0,alias:"punctuation"}};function i(t){for(var n={},i=0,e=(t=t.split(" ")).length;i>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp; +Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/i,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/i,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/i,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(]*>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,alias:["asp","script"],inside:Prism.languages.csharp||{}}}); +Prism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"keyword"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,opcode:{pattern:/\b(?:adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya|ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA)\b/,alias:"property"},hexnumber:{pattern:/#?\$[\da-f]{2,4}\b/i,alias:"string"},binarynumber:{pattern:/#?%[01]+\b/,alias:"string"},decimalnumber:{pattern:/#?\b\d+\b/,alias:"string"},register:{pattern:/\b[xya]\b/i,alias:"variable"}}; +Prism.languages.autohotkey={comment:[{pattern:/(^|\s);.*/,lookbehind:!0},{pattern:/(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,lookbehind:!0,greedy:!0}],tag:{pattern:/^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,lookbehind:!0},string:/"(?:[^"\n\r]|"")*"/m,variable:/%\w+%/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,boolean:/\b(?:true|false)\b/,selector:/\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,constant:/\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|programfiles|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\b/i,builtin:/\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|IsObject|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|ltrim|rtrim|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|strreplace|sb_seticon|sb_setparts|sb_settext|strsplit|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__New|__Call|__Get|__Set)\b/i,symbol:/\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,important:/#\b(?:AllowSameLineComments|ClipboardTimeout|CommentFlag|DerefChar|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|If|IfTimeout|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InputLevel|InstallKeybdHook|InstallMouseHook|KeyHistory|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|MenuMaskKey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|Warn|WinActivateForce)\b/i,keyword:/\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Region|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|TryAgain|Throw|Try|Catch|Finally|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,function:/[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/m,punctuation:/[{}[\]():,]/}; +Prism.languages.autoit={comment:[/;.*/,{pattern:/(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:comments-end|ce)/m,lookbehind:!0}],url:{pattern:/(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^[\t ]*)#\w+/m,lookbehind:!0,alias:"keyword"},function:/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,boolean:/\b(?:True|False)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Or|Not)\b/i,punctuation:/[\[\]().,:]/}; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,o=0;o?^\w +\-.])*"/i,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SHARED|SINGLE|SELECT CASE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; +!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"(?:[\\"]"|[^"])*"(?!")/,i=/(?:\b|-)\d+\b/;Prism.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/^for\b|\b(?:in|do)\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|neq|lss|leq|gtr|geq) )(?:"[^"]*"|[^\s"]\S*))/im,lookbehind:!0,inside:{keyword:/^if\b|\b(?:not|cmdextversion|defined|errorlevel|exist)\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|neq|lss|leq|gtr|geq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^\w+\b/i,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(); +Prism.languages.bbcode={tag:{pattern:/\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,inside:{tag:{pattern:/^\[\/?[^\s=\]]+/,inside:{punctuation:/^\[\/?/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\]/,"attr-name":/[^\s=\]]+/}}},Prism.languages.shortcode=Prism.languages.bbcode; +Prism.languages.birb=Prism.languages.extend("clike",{string:{pattern:/r?("|')(?:\\.|(?!\1)[^\\])*\1/,greedy:!0},"class-name":[/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,/\b[A-Z]\w*(?=\s+\w+\s*[;,=()])/],keyword:/\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|next|new|noSeeb|return|static|switch|throw|var|void|while)\b/,operator:/\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,variable:/\b[a-z_]\w*\b/}),Prism.languages.insertBefore("birb","function",{metadata:{pattern:/<\w+>/,greedy:!0,alias:"symbol"}}); +Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}}); +Prism.languages.bnf={string:{pattern:/"[^\r\n"]*"|'[^\r\n']*'/},definition:{pattern:/<[^<>\r\n\t]+>(?=\s*::=)/,alias:["rule","keyword"],inside:{punctuation:/^<|>$/}},rule:{pattern:/<[^<>\r\n\t]+>/,inside:{punctuation:/^<|>$/}},operator:/::=|[|()[\]{}*+?]|\.{3}/},Prism.languages.rbnf=Prism.languages.bnf; +Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/}; +Prism.languages.brightscript={comment:/(?:\brem|').*/i,"directive-statement":{pattern:/(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,lookbehind:!0,alias:"property",inside:{"error-message":{pattern:/(^#error).+/,lookbehind:!0},directive:{pattern:/^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,alias:"keyword"},expression:{pattern:/[\s\S]+/,inside:null}}},property:{pattern:/([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},"class-name":{pattern:/(\bAs[\t ]+)\w+/i,lookbehind:!0},keyword:/\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,boolean:/\b(?:true|false)\b/i,function:/\b(?!\d)\w+(?=[\t ]*\()/i,number:/(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,operator:/--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,punctuation:/[.,;()[\]{}]/,constant:/\b(?:LINE_NUM)\b/i},Prism.languages.brightscript["directive-statement"].inside.expression.inside=Prism.languages.brightscript; +Prism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:TODO|FIXME|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},boolean:/\b[TF]\b/,function:{pattern:/(?:function|hook|event) \w+(?:::\w+)?/,inside:{keyword:/^(?:function|hook|event)/}},variable:{pattern:/(?:global|local) \w+/i,inside:{keyword:/(?:global|local)/}},builtin:/(?:@(?:load(?:-(?:sigs|plugin))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:redef|priority|log|optional|default|add_func|delete_func|expire_func|read_expire|write_expire|create_expire|synchronized|persistent|rotate_interval|rotate_size|encrypt|raw_output|mergeable|group|error_handler|type_column))/,constant:{pattern:/const \w+/i,inside:{keyword:/const/}},keyword:/\b(?:break|next|continue|alarm|using|of|add|delete|export|print|return|schedule|when|timeout|addr|any|bool|count|double|enum|file|int|interval|pattern|opaque|port|record|set|string|subnet|table|time|vector|for|if|else|in|module|function)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/}; +Prism.languages.bsl={comment:/\/\/.*/,string:[{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},{pattern:/'(?:[^'\r\n\\]|\\.)*'/}],keyword:[{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:while|for|new|break|try|except|raise|else|endtry|undefined|function|var|return|endfunction|null|if|elseif|procedure|endprocedure|then|val|export|endif|in|each|true|false|to|do|enddo|execute)\b/i}],number:{pattern:/(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,lookbehind:!0},operator:[/[<>+\-*/]=?|[%=]/,{pattern:/(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,lookbehind:!0},{pattern:/\b(?:and|or|not)\b/i}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/,directive:[{pattern:/^(\s*)&.*/m,lookbehind:!0,alias:"important"},{pattern:/^\s*#.*/gm,alias:"important"}]},Prism.languages.oscript=Prism.languages.bsl; +Prism.languages.cfscript=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,inside:{annotation:{pattern:/(?:^|[^.])@[\w\.]+/,alias:"punctuation"}}},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],keyword:/\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,operator:[/\+\+|--|&&|\|\||::|=>|[!=]==|<=?|>=?|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|[?:]/,/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/],scope:{pattern:/\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,alias:"global"},type:{pattern:/\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,alias:"builtin"}}),Prism.languages.insertBefore("cfscript","keyword",{"function-variable":{pattern:/[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"}}),delete Prism.languages.cfscript["class-name"],Prism.languages.cfc=Prism.languages.cfscript; +Prism.languages.chaiscript=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,lookbehind:!0,greedy:!0},"class-name":[{pattern:/(\bclass\s+)\w+/,lookbehind:!0},{pattern:/(\b(?:attr|def)\s+)\w+(?=\s*::)/,lookbehind:!0}],keyword:/\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,number:[Prism.languages.cpp.number,/\b(?:Infinity|NaN)\b/],operator:/>>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/}),Prism.languages.insertBefore("chaiscript","operator",{"parameter-type":{pattern:/([,(]\s*)\w+(?=\s+\w)/,lookbehind:!0,alias:"class-name"}}),Prism.languages.insertBefore("chaiscript","string",{"string-interpolation":{pattern:/(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,lookbehind:!0,inside:{"interpolation-expression":{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:Prism.languages.chaiscript},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"}}},string:/[\s\S]+/}}}); +Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|iant|idispatch|implements|import|initonly|instance|u?int(?:8|16|32|64)?|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,function:/\b(?:(?:constrained|unaligned|volatile|readonly|tail|no)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.[0-9]+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.[0-9]+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|ldvirtftn|castclass|beq(?:\.s)?|mkrefany|localloc|ckfinite|rethrow|ldtoken|ldsflda|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,boolean:/\b(?:true|false)\b/,number:/\b-?(?:0x[0-9a-f]+|[0-9]+)(?:\.[0-9a-f]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/}; +Prism.languages.clojure={comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},operator:/(?:::|[:|'])\b[a-z][\w*+!?-]*\b/i,keyword:{pattern:/([^\w+*'?-])(?:def|if|do|let|\.\.|quote|var|->>|->|fn|loop|recur|throw|try|monitor-enter|\.|new|set!|def-|defn|defn-|defmacro|defmulti|defmethod|defstruct|defonce|declare|definline|definterface|defprotocol|==|defrecord|>=|deftype|<=|defproject|ns|\*|\+|-|\/|<|=|>|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|conj|cons|constantly|cond|if-not|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|deref|difference|disj|dissoc|distinct|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|for|fnseq|frest|gensym|get-proxy-class|get|hash-map|hash-set|identical\?|identity|if-let|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|line-seq|list\*|list|load|load-file|locking|long|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|name|namespace|neg\?|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|time|to-array|to-array-2d|tree-seq|true\?|union|up|update-proxy|val|vals|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[^\w+*'?-])/,lookbehind:!0},boolean:/\b(?:true|false|nil)\b/,number:/\b[\da-f]+\b/i,punctuation:/[{}\[\](),]/}; +Prism.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?|(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:ON|OFF|TRUE|FALSE)\b/,namespace:/\b(?:PROPERTIES|SHARED|PRIVATE|STATIC|PUBLIC|INTERFACE|TARGET_OBJECTS)\b/,operator:/\b(?:NOT|AND|OR|MATCHES|LESS|GREATER|EQUAL|STRLESS|STRGREATER|STREQUAL|VERSION_LESS|VERSION_EQUAL|VERSION_GREATER|DEFINED)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/}; +Prism.languages.cobol={comment:{pattern:/\*>.*|(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},string:{pattern:/[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,greedy:!0},level:{pattern:/(^[ \t]*)\d+\b/m,lookbehind:!0,greedy:!0,alias:"number"},"class-name":{pattern:/(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,lookbehind:!0,inside:{number:{pattern:/(\()\d+/,lookbehind:!0},punctuation:/[()]/}},keyword:{pattern:/(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOUNDS|BOTTOM|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COLLATING|COL|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOP|ERASE|ERROR|EOL|EOS|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTIONNAME|FUNCTION-POINTER|GENERATE|GOBACK|GIVING|GLOBAL|GO|GRID|GROUP|HEADING|HIGHLIGHT|HIGH-VALUE|HIGH-VALUES|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINES|LINE-COUNTER|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOWER|LOWLIGHT|LOW-VALUE|LOW-VALUES|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|POSITION|POSITIVE|PORT|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|READER|REMOTE|RD|REAL|READ|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|REVERSE-VIDEO|RESET|RETURN|RETURN-CODE|RETURNING|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TASK|TAPE|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYMMDD|YYYYDDD|ZERO-FILL|ZEROS|ZEROES)(?![\w-])/i,lookbehind:!0},boolean:{pattern:/(^|[^\w-])(?:false|true)(?![\w-])/i,lookbehind:!0},number:{pattern:/(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,lookbehind:!0},operator:[/<>|[<>]=?|[=+*/&]/,{pattern:/(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,lookbehind:!0}],punctuation:/[.:,()]/}; +!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism); +Prism.languages.concurnas={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],langext:{pattern:/\b\w+\s*\|\|[\s\S]+?\|\|/,greedy:!0,alias:"string"},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,lookbehind:!0},keyword:/\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,boolean:/\b(?:false|true)\b/,number:/\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,punctuation:/[{}[\];(),.:]/,operator:/<==|>==|=>|->|<-|<>|\^|&==|&<>|!|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,annotation:{pattern:/@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,alias:"builtin"}},Prism.languages.insertBefore("concurnas","langext",{string:{pattern:/[rs]?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:Prism.languages.concurnas},string:/[\s\S]+/}}}),Prism.languages.conc=Prism.languages.concurnas; +Prism.languages.csp={directive:{pattern:/(^|[^-\da-z])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[^-\da-z]|$)/i,lookbehind:!0,alias:"keyword"},safe:{pattern:/'(?:deny|none|report-sample|self|strict-dynamic|top-only|(?:nonce|sha(?:256|384|512))-[-+/\w=]+)'/i,alias:"selector"},unsafe:{pattern:/(?:'unsafe-(?:allow-redirects|dynamic|eval|hash-attributes|hashed-attributes|hashes|inline)'|\*)/i,alias:"function"}}; +!function(e){for(var t="\\(\\*(?:[^(*]|\\((?!\\*)|\\*(?!\\))|)*\\*\\)",i=0;i<2;i++)t=t.replace(//g,function(){return t});t=t.replace(//g,"[]"),e.languages.coq={comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},attribute:[{pattern:RegExp('#\\[(?:[^\\]("]|"(?:[^"]|"")*"(?!")|\\((?!\\*)|)*\\]'.replace(//g,function(){return t})),greedy:!0,alias:"attr-name",inside:{comment:RegExp(t),string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},operator:/=/,punctuation:/^#\[|\]$|[,()]/}},{pattern:/\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,alias:"attr-name"}],keyword:/\b(?:_|Abort|About|Add|Admit|Admitted|All|apply|Arguments|as|As|Assumptions|at|Axiom|Axioms|Back|BackTo|Backtrace|Bind|BinOp|BinOpSpec|BinRel|Blacklist|by|Canonical|Case|Cd|Check|Class|Classes|Close|Coercion|Coercions|cofix|CoFixpoint|CoInductive|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|else|end|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|exists|exists2|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|fix|Fixpoint|Flags|Focus|for|forall|From|fun|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|Identity|if|IF|Immediate|Implicit|Implicits|Import|in|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|let|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|match|Match|measure|Method|Minimality|ML|Module|Modules|Morphism|move|Next|NoInline|Notation|Number|Obligation|Obligations|OCaml|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|Property|PropOp|Proposition|PropUOp|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|removed|Require|Reserved|Reset|Resolve|Restart|return|Rewrite|Right|Ring|Rings|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|SProp|Step|Strategies|Strategy|String|struct|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|then|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|UnOp|UnOpSpec|Unshelve|using|Variable|Variables|Variant|Verbose|View|Visibility|wf|where|with|Zify)\b/,number:/\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,punct:{pattern:/@\{|\{\||\[=|:>/,alias:"punctuation"},operator:/\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,punctuation:/\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/}}(Prism); +!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp("%r(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:n}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(Prism); +!function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:abstract|alias|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|rescue|return|require|select|self|sizeof|struct|super|then|type|typeof|uninitialized|union|unless|until|when|while|with|yield|__DIR__|__END_LINE__|__FILE__|__LINE__)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/}),e.languages.insertBefore("crystal","string",{attribute:{pattern:/@\[.+?\]/,alias:"attr-name",inside:{delimiter:{pattern:/^@\[|\]$/,alias:"tag"},rest:e.languages.crystal}},expansion:[{pattern:/\{\{.+?\}\}/,inside:{delimiter:{pattern:/^\{\{|\}\}$/,alias:"tag"},rest:e.languages.crystal}},{pattern:/\{%.+?%\}/,inside:{delimiter:{pattern:/^\{%|%\}$/,alias:"tag"},rest:e.languages.crystal}}]})}(Prism); +!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); +Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}; +Prism.languages.cypher={comment:/\/\/.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,greedy:!0},"class-name":{pattern:/(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,lookbehind:!0,greedy:!0},relationship:{pattern:/(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,lookbehind:!0,greedy:!0,alias:"property"},identifier:{pattern:/`(?:[^`\\\r\n])*`/,greedy:!0,alias:"symbol"},variable:/\$\w+/,keyword:/\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,function:/\b\w+\b(?=\s*\()/,boolean:/\b(?:true|false|null)\b/i,number:/\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,operator:/:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,punctuation:/[()[\]{},;.]/}; +Prism.languages.d=Prism.languages.extend("clike",{comment:[{pattern:/^\s*#!.+/,greedy:!0},{pattern:RegExp("(^|[^\\\\])(?:"+["/\\+(?:/\\+(?:[^+]|\\+(?!/))*\\+/|(?!/\\+)[^])*?\\+/","//.*","/\\*[^]*?\\*/"].join("|")+")"),lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(['\\b[rx]"(?:\\\\[^]|[^\\\\"])*"[cwd]?','\\bq"(?:\\[[^]*?\\]|\\([^]*?\\)|<[^]*?>|\\{[^]*?\\})"','\\bq"((?!\\d)\\w+)$[^]*?^\\1"','\\bq"(.)[^]*?\\2"',"'(?:\\\\(?:\\W|\\w+)|[^\\\\])'",'(["`])(?:\\\\[^]|(?!\\3)[^\\\\])*\\3[cwd]?'].join("|"),"m"),greedy:!0},{pattern:/\bq\{(?:\{[^{}]*\}|[^{}])*\}/,greedy:!0,alias:"token-string"}],keyword:/\$|\b(?:abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|public|pure|real|ref|return|scope|shared|short|static|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|__(?:(?:FILE|MODULE|LINE|FUNCTION|PRETTY_FUNCTION|DATE|EOF|TIME|TIMESTAMP|VENDOR|VERSION)__|gshared|traits|vector|parameters)|string|wstring|dstring|size_t|ptrdiff_t)\b/,number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,lookbehind:!0}],operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E[ABCD]X|E?(?:BP|SP|DI|SI)|[ECSDGF]S|CR[0234]|DR[012367]|TR[3-7]|X?MM[0-7]|R[ABCD]X|[BS]PL|R[BS]P|[DS]IL|R[DS]I|R(?:[89]|1[0-5])[BWD]?|XMM(?:[89]|1[0-5])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}}); +!function(e){var a=[/\b(?:async|sync|yield)\*/,/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extension|external|extends|factory|final|finally|for|get|hide|if|implements|interface|import|in|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/],t="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp(t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}}}};e.languages.dart=e.languages.extend("clike",{string:[{pattern:/r?("""|''')[\s\S]*?\1/,greedy:!0},{pattern:/r?(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],"class-name":[s,{pattern:RegExp(t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:s.inside}],keyword:a,operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),e.languages.insertBefore("dart","function",{metadata:{pattern:/@\w+/,alias:"symbol"}}),e.languages.insertBefore("dart","class-name",{generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism); +Prism.languages.dataweave={url:/\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,property:{pattern:/(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,greedy:!0},string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},"mime-type":/\b(?:text|audio|video|application|multipart|image)\/[\w+-]+/,date:{pattern:/\|[\w:+-]+\|/,greedy:!0},comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],regex:{pattern:/\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,greedy:!0},function:/\b[A-Z_]\w*(?=\s*\()/i,number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\];(),.:@]/,operator:/<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,boolean:/\b(?:true|false)\b/,keyword:/\b(?:match|input|output|ns|type|update|null|if|else|using|unless|at|is|as|case|do|fun|var|not|and|or)\b/}; +Prism.languages.dax={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,lookbehind:!0},"data-field":{pattern:/'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,alias:"symbol"},measure:{pattern:/\[[ \w\xA0-\uFFFF]+\]/,alias:"constant"},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},function:/\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,keyword:/\b(?:DEFINE|MEASURE|EVALUATE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,boolean:{pattern:/\b(?:TRUE|FALSE|NULL)\b/i,alias:"constant"},number:/\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,punctuation:/[;\[\](){}`,.]/}; +Prism.languages.dhall={comment:/--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,string:{pattern:/"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}/,inside:{expression:{pattern:/(^\$\{)[\s\S]+(?=\}$)/,lookbehind:!0,alias:"language-dhall",inside:null},punctuation:/\$\{|\}/}}}},label:{pattern:/`[^`]*`/,greedy:!0},url:{pattern:/\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,greedy:!0},env:{pattern:/\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,greedy:!0,inside:{function:/^env/,operator:/^:/,variable:/[\s\S]+/}},hash:{pattern:/\bsha256:[\da-fA-F]{64}\b/,inside:{function:/sha256/,operator:/:/,number:/[\da-fA-F]{64}/}},keyword:/\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,builtin:/\b(?:Some|None)\b/,boolean:/\b(?:False|True)\b/,number:/\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,operator:/\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,punctuation:/\.\.|[{}\[\](),./]/,"class-name":/\b[A-Z]\w*\b/},Prism.languages.dhall.string.inside.interpolation.inside.expression.inside=Prism.languages.dhall; +!function(i){i.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(e){var n=r[e],a=[];/^\w+$/.test(e)||a.push(/\w+/.exec(e)[0]),"diff"===e&&a.push("bold"),i.languages.diff[e]={pattern:RegExp("^(?:["+n+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(e)[0]}}}}),Object.defineProperty(i.languages.diff,"PREFIXES",{value:r})}(Prism); +!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Tt]rue|[Ff]alse|[Nn]one/,variable:/\b\w+?\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,o=e.languages["markup-templating"];e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"django",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"django")}),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",function(e){o.buildPlaceholders(e,"jinja2",n)}),e.hooks.add("after-tokenize",function(e){o.tokenizePlaceholders(e,"jinja2")})}(Prism); +Prism.languages["dns-zone-file"]={comment:/;.*/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},variable:[{pattern:/(^\$ORIGIN[ \t]+)\S+/m,lookbehind:!0},{pattern:/(^|\s)@(?=\s|$)/,lookbehind:!0}],keyword:/^\$(?:ORIGIN|INCLUDE|TTL)(?=\s|$)/m,class:{pattern:/(^|\s)(?:IN|CH|CS|HS)(?=\s|$)/,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,lookbehind:!0,alias:"keyword"},punctuation:/[()]/},Prism.languages["dns-zone"]=Prism.languages["dns-zone-file"]; +!function(e){var r="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"}),n="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,function(){return n}),o={pattern:RegExp(n),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,n){return e=e.replace(//g,function(){return t}).replace(//g,function(){return r}),RegExp(e,n)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); +!function(e){var n="(?:"+["[a-zA-Z_\\x80-\\uFFFF][\\w\\x80-\\uFFFF]*","-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)",'"[^"\\\\]*(?:\\\\[^][^"\\\\]*)*"',"<(?:[^<>]|(?!\x3c!--)<(?:[^<>\"']|\"[^\"]*\"|'[^']*')+>|\x3c!--(?:[^-]|-(?!->))*--\x3e)*>"].join("|")+")",a={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,a){return RegExp(e.replace(//g,function(){return n}),a)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r("(\\b(?:digraph|graph|subgraph)[ \t\r\n]+)","i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:a},"attr-value":{pattern:r("(=[ \t\r\n]*)"),lookbehind:!0,greedy:!0,inside:a},"attr-name":{pattern:r("([\\[;, \t\r\n])(?=[ \t\r\n]*=)"),lookbehind:!0,greedy:!0,inside:a},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ns][ew]?|[ewc_])(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r("(^|[^-.\\w\\x80-\\uFFFF\\\\])"),lookbehind:!0,greedy:!0,inside:a},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism); +Prism.languages.ebnf={comment:/\(\*[\s\S]*?\*\)/,string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0},special:{pattern:/\?[^?\r\n]*\?/,greedy:!0,alias:"class-name"},definition:{pattern:/^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,lookbehind:!0,alias:["rule","keyword"]},rule:/\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,punctuation:/\([:/]|[:/]\)|[.,;()[\]{}]/,operator:/[-=|*/!]/}; +Prism.languages.editorconfig={comment:/[;#].*/,section:{pattern:/(^[ \t]*)\[.+\]/m,lookbehind:!0,alias:"keyword",inside:{regex:/\\\\[\[\]{},!?.*]/,operator:/[!?]|\.\.|\*{1,2}/,punctuation:/[\[\]{},]/}},property:{pattern:/(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,lookbehind:!0},value:{pattern:/=.*/,alias:"string",inside:{punctuation:/^=/}}}; +Prism.languages.eiffel={comment:/--.*/,string:[{pattern:/"([^[]*)\[[\s\S]*?\]\1"/,greedy:!0},{pattern:/"([^{]*)\{[\s\S]*?\}\1"/,greedy:!0},{pattern:/"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,greedy:!0}],char:/'(?:%.|[^%'\r\n])+'/,keyword:/\b(?:across|agent|alias|all|and|attached|as|assign|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,boolean:/\b(?:True|False)\b/i,"class-name":{pattern:/\b[A-Z][\dA-Z_]*\b/,alias:"builtin"},number:[/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i],punctuation:/:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,operator:/\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/}; +!function(e){e.languages.ejs={delimiter:{pattern:/^<%[-_=]?|[-_]?%>$/,alias:"punctuation"},comment:/^#[\s\S]*/,"language-javascript":{pattern:/[\s\S]+/,inside:e.languages.javascript}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"ejs",/<%(?!%)[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"ejs")}),e.languages.eta=e.languages.ejs}(Prism); +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/m,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); +Prism.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|as|exposing)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/}; +Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; +!function(e){e.languages.etlua={delimiter:{pattern:/^<%[-=]?|-?%>$/,alias:"punctuation"},"language-lua":{pattern:/[\s\S]+/,inside:e.languages.lua}},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"etlua",/<%[\s\S]+?%>/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"etlua")})}(Prism); +!function(n){n.languages.erb=n.languages.extend("ruby",{}),n.languages.insertBefore("erb","comment",{delimiter:{pattern:/^<%=?|%>$/,alias:"punctuation"}}),n.hooks.add("before-tokenize",function(e){n.languages["markup-templating"].buildPlaceholders(e,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/gm)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"erb")})}(Prism); +Prism.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:true|false)\b/,keyword:/\b(?:fun|when|case|of|end|if|receive|after|try|catch)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:bnot|div|rem|band|bor|bxor|bsl|bsr|not|and|or|xor|orelse|andalso)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; +Prism.languages["excel-formula"]={comment:{pattern:/(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,lookbehind:!0,greedy:!0},string:{pattern:/"(?:[^"]|"")*"(?!")/,greedy:!0},reference:{pattern:/(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,greedy:!0,alias:"string",inside:{operator:/!$/,punctuation:/'/,sheet:{pattern:/[^[\]]+$/,alias:"function"},file:{pattern:/\[[^[\]]+\]$/,inside:{punctuation:/[[\]]/}},path:/[\s\S]+/}},"function-name":{pattern:/\b[A-Z]\w*(?=\()/i,alias:"keyword"},range:{pattern:/\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,alias:"property",inside:{operator:/:/,cell:/\$?[A-Z]+\$?\d+/i,column:/\$?[A-Z]+/i,row:/\$?\d+/}},cell:{pattern:/\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,alias:"property"},number:/(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,boolean:/\b(?:TRUE|FALSE)\b/i,operator:/[-+*/^%=&,]|<[=>]?|>=?/,punctuation:/[[\]();{}|]/},Prism.languages.xlsx=Prism.languages.xls=Prism.languages["excel-formula"]; +Prism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?|'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|assert|base|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|global|if|in|inherit|inline|interface|internal|lazy|match|member|module|mutable|namespace|new|not|null|of|open|or|override|private|public|rec|select|static|struct|then|to|true|try|type|upcast|val|void|when|while|with|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|include|method|mixin|object|parallel|process|protected|pure|sealed|tailcall|trait|virtual|volatile)\b/,number:[/\b0x[\da-fA-F]+(?:un|lf|LF)?\b/,/\b0b[01]+(?:y|uy)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|u[lsy]?|UL)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),Prism.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:Prism.languages.fsharp}}}}); +!function(e){var t={function:/\b(?:TODOS?|FIX(?:MES?)?|NOTES?|BUGS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/},s={number:/\\[^\s']|%\w/},i={comment:[{pattern:/(^|\s)(?:! .*|!$)/,lookbehind:!0,inside:t},{pattern:/(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,inside:t}],number:[{pattern:/(^|\s)[+-]?\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)-\d+-\d+\/\d+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,lookbehind:!0},{pattern:/(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,lookbehind:!0},{pattern:/(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,lookbehind:!0}],regexp:{pattern:/(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,lookbehind:!0,alias:"number",inside:{variable:/\\\S/,keyword:/[+?*\[\]^$(){}.|]/,operator:{pattern:/(\/)[idmsr]+(?:-[idmsr]+)?/,lookbehind:!0}}},boolean:{pattern:/(^|\s)[tf](?=\s|$)/,lookbehind:!0},"custom-string":{pattern:/(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:/\\\S|%\w|\//}},"multiline-string":[{pattern:/(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:{number:s.number,"semicolon-or-setlocal":{pattern:/([\r\n][ \t]*);(?=\s|$)/,lookbehind:!0,alias:"function"}}},{pattern:/(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s},{pattern:/(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,lookbehind:!0,greedy:!0,alias:"string",inside:s}],"special-using":{pattern:/(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,lookbehind:!0,alias:"function",inside:{string:{pattern:/(\s)[^:\s]+/,lookbehind:!0}}},"stack-effect-delimiter":[{pattern:/(^|\s)(?:call|execute|eval)?\((?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)--(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\)(?=\s|$)/,lookbehind:!0,alias:"operator"}],combinators:{pattern:null,lookbehind:!0,alias:"keyword"},"kernel-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"sequences-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"math-builtin":{pattern:null,lookbehind:!0,alias:"variable"},"constructor-word":{pattern:/(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,lookbehind:!0,alias:"keyword"},"other-builtin-syntax":{pattern:null,lookbehind:!0,alias:"operator"},"conventionally-named-word":{pattern:/(^|\s)(?!")(?:(?:set|change|with|new)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,lookbehind:!0,alias:"keyword"},"colon-syntax":{pattern:/(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,lookbehind:!0,greedy:!0,alias:"function"},"semicolon-or-setlocal":{pattern:/(\s)(?:;|:>)(?=\s|$)/,lookbehind:!0,alias:"function"},"curly-brace-literal-delimiter":[{pattern:/(^|\s)[a-z]*\{(?=\s)/i,lookbehind:!0,alias:"operator"},{pattern:/(\s)\}(?=\s|$)/,lookbehind:!0,alias:"operator"}],"quotation-delimiter":[{pattern:/(^|\s)\[(?=\s)/,lookbehind:!0,alias:"operator"},{pattern:/(\s)\](?=\s|$)/,lookbehind:!0,alias:"operator"}],"normal-word":{pattern:/(^|\s)[^"\s]\S*(?=\s|$)/,lookbehind:!0},string:{pattern:/"(?:\\\S|[^"\\])*"/,greedy:!0,inside:s}},n=function(e){return(e+"").replace(/([.?*+\^$\[\]\\(){}|\-])/g,"\\$1")},r=function(e){return new RegExp("(^|\\s)(?:"+e.map(n).join("|")+")(?=\\s|$)")},a={"kernel-builtin":["or","2nipd","4drop","tuck","wrapper","nip","wrapper?","callstack>array","die","dupd","callstack","callstack?","3dup","hashcode","pick","4nip","build",">boolean","nipd","clone","5nip","eq?","?","=","swapd","2over","clear","2dup","get-retainstack","not","tuple?","dup","3nipd","call","-rotd","object","drop","assert=","assert?","-rot","execute","boa","get-callstack","curried?","3drop","pickd","overd","over","roll","3nip","swap","and","2nip","rotd","throw","(clone)","hashcode*","spin","reach","4dup","equal?","get-datastack","assert","2drop","","boolean?","identity-hashcode","identity-tuple?","null","composed?","new","5drop","rot","-roll","xor","identity-tuple","boolean"],"other-builtin-syntax":["=======","recursive","flushable",">>","<<<<<<","M\\","B","PRIVATE>","\\","======","final","inline","delimiter","deprecated",">>>>>","<<<<<<<","parse-complex","malformed-complex","read-only",">>>>>>>","call-next-method","<<","foldable","$","$[","${"],"sequences-builtin":["member-eq?","mismatch","append","assert-sequence=","longer","repetition","clone-like","3sequence","assert-sequence?","last-index-from","reversed","index-from","cut*","pad-tail","join-as","remove-eq!","concat-as","but-last","snip","nths","nth","sequence","longest","slice?","","remove-nth","tail-slice","empty?","tail*","member?","virtual-sequence?","set-length","drop-prefix","iota","unclip","bounds-error?","unclip-last-slice","non-negative-integer-expected","non-negative-integer-expected?","midpoint@","longer?","?set-nth","?first","rest-slice","prepend-as","prepend","fourth","sift","subseq-start","new-sequence","?last","like","first4","1sequence","reverse","slice","virtual@","repetition?","set-last","index","4sequence","max-length","set-second","immutable-sequence","first2","first3","supremum","unclip-slice","suffix!","insert-nth","tail","3append","short","suffix","concat","flip","immutable?","reverse!","2sequence","sum","delete-all","indices","snip-slice","","check-slice","sequence?","head","append-as","halves","sequence=","collapse-slice","?second","slice-error?","product","bounds-check?","bounds-check","immutable","virtual-exemplar","harvest","remove","pad-head","last","set-fourth","cartesian-product","remove-eq","shorten","shorter","reversed?","shorter?","shortest","head-slice","pop*","tail-slice*","but-last-slice","iota?","append!","cut-slice","new-resizable","head-slice*","sequence-hashcode","pop","set-nth","?nth","second","join","immutable-sequence?","","3append-as","virtual-sequence","subseq?","remove-nth!","length","last-index","lengthen","assert-sequence","copy","move","third","first","tail?","set-first","prefix","bounds-error","","exchange","surround","cut","min-length","set-third","push-all","head?","subseq-start-from","delete-slice","rest","sum-lengths","head*","infimum","remove!","glue","slice-error","subseq","push","replace-slice","subseq-as","unclip-last"],"math-builtin":["number=","next-power-of-2","?1+","fp-special?","imaginary-part","float>bits","number?","fp-infinity?","bignum?","fp-snan?","denominator","gcd","*","+","fp-bitwise=","-","u>=","/",">=","bitand","power-of-2?","log2-expects-positive","neg?","<","log2",">","integer?","number","bits>double","2/","zero?","bits>float","float?","shift","ratio?","rect>","even?","ratio","fp-sign","bitnot",">fixnum","complex?","/i","integer>fixnum","/f","sgn",">bignum","next-float","u<","u>","mod","recip","rational",">float","2^","integer","fixnum?","neg","fixnum","sq","bignum",">rect","bit?","fp-qnan?","simple-gcd","complex","","real",">fraction","double>bits","bitor","rem","fp-nan-payload","real-part","log2-expects-positive?","prev-float","align","unordered?","float","fp-nan?","abs","bitxor","integer>fixnum-strict","u<=","odd?","<=","/mod",">integer","real?","rational?","numerator"]};Object.keys(a).forEach(function(e){i[e].pattern=r(a[e])});i.combinators.pattern=r(["2bi","while","2tri","bi*","4dip","both?","same?","tri@","curry","prepose","3bi","?if","tri*","2keep","3keep","curried","2keepd","when","2bi*","2tri*","4keep","bi@","keepdd","do","unless*","tri-curry","if*","loop","bi-curry*","when*","2bi@","2tri@","with","2with","either?","bi","until","3dip","3curry","tri-curry*","tri-curry@","bi-curry","keepd","compose","2dip","if","3tri","unless","tuple","keep","2curry","tri","most","while*","dip","composed","bi-curry@","find-last-from","trim-head-slice","map-as","each-from","none?","trim-tail","partition","if-empty","accumulate*","reject!","find-from","accumulate-as","collector-for-as","reject","map","map-sum","accumulate!","2each-from","follow","supremum-by","map!","unless-empty","collector","padding","reduce-index","replicate-as","infimum-by","trim-tail-slice","count","find-index","filter","accumulate*!","reject-as","map-integers","map-find","reduce","selector","interleave","2map","filter-as","binary-reduce","map-index-as","find","produce","filter!","replicate","cartesian-map","cartesian-each","find-index-from","map-find-last","3map-as","3map","find-last","selector-as","2map-as","2map-reduce","accumulate","each","each-index","accumulate*-as","when-empty","all?","collector-as","push-either","new-like","collector-for","2selector","push-if","2all?","map-reduce","3each","any?","trim-slice","2reduce","change-nth","produce-as","2each","trim","trim-head","cartesian-find","map-index","if-zero","each-integer","unless-zero","(find-integer)","when-zero","find-last-integer","(all-integers?)","times","(each-integer)","find-integer","all-integers?","unless-negative","if-positive","when-positive","when-negative","unless-positive","if-negative","case","2cleave","cond>quot","case>quot","3cleave","wrong-values","to-fixed-point","alist>quot","cond","cleave","call-effect","recursive-hashcode","spread","deep-spread>quot","2||","0||","n||","0&&","2&&","3||","1||","1&&","n&&","3&&","smart-unless*","keep-inputs","reduce-outputs","smart-when*","cleave>array","smart-with","smart-apply","smart-if","inputs/outputs","output>sequence-n","map-outputs","map-reduce-outputs","dropping","output>array","smart-map-reduce","smart-2map-reduce","output>array-n","nullary","inputsequence"]),e.languages.factor=i}(Prism); +Prism.languages.false={comment:{pattern:/\{[^}]*\}/},string:{pattern:/"[^"]*"/,greedy:!0},"character-code":{pattern:/'(?:[^\r]|\r\n?)/,alias:"number"},"assembler-code":{pattern:/\d+`/,alias:"important"},number:/\d+/,operator:/[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,punctuation:/\[|\]/,variable:/[a-z]/,"non-standard":{pattern:/[()!=]=?|[-+*/%]|\b(?:in|is)\b/}),delete Prism.languages["firestore-security-rules"]["class-name"],Prism.languages.insertBefore("firestore-security-rules","keyword",{path:{pattern:/(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,inside:{operator:/=/,keyword:/\*\*/,punctuation:/[.$(){}]/}},punctuation:/\//}},method:{pattern:/(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,lookbehind:!0,alias:"builtin",inside:{punctuation:/,/}}}); +!function(a){a.languages.flow=a.languages.extend("javascript",{}),a.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Nn]umber|[Ss]tring|[Bb]oolean|Function|any|mixed|null|void)\b/,alias:"tag"}]}),a.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete a.languages.flow.parameter,a.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(a.languages.flow.keyword)||(a.languages.flow.keyword=[a.languages.flow.keyword]),a.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:type|opaque|declare|Class)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:await|Diff|Exact|Keys|ObjMap|PropertyType|Shape|Record|Supertype|Subtype|Enum)\b(?!\$)/,lookbehind:!0})}(Prism); +Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:TRUE|FALSE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:INTEGER|REAL|DOUBLE ?PRECISION|COMPLEX|CHARACTER|LOGICAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEWHERE|ELSEIF|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; +!function(n){for(var i="[^<()\"']|\\((?:)*\\)|<(?!#--)|<#--(?:[^-]|-(?!->))*--\x3e|\"(?:[^\\\\\"]|\\\\.)*\"|'(?:[^\\\\']|\\\\.)*'",e=0;e<2;e++)i=i.replace(//g,function(){return i});i=i.replace(//g,"[^\\s\\S]");var t={comment:/<#--[\s\S]*?-->/,string:[{pattern:/\br("|')(?:(?!\1)[^\\]|\\.)*\1/,greedy:!0},{pattern:RegExp("(\"|')(?:(?!\\1|\\$\\{)[^\\\\]|\\\\.|\\$\\{(?:(?!\\})(?:))*\\})*\\1".replace(//g,function(){return i})),greedy:!0,inside:{interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\\\\\)*)\\$\\{(?:(?!\\})(?:))*\\}".replace(//g,function(){return i})),lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:null}}}}],keyword:/\b(?:as)\b/,boolean:/\b(?:true|false)\b/,"builtin-function":{pattern:/((?:^|[^?])\?\s*)\w+/,lookbehind:!0,alias:"function"},function:/\b\w+(?=\s*\()/,number:/\b\d+(?:\.\d+)?\b/,operator:/\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,punctuation:/[,;.:()[\]{}]/};t.string[1].inside.interpolation.inside.rest=t,n.languages.ftl={"ftl-comment":{pattern:/^<#--[\s\S]*/,alias:"comment"},"ftl-directive":{pattern:/^<[\s\S]+>$/,inside:{directive:{pattern:/(^<\/?)[#@][a-z]\w*/i,lookbehind:!0,alias:"keyword"},punctuation:/^<\/?|\/?>$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}},"ftl-interpolation":{pattern:/^\$\{[\s\S]*\}$/,inside:{punctuation:/^\$\{|\}$/,content:{pattern:/\s*\S[\s\S]*/,alias:"ftl",inside:t}}}},n.hooks.add("before-tokenize",function(e){var t=RegExp("<#--[^]*?--\x3e|)*?>|\\$\\{(?:)*?\\}".replace(//g,function(){return i}),"gi");n.languages["markup-templating"].buildPlaceholders(e,"ftl",t)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"ftl")})}(Prism); +Prism.languages.gamemakerlanguage=Prism.languages.gml=Prism.languages.extend("clike",{keyword:/\b(?:if|else|switch|case|default|break|for|repeat|while|do|until|continue|exit|return|globalvar|var|enum)\b/,number:/(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not|with|at|xor)\b/,constant:/\b(?:self|other|all|noone|global|local|undefined|pointer_(?:invalid|null)|action_(?:stop|restart|continue|reverse)|pi|GM_build_date|GM_version|timezone_(?:local|utc)|gamespeed_(?:fps|microseconds)|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|pre|post)|keypress|keyrelease|trigger|(?:left|right|middle|no)_button|(?:left|right|middle)_press|(?:left|right|middle)_release|mouse_(?:enter|leave|wheel_up|wheel_down)|global_(?:left|right|middle)_button|global_(?:left|right|middle)_press|global_(?:left|right|middle)_release|joystick(?:1|2)_(?:left|right|up|down|button1|button2|button3|button4|button5|button6|button7|button8)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|step_(?:normal|begin|end)|gui|gui_begin|gui_end)|vk_(?:nokey|anykey|enter|return|shift|control|alt|escape|space|backspace|tab|pause|printscreen|left|right|up|down|home|end|delete|insert|pageup|pagedown|f\d|numpad\d|divide|multiply|subtract|add|decimal|lshift|lcontrol|lalt|rshift|rcontrol|ralt)|mb_(?:any|none|left|right|middle)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|purple|red|silver|teal|white|yellow|orange)|fa_(?:left|center|right|top|middle|bottom|readonly|hidden|sysfile|volumeid|directory|archive)|pr_(?:pointlist|linelist|linestrip|trianglelist|trianglestrip|trianglefan)|bm_(?:complex|normal|add|max|subtract|zero|one|src_colour|inv_src_colour|src_color|inv_src_color|src_alpha|inv_src_alpha|dest_alpha|inv_dest_alpha|dest_colour|inv_dest_colour|dest_color|inv_dest_color|src_alpha_sat)|audio_(?:falloff_(?:none|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|exponent_distance|exponent_distance_clamped)|old_system|new_system|mono|stereo|3d)|cr_(?:default|none|arrow|cross|beam|size_nesw|size_ns|size_nwse|size_we|uparrow|hourglass|drag|appstart|handpoint|size_all)|asset_(?:object|unknown|sprite|sound|room|path|script|font|timeline|tiles|shader)|ds_type_(?:map|list|stack|queue|grid|priority)|ef_(?:explosion|ring|ellipse|firework|smoke|smokeup|star|spark|flare|cloud|rain|snow)|pt_shape_(?:pixel|disk|square|line|star|circle|ring|sphere|flare|spark|explosion|cloud|smoke|snow)|ps_(?:distr|shape)_(?:linear|gaussian|invgaussian|rectangle|ellipse|diamond|line)|ty_(?:real|string)|dll_(?:cdel|cdecl|stdcall)|matrix_(?:view|projection|world)|os_(?:win32|windows|macosx|ios|android|linux|unknown|winphone|win8native|psvita|ps4|xboxone|ps3|uwp)|browser_(?:not_a_browser|unknown|ie|firefox|chrome|safari|safari_mobile|opera|tizen|windows_store|ie_mobile)|device_ios_(?:unknown|iphone|iphone_retina|ipad|ipad_retina|iphone5|iphone6|iphone6plus)|device_(?:emulator|tablet)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|of_challenge_(?:win|lose|tie)|leaderboard_type_(?:number|time_mins_secs)|cmpfunc_(?:never|less|equal|lessequal|greater|notequal|greaterequal|always)|cull_(?:noculling|clockwise|counterclockwise)|lighttype_(?:dir|point)|iap_(?:ev_storeload|ev_product|ev_purchase|ev_consume|ev_restore|storeload_ok|storeload_failed|status_uninitialised|status_unavailable|status_loading|status_available|status_processing|status_restoring|failed|unavailable|available|purchased|canceled|refunded)|fb_login_(?:default|fallback_to_webview|no_fallback_to_webview|forcing_webview|use_system_account|forcing_safari)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|reaction_force_x|reaction_force_y|reaction_torque|motor_speed|angle|motor_torque|max_motor_torque|translation|speed|motor_force|max_motor_force|length_1|length_2|damping_ratio|frequency|lower_angle_limit|upper_angle_limit|angle_limits|max_length|max_torque|max_force)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_particle_flag_(?:water|zombie|wall|spring|elastic|viscous|powder|tensile|colourmixing|colormixing)|phy_particle_group_flag_(?:solid|rigid)|phy_particle_data_flag_(?:typeflags|position|velocity|colour|color|category)|achievement_(?:our_info|friends_info|leaderboard_info|info|filter_(?:all_players|friends_only|favorites_only)|type_challenge|type_score_challenge|pic_loaded|show_(?:ui|profile|leaderboard|achievement|bank|friend_picker|purchase_prompt))|network_(?:socket_(?:tcp|udp|bluetooth)|type_(?:connect|disconnect|data|non_blocking_connect)|config_(?:connect_timeout|use_non_blocking_socket|enable_reliable_udp|disable_reliable_udp))|buffer_(?:fixed|grow|wrap|fast|vbuffer|network|u8|s8|u16|s16|u32|s32|u64|f16|f32|f64|bool|text|string|seek_start|seek_relative|seek_end|generalerror|outofspace|outofbounds|invalidtype)|gp_(?:face\d|shoulderl|shoulderr|shoulderlb|shoulderrb|select|start|stickl|stickr|padu|padd|padl|padr|axislh|axislv|axisrh|axisrv)|ov_(?:friends|community|players|settings|gamegroup|achievements)|lb_sort_(?:none|ascending|descending)|lb_disp_(?:none|numeric|time_sec|time_ms)|ugc_(?:result_success|filetype_(?:community|microtrans)|visibility_(?:public|friends_only|private)|query_RankedBy(?:Vote|PublicationDate|Trend|NumTimesReported|TotalVotesAsc|VotesUp|TextSearch)|query_(?:AcceptedForGameRankedByAcceptanceDate|FavoritedByFriendsRankedByPublicationDate|CreatedByFriendsRankedByPublicationDate|NotYetRated)|sortorder_CreationOrder(?:Desc|Asc)|sortorder_(?:TitleAsc|LastUpdatedDesc|SubscriptionDateDesc|VoteScoreDesc|ForModeration)|list_(?:Published|VotedOn|VotedUp|VotedDown|WillVoteLater|Favorited|Subscribed|UsedOrPlayed|Followed)|match_(?:Items|Items_Mtx|Items_ReadyToUse|Collections|Artwork|Videos|Screenshots|AllGuides|WebGuides|IntegratedGuides|UsableInGame|ControllerBindings))|vertex_usage_(?:position|colour|color|normal|texcoord|textcoord|blendweight|blendindices|psize|tangent|binormal|fog|depth|sample)|vertex_type_(?:float\d|colour|color|ubyte4)|layerelementtype_(?:undefined|background|instance|oldtilemap|sprite|tilemap|particlesystem|tile)|tile_(?:rotate|flip|mirror|index_mask)|input_type|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|(?:obj|scr|spr|rm)\w+)\b/,variable:/\b(?:x|y|(?:x|y)(?:previous|start)|(?:h|v)speed|direction|speed|friction|gravity|gravity_direction|path_(?:index|position|positionprevious|speed|scale|orientation|endaction)|object_index|id|solid|persistent|mask_index|instance_(?:count|id)|alarm|timeline_(?:index|position|speed|running|loop)|visible|sprite_(?:index|width|height|xoffset|yoffset)|image_(?:number|index|speed|depth|xscale|yscale|angle|alpha|blend)|bbox_(?:left|right|top|bottom)|layer|phy_(?:rotation|(?:position|linear_velocity|speed|com|collision|col_normal)_(?:x|y)|angular_(?:velocity|damping)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|working_directory|webgl_enabled|view_(?:(?:y|x|w|h)view|(?:y|x|w|h)port|(?:v|h)(?:speed|border)|visible|surface_id|object|enabled|current|angle)|undefined|transition_(?:steps|kind|color)|temp_directory|show_(?:score|lives|health)|secure_mode|score|room_(?:width|speed|persistent|last|height|first|caption)|room|pointer_(?:null|invalid)|os_(?:version|type|device|browser)|mouse_(?:y|x|lastbutton|button)|lives|keyboard_(?:string|lastkey|lastchar|key)|iap_data|health|gamemaker_(?:version|registered|pro)|game_(?:save|project|display)_(?:id|name)|fps_real|fps|event_(?:type|object|number|action)|error_(?:occurred|last)|display_aa|delta_time|debug_mode|cursor_sprite|current_(?:year|weekday|time|second|month|minute|hour|day)|caption_(?:score|lives|health)|browser_(?:width|height)|background_(?:yscale|y|xscale|x|width|vtiled|vspeed|visible|showcolour|showcolor|index|htiled|hspeed|height|foreground|colour|color|blend|alpha)|async_load|application_surface|argument(?:_relitive|_count|\d)|argument|global|local|self|other)\b/}); +Prism.languages.gcode={comment:/;.*|\B\(.*?\)\B/,string:{pattern:/"(?:""|[^"])*"/,greedy:!0},keyword:/\b[GM]\d+(?:\.\d+)?\b/,property:/\b[A-Z]/,checksum:{pattern:/\*\d+/,alias:"punctuation"},punctuation:/:/}; +Prism.languages.gdscript={comment:/#.*/,string:{pattern:/@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,greedy:!0},"class-name":{pattern:/(^(?:class_name|class|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,lookbehind:!0},keyword:/\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,function:/\b[a-z_]\w*(?=[ \t]*\()/i,variable:/\$\w+/,number:[/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,/\b(?:INF|NAN|PI|TAU)\b/],constant:/\b[A-Z][A-Z_\d]*\b/,boolean:/\b(?:false|true)\b/,operator:/->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,punctuation:/[.:,;()[\]{}]/}; +Prism.languages.gedcom={"line-value":{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,lookbehind:!0,inside:{pointer:{pattern:/^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,alias:"variable"}}},tag:{pattern:/(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,lookbehind:!0,alias:"string"},level:{pattern:/(^[\t ]*)\d+/m,lookbehind:!0,alias:"number"},pointer:{pattern:/@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,alias:"variable"}}; +!function(a){var n="(?:\r?\n|\r)[ \t]*\\|.+\\|(?:(?!\\|).)*";Prism.languages.gherkin={pystring:{pattern:/("""|''')[\s\S]+?\1/,alias:"string"},comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},tag:{pattern:/(^[ \t]*)@\S*/m,lookbehind:!0},feature:{pattern:/((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|laH|Lastnost|Mak|Mogucnost|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|perbogh|poQbogh malja'|Potrzeba biznesowa|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]+/,lookbehind:!0},keyword:/[^:\r\n]+:/}},scenario:{pattern:/(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram senaryo|Dyagram Senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|Examples|EXAMPLZ|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|ghantoH|Grundlage|Hannergrond|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut|lut chovnatlh|lutmey|Lýsing Atburðarásar|Lýsing Dæma|Menggariskan Senario|MISHUN|MISHUN SRSLY|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan senaryo|Plan Senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo|Senaryo deskripsyon|Senaryo Deskripsyon|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie|Situasie Uiteensetting|Skenario|Skenario konsep|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa|Swa hwaer swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,lookbehind:!0,inside:{important:{pattern:/(:)[^\r\n]*/,lookbehind:!0},keyword:/[^:\r\n]+:/}},"table-body":{pattern:RegExp("("+n+")(?:"+n+")+"),lookbehind:!0,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"},td:{pattern:/\s*[^\s|][^|]*/,alias:"string"},punctuation:/\|/}},"table-head":{pattern:RegExp(n),inside:{th:{pattern:/\s*[^\s|][^|]*/,alias:"variable"},punctuation:/\|/}},atrule:{pattern:/(^[ \t]+)(?:'ach|'a|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cando|Cand|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|Dato|DEN|Den youse gotta|Dengan|De|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|Entonces|En|Epi|E|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kadar|Kada|Kad|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Majd|Maka|Manawa|Mas|Ma|Menawa|Men|Mutta|Nalikaning|Nalika|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Og|Och|Oletetaan|Onda|Ond|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|qaSDI'|Quando|Quand|Quan|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|ugeholl|Und|Un|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadani|Zadano|Zadan|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,inside:{outline:{pattern:/<[^>]+>/,alias:"variable"}}},outline:{pattern:/<[^>]+>/,alias:"variable"}}}(); +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; +Prism.languages.glsl=Prism.languages.extend("c",{keyword:/\b(?:attribute|const|uniform|varying|buffer|shared|coherent|volatile|restrict|readonly|writeonly|atomic_uint|layout|centroid|flat|smooth|noperspective|patch|sample|break|continue|do|for|while|switch|case|default|if|else|subroutine|in|out|inout|float|double|int|void|bool|true|false|invariant|precise|discard|return|d?mat[234](?:x[234])?|[ibdu]?vec[234]|uint|lowp|mediump|highp|precision|[iu]?sampler[123]D|[iu]?samplerCube|sampler[12]DShadow|samplerCubeShadow|[iu]?sampler[12]DArray|sampler[12]DArrayShadow|[iu]?sampler2DRect|sampler2DRectShadow|[iu]?samplerBuffer|[iu]?sampler2DMS(?:Array)?|[iu]?samplerCubeArray|samplerCubeArrayShadow|[iu]?image[123]D|[iu]?image2DRect|[iu]?imageCube|[iu]?imageBuffer|[iu]?image[12]DArray|[iu]?imageCubeArray|[iu]?image2DMS(?:Array)?|struct|common|partition|active|asm|class|union|enum|typedef|template|this|resource|goto|inline|noinline|public|static|extern|external|interface|long|short|half|fixed|unsigned|superp|input|output|hvec[234]|fvec[234]|sampler3DRect|filter|sizeof|cast|namespace|using)\b/}); +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete Prism.languages.go["class-name"]; +Prism.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:Prism.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/[A-Z]\w*Input(?=!?.*$)/m,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},Prism.hooks.add("after-tokenize",function(n){if("graphql"===n.language)for(var o=n.tokens.filter(function(n){return"string"!=typeof n&&"comment"!==n.type&&"scalar"!==n.type}),s=0;s]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),Prism.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:setup|given|when|then|and|cleanup|expect|where):/}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),Prism.hooks.add("wrap",function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;"$"===t&&(n=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),e.content=e.content.replace(/</g,"<").replace(/&/g,"&"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring")}}}); +!function(e){e.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:e.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:e.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:e.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:e.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:e.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:e.languages.ruby}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var t=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],n={},r=0,a=t.length;r@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",function(a){e.languages["markup-templating"].buildPlaceholders(a,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)}),e.hooks.add("after-tokenize",function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"handlebars")}),e.languages.hbs=e.languages.handlebars}(Prism); +Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|qualified|as|hiding)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell; +Prism.languages.haxe=Prism.languages.extend("clike",{string:{pattern:/(["'])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:{pattern:/(^|[^\\])\$(?:\w+|\{[^}]+\})/,lookbehind:!0,inside:{interpolation:{pattern:/^\$\w*/,alias:"variable"}}}}},keyword:/\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|from|for|function|if|implements|import|in|inline|interface|macro|new|null|override|public|private|return|static|super|switch|throw|to|try|typedef|using|var|while)(?!\.)\b/,operator:/\.{3}|\+\+?|-[->]?|[=!]=?|&&?|\|\|?|<[<=]?|>[>=]?|[*\/%~^]/}),Prism.languages.insertBefore("haxe","class-name",{regex:{pattern:/~\/(?:[^\/\\\r\n]|\\.)+\/[igmsu]*/,greedy:!0}}),Prism.languages.insertBefore("haxe","keyword",{preprocessor:{pattern:/#\w+/,alias:"builtin"},metadata:{pattern:/@:?\w+/,alias:"symbol"},reification:{pattern:/\$(?:\w+|(?=\{))/,alias:"variable"}}),Prism.languages.haxe.string.inside.interpolation.inside.rest=Prism.languages.haxe,delete Prism.languages.haxe["class-name"]; +Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:resource|data)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:provider|provisioner|variable|output|module|backend)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(provider|provisioner|variable|output|module|backend)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:terraform|var|self|count|module|path|data|local)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:terraform|var|self|count|module|path|data|local)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:true|false)\b/i,punctuation:/[=\[\]{}]/}; +Prism.languages.hlsl=Prism.languages.extend("c",{"class-name":[Prism.languages.c["class-name"],/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RasterizerState|RenderTargetView|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/],keyword:[/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/],number:/(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,boolean:/\b(?:false|true)\b/}); +Prism.languages.hoon={constant:/%(?:\.[ny]|[\w-]+)/,comment:{pattern:/::.*/,greedy:!0},"class-name":[{pattern:/@(?:[A-Za-z0-9-]*[A-Za-z0-9])?/},/\*/],function:/(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/:_|\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/}; +!function(t){t.languages.http={"request-line":{pattern:/^(?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI|SEARCH)\s(?:https?:\/\/|\/)\S*\sHTTP\/[0-9.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[0-9.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[0-9.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[0-9.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var a,e,s,n=t.languages,r={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css},i={"application/json":!0,"application/xml":!0};for(var p in r)if(r[p]){a=a||{};var o=i[p]?(void 0,s=(e=p).replace(/^[a-z]+\//,""),"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):p;a[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+"(?:(?:\\r\\n?|\\n).+)*)(?:\\r?\\n|\\r){2}[\\s\\S]*","i"),lookbehind:!0,inside:r[p]}}a&&t.languages.insertBefore("http","header-name",a)}(Prism); +Prism.languages.hpkp={directive:{pattern:/\b(?:(?:includeSubDomains|preload|strict)(?: |;)|pin-sha256="[a-zA-Z\d+=/]+"|(?:max-age|report-uri)=|report-to )/,alias:"keyword"},safe:{pattern:/\b\d{7,}\b/,alias:"selector"},unsafe:{pattern:/\b\d{1,6}\b/,alias:"function"}}; +Prism.languages.hsts={directive:{pattern:/\b(?:max-age=|includeSubDomains|preload)/,alias:"keyword"},safe:{pattern:/\b\d{8,}\b/,alias:"selector"},unsafe:{pattern:/\b\d{1,7}\b/,alias:"function"}}; +Prism.languages.ichigojam={comment:/(?:\B'|REM)(?:[^\n\r]*)/i,string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/i,greedy:!0},number:/\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GSB|GOTO|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|RIGHT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,function:/\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,label:/(?:\B@\S+)/i,operator:/<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,punctuation:/[\[,;:()\]]/}; +Prism.languages.icon={comment:/#.*/,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,greedy:!0},number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,function:/\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}; +!function(e){function s(e,t){return t<=0?"[]":e.replace(//g,function(){return s(e,t-1)})}var t=/'[{}:=,](?:[^']|'')*'(?!')/,n={pattern:/''/,greedy:!0,alias:"operator"},r={pattern:t,greedy:!0,inside:{escape:n}},a=s("\\{(?:[^{}']|'(?![{},'])|''||)*\\}".replace(//g,function(){return t.source}),8),i={pattern:RegExp(a),inside:{message:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:null},"message-delimiter":{pattern:/./,alias:"punctuation"}}};e.languages["icu-message-format"]={argument:{pattern:RegExp(a),greedy:!0,inside:{content:{pattern:/^(\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:{"argument-name":{pattern:/^(\s*)[^{}:=,\s]+/,lookbehind:!0},"choice-style":{pattern:/^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{punctuation:/\|/,range:{pattern:/^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,lookbehind:!0,inside:{operator:/[<#\u2264]/,number:/\S+/}},rest:null}},"plural-style":{pattern:/^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{offset:/^offset:\s*\d+/,"nested-message":i,selector:{pattern:/=\d+|[^{}:=,\s]+/,inside:{keyword:/^(?:zero|one|two|few|many|other)$/}}}},"select-style":{pattern:/^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,lookbehind:!0,inside:{"nested-message":i,selector:{pattern:/[^{}:=,\s]+/,inside:{keyword:/^other$/}}}},keyword:/\b(?:choice|plural|select|selectordinal)\b/,"arg-type":{pattern:/\b(?:number|date|time|spellout|ordinal|duration)\b/,alias:"keyword"},"arg-skeleton":{pattern:/(,\s*)::[^{}:=,\s]+/,lookbehind:!0},"arg-style":{pattern:/(,\s*)(?:short|medium|long|full|integer|currency|percent)(?=\s*$)/,lookbehind:!0},"arg-style-text":{pattern:RegExp("(^\\s*,\\s*(?=\\S))"+s("(?:[^{}']|'[^']*'|\\{(?:)?\\})+",8)+"$"),lookbehind:!0,alias:"string"},punctuation:/,/}},"argument-delimiter":{pattern:/./,alias:"operator"}}},escape:n,string:r},i.inside.message.inside=e.languages["icu-message-format"],e.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest=e.languages["icu-message-format"]}(Prism); +Prism.languages.idris=Prism.languages.extend("haskell",{comment:{pattern:/(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m},keyword:/\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,"import-statement":{pattern:/(^\s*)import\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,lookbehind:!0},builtin:void 0}),Prism.languages.idr=Prism.languages.idris; +!function(n){n.languages.ignore={comment:/^#.*/m,entry:{pattern:/\S(?:.*(?:(?:\\ )|\S))?/,alias:"string",inside:{operator:/^!|\*\*?|\?/,regex:{pattern:/(^|[^\\])\[[^\[\]]*\]/,lookbehind:!0},punctuation:/\//}}},n.languages.gitignore=n.languages.ignore,n.languages.hgignore=n.languages.ignore,n.languages.npmignore=n.languages.ignore}(Prism); +Prism.languages.inform7={string:{pattern:/"[^"]*"/,inside:{substitution:{pattern:/\[[^\[\]]+\]/,inside:{delimiter:{pattern:/\[|\]/,alias:"punctuation"}}}}},comment:{pattern:/\[[^\[\]]+\]/,greedy:!0},title:{pattern:/^[ \t]*(?:volume|book|part(?! of)|chapter|section|table)\b.+/im,alias:"important"},number:{pattern:/(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve))\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\b(?:applying to|are|attacking|answering|asking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:s|ing)?|consulting|contain(?:s|ing)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:ve|s|ving)|hold(?:s|ing)?|impl(?:y|ies)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:s|ing)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:s|ing)?|setting|showing|singing|sleeping|smelling|squeezing|switching|support(?:s|ing)?|swearing|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:s|ing)?|var(?:y|ies|ying)|waiting|waking|waving|wear(?:s|ing)?)\b(?!-)/i,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|unless|the story)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: on| off)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,lookbehind:!0,alias:"symbol"},position:{pattern:/(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,lookbehind:!0,alias:"keyword"},type:{pattern:/(^|[^-])\b(?:actions?|activit(?:y|ies)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,lookbehind:!0,alias:"variable"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.languages.inform7,Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\S(?:\s*\S)*/,alias:"comment"}; +Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},header:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}; +Prism.languages.io={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"triple-quoted-string":{pattern:/"""(?:\\[\s\S]|(?!""")[^\\])*"""/,greedy:!0,alias:"string"},string:{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},keyword:/\b(?:activate|activeCoroCount|asString|block|break|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getSlot|getEnvironmentVariable|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|call|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,builtin:/\b(?:Array|AudioDevice|AudioMixer|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Regex|SGML|SGMLElement|SGMLParser|SQLite|Server|Sequence|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink|Random|BigNum)\b/,boolean:/\b(?:true|false|nil)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,operator:/[=!*/%+\-^&|]=|>>?=?|<+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,alias:"keyword"},number:/\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:[ejpx]|ad|ar)_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,adverb:{pattern:/[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,alias:"builtin"},operator:/[=a][.:]|_\./,conjunction:{pattern:/&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,alias:"variable"},punctuation:/[()]/}; +!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(a){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); +!function(p){var a=p.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(a,e){"string"==typeof a&&(a=[a]),a.forEach(function(a){!function(a,e){var n="doc-comment",t=p.languages[a];if(t){var r=t[n];if(!r){var o={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};r=(t=p.languages.insertBefore(a,"comment",o))[n]}if(r instanceof RegExp&&(r=t[n]={pattern:r}),Array.isArray(r))for(var i=0,s=r.length;i/g,function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|throws|see|link|linkplain|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); +Prism.languages.javastacktrace={summary:{pattern:/^[\t ]*(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,inside:{keyword:{pattern:/^(\s*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+(?=$|:)/,namespace:/[a-z]\w*/,punctuation:/[.:]/}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/:/}},"stack-frame":{pattern:/^[\t ]*at (?:[\w$./]|@[\w$.+-]*\/)+(?:)?\([^()]*\)/m,inside:{keyword:{pattern:/^(\s*)at(?= )/,lookbehind:!0},source:[{pattern:/(\()\w+\.\w+:\d+(?=\))/,lookbehind:!0,inside:{file:/^\w+\.\w+/,punctuation:/:/,"line-number":{pattern:/\d+/,alias:"number"}}},{pattern:/(\()[^()]*(?=\))/,lookbehind:!0,inside:{keyword:/^(?:Unknown Source|Native Method)$/}}],"class-name":/[\w$]+(?=\.(?:|[\w$]+)\()/,function:/(?:|[\w$]+)(?=\()/,"class-loader":{pattern:/(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,lookbehind:!0,alias:"namespace",inside:{punctuation:/\./}},module:{pattern:/([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,lookbehind:!0,inside:{version:{pattern:/(@)[\s\S]+/,lookbehind:!0,alias:"number"},punctuation:/[@.]/}},namespace:{pattern:/(?:[a-z]\w*\.)+/,inside:{punctuation:/\./}},punctuation:/[()/.]/}},more:{pattern:/^[\t ]*\.{3} \d+ [a-z]+(?: [a-z]+)*/m,inside:{punctuation:/\.{3}/,number:/\d+/,keyword:/\b[a-z]+(?: [a-z]+)*\b/}}}; +Prism.languages.jexl={string:/(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,transform:{pattern:/(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,alias:"function",lookbehind:!0},function:/[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+\b/,operator:/[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,boolean:/\b(?:true|false)\b/,keyword:/\bin\b/,punctuation:/[{}[\](),.]/}; +Prism.languages.jolie=Prism.languages.extend("clike",{string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/\b(?:include|define|is_defined|undef|main|init|outputPort|inputPort|Location|Protocol|Interfaces|RequestResponse|OneWay|type|interface|extender|throws|cset|csets|forward|Aggregates|Redirects|embedded|courier|execution|sequential|concurrent|single|scope|install|throw|comp|cH|default|global|linkIn|linkOut|synchronized|this|new|for|if|else|while|in|Jolie|Java|Javascript|nullProcess|spawn|constants|with|provide|until|exit|foreach|instanceof|over|service)\b/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,operator:/-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[:?\/%^]/,punctuation:/[,.]/,builtin:/\b(?:undefined|string|int|void|long|Byte|bool|double|float|char|any)\b/,symbol:/[|;@]/}),delete Prism.languages.jolie["class-name"],Prism.languages.insertBefore("jolie","keyword",{function:{pattern:/((?:\b(?:outputPort|inputPort|in|service|courier)\b|@)\s*)\w+/,lookbehind:!0},aggregates:{pattern:/(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,lookbehind:!0,inside:{"with-extension":{pattern:/\bwith\s+\w+/,inside:{keyword:/\bwith\b/}},function:{pattern:/\w+/},punctuation:{pattern:/,/}}},redirects:{pattern:/(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,lookbehind:!0,inside:{punctuation:{pattern:/,/},function:{pattern:/\w+/},symbol:{pattern:/=>/}}}}); +!function(e){var n="\\\\\\((?:[^()]|\\([^()]*\\))*\\)",t=RegExp('"(?:[^"\r\n\\\\]|\\\\[^\r\n(]|__)*"'.replace(/__/g,function(){return n})),i={interpolation:{pattern:RegExp("((?:^|[^\\\\])(?:\\\\{2})*)"+n),lookbehind:!0,inside:{content:{pattern:/^(\\\()[\s\S]+(?=\)$)/,lookbehind:!0,inside:null},punctuation:/^\\\(|\)$/}}},a=e.languages.jq={comment:/#.*/,property:{pattern:RegExp(t.source+"(?=\\s*:(?!:))"),greedy:!0,inside:i},string:{pattern:t,greedy:!0,inside:i},function:{pattern:/(\bdef\s+)[a-z_]\w+/i,lookbehind:!0},variable:/\B\$\w+/,"property-literal":{pattern:/\b[a-z_]\w*(?=\s*:(?!:))/i,alias:"property"},keyword:/\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,boolean:/\b(?:true|false)\b/,number:/(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,operator:[{pattern:/\|=?/,alias:"pipe"},/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|or|not)\b/],"c-style-function":{pattern:/\b[a-z_]\w*(?=\s*\()/i,alias:"function"},punctuation:/::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,dot:{pattern:/\./,alias:"important"}};i.interpolation.inside.content.inside=a}(Prism); +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|as|declare|implements|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter;var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); +!function(e){var a=e.languages.javascript,n="\\{(?:[^{}]|\\{(?:[^{}]|\\{[^{}]*\\})*\\})+\\}",t="(@(?:param|arg|argument|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(t+"(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?=\\s|$)"),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(t+"\\[(?:(?!\\s)[$\\w\\xA0-\\uFFFF.])+(?:=[^[\\]]+)?\\](?=\\s|$)"),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:a,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@(?:augments|extends|class|interface|memberof!?|template|this|typedef)\\s+(?:\\s+)?)[A-Z]\\w*(?:\\.[A-Z]\\w*)*".replace(//g,function(){return n})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:a.string,number:a.number,boolean:a.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:a,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(Prism); +!function(a){function e(a,e){return RegExp(a.replace(//g,function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"}),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|for|finally|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r|.*(?:node_modules|\(\)|\(|$|\(internal\/|\(node\.js)).*/m,alias:"comment"},filename:{pattern:/(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,lookbehind:!0,alias:"url"},function:{pattern:/(at\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,lookbehind:!0,inside:{punctuation:/\./}},punctuation:/[()]/,keyword:/\b(?:at|new)\b/,alias:{pattern:/\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,alias:"variable"},"line-number":{pattern:/:[0-9]+(?::[0-9]+)?\b/,alias:"number",inside:{punctuation:/:/}}}}}; +!function(u){var e=u.languages.javascript["template-string"],n=e.pattern.source,a=e.inside.interpolation,i=a.inside["interpolation-punctuation"],r=a.pattern.source;function t(e,t){if(u.languages[e])return{pattern:RegExp("((?:"+t+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:e}}}}function s(e,t,n){var r={code:e,grammar:t,language:n};return u.hooks.run("before-tokenize",r),r.tokens=u.tokenize(r.code,r.grammar),u.hooks.run("after-tokenize",r),r.tokens}function d(e){var t={};t["interpolation-punctuation"]=i;var n=u.tokenize(e,t);if(3===n.length){var r=[1,1];r.push.apply(r,s(n[1],u.languages.javascript,"javascript")),n.splice.apply(n,r)}return new u.Token("interpolation",n,a.alias,e)}function c(a,e,i){var t=u.tokenize(a,{interpolation:{pattern:RegExp(r),lookbehind:!0}}),f=0,y={},n=s(t.map(function(e){if("string"==typeof e)return e;for(var t,n=e.content;-1!==a.indexOf((r=f++,t="___"+i.toUpperCase()+"_"+r+"___")););return y[t]=n,t;var r}).join(""),e,i),v=Object.keys(y);return f=0,function e(t){for(var n=0;n=v.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=v[f],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++f;var o=i.substring(0,s),p=d(y[a]),l=i.substring(s+a.length),g=[];if(o&&g.push(o),g.push(p),l){var u=[l];e(u),g.push.apply(g,u)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var c=r.content;Array.isArray(c)?e(c):e([c])}}}(n),new u.Token(i,n,"language-"+i,a)}u.languages.javascript["template-string"]=[t("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),t("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),t("svg","\\bsvg"),t("markdown","\\b(?:md|markdown)"),t("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),t("sql","\\bsql"),e].filter(Boolean);var o={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}u.hooks.add("after-tokenize",function(e){e.language in o&&!function e(t){for(var n=0,r=t.length;n]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,punctuation:/::?|[{}[\]();,.?]/,constant:/\b(?:(?:NaN|Inf)(?:16|32|64)?|im|pi)\b|[πℯ]/}; +Prism.languages.keyman={comment:/\bc\s.*/i,function:/\[\s*(?:(?:CTRL|SHIFT|ALT|LCTRL|RCTRL|LALT|RALT|CAPS|NCAPS)\s+)*(?:[TKU]_[\w?]+|".+?"|'.+?')\s*\]/i,string:/("|').*?\1/,bold:[/&(?:baselayout|bitmap|capsononly|capsalwaysoff|shiftfreescaps|copyright|ethnologuecode|hotkey|includecodes|keyboardversion|kmw_embedcss|kmw_embedjs|kmw_helpfile|kmw_helptext|kmw_rtl|language|layer|layoutfile|message|mnemoniclayout|name|oldcharposmatching|platform|targets|version|visualkeyboard|windowslanguages)\b/i,/\b(?:bitmap|bitmaps|caps on only|caps always off|shift frees caps|copyright|hotkey|language|layout|message|name|version)\b/i],keyword:/\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|return|reset|save|set|store|use)\b/i,atrule:/\b(?:ansi|begin|unicode|group|using keys|match|nomatch)\b/i,number:/\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,operator:/[+>\\,()]/,tag:/\$(?:keyman|kmfl|weaver|keymanweb|keymanonly):/i}; +!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"],e.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}});var n=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:e.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];e.languages.kotlin.string.inside=e.languages.kotlin["raw-string"].inside={interpolation:n},e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism); +!function(n){function o(n,o){return RegExp(n.replace(//g,"\\s\\x00-\\x1f\\x22-\\x2f\\x3a-\\x3f\\x5b-\\x5e\\x60\\x7b-\\x7e"),o)}n.languages.kumir={comment:{pattern:/\|.*/},prolog:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^\n\r"]*"|'[^\n\r']*'/,greedy:!0},boolean:{pattern:o("(^|[])(?:да|нет)(?=[]|$)"),lookbehind:!0},"operator-word":{pattern:o("(^|[])(?:и|или|не)(?=[]|$)"),lookbehind:!0,alias:"keyword"},"system-variable":{pattern:o("(^|[])знач(?=[]|$)"),lookbehind:!0,alias:"keyword"},type:[{pattern:o("(^|[])(?:вещ|лит|лог|сим|цел)(?:\\x20*таб)?(?=[]|$)"),lookbehind:!0,alias:"builtin"},{pattern:o("(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)"),lookbehind:!0,alias:"important"}],keyword:{pattern:o("(^|[])(?:алг|арг(?:\\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\\x20+|_)исп)?|кц(?:(?:\\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)"),lookbehind:!0},name:{pattern:o("(^|[])[^\\d][^]*(?:\\x20+[^]+)*(?=[]|$)"),lookbehind:!0},number:{pattern:o("(^|[])(?:\\B\\$[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?)(?=[]|$)","i"),lookbehind:!0},punctuation:/:=|[(),:;\[\]]/,"operator-char":{pattern:/\*\*?|<[=>]?|>=?|[-+/=]/,alias:"operator"}},n.languages.kum=n.languages.kumir}(Prism); +!function(a){var e=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/},a.languages.tex=a.languages.latex,a.languages.context=a.languages.latex}(Prism); +!function(t){t.languages.latte={comment:/^\{\*[\s\S]*/,ld:{pattern:/^\{(?:[=_]|\/?(?!\d|\w+\()\w+)?/,inside:{punctuation:/^\{\/?/,tag:{pattern:/.+/,alias:"important"}}},rd:{pattern:/\}$/,inside:{punctuation:/.+/}},php:{pattern:/\S(?:[\s\S]*\S)?/,alias:"language-php",inside:t.languages.php}};var e=t.languages.extend("markup",{});t.languages.insertBefore("inside","attr-value",{"n-attr":{pattern:/n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,inside:{"attr-name":{pattern:/^[^\s=]+/,alias:"important"},"attr-value":{pattern:/=[\s\S]+/,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}],php:{pattern:/\S(?:[\s\S]*\S)?/,inside:t.languages.php}}}}}},e.tag),t.hooks.add("before-tokenize",function(a){if("latte"===a.language){t.languages["markup-templating"].buildPlaceholders(a,"latte",/\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*?\}/g),a.grammar=e}}),t.hooks.add("after-tokenize",function(a){t.languages["markup-templating"].tokenizePlaceholders(a,"latte")})}(Prism); +Prism.languages.less=Prism.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),Prism.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}); +Prism.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()\[\]#'\s]+/,greedy:!0},character:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0,alias:"string"},"lambda-parameter":[{pattern:/((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|export|except|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(r){for(var e in r)r[e]=r[e].replace(/<[\w\s]+>/g,function(e){return"(?:"+r[e].trim()+")"});return r[e]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()\[\]']/}; +!function(e){for(var n='\\((?:[^();"#\\\\]|\\\\[^]|;.*(?!.)|"(?:[^"\\\\]|\\\\.)*"|#(?:\\{(?:(?!#\\})[^])*#\\}|[^{])|)*\\)',i=0;i<5;i++)n=n.replace(//g,function(){return n});n=n.replace(//g,"[^\\s\\S]");var d=e.languages.lilypond={comment:/%(?:(?!\{).*|\{[\s\S]*?%\})/,"embedded-scheme":{pattern:RegExp('(^|[=\\s])#(?:"(?:[^"\\\\]|\\\\.)*"|[^\\s()"]*(?:[^\\s()]|))'.replace(//g,function(){return n}),"m"),lookbehind:!0,greedy:!0,inside:{scheme:{pattern:/^(#)[\s\S]+$/,lookbehind:!0,alias:"language-scheme",inside:{"embedded-lilypond":{pattern:/#\{[\s\S]*?#\}/,greedy:!0,inside:{punctuation:/^#\{|#\}$/,lilypond:{pattern:/[\s\S]+/,alias:"language-lilypond",inside:null}}},rest:e.languages.scheme}},punctuation:/#/}},string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":{pattern:/(\\new\s+)[\w-]+/,lookbehind:!0},keyword:{pattern:/\\[a-z][-\w]*/i,inside:{punctuation:/^\\/}},operator:/[=|]|<<|>>/,punctuation:{pattern:/(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,lookbehind:!0},number:/\b\d+(?:\/\d+)?\b/};d["embedded-scheme"].inside.scheme.inside["embedded-lilypond"].inside.lilypond.inside=d,e.languages.ly=d}(Prism); +Prism.languages.liquid={comment:{pattern:/(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,lookbehind:!0},delimiter:{pattern:/^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,alias:"punctuation"},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},keyword:/\b(?:as|assign|break|continue|cycle|decrement|echo|else|elsif|(?:end)?(?:capture|case|comment|for|form|if|paginate|style|raw|tablerow|unless)|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,object:/\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|comment|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|form|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|paginate|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|section|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tablerow|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,function:[{pattern:/(\|\s*)\w+/,lookbehind:!0,alias:"filter"},{pattern:/(\.\s*)(?:first|last|size)/,lookbehind:!0}],boolean:/\b(?:true|false|nil)\b/,range:{pattern:/\.\./,alias:"operator"},number:/\b\d+(?:\.\d+)?\b/,operator:/[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|or|contains(?=\s))\b/,punctuation:/[.,\[\]()]/,empty:{pattern:/\bempty\b/,alias:"keyword"}},Prism.hooks.add("before-tokenize",function(e){var a=!1;Prism.languages["markup-templating"].buildPlaceholders(e,"liquid",/\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g,function(e){var t=/^\{%-?\s*(\w+)/.exec(e);if(t){var n=t[1];if("raw"===n&&!a)return a=!0;if("endraw"===n)return!(a=!1)}return!a})}),Prism.hooks.add("after-tokenize",function(e){Prism.languages["markup-templating"].tokenizePlaceholders(e,"liquid")}); +!function(e){function n(e){return RegExp("(\\()"+e+"(?=[\\s\\)])")}function a(e){return RegExp("([\\s([])"+e+"(?=[\\s)])")}var t="[-+*/_~!@$%^=<>{}\\w]+",r="(\\()",s="(?=\\))",i="(?=\\s)",o={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+t+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+t),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+t),alias:"property"},splice:{pattern:RegExp(",@?"+t),alias:["symbol","variable"]},keyword:[{pattern:RegExp(r+"(?:(?:lexical-)?let\\*?|(?:cl-)?letf|if|when|while|unless|cons|cl-loop|and|or|not|cond|setq|error|message|null|require|provide|use-package)"+i),lookbehind:!0},{pattern:RegExp(r+"(?:for|do|collect|return|finally|append|concat|in|by)"+i),lookbehind:!0}],declare:{pattern:n("declare"),lookbehind:!0,alias:"keyword"},interactive:{pattern:n("interactive"),lookbehind:!0,alias:"keyword"},boolean:{pattern:a("(?:t|nil)"),lookbehind:!0},number:{pattern:a("[-+]?\\d+(?:\\.\\d*)?"),lookbehind:!0},defvar:{pattern:RegExp(r+"def(?:var|const|custom|group)\\s+"+t),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(t)}},defun:{pattern:RegExp(r+"(?:cl-)?(?:defun\\*?|defmacro)\\s+"+t+"\\s+\\([\\s\\S]*?\\)"),lookbehind:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+t),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(r+"lambda\\s+\\(\\s*(?:&?"+t+"(?:\\s+&?"+t+")*\\s*)?\\)"),lookbehind:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(r+t),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},l={"lisp-marker":RegExp("&[-+*/_~!@$%^=<>{}\\w]+"),rest:{argument:{pattern:RegExp(t),alias:"variable"},varform:{pattern:RegExp(r+t+"\\s+\\S[\\s\\S]*"+s),lookbehind:!0,inside:{string:o.string,boolean:o.boolean,number:o.number,symbol:o.symbol,punctuation:/[()]/}}}},p="\\S+(?:\\s+\\S+)*",d={pattern:RegExp(r+"[\\s\\S]*"+s),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:rest|body)\\s+"+p),inside:l},"other-marker-vars":{pattern:RegExp("&(?:optional|aux)\\s+"+p),inside:l},keys:{pattern:RegExp("&key\\s+"+p+"(?:\\s+&allow-other-keys)?"),inside:l},argument:{pattern:RegExp(t),alias:"variable"},punctuation:/[()]/}};o.lambda.inside.arguments=d,o.defun.inside.arguments=e.util.clone(d),o.defun.inside.arguments.inside.sublist=d,e.languages.lisp=o,e.languages.elisp=o,e.languages.emacs=o,e.languages["emacs-lisp"]=o}(Prism); +Prism.languages.livescript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\])#.*/,lookbehind:!0}],"interpolated-string":{pattern:/(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,lookbehind:!0},interpolation:{pattern:/(^|[^\\])#\{[^}]+\}/m,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^#\{|\}$/,alias:"variable"}}},string:/[\s\S]+/}},string:[{pattern:/('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/<\[[\s\S]*?\]>/,greedy:!0},/\\[^\s,;\])}]+/],regex:[{pattern:/\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,greedy:!0,inside:{comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0}}},{pattern:/\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,greedy:!0}],keyword:{pattern:/(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,lookbehind:!0},"keyword-operator":{pattern:/(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?:nt| not)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,lookbehind:!0,alias:"operator"},boolean:{pattern:/(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,lookbehind:!0},argument:{pattern:/(^|(?!\.&\.)[^&])&(?!&)\d*/m,lookbehind:!0,alias:"variable"},number:/\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,identifier:/[a-z_](?:-?[a-z]|[\d_])*/i,operator:[{pattern:/( )\.(?= )/,lookbehind:!0},/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/],punctuation:/[(){}\[\]|.,:;`]/},Prism.languages.livescript["interpolated-string"].inside.interpolation.inside.rest=Prism.languages.livescript; +Prism.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:true|false)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/}; +Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:https?|ftp|file):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/i,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)(?:\\s{1,2}(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))?|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:true|false|null)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}; +Prism.languages.lolcode={comment:[/\bOBTW\s[\s\S]*?\sTLDR\b/,/\bBTW.+/],string:{pattern:/"(?::.|[^":])*"/,inside:{variable:/:\{[^}]+\}/,symbol:[/:\([a-f\d]+\)/i,/:\[[^\]]+\]/,/:[)>o":]/]},greedy:!0},number:/(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,symbol:{pattern:/(^|\s)(?:A )?(?:YARN|NUMBR|NUMBAR|TROOF|BUKKIT|NOOB)(?=\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\s)/}},label:{pattern:/((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,lookbehind:!0,alias:"string"},function:{pattern:/((?:^|\s)(?:I IZ|HOW IZ I|IZ) )[a-zA-Z]\w*/,lookbehind:!0},keyword:[{pattern:/(^|\s)(?:O HAI IM|KTHX|HAI|KTHXBYE|I HAS A|ITZ(?: A)?|R|AN|MKAY|SMOOSH|MAEK|IS NOW(?: A)?|VISIBLE|GIMMEH|O RLY\?|YA RLY|NO WAI|OIC|MEBBE|WTF\?|OMG|OMGWTF|GTFO|IM IN YR|IM OUTTA YR|FOUND YR|YR|TIL|WILE|UPPIN|NERFIN|I IZ|HOW IZ I|IF U SAY SO|SRS|HAS A|LIEK(?: A)?|IZ)(?=\s|,|$)/,lookbehind:!0},/'Z(?=\s|,|$)/],boolean:{pattern:/(^|\s)(?:WIN|FAIL)(?=\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\s)IT(?=\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:SUM|DIFF|PRODUKT|QUOSHUNT|MOD|BIGGR|SMALLR|BOTH|EITHER|WON|ALL|ANY) OF)(?=\s|,|$)/,lookbehind:!0},punctuation:/\.{3}|…|,|!/}; +Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; +!function(s){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";s.languages.markdown=s.languages.extend("markup",{}),s.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:s.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:s.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:s.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike","code-snippet"].forEach(function(n){e!==n&&(s.languages.markdown[e].inside.content.inside[n]=s.languages.markdown[n])})}),s.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},u=String.fromCodePoint||String.fromCharCode;s.languages.md=s.languages.markdown}(Prism); +Prism.languages.matlab={comment:[/%\{[\s\S]*?\}%/,/%.+/],string:{pattern:/\B'(?:''|[^'\r\n])*'/,greedy:!0},number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,keyword:/\b(?:break|case|catch|continue|else|elseif|end|for|function|if|inf|NaN|otherwise|parfor|pause|pi|return|switch|try|while)\b/,function:/\b(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}; +Prism.languages.mel={comment:/\/\/.*/,code:{pattern:/`(?:\\.|[^\\`\r\n])*`/,greedy:!0,alias:"italic",inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},variable:/\$\w+/,number:/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,flag:{pattern:/-[^\d\W]\w*/,alias:"operator"},keyword:/\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,function:/\b\w+(?=\()|\b(?:about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|CBG|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|Mayatomr|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\b/,operator:[/\+[+=]?|-[-=]?|&&|\|\||[<>]=|[*\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\[\](){}]/},Prism.languages.mel.code.inside.rest=Prism.languages.mel; +Prism.languages.mizar={comment:/::.+/,keyword:/@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|equals|end|environ|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:y|ies)|when|where|with|wrt)\b/,parameter:{pattern:/\$(?:10|\d)/,alias:"variable"},variable:/\b\w+(?=:)/,number:/(?:\b|-)\d+\b/,operator:/\.\.\.|->|&|\.?=/,punctuation:/\(#|#\)|[,:;\[\](){}]/}; +!function($){var e=["$eq","$gt","$gte","$in","$lt","$lte","$ne","$nin","$and","$not","$nor","$or","$exists","$type","$expr","$jsonSchema","$mod","$regex","$text","$where","$geoIntersects","$geoWithin","$near","$nearSphere","$all","$elemMatch","$size","$bitsAllClear","$bitsAllSet","$bitsAnyClear","$bitsAnySet","$comment","$elemMatch","$meta","$slice","$currentDate","$inc","$min","$max","$mul","$rename","$set","$setOnInsert","$unset","$addToSet","$pop","$pull","$push","$pullAll","$each","$position","$slice","$sort","$bit","$addFields","$bucket","$bucketAuto","$collStats","$count","$currentOp","$facet","$geoNear","$graphLookup","$group","$indexStats","$limit","$listLocalSessions","$listSessions","$lookup","$match","$merge","$out","$planCacheStats","$project","$redact","$replaceRoot","$replaceWith","$sample","$set","$skip","$sort","$sortByCount","$unionWith","$unset","$unwind","$abs","$accumulator","$acos","$acosh","$add","$addToSet","$allElementsTrue","$and","$anyElementTrue","$arrayElemAt","$arrayToObject","$asin","$asinh","$atan","$atan2","$atanh","$avg","$binarySize","$bsonSize","$ceil","$cmp","$concat","$concatArrays","$cond","$convert","$cos","$dateFromParts","$dateToParts","$dateFromString","$dateToString","$dayOfMonth","$dayOfWeek","$dayOfYear","$degreesToRadians","$divide","$eq","$exp","$filter","$first","$floor","$function","$gt","$gte","$hour","$ifNull","$in","$indexOfArray","$indexOfBytes","$indexOfCP","$isArray","$isNumber","$isoDayOfWeek","$isoWeek","$isoWeekYear","$last","$last","$let","$literal","$ln","$log","$log10","$lt","$lte","$ltrim","$map","$max","$mergeObjects","$meta","$min","$millisecond","$minute","$mod","$month","$multiply","$ne","$not","$objectToArray","$or","$pow","$push","$radiansToDegrees","$range","$reduce","$regexFind","$regexFindAll","$regexMatch","$replaceOne","$replaceAll","$reverseArray","$round","$rtrim","$second","$setDifference","$setEquals","$setIntersection","$setIsSubset","$setUnion","$size","$sin","$slice","$split","$sqrt","$stdDevPop","$stdDevSamp","$strcasecmp","$strLenBytes","$strLenCP","$substr","$substrBytes","$substrCP","$subtract","$sum","$switch","$tan","$toBool","$toDate","$toDecimal","$toDouble","$toInt","$toLong","$toObjectId","$toString","$toLower","$toUpper","$trim","$trunc","$type","$week","$year","$zip","$comment","$explain","$hint","$max","$maxTimeMS","$min","$orderby","$query","$returnKey","$showDiskLoc","$natural"],t="(?:"+(e=e.map(function($){return $.replace("$","\\$")})).join("|")+")\\b";$.languages.mongodb=$.languages.extend("javascript",{}),$.languages.insertBefore("mongodb","string",{property:{pattern:/(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,greedy:!0,inside:{keyword:RegExp("^(['\"])?"+t+"(?:\\1)?$")}}}),$.languages.mongodb.string.inside={url:{pattern:/https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,greedy:!0},entity:{pattern:/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/,greedy:!0}},$.languages.insertBefore("mongodb","constant",{builtin:{pattern:RegExp("\\b(?:"+["ObjectId","Code","BinData","DBRef","Timestamp","NumberLong","NumberDecimal","MaxKey","MinKey","RegExp","ISODate","UUID"].join("|")+")\\b"),alias:"keyword"}})}(Prism); +Prism.languages.monkey={string:/"[^"\r\n]*"/,comment:[{pattern:/^#Rem\s[\s\S]*?^#End/im,greedy:!0},{pattern:/'.+/,greedy:!0}],preprocessor:{pattern:/(^[ \t]*)#.+/m,lookbehind:!0,alias:"comment"},function:/\b\w+(?=\()/,"type-char":{pattern:/(\w)[?%#$]/,lookbehind:!0,alias:"variable"},number:{pattern:/((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,lookbehind:!0},keyword:/\b(?:Void|Strict|Public|Private|Property|Bool|Int|Float|String|Array|Object|Continue|Exit|Import|Extern|New|Self|Super|Try|Catch|Eachin|True|False|Extends|Abstract|Final|Select|Case|Default|Const|Local|Global|Field|Method|Function|Class|End|If|Then|Else|ElseIf|EndIf|While|Wend|Repeat|Until|Forever|For|To|Step|Next|Return|Module|Interface|Implements|Inline|Throw|Null)\b/i,operator:/\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,punctuation:/[.,:;()\[\]]/}; +Prism.languages.moonscript={comment:/--.*/,string:[{pattern:/'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,greedy:!0},{pattern:/"[^"]*"/,greedy:!0,inside:{interpolation:{pattern:/#\{[^{}]*\}/,inside:{moonscript:{pattern:/(^#\{)[\s\S]+(?=\})/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/#\{|\}/,alias:"punctuation"}}}}}],"class-name":[{pattern:/(\b(?:class|extends)[ \t]+)\w+/,lookbehind:!0},/\b[A-Z]\w*/],keyword:/\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,variable:/@@?\w*/,property:{pattern:/\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,lookbehind:!0},function:{pattern:/\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:running|create|resume|status|wrap|yield)|debug\.(?:debug|gethook|getinfo|getlocal|getupvalue|setlocal|setupvalue|sethook|traceback|getfenv|getmetatable|getregistry|setfenv|setmetatable)|dofile|error|getfenv|getmetatable|io\.(?:stdin|stdout|stderr|close|flush|input|lines|open|output|popen|read|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|sin|cos|tan|deg|exp|floor|log|log10|max|min|fmod|modf|cosh|sinh|tanh|pow|rad|sqrt|frexp|ldexp|random|randomseed|pi)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|len|lower|rep|sub|upper|format|gsub|gmatch|match|reverse)|table\.(?:maxn|concat|sort|insert|remove)|tonumber|tostring|type|unpack|xpcall)\b/,inside:{punctuation:/\./}},boolean:/\b(?:false|true)\b/,number:/(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,operator:/\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,punctuation:/[.,()[\]{}\\]/},Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside=Prism.languages.moonscript,Prism.languages.moon=Prism.languages.moonscript; +Prism.languages.n1ql={comment:/\/\*[\s\S]*?(?:$|\*\/)/,parameter:/\$[\w.]+/,string:{pattern:/(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,greedy:!0},identifier:{pattern:/`(?:\\[\s\S]|[^\\`]|``)*`/,greedy:!0},function:/\b(?:ABS|ACOS|ARRAY_AGG|ARRAY_APPEND|ARRAY_AVG|ARRAY_CONCAT|ARRAY_CONTAINS|ARRAY_COUNT|ARRAY_DISTINCT|ARRAY_FLATTEN|ARRAY_IFNULL|ARRAY_INSERT|ARRAY_INTERSECT|ARRAY_LENGTH|ARRAY_MAX|ARRAY_MIN|ARRAY_POSITION|ARRAY_PREPEND|ARRAY_PUT|ARRAY_RANGE|ARRAY_REMOVE|ARRAY_REPEAT|ARRAY_REPLACE|ARRAY_REVERSE|ARRAY_SORT|ARRAY_STAR|ARRAY_SUM|ARRAY_SYMDIFF|ARRAY_SYMDIFFN|ARRAY_UNION|ASIN|ATAN|ATAN2|AVG|BASE64|BASE64_DECODE|BASE64_ENCODE|BITAND|BITCLEAR|BITNOT|BITOR|BITSET|BITSHIFT|BITTEST|BITXOR|CEIL|CLOCK_LOCAL|CLOCK_MILLIS|CLOCK_STR|CLOCK_TZ|CLOCK_UTC|CONTAINS|CONTAINS_TOKEN|CONTAINS_TOKEN_LIKE|CONTAINS_TOKEN_REGEXP|COS|COUNT|CURL|DATE_ADD_MILLIS|DATE_ADD_STR|DATE_DIFF_MILLIS|DATE_DIFF_STR|DATE_FORMAT_STR|DATE_PART_MILLIS|DATE_PART_STR|DATE_RANGE_MILLIS|DATE_RANGE_STR|DATE_TRUNC_MILLIS|DATE_TRUNC_STR|DECODE_JSON|DEGREES|DURATION_TO_STR|E|ENCODED_SIZE|ENCODE_JSON|EXP|FLOOR|GREATEST|HAS_TOKEN|IFINF|IFMISSING|IFMISSINGORNULL|IFNAN|IFNANORINF|IFNULL|INITCAP|ISARRAY|ISATOM|ISBOOLEAN|ISNUMBER|ISOBJECT|ISSTRING|IsBitSET|LEAST|LENGTH|LN|LOG|LOWER|LTRIM|MAX|META|MILLIS|MILLIS_TO_LOCAL|MILLIS_TO_STR|MILLIS_TO_TZ|MILLIS_TO_UTC|MILLIS_TO_ZONE_NAME|MIN|MISSINGIF|NANIF|NEGINFIF|NOW_LOCAL|NOW_MILLIS|NOW_STR|NOW_TZ|NOW_UTC|NULLIF|OBJECT_ADD|OBJECT_CONCAT|OBJECT_INNER_PAIRS|OBJECT_INNER_VALUES|OBJECT_LENGTH|OBJECT_NAMES|OBJECT_PAIRS|OBJECT_PUT|OBJECT_REMOVE|OBJECT_RENAME|OBJECT_REPLACE|OBJECT_UNWRAP|OBJECT_VALUES|PAIRS|PI|POLY_LENGTH|POSINFIF|POSITION|POWER|RADIANS|RANDOM|REGEXP_CONTAINS|REGEXP_LIKE|REGEXP_POSITION|REGEXP_REPLACE|REPEAT|REPLACE|REVERSE|ROUND|RTRIM|SIGN|SIN|SPLIT|SQRT|STR_TO_DURATION|STR_TO_MILLIS|STR_TO_TZ|STR_TO_UTC|STR_TO_ZONE_NAME|SUBSTR|SUFFIXES|SUM|TAN|TITLE|TOARRAY|TOATOM|TOBOOLEAN|TOKENS|TONUMBER|TOOBJECT|TOSTRING|TRIM|TRUNC|TYPE|UPPER|WEEKDAY_MILLIS|WEEKDAY_STR)(?=\s*\()/i,keyword:/\b(?:ALL|ALTER|ANALYZE|AS|ASC|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|CONNECT|CONTINUE|CORRELATE|COVER|CREATE|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FLATTEN|FOR|FORCE|FROM|FUNCTION|GRANT|GROUP|GSI|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LAST|LEFT|LET|LETTING|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NULL|NUMBER|OBJECT|OFFSET|ON|OPTION|ORDER|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROCEDURE|PUBLIC|RAW|REALM|REDUCE|RENAME|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|SATISFIES|SCHEMA|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TO|TRANSACTION|TRIGGER|TRUNCATE|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WITH|WORK|XOR)\b/i,boolean:/\b(?:TRUE|FALSE)\b/i,number:/(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,punctuation:/[;[\](),.{}:]/}; +Prism.languages.n4js=Prism.languages.extend("javascript",{keyword:/\b(?:any|Array|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),Prism.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),Prism.languages.n4jsd=Prism.languages.n4js; +Prism.languages["nand2tetris-hdl"]={comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,keyword:/\b(?:CHIP|IN|OUT|PARTS|BUILTIN|CLOCKED)\b/,boolean:/\b(?:true|false)\b/,function:/\b[A-Za-z][A-Za-z0-9]*(?=\()/,number:/\b\d+\b/,operator:/=|\.\./,punctuation:/[{}[\];(),:]/}; +!function(e){var a=/\{[^\r\n\[\]{}]*\}/,n={"quoted-string":{pattern:/"(?:[^"\\]|\\.)*"/,alias:"operator"},"command-param-id":{pattern:/(\s)\w+:/,lookbehind:!0,alias:"property"},"command-param-value":[{pattern:a,alias:"selector"},{pattern:/([\t ])\S+/,lookbehind:!0,greedy:!0,alias:"operator"},{pattern:/\S(?:.*\S)?/,alias:"operator"}]};function t(e){return"string"==typeof e?e:Array.isArray(e)?e.map(t).join(""):t(e.content)}e.languages.naniscript={comment:{pattern:/^([\t ]*);.*/m,lookbehind:!0},define:{pattern:/^>.+/m,alias:"tag",inside:{value:{pattern:/(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,lookbehind:!0,alias:"operator"},key:{pattern:/(^>)\w+/,lookbehind:!0}}},label:{pattern:/^([\t ]*)#[\t ]*\w+[\t ]*$/m,lookbehind:!0,alias:"regex"},command:{pattern:/^([\t ]*)@\w+(?=[\t ]|$).*/m,lookbehind:!0,alias:"function",inside:{"command-name":/^@\w+/,expression:{pattern:a,greedy:!0,alias:"selector"},"command-params":{pattern:/\s*\S[\s\S]*/,inside:n}}},"generic-text":{pattern:/(^[ \t]*)[^#@>;\s].*/m,lookbehind:!0,alias:"punctuation",inside:{"escaped-char":/\\[{}\[\]"]/,expression:{pattern:a,greedy:!0,alias:"selector"},"inline-command":{pattern:/\[[\t ]*\w[^\r\n\[\]]*\]/,greedy:!0,alias:"function",inside:{"command-params":{pattern:/(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,lookbehind:!0,inside:n},"command-param-name":{pattern:/^(\[[\t ]*)\w+/,lookbehind:!0,alias:"name"},"start-stop-char":/[\[\]]/}}}}},e.languages.nani=e.languages.naniscript,e.hooks.add("after-tokenize",function(e){e.tokens.forEach(function(e){if("string"!=typeof e&&"generic-text"===e.type){var a=t(e);(function(e){for(var a=[],n=0;n=&|$!]/}; +Prism.languages.neon={comment:{pattern:/#.*/,greedy:!0},datetime:{pattern:/(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,lookbehind:!0,alias:"number"},key:{pattern:/(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,lookbehind:!0,alias:"atrule"},number:{pattern:/(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,lookbehind:!0},boolean:{pattern:/(^|[[{(=:,\s])(?:true|false|yes|no)(?=$|[\]}),:=\s])/i,lookbehind:!0},null:{pattern:/(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,lookbehind:!0,alias:"keyword"},string:{pattern:/(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,lookbehind:!0,greedy:!0},literal:{pattern:/(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,lookbehind:!0,alias:"string"},punctuation:/[,:=[\]{}()-]/}; +Prism.languages.nevod={comment:/\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,string:{pattern:/(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,greedy:!0,inside:{"string-attrs":/!$|!\*$|\*$/}},namespace:{pattern:/(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,lookbehind:!0},pattern:{pattern:/(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,lookbehind:!0,inside:{"pattern-name":{pattern:/^#?[a-zA-Z0-9\-.]+/,alias:"class-name"},fields:{pattern:/\(.*\)/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},punctuation:/[,()]/,operator:{pattern:/~/,alias:"field-hidden-mark"}}}}},search:{pattern:/(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,alias:"function",lookbehind:!0},keyword:/@(?:require|namespace|pattern|search|inside|outside|having|where)\b/,"standard-pattern":{pattern:/\b(?:Word|Punct|Symbol|Space|LineBreak|Start|End|Alpha|AlphaNum|Num|NumAlpha|Blank|WordBreak|Any)(?:\([a-zA-Z0-9\-.,\s+]*\))?/,inside:{"standard-pattern-name":{pattern:/^[a-zA-Z0-9\-.]+/,alias:"builtin"},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},"standard-pattern-attr":{pattern:/[a-zA-Z0-9\-.]+/,alias:"builtin"},punctuation:/[,()]/}},quantifier:{pattern:/\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,alias:"number"},operator:[{pattern:/=/,alias:"pattern-def"},{pattern:/&/,alias:"conjunction"},{pattern:/~/,alias:"exception"},{pattern:/\?/,alias:"optionality"},{pattern:/[[\]]/,alias:"repetition"},{pattern:/[{}]/,alias:"variation"},{pattern:/[+_]/,alias:"sequence"},{pattern:/\.{2,3}/,alias:"span"}],"field-capture":[{pattern:/([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,lookbehind:!0,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}},{pattern:/[a-zA-Z0-9\-.]+\s*:/,inside:{"field-name":{pattern:/[a-zA-Z0-9\-.]+/,alias:"variable"},colon:/:/}}],punctuation:/[:;,()]/,name:/[a-zA-Z0-9\-.]+/}; +!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;Prism.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(); +Prism.languages.nim={comment:/#.*/,string:{pattern:/(?:(?:\b(?!\d)(?:\w|\\x[8-9a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")|'(?:\\(?:\d+|x[\da-fA-F]{2}|.)|[^'])')/,greedy:!0},number:/\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,keyword:/\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,function:{pattern:/(?:(?!\d)(?:\w|\\x[8-9a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,inside:{operator:/\*$/}},ignore:{pattern:/`[^`\r\n]+`/,inside:{punctuation:/`/}},operator:{pattern:/(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|of|or|in|is|isnot|mod|not|notin|shl|shr|xor)\b)/m,lookbehind:!0},punctuation:/[({\[]\.|\.[)}\]]|[`(){}\[\],:]/}; +Prism.languages.nix={comment:/\/\*[\s\S]*?\*\/|#.*/,string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:{antiquotation:{pattern:/^\$(?=\{)/,alias:"variable"}}}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"variable"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:url|Tarball)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:true|false)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside.rest=Prism.languages.nix; +Prism.languages.nsis={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,lookbehind:!0},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:{pattern:/(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|Banner|BG(?:Font|Gradient|Image)|BrandingText|BringToFront|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|WriteUTF16LE|Seek|Write|WriteByte|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DlgItem|DLLVersion(?:Local)?|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|Name|Nop|ns(?:Dialogs|Exec)|NSISdl|OutFile|Page(?:Callbacks)?|PE(?:DllCharacteristics|SubsysVer)|Pop|Push|Quit|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|Unicode|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UninstPage|UnRegDLL|UserInfo|Var|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle)\b/m,lookbehind:!0},property:/\b(?:admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user|ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)\b/,constant:/\$\{[\w\.:\^-]+\}|\$\([\w\.:\^-]+\)/i,variable:/\$\w+/i,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,punctuation:/[{}[\];(),.:]/,important:{pattern:/(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,lookbehind:!0}}; +Prism.languages.objectivec=Prism.languages.extend("c",{string:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,keyword:/\b(?:asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec; +Prism.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?[\d_]+)?)/i,directive:{pattern:/\B#\w+/,alias:"important"},label:{pattern:/\B~\w+/,alias:"function"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"variable"},module:{pattern:/\b[A-Z]\w+/,alias:"variable"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/[(){}\[\]|.,:;]|\b_\b/}; +!function(E){E.languages.opencl=E.languages.extend("c",{keyword:/\b(?:__attribute__|(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|auto|break|case|complex|const|continue|default|do|(?:float|double)(?:16(?:x(?:1|16|2|4|8))?|1x(?:1|16|2|4|8)|2(?:x(?:1|16|2|4|8))?|3|4(?:x(?:1|16|2|4|8))?|8(?:x(?:1|16|2|4|8))?)?|else|enum|extern|for|goto|(?:u?(?:char|short|int|long)|half|quad|bool)(?:2|3|4|8|16)?|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,boolean:/\b(?:false|true)\b/,"constant-opencl-kernel":{pattern:/\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:LOCAL|GLOBAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|MANT_DIG|(?:MIN|MAX)(?:(?:_10)?_EXP)?)|FLT_RADIX|HUGE_VALF?|INFINITY|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|(?:UCHAR|USHRT|UINT|ULONG)_MAX|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:10|2)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN)\b/,alias:"constant"}}),E.languages.insertBefore("opencl","class-name",{"builtin-type":{pattern:/\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,alias:"keyword"}});var _={"type-opencl-host":{pattern:/\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|short|int|long)|float|double)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,alias:"keyword"},"boolean-opencl-host":{pattern:/\bCL_(?:TRUE|FALSE)\b/,alias:"boolean"},"constant-opencl-host":{pattern:/\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:16|24|8|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,alias:"constant"},"function-opencl-host":{pattern:/\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|Kernel|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,alias:"function"}};E.languages.insertBefore("c","keyword",_),E.languages.cpp&&(_["type-opencl-host-cpp"]={pattern:/\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|Sampler|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|UserEvent)\b/,alias:"keyword"},E.languages.insertBefore("cpp","keyword",_))}(Prism); +Prism.languages.openqasm={comment:/\/\*[\s\S]*?\*\/|\/\/.*/,string:{pattern:/"[^"\r\n\t]*"|'[^'\r\n\t]*'/,greedy:!0},keyword:/\b(?:barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while|CX|OPENQASM|U)\b|#pragma\b/,"class-name":/\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,function:/\b(?:sin|cos|tan|exp|ln|sqrt|rotl|rotr|popcount)\b(?=\s*\()/,constant:/\b(?:pi|tau|euler)\b|π|𝜏|ℇ/,number:{pattern:/(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,lookbehind:!0},operator:/->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,punctuation:/[(){}\[\];,:.]/},Prism.languages.qasm=Prism.languages.openqasm; +Prism.languages.oz={comment:/\/\*[\s\S]*?\*\/|%.*/,string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/\b[A-Z][A-Za-z\d]*|`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=:)/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/}; +Prism.languages.parigp={comment:/\/\*[\s\S]*?\*\/|\\\\.*/,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"/,greedy:!0},keyword:function(){var r=["breakpoint","break","dbg_down","dbg_err","dbg_up","dbg_x","forcomposite","fordiv","forell","forpart","forprime","forstep","forsubgroup","forvec","for","iferr","if","local","my","next","return","until","while"];return r=r.map(function(r){return r.split("").join(" *")}).join("|"),RegExp("\\b(?:"+r+")\\b")}(),function:/\b\w(?:[\w ]*\w)?(?= *\()/,number:{pattern:/((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,lookbehind:!0},operator:/\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,punctuation:/[\[\]{}().,:;|]/}; +!function(e){var n=e.languages.parser=e.languages.extend("markup",{keyword:{pattern:/(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{punctuation:/\.|:+/}},function:{pattern:/(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\.|:+/}},escape:{pattern:/\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,alias:"builtin"},punctuation:/[\[\](){};]/});n=e.languages.insertBefore("parser","keyword",{"parser-comment":{pattern:/(\s)#.*/,lookbehind:!0,alias:"comment"},expression:{pattern:/(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,greedy:!0,lookbehind:!0,inside:{string:{pattern:/(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,lookbehind:!0},keyword:n.keyword,variable:n.variable,function:n.function,boolean:/\b(?:true|false)\b/,number:/\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,escape:n.escape,operator:/[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,punctuation:n.punctuation}}}),e.languages.insertBefore("inside","punctuation",{expression:n.expression,keyword:n.keyword,variable:n.variable,function:n.function,escape:n.escape,"parser-punctuation":{pattern:n.punctuation,alias:"punctuation"}},n.tag.inside["attr-value"])}(Prism); +Prism.languages.pascal={comment:[/\(\*[\s\S]+?\*\)/,/\{[\s\S]+?\}/,/\/\/.*/],string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/i,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.objectpascal=Prism.languages.pascal; +!function(e){var n="(?:\\b\\w+(?:)?|)".replace(//g,function(){return"\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)"}),t=e.languages.pascaligo={comment:/\(\*[\s\S]+?\*\)|\/\/.*/,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,greedy:!0},"class-name":[{pattern:RegExp("(\\btype\\s+\\w+\\s+is\\s+)".replace(//g,function(){return n}),"i"),lookbehind:!0,inside:null},{pattern:RegExp("(?=\\s+is\\b)".replace(//g,function(){return n}),"i"),inside:null},{pattern:RegExp("(:\\s*)".replace(//g,function(){return n})),lookbehind:!0,inside:null}],keyword:{pattern:/(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,lookbehind:!0},boolean:{pattern:/(^|[^&])\b(?:True|False)\b/i,lookbehind:!0},builtin:{pattern:/(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,lookbehind:!0},function:/\b\w+(?=\s*\()/i,number:[/%[01]+|&[0-7]+|\$[a-f\d]+/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i],operator:/->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,punctuation:/\(\.|\.\)|[()\[\]:;,.{}]/},i=["comment","keyword","builtin","operator","punctuation"].reduce(function(e,n){return e[n]=t[n],e},{});t["class-name"].forEach(function(e){e.inside=i})}(Prism); +Prism.languages.psl={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,inside:{symbol:/\\[ntrbA-Z"\\]/}},"heredoc-string":{pattern:/<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,alias:"string",greedy:!0},keyword:/\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,constant:/\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|FALSE|False|false|NO|No|no|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|TRUE|True|true|VOID|WARN)\b/,variable:/\b(?:errno|exit_status|PslDebug)\b/,builtin:{pattern:/\b(?:acos|add_diary|annotate|annotate_get|asctime|asin|atan|atexit|ascii_to_ebcdic|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|destroy_lock|dump_hist|date|destroy|difference|dget_text|dcget_text|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|floor|fmod|full_discovery|file|fopen|ftell|fseek|grep|get_vars|getenv|get|get_chan_info|get_ranges|get_text|gethostinfo|getpid|getpname|history_get_retention|history|index|int|is_var|intersection|isnumber|internal|in_transition|join|kill|length|lines|lock|lock_info|log|loge|log10|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|num_consoles|nthargf|nthline|nthlinef|num_bytes|print|proc_exists|process|popen|printf|pconfig|poplines|pow|PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|sopen|sqrt|srandom|subset|set|substr|system|sprintf|sort|snmp_agent_config|_snmp_debug|snmp_agent_stop|snmp_agent_start|snmp_h_set|snmp_h_get_next|snmp_h_get|snmp_set|snmp_walk|snmp_get_next|snmp_get|snmp_config|snmp_close|snmp_open|snmp_trap_receive|snmp_trap_ignore|snmp_trap_listen|snmp_trap_send|snmp_trap_raise_std_trap|snmp_trap_register_im|splitline|strcasecmp|str_repeat|trim|tail|tan|tanh|time|tmpnam|tolower|toupper|trace_psl_process|text_domain|unlock|unique|union|unset|va_arg|va_start|write)\b/,alias:"builtin-function"},"foreach-variable":{pattern:/(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,lookbehind:!0,greedy:!0},function:{pattern:/\b[_a-z]\w*\b(?=\s*\()/i},number:/\b(?:0x[0-9a-f]+|[0-9]+(?:\.[0-9]+)?)\b/i,operator:/--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,punctuation:/[(){}\[\];,]/}; +Prism.languages.pcaxis={string:/"[^"]*"/,keyword:{pattern:/((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,lookbehind:!0,greedy:!0,inside:{keyword:/^[-A-Z\d]+/,language:{pattern:/^(\s*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/^\[|\]$/,property:/[-\w]+/}},"sub-key":{pattern:/^(\s*)\S[\s\S]*/,lookbehind:!0,inside:{parameter:{pattern:/"[^"]*"/,alias:"property"},punctuation:/^\(|\)$|,/}}}},operator:/=/,tlist:{pattern:/TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,greedy:!0,inside:{function:/^TLIST/,property:{pattern:/^(\s*\(\s*)\w+/,lookbehind:!0},string:/"[^"]*"/,punctuation:/[(),]/,operator:/-/}},punctuation:/[;,]/,number:{pattern:/(^|\s)\d+(?:\.\d+)?(?!\S)/,lookbehind:!0},boolean:/YES|NO/},Prism.languages.px=Prism.languages.pcaxis; +Prism.languages.peoplecode={comment:RegExp(["/\\*[^]*?\\*/","\\bREM[^;]*;","<\\*(?:[^<*]|\\*(?!>)|<(?!\\*)|<\\*(?:(?!\\*>)[^])*\\*>)*\\*>","/\\+[^]*?\\+/"].join("|")),string:{pattern:/'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,greedy:!0},variable:/%\w+/,"function-definition":{pattern:/((?:^|[^\w-])(?:function|method)\s+)\w+/i,lookbehind:!0,alias:"function"},"class-name":{pattern:/((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,lookbehind:!0,inside:{punctuation:/:/}},keyword:/\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|implements|import|instance|if|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,"operator-keyword":{pattern:/\b(?:and|not|or)\b/i,alias:"operator"},function:/[_a-z]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/i,number:/\b\d+(?:\.\d+)?\b/,operator:/<>|[<>]=?|!=|\*\*|[-+*/|=@]/,punctuation:/[:.;,()[\]]/},Prism.languages.pcode=Prism.languages.peoplecode; +Prism.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0}],string:[{pattern:/\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:/\b(?:m|qr)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/i,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*>|\b_\b/,alias:"symbol"},vstring:{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/sub \w+/i,inside:{keyword:/sub/}},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,punctuation:/[{}[\];(),:]/}; +!function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:callback|resource|boolean|integer|double|object|string|array|false|float|mixed|bool|null|self|true|void|int)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism); +Prism.languages.insertBefore("php","variable",{this:/\$this\b/,global:/\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/static|self|parent/,punctuation:/::|\\/}}}); +!function(E){var A=E.languages.plsql=E.languages.extend("sql",{comment:[/\/\*[\s\S]*?\*\//,/--.*/]}),T=A.keyword;Array.isArray(T)||(T=A.keyword=[T]),T.unshift(/\b(?:ACCESS|AGENT|AGGREGATE|ARRAY|ARROW|AT|ATTRIBUTE|AUDIT|AUTHID|BFILE_BASE|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BYTE|CALLING|CHAR_BASE|CHARSET(?:FORM|ID)|CLOB_BASE|COLAUTH|COLLECT|CLUSTERS?|COMPILED|COMPRESS|CONSTANT|CONSTRUCTOR|CONTEXT|CRASH|CUSTOMDATUM|DANGLING|DATE_BASE|DEFINE|DETERMINISTIC|DURATION|ELEMENT|EMPTY|EXCEPTIONS?|EXCLUSIVE|EXTERNAL|FINAL|FORALL|FORM|FOUND|GENERAL|HEAP|HIDDEN|IDENTIFIED|IMMEDIATE|INCLUDING|INCREMENT|INDICATOR|INDEXES|INDICES|INFINITE|INITIAL|ISOPEN|INSTANTIABLE|INTERFACE|INVALIDATE|JAVA|LARGE|LEADING|LENGTH|LIBRARY|LIKE[24C]|LIMITED|LONG|LOOP|MAP|MAXEXTENTS|MAXLEN|MEMBER|MINUS|MLSLABEL|MULTISET|NAME|NAN|NATIVE|NEW|NOAUDIT|NOCOMPRESS|NOCOPY|NOTFOUND|NOWAIT|NUMBER(?:_BASE)?|OBJECT|OCI(?:COLL|DATE|DATETIME|DURATION|INTERVAL|LOBLOCATOR|NUMBER|RAW|REF|REFCURSOR|ROWID|STRING|TYPE)|OFFLINE|ONLINE|ONLY|OPAQUE|OPERATOR|ORACLE|ORADATA|ORGANIZATION|ORL(?:ANY|VARY)|OTHERS|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETERS?|PASCAL|PCTFREE|PIPE(?:LINED)?|PRAGMA|PRIOR|PRIVATE|RAISE|RANGE|RAW|RECORD|REF|REFERENCE|REM|REMAINDER|RESULT|RESOURCE|RETURNING|REVERSE|ROW(?:ID|NUM|TYPE)|SAMPLE|SB[124]|SEGMENT|SELF|SEPARATE|SEQUENCE|SHORT|SIZE(?:_T)?|SPARSE|SQL(?:CODE|DATA|NAME|STATE)|STANDARD|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUCCESSFUL|SYNONYM|SYSDATE|TABAUTH|TDO|THE|TIMEZONE_(?:ABBR|HOUR|MINUTE|REGION)|TRAILING|TRANSAC(?:TIONAL)?|TRUSTED|UB[124]|UID|UNDER|UNTRUSTED|VALIDATE|VALIST|VARCHAR2|VARIABLE|VARIANCE|VARRAY|VIEWS|VOID|WHENEVER|WRAPPED|ZONE)\b/i);var R=A.operator;Array.isArray(R)||(R=A.operator=[R]),R.unshift(/:=/)}(Prism); +Prism.languages.powerquery={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/).*)/,lookbehind:!0},"quoted-identifier":{pattern:/#"(?:[^"\r\n]|"")*"(?!")/,greedy:!0,alias:"variable"},string:{pattern:/"(?:[^"\r\n]|"")*"(?!")/,greedy:!0},constant:[/\bDay\.(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\b/,/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,/\bOccurrence\.(?:First|Last|All)\b/,/\bOrder\.(?:Ascending|Descending)\b/,/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,/\bMissingField\.(?:Error|Ignore|UseNull)\b/,/\bQuoteStyle\.(?:Csv|None)\b/,/\bJoinKind\.(?:Inner|LeftOuter|RightOuter|FullOuter|LeftAnti|RightAnti)\b/,/\bGroupKind\.(?:Global|Local)\b/,/\bExtraValues\.(?:List|Ignore|Error)\b/,/\bJoinAlgorithm\.(?:Dynamic|PairwiseHash|SortMerge|LeftHash|RightHash|LeftIndex|RightIndex)\b/,/\bJoinSide\.(?:Left|Right)\b/,/\bPrecision\.(?:Double|Decimal)\b/,/\bRelativePosition\.From(?:End|Start)\b/,/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf8|Utf16|Windows)\b/,/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Int8|Int16|Int32|Int64|Function|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,/\bnull\b/],boolean:/\b(?:true|false)\b/,keyword:/\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,function:{pattern:/(^|[^#\w.])(?!\d)[\w.]+(?=\s*\()/,lookbehind:!0},"data-type":{pattern:/\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time|type)\b/,alias:"variable"},number:{pattern:/\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,lookbehind:!0},operator:/[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,punctuation:/[,;\[\](){}]/},Prism.languages.pq=Prism.languages.powerquery,Prism.languages.mscript=Prism.languages.powerquery; +!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:true|false)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:eq|ne|gt|ge|lt|le|sh[lr]|not|b?(?:and|x?or)|(?:Not)?(?:Like|Match|Contains|In)|Replace|Join|is(?:Not)?|as)\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}(); +Prism.languages.processing=Prism.languages.extend("clike",{keyword:/\b(?:break|catch|case|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/}),Prism.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"variable"}}),Prism.languages.processing.function=/\b\w+(?=\s*\()/,Prism.languages.processing["class-name"].alias="variable"; +Prism.languages.prolog={comment:[/%.+/,/\/\*[\s\S]*?\*\//],string:{pattern:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,variable:/\b[A-Z_]\w*/,function:/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+(?:\.\d*)?/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/}; +!function(t){var n=["on","ignoring","group_right","group_left","by","without"],a=["sum","min","max","avg","group","stddev","stdvar","count","count_values","bottomk","topk","quantile"].concat(n,["offset"]);t.languages.promql={comment:{pattern:/(^[ \t]*)#.*/m,lookbehind:!0},"vector-match":{pattern:new RegExp("((?:"+n.join("|")+")\\s*)\\([^)]*\\)"),lookbehind:!0,inside:{"label-key":{pattern:/\b[^,]*\b/,alias:"attr-name"},punctuation:/[(),]/}},"context-labels":{pattern:/\{[^{}]*\}/,inside:{"label-key":{pattern:/\b[a-z_]\w*(?=\s*(?:=|![=~]))/,alias:"attr-name"},"label-value":{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0,alias:"attr-value"},punctuation:/\{|\}|=~?|![=~]|,/}},"context-range":[{pattern:/\[[\w\s:]+\]/,inside:{punctuation:/\[|\]|:/,"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}},{pattern:/(\boffset\s+)\w+/,lookbehind:!0,inside:{"range-duration":{pattern:/\b(?:\d+(?:[smhdwy]|ms))+\b/i,alias:"number"}}}],keyword:new RegExp("\\b(?:"+a.join("|")+")\\b","i"),function:/\b[a-z_]\w*(?=\s*\()/i,number:/[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,operator:/[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|unless|or)\b/i,punctuation:/[{};()`,.[\]]/}}(Prism); +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}; +!function(e){var s=/\b(?:double|float|[su]?int(?:32|64)|s?fixed(?:32|64)|bool|string|bytes)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism); +!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"}}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:if|unless|else|case|when|default|each|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:if|unless|else|case|when|default|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:block|extends|include|append|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w\-]+/,"attr-class":/\.[\w\-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],n={},a=0,i=t.length;a(?:(?:\r?\n|\r(?!\n))(?:\\2[\t ].+|\\s*?(?=\r?\n|\r)))+".replace("",function(){return r.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},rest:e.languages[r.language]}})}e.languages.insertBefore("pug","filter",n)}(Prism); +!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\b\w+|\*)(?=\s*=>)/,function:[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,boolean:/\b(?:true|false)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism); +!function(r){r.languages.pure={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0},/#!.+/],"inline-lang":{pattern:/%<[\s\S]+?%>/,greedy:!0,inside:{lang:{pattern:/(^%< *)-\*-.+?-\*-/,lookbehind:!0,alias:"comment"},delimiter:{pattern:/^%<.*|%>$/,alias:"punctuation"}}},string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},number:{pattern:/((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,lookbehind:!0},keyword:/\b(?:ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|NULL|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,function:/\b(?:abs|add_(?:(?:fundef|interface|macdef|typedef)(?:_at)?|addr|constdef|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_(?:matrix|pointer)|byte_c?string(?:_pointer)?|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|short|sentry|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,special:{pattern:/\b__[a-z]+__\b/i,alias:"builtin"},operator:/(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,punctuation:/[(){}\[\];,|]/};["c",{lang:"c++",alias:"cpp"},"fortran"].forEach(function(e){var t=e;if("string"!=typeof e&&(t=e.alias,e=e.lang),r.languages[t]){var a={};a["inline-lang-"+t]={pattern:RegExp("%< *-\\*- *\\d* *-\\*-[^]+?%>".replace("",e.replace(/([.+*?\/\\(){}\[\]])/g,"\\$1")),"i"),inside:r.util.clone(r.languages.pure["inline-lang"].inside)},a["inline-lang-"+t].inside.rest=r.util.clone(r.languages[t]),r.languages.insertBefore("pure","inline-lang",a)}}),r.languages.c&&(r.languages.pure["inline-lang"].inside.rest=r.util.clone(r.languages.c))}(Prism); +Prism.languages.purebasic=Prism.languages.extend("clike",{comment:/;.*/,keyword:/\b(?:declarecdll|declaredll|compilerselect|compilercase|compilerdefault|compilerendselect|compilererror|enableexplicit|disableexplicit|not|and|or|xor|calldebugger|debuglevel|enabledebugger|disabledebugger|restore|read|includepath|includebinary|threaded|runtime|with|endwith|structureunion|endstructureunion|align|newlist|newmap|interface|endinterface|extends|enumeration|endenumeration|swap|foreach|continue|fakereturn|goto|gosub|return|break|module|endmodule|declaremodule|enddeclaremodule|declare|declarec|prototype|prototypec|enableasm|disableasm|dim|redim|data|datasection|enddatasection|to|procedurereturn|debug|default|case|select|endselect|as|import|endimport|importc|compilerif|compilerelse|compilerendif|compilerelseif|end|structure|endstructure|while|wend|for|next|step|if|else|elseif|endif|repeat|until|procedure|proceduredll|procedurec|procedurecdll|endprocedure|protected|shared|static|global|define|includefile|xincludefile|macro|endmacro)\b/i,function:/\b\w+(?:\.\w+)?\s*(?=\()/,number:/(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,operator:/(?:@\*?|\?|\*)\w+|-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*/@]/}),Prism.languages.insertBefore("purebasic","keyword",{tag:/#\w+/,asm:{pattern:/(^[\t ]*)!.*/m,lookbehind:!0,alias:"tag",inside:{comment:/;.*/,string:{pattern:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"label-reference-anonymous":{pattern:/(!\s*j[a-z]+\s+)@[fb]/i,lookbehind:!0,alias:"fasm-label"},"label-reference-addressed":{pattern:/(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,lookbehind:!0,alias:"fasm-label"},function:{pattern:/^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,lookbehind:!0},"function-inline":{pattern:/(:\s*)[\da-z]+(?=\s)/i,lookbehind:!0,alias:"function"},label:{pattern:/^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,lookbehind:!0,alias:"fasm-label"},keyword:[/\b(?:extern|global)\b[^;\r\n]*/i,/\b(?:CPU|FLOAT|DEFAULT)\b.*/],register:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|sp|si|di)|[cdefgs]s|mm\d+)\b/i,number:/(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-/%<>=&|$!,.:]/}}}),delete Prism.languages.purebasic["class-name"],delete Prism.languages.purebasic.boolean,Prism.languages.pbfasm=Prism.languages.purebasic; +Prism.languages.purescript=Prism.languages.extend("haskell",{keyword:/\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|as|hiding)\b/,punctuation:/\./}},builtin:/\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,operator:[Prism.languages.haskell.operator[0],Prism.languages.haskell.operator[2],/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/]}),Prism.languages.purs=Prism.languages.purescript; +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +!function(e){function a(e,r){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+r[+n]+")"})}function n(e,n,r){return RegExp(a(e,n),r||"")}var r=RegExp("\\b(?:"+("Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero"+" "+"Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within").trim().replace(/ /g,"|")+")\\b"),t=a("<<0>>(?:\\s*\\.\\s*<<0>>)*",["\\b[A-Za-z_]\\w*\\b"]),i={keyword:r,punctuation:/[<>()?,.:[\]]/},s='"(?:\\\\.|[^\\\\"])*"';e.languages.qsharp=e.languages.extend("clike",{comment:/\/\/.*/,string:[{pattern:n("(^|[^$\\\\])<<0>>",[s]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n("(\\b(?:as|open)\\s+)<<0>>(?=\\s*(?:;|as\\b))",[t]),lookbehind:!0,inside:i},{pattern:n("(\\bnamespace\\s+)<<0>>(?=\\s*\\{)",[t]),lookbehind:!0,inside:i}],keyword:r,number:/(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,operator:/\band=|\bor=|\band\b|\bor\b|\bnot\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,punctuation:/::|[{}[\];(),.:]/}),e.languages.insertBefore("qsharp","number",{range:{pattern:/\.\./,alias:"operator"}});var o=function(e,n){for(var r=0;r>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}(a('\\{(?:[^"{}]|<<0>>|<>)*\\}',[s]),2);e.languages.insertBefore("qsharp","string",{"interpolation-string":{pattern:n('\\$"(?:\\\\.|<<0>>|[^\\\\"{])*"',[o]),greedy:!0,inside:{interpolation:{pattern:n("((?:^|[^\\\\])(?:\\\\\\\\)*)<<0>>",[o]),lookbehind:!0,inside:{punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-qsharp",inside:e.languages.qsharp}}},string:/[\s\S]+/}}})}(Prism),Prism.languages.qs=Prism.languages.qsharp; +Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0[wn]|0W[hj]?|0N[hje]?|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}; +!function(e){for(var r="(?:[^\\\\()[\\]{}\"'/]||/(?![*/])||\\(*\\)|\\[*\\]|\\{*\\}|\\\\[^])".replace(//g,function(){return"\"(?:\\\\.|[^\\\\\"\r\n])*\"|'(?:\\\\.|[^\\\\'\r\n])*'"}).replace(//g,function(){return"//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"}),n=0;n<2;n++)r=r.replace(//g,function(){return r});r=r.replace(//g,"[^\\s\\S]"),e.languages.qml={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\//,greedy:!0},"javascript-function":{pattern:RegExp("((?:^|;)[ \t]*)function\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*\\(*\\)\\s*\\{*\\}".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},"class-name":{pattern:/((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,lookbehind:!0},property:[{pattern:/((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0},{pattern:/((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,lookbehind:!0,inside:{keyword:/^property/,property:/\w+(?:\.\w+)*/}}],"javascript-expression":{pattern:RegExp("(:[ \t]*)(?![\\s;}[])(?:(?!$|[;}]))+".replace(//g,function(){return r}),"m"),lookbehind:!0,greedy:!0,alias:"language-javascript",inside:e.languages.javascript},string:/"(?:\\.|[^\\"\r\n])*"/,keyword:/\b(?:as|import|on)\b/,punctuation:/[{}[\]:;,]/}}(Prism); +Prism.languages.qore=Prism.languages.extend("clike",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,lookbehind:!0},string:{pattern:/("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:int|float|number|bool|string|date|list)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,boolean:/\b(?:true|false)\b/i,function:/\$?\b(?!\d)\w+(?=\()/,number:/\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,lookbehind:!0},variable:/\$(?!\d)\w+\b/}); +Prism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:TRUE|FALSE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:NaN|Inf)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:if|else|repeat|while|function|for|in|next|break|NULL|NA|NA_integer_|NA_real_|NA_complex_|NA_character_)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; +Prism.languages.racket=Prism.languages.extend("scheme",{"lambda-parameter":{pattern:/([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,lookbehind:!0}}),Prism.languages.insertBefore("racket","string",{lang:{pattern:/^#lang.+/m,greedy:!0,alias:"keyword"}}),Prism.languages.rkt=Prism.languages.racket; +!function(i){var t=i.util.clone(i.languages.javascript),e="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function n(t,n){return t=t.replace(//g,function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"}).replace(//g,function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"}).replace(//g,function(){return e}),RegExp(t,n)}e=n(e).source,i.languages.jsx=i.languages.extend("markup",t),i.languages.jsx.tag.pattern=n("+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|))?|))**/?)?>"),i.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,i.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/i,i.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,i.languages.jsx.tag.inside.comment=t.comment,i.languages.insertBefore("inside","attr-name",{spread:{pattern:n(""),inside:i.languages.jsx}},i.languages.jsx.tag),i.languages.insertBefore("inside","special-attr",{script:{pattern:n("="),inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:i.languages.jsx},alias:"language-javascript"}},i.languages.jsx.tag);var o=function(t){return t?"string"==typeof t?t:"string"==typeof t.content?t.content:t.content.map(o).join(""):""},r=function(t){for(var n=[],e=0;e"===a.content[a.content.length-1].content||n.push({tagName:o(a.content[0].content[1]),openedBraces:0}):0|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),Prism.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete Prism.languages.reason.function; +!function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|c[a-zA-Z]|0[0-7]{0,2}|[123][0-7]{2}|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={charset:{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"charset-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"charset-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,charclass:{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,charclass:{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|:=]=?|!=|\b_\b/,punctuation:/[,;.\[\]{}()]/}; +Prism.languages.renpy={comment:{pattern:/(^|[^\\])#.+/,lookbehind:!0},string:{pattern:/("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2|(?:^#?(?:[0-9a-fA-F]{6}|(?:[0-9a-fA-F]){3})$)/m,greedy:!0},function:/\b[a-z_]\w*(?=\()/i,property:/\b(?:insensitive|idle|hover|selected_idle|selected_hover|background|position|alt|xpos|ypos|pos|xanchor|yanchor|anchor|xalign|yalign|align|xcenter|ycenter|xofsset|yoffset|ymaximum|maximum|xmaximum|xminimum|yminimum|minimum|xsize|ysizexysize|xfill|yfill|area|antialias|black_color|bold|caret|color|first_indent|font|size|italic|justify|kerning|language|layout|line_leading|line_overlap_split|line_spacing|min_width|newline_indent|outlines|rest_indent|ruby_style|slow_cps|slow_cps_multiplier|strikethrough|text_align|underline|hyperlink_functions|vertical|hinting|foreground|left_margin|xmargin|top_margin|bottom_margin|ymargin|left_padding|right_padding|xpadding|top_padding|bottom_padding|ypadding|size_group|child|hover_sound|activate_sound|mouse|focus_mask|keyboard_focus|bar_vertical|bar_invert|bar_resizing|left_gutter|right_gutter|top_gutter|bottom_gutter|left_bar|right_bar|top_bar|bottom_bar|thumb|thumb_shadow|thumb_offset|unscrollable|spacing|first_spacing|box_reverse|box_wrap|order_reverse|fit_first|ysize|thumbnail_width|thumbnail_height|help|text_ypos|text_xpos|idle_color|hover_color|selected_idle_color|selected_hover_color|insensitive_color|alpha|insensitive_background|hover_background|zorder|value|width|xadjustment|xanchoraround|xaround|xinitial|xoffset|xzoom|yadjustment|yanchoraround|yaround|yinitial|yzoom|zoom|ground|height|text_style|text_y_fudge|selected_insensitive|has_sound|has_music|has_voice|focus|hovered|image_style|length|minwidth|mousewheel|offset|prefix|radius|range|right_margin|rotate|rotate_pad|developer|screen_width|screen_height|window_title|name|version|windows_icon|default_fullscreen|default_text_cps|default_afm_time|main_menu_music|sample_sound|enter_sound|exit_sound|save_directory|enter_transition|exit_transition|intra_transition|main_game_transition|game_main_transition|end_splash_transition|end_game_transition|after_load_transition|window_show_transition|window_hide_transition|adv_nvl_transition|nvl_adv_transition|enter_yesno_transition|exit_yesno_transition|enter_replay_transition|exit_replay_transition|say_attribute_transition|directory_name|executable_name|include_update|window_icon|modal|google_play_key|google_play_salt|drag_name|drag_handle|draggable|dragged|droppable|dropped|narrator_menu|action|default_afm_enable|version_name|version_tuple|inside|fadeout|fadein|layers|layer_clipping|linear|scrollbars|side_xpos|side_ypos|side_spacing|edgescroll|drag_joined|drag_raise|drop_shadow|drop_shadow_color|subpixel|easein|easeout|time|crop|auto|update|get_installed_packages|can_update|UpdateVersion|Update|overlay_functions|translations|window_left_padding|show_side_image|show_two_window)\b/,tag:/\b(?:label|image|menu|[hv]box|frame|text|imagemap|imagebutton|bar|vbar|screen|textbutton|buttoscreenn|fixed|grid|input|key|mousearea|side|timer|viewport|window|hotspot|hotbar|self|button|drag|draggroup|tag|mm_menu_frame|nvl|block|parallel)\b|\$/,keyword:/\b(?:as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|yield|adjustment|alignaround|allow|angle|around|box_layout|cache|changed|child_size|clicked|clipping|corner1|corner2|default|delay|exclude|scope|slow|slow_abortable|slow_done|sound|style_group|substitute|suffix|transform_anchor|transpose|unhovered|config|theme|mm_root|gm_root|rounded_window|build|disabled_text|disabled|widget_selected|widget_text|widget_hover|widget|updater|behind|call|expression|hide|init|jump|onlayer|python|renpy|scene|set|show|transform|play|queue|stop|pause|define|window|repeat|contains|choice|on|function|event|animation|clockwise|counterclockwise|circles|knot|null|None|random|has|add|use|fade|dissolve|style|store|id|voice|center|left|right|less_rounded|music|movie|clear|persistent|ui)\b/,boolean:/\b(?:[Tt]rue|[Ff]alse)\b/,number:/(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not|with|at)\b/,punctuation:/[{}[\];(),.:]/},Prism.languages.rpy=Prism.languages.renpy; +Prism.languages.rest={table:[{pattern:/(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,lookbehind:!0,inside:{punctuation:/\||(?:\+[=-]+)+\+/}},{pattern:/(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,lookbehind:!0,inside:{punctuation:/[=-]+/}}],"substitution-def":{pattern:/(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,alias:"attr-value",inside:{punctuation:/^\||\|$/}},directive:{pattern:/( )(?! )[^:]+::/,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}}}},"link-target":[{pattern:/(^[\t ]*\.\. )\[[^\]]+\]/m,lookbehind:!0,alias:"string",inside:{punctuation:/^\[|\]$/}},{pattern:/(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,lookbehind:!0,alias:"string",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^[\t ]*\.\. )[^:]+::/m,lookbehind:!0,alias:"function",inside:{punctuation:/::$/}},comment:{pattern:/(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,inside:{punctuation:/^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,lookbehind:!0,inside:{punctuation:/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,lookbehind:!0,alias:"punctuation"},field:{pattern:/(^[\t ]*):[^:\r\n]+:(?= )/m,lookbehind:!0,alias:"attr-name"},"command-line-option":{pattern:/(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,lookbehind:!0,alias:"symbol"},"literal-block":{pattern:/::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,inside:{"literal-block-punctuation":{pattern:/^::/,alias:"punctuation"}}},"quoted-literal-block":{pattern:/::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,inside:{"literal-block-punctuation":{pattern:/^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,alias:"punctuation"}}},"list-bullet":{pattern:/(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,lookbehind:!0,alias:"punctuation"},"doctest-block":{pattern:/(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\*\*).+(?=\*\*$)/,lookbehind:!0},italic:{pattern:/(^\*).+(?=\*$)/,lookbehind:!0},"inline-literal":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:"symbol"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:"function",inside:{punctuation:/^:|:$/}},"interpreted-text":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:"attr-value"},substitution:{pattern:/(^\|).+(?=\|$)/,lookbehind:!0,alias:"attr-value"},punctuation:/\*\*?|``?|\|/}}],link:[{pattern:/\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,alias:"string",inside:{punctuation:/^\[|\]_$/}},{pattern:/(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,alias:"string",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,lookbehind:!0}}; +Prism.languages.rip={comment:/#.*/,keyword:/(?:=>|->)|\b(?:class|if|else|switch|case|return|exit|try|catch|finally|raise)\b/,builtin:/@|\bSystem\b/,boolean:/\b(?:true|false)\b/,date:/\b\d{4}-\d{2}-\d{2}\b/,time:/\b\d{2}:\d{2}:\d{2}\b/,datetime:/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,character:/\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,regex:{pattern:/(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0},symbol:/:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},number:/[+-]?\b(?:\d+\.\d+|\d+)\b/,punctuation:/(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,reference:/[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/}; +Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{)|(?:external|import)\b)/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*(?![ \t]))[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/}; +!function(t){var r={pattern:/(^[ \t]*| {2}|\t)#.*/m,lookbehind:!0,greedy:!0},o={pattern:/((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,lookbehind:!0,inside:{punctuation:/^[$@&%]\{|\}$/}};function n(t,n){var e={"section-header":{pattern:/^ ?\*{3}.+?\*{3}/,alias:"keyword"}};for(var a in n)e[a]=n[a];return e.tag={pattern:/([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,lookbehind:!0,inside:{punctuation:/\[|\]/}},e.variable=o,e.comment=r,{pattern:RegExp("^ ?\\*{3}[ \t]*[ \t]*\\*{3}(?:.|[\r\n](?!\\*{3}))*".replace(//g,function(){return t}),"im"),alias:"section",inside:e}}var e={pattern:/(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},a={pattern:/([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,alias:"function",inside:{variable:o}},i={pattern:/([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0,inside:{variable:o}};t.languages.robotframework={settings:n("Settings",{documentation:{pattern:/([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,lookbehind:!0,alias:"string"},property:{pattern:/([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,lookbehind:!0}}),variables:n("Variables"),"test-cases":n("Test Cases",{"test-name":a,documentation:e,property:i}),keywords:n("Keywords",{"keyword-name":a,documentation:e,property:i}),tasks:n("Tasks",{"task-name":a,documentation:e,property:i}),comment:r},t.languages.robot=t.languages.robotframework}(Prism); +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0,alias:"string"},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|Self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:[ui](?:8|16|32|64|128|size)|f(?:32|64)|bool|char|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:[iu](?:8|16|32|64|size)?|f32|f64))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); +!function(e){var t="(?:\"(?:\"\"|[^\"])*\"(?!\")|'(?:''|[^'])*'(?!'))",a=/\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,n={pattern:RegExp(t+"[bx]"),alias:"number"},i={pattern:/&[a-z_]\w*/i},r={pattern:/((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMGLOBL|SYMLOCAL|SYMEXIST|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,lookbehind:!0,alias:"keyword"},s={pattern:/(^|\s)(?:proc\s+\w+|quit|run|data(?!=))\b/i,alias:"keyword",lookbehind:!0},o=[/\/\*[\s\S]*?\*\//,{pattern:/(^[ \t]*|;\s*)\*[^;]*;/m,lookbehind:!0}],l={pattern:RegExp(t),greedy:!0},c=/[$%@.(){}\[\];,\\]/,d={pattern:/%?\b\w+(?=\()/,alias:"keyword"},p={function:d,"arg-value":{pattern:/(=\s*)[A-Z\.]+/i,lookbehind:!0},operator:/=/,"macro-variable":i,arg:{pattern:/[A-Z]+/i,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l},u={pattern:/\b(?:format|put)\b=?[\w'$.]+/im,inside:{keyword:/^(?:format|put)(?==)/i,equals:/=/,format:{pattern:/(?:\w|\$\d)+\.\d?/i,alias:"number"}}},m={pattern:/\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,inside:{keyword:/^(?:format|put)/i,format:{pattern:/[\w$]+\.\d?/,alias:"number"}}},b={pattern:/((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,lookbehind:!0,alias:"keyword"},g={pattern:/(^|\s)(?:submit(?:\s+(?:load|parseonly|norun))?|endsubmit)\b/i,lookbehind:!0,alias:"keyword"},k="accessControl|cdm|aggregation|aStore|ruleMining|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|sccasl|clustering|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deepLearn|deepNeural|varReduce|simSystem|ds2|deduplication|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gam|gleam|graphSemiSupLearn|gVarCluster|hiddenMarkovModel|hyperGroup|image|iml|ica|kernalPca|langModel|ldaTopic|sparseML|mlTools|mixed|modelPublishing|mbc|network|optNetwork|neuralNet|nonlinear|nmf|nonParametricBayes|optimization|panel|pls|percentile|pca|phreg|qkb|qlim|quantreg|recommend|tsReconcile|deepRnn|regression|reinforcementLearn|robustPca|sampling|sparkEmbeddedProcess|search(?:Analytics)?|sentimentAnalysis|sequence|configuration|session(?:Prop)?|severity|simple|smartData|sandwich|spatialreg|stabilityMonitoring|spc|loadStreams|svDataDescription|svm|table|conditionalRandomFields|text(?:Rule(?:Develop|Score)|Mining|Parse|Topic|Util|Filters|Frequency)|tsInfo|timeData|transpose|uniTimeSeries",y={pattern:RegExp("(^|\\s)(?:action\\s+)?(?:)\\.[a-z]+\\b[^;]+".replace(//g,function(){return k}),"i"),lookbehind:!0,inside:{keyword:RegExp("(?:)\\.[a-z]+\\b".replace(//g,function(){return k}),"i"),action:{pattern:/(?:action)/i,alias:"keyword"},comment:o,function:d,"arg-value":p["arg-value"],operator:p.operator,argument:p.arg,number:a,"numeric-constant":n,punctuation:c,string:l}},S={pattern:/((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|end(?:source|comp)?|entryTitle|else|eval(?:uate)?|exec(?:ute)?|exit|fill(?:attrs)?|file(?:name)?|flist|fnc|function(?:list)?|goto|global|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|name|noobs|nowd|_?null_|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|put|print|raise|ranexp|rannor|rbreak|retain|return|select|set|session|sessref|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|yaxisopts|y2axisopts)\b/i,lookbehind:!0};e.languages.sas={datalines:{pattern:/^([ \t]*)(?:(?:data)?lines|cards);[\s\S]+?^[ \t]*;/im,lookbehind:!0,alias:"string",inside:{keyword:{pattern:/^(?:(?:data)?lines|cards)/i},punctuation:/;/}},"proc-sql":{pattern:/(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,lookbehind:!0,inside:{sql:{pattern:RegExp("^[ \t]*(?:select|alter\\s+table|(?:create|describe|drop)\\s+(?:index|table(?:\\s+constraints)?|view)|create\\s+unique\\s+index|insert\\s+into|update)(?:|[^;\"'])+;".replace(//g,function(){return t}),"im"),alias:"language-sql",inside:e.languages.sql},"global-statements":b,"sql-statements":{pattern:/(^|\s)(?:disconnect\s+from|exec(?:ute)?|begin|commit|rollback|reset|validate)\b/i,lookbehind:!0,alias:"keyword"},number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-groovy":{pattern:/(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,groovy:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|parseonly|norun))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-groovy",inside:e.languages.groovy},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-lua":{pattern:/(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,lua:{pattern:RegExp("(^[ \t]*submit(?:\\s+(?:load|parseonly|norun))?)(?:|[^\"'])+?(?=endsubmit;)".replace(//g,function(){return t}),"im"),lookbehind:!0,alias:"language-lua",inside:e.languages.lua},keyword:S,"submit-statement":g,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-cas":{pattern:/(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,lookbehind:!0,inside:{comment:o,"statement-var":{pattern:/((?:^|\s)=?)saveresult\s[^;]+/im,lookbehind:!0,inside:{statement:{pattern:/^saveresult\s+\S+/i,inside:{keyword:/^(?:saveresult)/i}},rest:p}},"cas-actions":y,statement:{pattern:/((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,lookbehind:!0,inside:p},step:s,keyword:S,function:d,format:u,altformat:m,"global-statements":b,number:a,"numeric-constant":n,punctuation:c,string:l}},"proc-args":{pattern:RegExp("(^proc\\s+\\w+\\s+)(?!\\s)(?:[^;\"']|)+;".replace(//g,function(){return t}),"im"),lookbehind:!0,inside:p},"macro-keyword":r,"macro-variable":i,"macro-string-functions":{pattern:/((?:^|\s|=))%(?:NRBQUOTE|NRQUOTE|NRSTR|BQUOTE|QUOTE|STR)\(.*?(?:[^%]\))/i,lookbehind:!0,inside:{function:{pattern:/%(?:NRBQUOTE|NRQUOTE|NRSTR|BQUOTE|QUOTE|STR)/i,alias:"keyword"},"macro-keyword":r,"macro-variable":i,"escaped-char":{pattern:/%['"()<>=¬^~;,#]/i},punctuation:c}},"macro-declaration":{pattern:/^%macro[^;]+(?=;)/im,inside:{keyword:/%macro/i}},"macro-end":{pattern:/^%mend[^;]+(?=;)/im,inside:{keyword:/%mend/i}},macro:{pattern:/%_\w+(?=\()/,alias:"keyword"},input:{pattern:/\binput\s[-\w\s/*.$&]+;/i,inside:{input:{alias:"keyword",pattern:/^input/i},comment:o,number:a,"numeric-constant":n}},"options-args":{pattern:/(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,lookbehind:!0,inside:p},"cas-actions":y,comment:o,function:d,format:u,altformat:m,"numeric-constant":n,datetime:{pattern:RegExp(t+"(?:dt?|t)"),alias:"number"},string:l,step:s,keyword:S,"operator-keyword":{pattern:/\b(?:eq|ne|gt|lt|ge|le|in|not)\b/i,alias:"operator"},number:a,operator:/\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/i,punctuation:c}}(Prism); +!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|forward|for|each|while|import|use|extend|debug|warn|mixin|include|function|return|content)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|with|show|hide)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,symbol:/'[^\d\s\\]\w*/}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function; +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\\1\\s[^]*?[\r\n]\\2"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^\0-\\x1F$#%*?"<>:;|]+)?|[^\0-\\x1F$#%*?"<>@:;|]+)?[$#%]'+"(?:[^\\\\\r\n'\"<$]|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<>)+".replace(/<>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); +Prism.languages.smali={comment:/#.*/,string:{pattern:/"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,greedy:!0},"class-name":{pattern:/(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,lookbehind:!0,inside:{"class-name":{pattern:/(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,lookbehind:!0},namespace:{pattern:/^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,lookbehind:!0,inside:{punctuation:/\//}},builtin:/^L/}},builtin:[{pattern:/([();\[])[BCDFIJSVZ]+/,lookbehind:!0},{pattern:/([\w$>]:)[BCDFIJSVZ]/,lookbehind:!0}],keyword:[{pattern:/(\.end\s+)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])\.(?!\d)[\w-]+/,lookbehind:!0},{pattern:/(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,lookbehind:!0}],function:{pattern:/(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,lookbehind:!0},field:{pattern:/[\w$]+(?=:)/,alias:"variable"},register:{pattern:/(^|[^\w.-])[vp]\d(?![\w.-])/,lookbehind:!0,alias:"variable"},boolean:{pattern:/(^|[^\w.-])(?:true|false)(?![\w.-])/,lookbehind:!0},number:{pattern:/(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,lookbehind:!0},label:{pattern:/(:)\w+/,lookbehind:!0,alias:"property"},operator:/->|\.\.|[\[=]/,punctuation:/[{}(),;:]/}; +Prism.languages.smalltalk={comment:/"(?:""|[^"])*"/,character:{pattern:/\$./,alias:"string"},string:/'(?:''|[^'])*'/,symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:nil|true|false|self|super|new)\b/,number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/\b\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}; +!function(n){n.languages.smarty={comment:/\{\*[\s\S]*?\*\}/,delimiter:{pattern:/^\{|\}$/i,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,variable:[/\$(?!\d)\w+/,/#(?!\d)\w+#/,{pattern:/(\.|->)(?!\d)\w+/,lookbehind:!0},{pattern:/(\[)(?!\d)\w+(?=\])/,lookbehind:!0}],function:[{pattern:/(\|\s*)@?(?!\d)\w+/,lookbehind:!0},/^\/?(?!\d)\w+/,/(?!\d)\w+(?=\()/],"attr-name":{pattern:/\w+\s*=\s*(?:(?!\d)\w+)?/,inside:{variable:{pattern:/(=\s*)(?!\d)\w+/,lookbehind:!0},operator:/=/}},punctuation:[/[\[\]().,:`]|->/],operator:[/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,/\b(?:eq|neq?|gt|lt|gt?e|lt?e|not|mod|or|and)\b/],keyword:/\b(?:false|off|on|no|true|yes)\b/},n.hooks.add("before-tokenize",function(e){var t=!1;n.languages["markup-templating"].buildPlaceholders(e,"smarty",/\{\*[\s\S]*?\*\}|\{[\s\S]+?\}/g,function(e){return"{/literal}"===e&&(t=!1),!t&&("{literal}"===e&&(t=!0),!0)})}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"smarty")})}(Prism); +!function(e){var n=/\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;e.languages.sml={comment:/\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,string:{pattern:/#?"(?:[^"\\]|\\.)*"/,greedy:!0},"class-name":[{pattern:RegExp("((?:^|[^:]):\\s*)(?:\\s*(?:(?:\\*|->)\\s*|,\\s*(?:(?=)|(?!)\\s+)))*".replace(//g,function(){return"\\s*(?:[*,]|->)"}).replace(//g,function(){return"(?:'[\\w']*||\\((?:[^()]|\\([^()]*\\))*\\)|\\{(?:[^{}]|\\{[^{}]*\\})*\\})(?:\\s+)*"}).replace(//g,function(){return"(?!)[a-z\\d_][\\w'.]*"}).replace(//g,function(){return n.source}),"i"),lookbehind:!0,greedy:!0,inside:null},{pattern:/((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,lookbehind:!0}],function:{pattern:/((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,lookbehind:!0},keyword:n,variable:{pattern:/(^|[^\w'])'[\w']*/,lookbehind:!0},number:/~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,word:{pattern:/\b0w(?:\d+|x[\da-f]+)\b/i,alias:"constant"},boolean:/\b(?:false|true)\b/i,operator:/\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,punctuation:/[(){}\[\].:,;]/},e.languages.sml["class-name"][0].inside=e.languages.sml,e.languages.smlnj=e.languages.sml}(Prism); +Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|string|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|byte|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity; +!function(n){var t={pattern:/\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,alias:"constant",inside:{punctuation:/[{}]/}};n.languages["solution-file"]={comment:{pattern:/#.*/,greedy:!0},string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,greedy:!0,inside:{guid:t}},object:{pattern:/^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,lookbehind:!0,greedy:!0,alias:"keyword"},property:{pattern:/^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,lookbehind:!0,inside:{guid:t}},guid:t,number:/\b\d+(?:\.\d+)*\b/,boolean:/\b(?:FALSE|TRUE)\b/,operator:/=/,punctuation:/[(),]/},n.languages.sln=n.languages["solution-file"]}(Prism); +!function(t){var e=/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,a=/\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;t.languages.soy={comment:[/\/\*[\s\S]*?\*\//,{pattern:/(\s)\/\/.*/,lookbehind:!0,greedy:!0}],"command-arg":{pattern:/(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,lookbehind:!0,alias:"string",inside:{punctuation:/\./}},parameter:{pattern:/(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,lookbehind:!0,alias:"variable"},keyword:[{pattern:/(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,lookbehind:!0},/\b(?:any|as|attributes|bool|css|float|in|int|js|html|list|map|null|number|string|uri)\b/],delimiter:{pattern:/^\{+\/?|\/?\}+$/,alias:"punctuation"},property:/\w+(?==)/,variable:{pattern:/\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,inside:{string:{pattern:e,greedy:!0},number:a,punctuation:/[\[\].?]/}},string:{pattern:e,greedy:!0},function:[/\w+(?=\()/,{pattern:/(\|[^\S\r\n]*)\w+/,lookbehind:!0}],boolean:/\b(?:true|false)\b/,number:a,operator:/\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,punctuation:/[{}()\[\]|.,:]/},t.hooks.add("before-tokenize",function(e){var a=!1;t.languages["markup-templating"].buildPlaceholders(e,"soy",/\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g,function(e){return"{/literal}"===e&&(a=!1),!a&&("{literal}"===e&&(a=!0),!0)})}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"soy")})}(Prism); +Prism.languages.turtle={comment:{pattern:/#.*/,greedy:!0},"multiline-string":{pattern:/"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,greedy:!0,alias:"string",inside:{comment:/#.*/}},string:{pattern:/"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,greedy:!0},url:{pattern:/<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,greedy:!0,inside:{punctuation:/[<>]/}},function:{pattern:/(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,inside:{"local-name":{pattern:/([^:]*:)[\s\S]+/,lookbehind:!0},prefix:{pattern:/[\s\S]+/,inside:{punctuation:/:/}}}},number:/[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[{}.,;()[\]]|\^\^/,boolean:/\b(?:true|false)\b/,keyword:[/(?:\ba|@prefix|@base)\b|=/,/\b(?:graph|base|prefix)\b/i],tag:{pattern:/@[a-z]+(?:-[a-z\d]+)*/i,inside:{punctuation:/@/}}},Prism.languages.trig=Prism.languages.turtle; +Prism.languages.sparql=Prism.languages.extend("turtle",{boolean:/\b(?:true|false)\b/i,variable:{pattern:/[?$]\w+/,greedy:!0}}),Prism.languages.insertBefore("sparql","punctuation",{keyword:[/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|ROUND|REGEX|REPLACE|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,/\b(?:GRAPH|BASE|PREFIX)\b/i]}),Prism.languages.rq=Prism.languages.sparql; +Prism.languages["splunk-spl"]={comment:/`comment\("(?:\\.|[^\\"])*"\)`/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},keyword:/\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,"operator-word":{pattern:/\b(?:and|as|by|not|or|xor)\b/i,alias:"operator"},function:/\b\w+(?=\s*\()/,property:/\b\w+(?=\s*=(?!=))/,date:{pattern:/\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,alias:"number"},number:/\b\d+(?:\.\d+)?\b/,boolean:/\b(?:f|false|t|true)\b/i,operator:/[<>=]=?|[-+*/%|]/,punctuation:/[()[\],]/}; +Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execVM|execFSM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:true|false)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x|this|thisList|thisTrigger)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"]; +Prism.languages.squirrel=Prism.languages.extend("clike",{comment:[Prism.languages.clike.comment[0],{pattern:/(^|[^\\:])(?:\/\/|#).*/,lookbehind:!0,greedy:!0}],string:[{pattern:/(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,lookbehind:!0,greedy:!0}],"class-name":{pattern:/(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,lookbehind:!0,inside:{punctuation:/\./}},keyword:/\b(?:base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield|__LINE__|__FILE__)\b/,number:/\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,operator:/\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,punctuation:/[(){}\[\],;.]/}),Prism.languages.insertBefore("squirrel","operator",{"attribute-punctuation":{pattern:/<\/|\/>/,alias:"important"},lambda:{pattern:/@(?=\()/,alias:"operator"}}); +Prism.languages.stan={comment:/\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,string:{pattern:/"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,greedy:!0},directive:{pattern:/^([ \t]*)#include\b.*/m,lookbehind:!0,alias:"property"},"function-arg":{pattern:/(\b(?:algebra_solver|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect)\s*\(\s*)[a-zA-Z]\w*/,lookbehind:!0,alias:"function"},constraint:{pattern:/(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,lookbehind:!0,inside:{expression:{pattern:/(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,lookbehind:!0,inside:null},property:/\b[a-z]\w*(?=\s*=)/i,operator:/=/,punctuation:/^<|>$|,/}},keyword:[/\b(?:break|cholesky_factor_corr|cholesky_factor_cov|continue|corr_matrix|cov_matrix|data|else|for|functions|generated|if|in|increment_log_prob|int|matrix|model|ordered|parameters|positive_ordered|print|quantities|real|reject|return|row_vector|simplex|target|transformed|unit_vector|vector|void|while)\b/,/\b(?:algebra_solver|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect)\b/],function:/\b[a-z]\w*(?=\s*\()/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,operator:/<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,punctuation:/[()\[\]{},;]/},Prism.languages.stan.constraint.inside.expression.inside=Prism.languages.stan; +Prism.languages.iecst={comment:[{pattern:/(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:GLOBAL|INPUT|PUTPUT|IN_OUT|ACCESS|TEMP|EXTERNAL|CONFIG)|VAR|METHOD|PROPERTY)\b/i,keyword:/\b(?:(?:END_)?(?:IF|WHILE|REPEAT|CASE|FOR)|ELSE|FROM|THEN|ELSIF|DO|TO|BY|PRIVATE|PUBLIC|PROTECTED|CONSTANT|RETURN|EXIT|CONTINUE|GOTO|JMP|AT|RETAIN|NON_RETAIN|TASK|WITH|UNTIL|USING|EXTENDS|IMPLEMENTS|GET|SET|__TRY|__CATCH|__FINALLY|__ENDTRY)\b/,variable:/\b(?:AT|BOOL|BYTE|(?:D|L)?WORD|U?(?:S|D|L)?INT|L?REAL|TIME(?:_OF_DAY)?|TOD|DT|DATE(?:_AND_TIME)?|STRING|ARRAY|ANY|POINTER)\b/,symbol:/%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,number:/\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:T|D|DT|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/,function:/\w+(?=\()/,operator:/(?:S?R?:?=>?|&&?|\*\*?|<=?|>=?|[-:^/+])|\b(?:OR|AND|MOD|NOT|XOR|LE|GE|EQ|NE|GT|LT)\b/,punctuation:/[();]/,type:{pattern:/#/,alias:"selector"}}; +!function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:true|false)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:r,punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(Prism); +Prism.languages.swift=Prism.languages.extend("clike",{string:{pattern:/("|')(?:\\(?:\((?:[^()]|\([^)]+\))+\)|\r\n|[^(])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/\\\((?:[^()]|\([^)]+\))+\)/,inside:{delimiter:{pattern:/^\\\(|\)$/,alias:"variable"}}}}},keyword:/\b(?:actor|as|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonisolated|nonmutating|operator|optional|override|postfix|precedence|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|some|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\b/,number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,constant:/\b(?:nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,atrule:/@\b(?:IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|globalActor|MainActor|noreturn|NS(?:Copying|Managed)|objc|propertyWrapper|UIApplicationMain|auto_closure)\b/,builtin:/\b(?:[A-Z]\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.languages.swift; +!function(n){function i(e,t,a){return{pattern:RegExp("<#"+e+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+e+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:t,alias:a}}}}n.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:function(e){var t=n.languages[e],a="language-"+e;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:i("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:i("=",t,a),"class-feature":i("\\+",t,a),standard:i("",t,a)}}}}})}(Prism); +Prism.languages.t4=Prism.languages["t4-cs"]=Prism.languages["t4-templating"].createT4("csharp"); +Prism.languages.vbnet=Prism.languages.extend("basic",{comment:[{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},{pattern:/(^|[^\\:])'.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(^|[^"])"(?:""|[^"])*"(?!")/i,lookbehind:!0,greedy:!0},keyword:/(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDEC|CDBL|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEFAULT|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LINE INPUT|LET|LIB|LIKE|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPERATOR|OPEN|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHORT|SINGLE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SYNCLOCK|SWAP|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,punctuation:/[,;:(){}]/}); +Prism.languages["t4-vb"]=Prism.languages["t4-templating"].createT4("vbnet"); +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +Prism.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:Prism.languages.yaml,alias:"language-yaml"}}; +Prism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:proc|return|class|error|eval|exit|for|foreach|if|switch|while|break|continue)\b/m,lookbehind:!0},/\b(?:elseif|else)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|Safe_Base|scan|seek|set|socket|source|split|string|subst|Tcl|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|wordBreak(?:After|Before)|test|vars)|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|ne|in|ni)\b/,punctuation:/[{}()\[\]]/}; +!function(t){t.languages.tt2=t.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|TAGS|THROW|TRY|SWITCH|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),t.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|or|not)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),t.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),t.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete t.languages.tt2.string,t.hooks.add("before-tokenize",function(e){t.languages["markup-templating"].buildPlaceholders(e,"tt2",/\[%[\s\S]+?%\]/g)}),t.hooks.add("after-tokenize",function(e){t.languages["markup-templating"].tokenizePlaceholders(e,"tt2")})}(Prism); +!function(n){function e(n,e){return RegExp(n.replace(//g,function(){return"(?:\\([^|()\n]+\\)|\\[[^\\]\n]+\\]|\\{[^}\n]+\\})"}).replace(//g,function(){return"(?:\\)|\\((?![^|()\n]+\\)))"}),e||"")}var i={css:{pattern:/\{[^{}]+\}/,inside:{rest:n.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/},t=n.languages.textile=n.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:e("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:e("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:e("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:e("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:e("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:e("(^|\\|(?:\r?\n|\r)?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:e("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:e("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:e("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:e("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:e("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:e("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:e("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:e("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:e("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:e('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:e('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:e('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:e("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:e("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:e("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:TM|R|C)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),a=t.phrase.inside,o={inline:a.inline,link:a.link,image:a.image,footnote:a.footnote,acronym:a.acronym,mark:a.mark};t.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;var r=a.inline.inside;r.bold.inside=o,r.italic.inside=o,r.inserted.inside=o,r.deleted.inside=o,r.span.inside=o;var d=a.table.inside;d.inline=o.inline,d.link=o.link,d.image=o.image,d.footnote=o.footnote,d.acronym=o.acronym,d.mark=o.mark}(Prism); +!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(Prism); +Prism.languages.twig={comment:/\{#[\s\S]*?#\}/,tag:{pattern:/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}/,inside:{ld:{pattern:/^(?:\{\{-?|\{%-?\s*\w+)/,inside:{punctuation:/^(?:\{\{|\{%)-?/,keyword:/\w+/}},rd:{pattern:/-?(?:%\}|\}\})$/,inside:{punctuation:/.+/}},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:true|false|null)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-xor|b-or|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],property:/\b[a-zA-Z_]\w*\b/,punctuation:/[()\[\]{}:.,]/}},other:{pattern:/\S(?:[\s\S]*\S)?/,inside:Prism.languages.markup}}; +!function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^[0-9]+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b[0-9]+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism); +Prism.languages.unrealscript={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},category:{pattern:/(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,lookbehind:!0,greedy:!0,alias:"property"},metadata:{pattern:/(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,lookbehind:!0,greedy:!0,inside:{property:/\b\w+(?=\s*=)/,operator:/=/,punctuation:/[<>|]/}},macro:{pattern:/`\w+/,alias:"property"},"class-name":{pattern:/(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,lookbehind:!0},keyword:/\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,boolean:/\b(?:false|true)\b/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/>>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:Cross|Dot|ClockwiseFrom)\b/,punctuation:/[()[\]{};,.]/},Prism.languages.uc=Prism.languages.uscript=Prism.languages.unrealscript; +Prism.languages.uri={scheme:{pattern:/^[a-z][a-z0-9+.-]*:/im,greedy:!0,inside:{"scheme-delimiter":/:$/}},fragment:{pattern:/#[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"fragment-delimiter":/^#/}},query:{pattern:/\?[\w\-.~!$&'()*+,;=%:@/?]*/,inside:{"query-delimiter":{pattern:/^\?/,greedy:!0},"pair-delimiter":/[&;]/,pair:{pattern:/^[^=][\s\S]*/,inside:{key:/^[^=]+/,value:{pattern:/(^=)[\s\S]+/,lookbehind:!0}}}}},authority:{pattern:RegExp("^//(?:[\\w\\-.~!$&'()*+,;=%:]*@)?(?:\\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\\.[\\w\\-.~!$&'()*+,;=]+)\\]|[\\w\\-.~!$&'()*+,;=%]*)(?::\\d*)?","m"),inside:{"authority-delimiter":/^\/\//,"user-info-segment":{pattern:/^[\w\-.~!$&'()*+,;=%:]*@/,inside:{"user-info-delimiter":/@$/,"user-info":/^[\w\-.~!$&'()*+,;=%:]+/}},"port-segment":{pattern:/:\d*$/,inside:{"port-delimiter":/^:/,port:/^\d+/}},host:{pattern:/[\s\S]+/,inside:{"ip-literal":{pattern:/^\[[\s\S]+\]$/,inside:{"ip-literal-delimiter":/^\[|\]$/,"ipv-future":/^v[\s\S]+/,"ipv6-address":/^[\s\S]+/}},"ipv4-address":/^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]{0,2})$/}}}},path:{pattern:/^[\w\-.~!$&'()*+,;=%:@/]+/m,inside:{"path-separator":/\//}}},Prism.languages.url=Prism.languages.uri; +!function(e){var n={pattern:/[\s\S]+/,inside:null};e.languages.v=e.languages.extend("clike",{string:[{pattern:/`(?:\\`|\\?[^`]{1,2})`/,alias:"rune"},{pattern:/r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,alias:"quoted-string",greedy:!0,inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,lookbehind:!0,inside:{"interpolation-variable":{pattern:/^\$\w[\s\S]*$/,alias:"variable"},"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},"interpolation-expression":n}}}}],"class-name":{pattern:/(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,lookbehind:!0},keyword:/(?:\b(?:as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|__global|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:if|else|for)|#(?:include|flag))\b/,number:/\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,operator:/~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,builtin:/\b(?:any(?:_int|_float)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|nt|64|128)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/}),n.inside=e.languages.v,e.languages.insertBefore("v","operator",{attribute:{pattern:/(^[\t ]*)\[(?:deprecated|unsafe_fn|typedef|live|inline|flag|ref_only|windows_stdcall|direct_array_access)\]/m,lookbehind:!0,alias:"annotation",inside:{punctuation:/[\[\]]/,keyword:/\w+/}},generic:{pattern:/<\w+>(?=\s*[\)\{])/,inside:{punctuation:/[<>]/,"class-name":/\w+/}}}),e.languages.insertBefore("v","function",{"generic-function":{pattern:/\b\w+\s*<\w+>(?=\()/,inside:{function:/^\w+/,generic:{pattern:/<\w+>/,inside:e.languages.v.generic.inside}}}})}(Prism); +Prism.languages.vala=Prism.languages.extend("clike",{"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new|struct|enum)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],keyword:/\b(?:bool|char|double|float|null|size_t|ssize_t|string|unichar|void|int|int8|int16|int32|int64|long|short|uchar|uint|uint8|uint16|uint32|uint64|ulong|ushort|class|delegate|enum|errordomain|interface|namespace|struct|break|continue|do|for|foreach|return|while|else|if|switch|assert|case|default|abstract|const|dynamic|ensures|extern|inline|internal|override|private|protected|public|requires|signal|static|virtual|volatile|weak|async|owned|unowned|try|catch|finally|throw|as|base|construct|delete|get|in|is|lock|new|out|params|ref|sizeof|set|this|throws|typeof|using|value|var|yield)\b/i,function:/\b\w+(?=\s*\()/,number:/(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,operator:/\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,punctuation:/[{}[\];(),.:]/,constant:/\b[A-Z0-9_]+\b/}),Prism.languages.insertBefore("vala","string",{"raw-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},"template-string":{pattern:/@"[\s\S]*?"/,greedy:!0,inside:{interpolation:{pattern:/\$(?:\([^)]*\)|[a-zA-Z]\w*)/,inside:{delimiter:{pattern:/^\$\(?|\)$/,alias:"punctuation"},rest:Prism.languages.vala}},string:/[\s\S]+/}}}),Prism.languages.insertBefore("vala","keyword",{regex:{pattern:/\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\//,"regex-flags":/^[a-z]+$/}}}); +!function(e){e.languages.velocity=e.languages.extend("markup",{});var n={variable:{pattern:/(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,lookbehind:!0,inside:{}},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},number:/\b\d+\b/,boolean:/\b(?:true|false)\b/,operator:/[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,punctuation:/[(){}[\]:,.]/};n.variable.inside={string:n.string,function:{pattern:/([^\w-])[a-z][\w-]*(?=\()/,lookbehind:!0},number:n.number,boolean:n.boolean,punctuation:n.punctuation},e.languages.insertBefore("velocity","comment",{unparsed:{pattern:/(^|[^\\])#\[\[[\s\S]*?\]\]#/,lookbehind:!0,greedy:!0,inside:{punctuation:/^#\[\[|\]\]#$/}},"velocity-comment":[{pattern:/(^|[^\\])#\*[\s\S]*?\*#/,lookbehind:!0,greedy:!0,alias:"comment"},{pattern:/(^|[^\\])##.*/,lookbehind:!0,greedy:!0,alias:"comment"}],directive:{pattern:/(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,lookbehind:!0,inside:{keyword:{pattern:/^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,inside:{punctuation:/[{}]/}},rest:n}},variable:n.variable}),e.languages.velocity.tag.inside["attr-value"].inside.rest=e.languages.velocity}(Prism); +Prism.languages.verilog={comment:/\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},property:/\B\$\w+\b/,constant:/\B`\w+\b/,function:/\b\w+(?=\()/,keyword:/\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|class|case|casex|casez|cell|chandle|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endspecify|endsequence|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,important:/\b(?:always_latch|always_comb|always_ff|always)\b ?@?/,number:/\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,operator:/[-+{}^~%*\/?=!<>&|]+/,punctuation:/[[\];(),.:]/}; +Prism.languages.vhdl={comment:/--.+/,"vhdl-vectors":{pattern:/\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,alias:"number"},"quoted-function":{pattern:/"\S+?"(?=\()/,alias:"function"},string:/"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,constant:/\b(?:use|library)\b/i,keyword:/\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\b/i,boolean:/\b(?:true|false)\b/i,function:/\w+(?=\()/,number:/'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,operator:/[<>]=?|:=|[-+*/&=]|\b(?:abs|not|mod|rem|sll|srl|sla|sra|rol|ror|and|or|nand|xnor|xor|nor)\b/i,punctuation:/[{}[\];(),.:]/}; +Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; +Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:[^\S\r\n]_[^\S\r\n]*(?:\r\n?|\n)|.)+/i,alias:"comment",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[^\S\r\n]*(?:\d+([/-])\d+\1\d+(?:[^\S\r\n]+(?:\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?))?|\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?)[^\S\r\n]*#/i,alias:"builtin"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:U?[ILS]|[FRD])?/i,boolean:/\b(?:True|False|Nothing)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Until|Xor)\b/i,operator:[/[+\-*/\\^<=>&#@$%!]/,{pattern:/([^\S\r\n])_(?=[^\S\r\n]*[\r\n])/,lookbehind:!0}],punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; +Prism.languages.warpscript={comment:/#.*|\/\/.*|\/\*[\s\S]*?\*\//,string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,greedy:!0},variable:/\$\S+/,macro:{pattern:/@\S+/,alias:"property"},keyword:/\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,number:/[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,boolean:/\b(?:false|true|F|T)\b/,punctuation:/<%|%>|[{}[\]()]/,operator:/==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/}; +Prism.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/}; +Prism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+)[^=\r\n].*?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold-italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0,alias:["bold","italic"]},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:RFC|PMID) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?\}\}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}}); +Prism.languages.wolfram={comment:/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,string:{pattern:/"(?:\\.|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,context:{pattern:/\w+`+\w*/,alias:"class-name"},blank:{pattern:/\b\w+_\b/,alias:"regex"},"global-variable":{pattern:/\$\w+/,alias:"variable"},boolean:/\b(?:True|False)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\^|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[\|{}[\];(),.:]/},Prism.languages.mathematica=Prism.languages.wolfram,Prism.languages.wl=Prism.languages.wolfram,Prism.languages.nb=Prism.languages.wolfram; +!function(n){n.languages.xeora=n.languages.extend("markup",{constant:{pattern:/\$(?:DomainContents|PageRenderDuration)\$/,inside:{punctuation:{pattern:/\$/}}},variable:{pattern:/\$@?(?:#+|[-+*~=^])?[\w.]+\$/,inside:{punctuation:{pattern:/[$.]/},operator:{pattern:/#+|[-+*~=^@]/}}},"function-inline":{pattern:/\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,inside:{variable:{pattern:/(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,inside:{punctuation:{pattern:/[,.|]/},operator:{pattern:/#+|[-+*~=^@]/}}},punctuation:{pattern:/\$\w:|[$:?.,|]/}},alias:"function"},"function-block":{pattern:/\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,inside:{punctuation:{pattern:/[$:{}?.,|]/}},alias:"function"},"directive-inline":{pattern:/\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}}},alias:"function"},"directive-block-open":{pattern:/\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,inside:{punctuation:{pattern:/\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,inside:{tag:{pattern:/#\d/}}},attribute:{pattern:/![A-Z]+$/,inside:{punctuation:{pattern:/!/}},alias:"keyword"}},alias:"function"},"directive-block-separator":{pattern:/\}:[-\w.]+:\{/,inside:{punctuation:{pattern:/[:{}]/}},alias:"function"},"directive-block-close":{pattern:/\}:[-\w.]+\$/,inside:{punctuation:{pattern:/[:{}$]/}},alias:"function"}}),n.languages.insertBefore("inside","punctuation",{variable:n.languages.xeora["function-inline"].inside.variable},n.languages.xeora["function-block"]),n.languages.xeoracube=n.languages.xeora}(Prism); +!function(n){function a(a,e){n.languages[a]&&n.languages.insertBefore(a,"comment",{"doc-comment":e})}var e=n.languages.markup.tag,t={pattern:/\/\/\/.*/,greedy:!0,alias:"comment",inside:{tag:e}},g={pattern:/'''.*/,greedy:!0,alias:"comment",inside:{tag:e}};a("csharp",t),a("fsharp",t),a("vbnet",g)}(Prism); +Prism.languages.xojo={comment:{pattern:/(?:'|\/\/|Rem\b).+/i},string:{pattern:/"(?:""|[^"])*"/,greedy:!0},number:[/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,/&[bchou][a-z\d]+/i],symbol:/#(?:If|Else|ElseIf|Endif|Pragma)\b/i,keyword:/\b(?:AddHandler|App|Array|As(?:signs)?|Auto|By(?:Ref|Val)|Boolean|Break|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:erface|eger|8|16|32|64)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Single|Shared|Short|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:eger|8|16|32|64)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,operator:/<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|Xor|WeakAddressOf)\b/i,punctuation:/[.,;:()]/}; +!function(r){r.languages.xquery=r.languages.extend("markup",{"xquery-comment":{pattern:/\(:[\s\S]*?:\)/,greedy:!0,alias:"comment"},string:{pattern:/(["'])(?:\1\1|(?!\1)[\s\S])*\1/,greedy:!0},extension:{pattern:/\(#.+?#\)/,alias:"symbol"},variable:/\$[-\w:]+/,axis:{pattern:/(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,lookbehind:!0,alias:"operator"},"keyword-operator":{pattern:/(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,lookbehind:!0,alias:"operator"},keyword:{pattern:/(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,lookbehind:!0},function:/[\w-]+(?::[\w-]+)*(?=\s*\()/,"xquery-element":{pattern:/(element\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"tag"},"xquery-attribute":{pattern:/(attribute\s+)[\w-]+(?::[\w-]+)*/,lookbehind:!0,alias:"attr-name"},builtin:{pattern:/(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|ENTITIES|ENTITY|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|ID|IDREFS?|int|integer|language|long|Name|NCName|negativeInteger|NMTOKENS?|nonNegativeInteger|nonPositiveInteger|normalizedString|NOTATION|positiveInteger|QName|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,lookbehind:!0},number:/\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,operator:[/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}],punctuation:/[[\](){},;:/]/}),r.languages.xquery.tag.pattern=/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,r.languages.xquery.tag.inside["attr-value"].pattern=/=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/i,r.languages.xquery.tag.inside["attr-value"].inside.punctuation=/^="|"$/,r.languages.xquery.tag.inside["attr-value"].inside.expression={pattern:/\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,inside:r.languages.xquery,alias:"language-xquery"};var s=function(e){return"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join("")},l=function(e){for(var t=[],n=0;n"===a.content[a.content.length-1].content||t.push({tagName:s(a.content[0].content[1]),openedBraces:0}):!(0|(?:\\[[^[\\]]*\\]|\\*(?!\\*)|\\*\\*)(?:\\s*|\\s*const\\b|\\s*volatile\\b|\\s*allowzero\\b)*)".replace(//g,e(o))+"\\s*)*"+"(?:\\bpromise\\b|(?:\\berror\\.)?(?:\\.)*(?!\\s+))".replace(//g,e(a))+")+";n.languages.zig={comment:[{pattern:/\/{3}.*/,alias:"doc-comment"},/\/{2}.*/],string:[{pattern:/(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,lookbehind:!0,greedy:!0},{pattern:/([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])'(?:[^'\\\r\n]|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,lookbehind:!0,greedy:!0}],builtin:/\B@(?!\d)\w+(?=\s*\()/,label:{pattern:/(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,lookbehind:!0},"class-name":[/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,{pattern:RegExp("(:\\s*)(?=\\s*(?:\\s*)?[=;,)])|(?=\\s*(?:\\s*)?\\{)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null},{pattern:RegExp("(\\)\\s*)(?=\\s*(?:\\s*)?;)".replace(//g,e(s)).replace(//g,e(o))),lookbehind:!0,inside:null}],"builtin-types":{pattern:/\b(?:anyerror|bool|c_u?(?:short|int|long|longlong)|c_longdouble|c_void|comptime_(?:float|int)|[iu](?:8|16|32|64|128|size)|f(?:16|32|64|128)|noreturn|type|void)\b/,alias:"keyword"},keyword:r,function:/\b(?!\d)\w+(?=\s*\()/,number:/\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,boolean:/\b(?:false|true)\b/,operator:/\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,punctuation:/[.:,;(){}[\]]/},n.languages.zig["class-name"].forEach(function(e){null===e.inside&&(e.inside=n.languages.zig)})}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1 /}}}}},Prism.hooks.add("wrap",function(e){if("treeview"===e.language&&"entry-name"===e.type){var t=e.classes,n=/(^|[^\\])\/\s*$/;if(n.test(e.content))e.content=e.content.replace(n,"$1"),t.push("dir");else{e.content=e.content.replace(/(^|[^\\])[=*|]\s*$/,"$1");for(var a=e.content.toLowerCase().replace(/\s+/g,"").split(".");1":">",'"':""","'":"'","`":"`"},Yn=Ln(Wn),Vn=Ln(bn(Wn)),zn=en.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},$n=/\\|'|\r|\n|\u2028|\u2029/g;function Kn(n){return"\\"+Hn[n]}var Jn=/^\s*(\w|\$)+\s*$/;var Xn=0;function Zn(n,t,e,r,u){if(!(r instanceof t))return n.apply(e,u);e=An(n.prototype),u=n.apply(e,u);return m(u)?u:e}var nt=b(function(u,i){var o=nt.placeholder,c=function(){for(var n=0,t=i.length,e=Array(t),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 UU)@XFB>(^b07*qoM6N<$g21E|Bme*a literal 0 HcmV?d00001 diff --git a/packages/renderer/public/video-js.min.css b/packages/renderer/public/video-js.min.css new file mode 100644 index 0000000..be7aeab --- /dev/null +++ b/packages/renderer/public/video-js.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.vjs-modal-dialog .vjs-modal-dialog-content{position:absolute;top:0;left:0;width:100%;height:100%}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.vjs-button>.vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder,.vjs-icon-play{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.vjs-icon-play:before{content:"\f101"}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:"\f102"}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder,.vjs-icon-pause{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before,.vjs-icon-pause:before{content:"\f103"}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder,.vjs-icon-volume-mute{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before,.vjs-icon-volume-mute:before{content:"\f104"}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder,.vjs-icon-volume-low{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before,.vjs-icon-volume-low:before{content:"\f105"}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder,.vjs-icon-volume-mid{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before,.vjs-icon-volume-mid:before{content:"\f106"}.video-js .vjs-mute-control .vjs-icon-placeholder,.vjs-icon-volume-high{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control .vjs-icon-placeholder:before,.vjs-icon-volume-high:before{content:"\f107"}.video-js .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-enter{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-enter:before{content:"\f108"}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-exit{font-family:VideoJS;font-weight:400;font-style:normal}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-exit:before{content:"\f109"}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:"\f10a"}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:"\f10b"}.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.vjs-icon-subtitles{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.vjs-icon-subtitles:before{content:"\f10c"}.video-js .vjs-captions-button .vjs-icon-placeholder,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.vjs-icon-captions{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-captions-button .vjs-icon-placeholder:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.vjs-icon-captions:before{content:"\f10d"}.video-js .vjs-chapters-button .vjs-icon-placeholder,.vjs-icon-chapters{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-chapters-button .vjs-icon-placeholder:before,.vjs-icon-chapters:before{content:"\f10e"}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:"\f10f"}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:"\f110"}.video-js .vjs-play-progress,.video-js .vjs-volume-level,.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before,.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before{content:"\f111"}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:"\f112"}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:"\f113"}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:"\f114"}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder,.vjs-icon-cancel{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before,.vjs-icon-cancel:before{content:"\f115"}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder,.vjs-icon-replay{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before,.vjs-icon-replay:before{content:"\f116"}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:"\f117"}.vjs-icon-gplus{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-gplus:before{content:"\f118"}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:"\f119"}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:"\f11a"}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:"\f11b"}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:"\f11c"}.video-js .vjs-descriptions-button .vjs-icon-placeholder,.vjs-icon-audio-description{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-descriptions-button .vjs-icon-placeholder:before,.vjs-icon-audio-description:before{content:"\f11d"}.video-js .vjs-audio-button .vjs-icon-placeholder,.vjs-icon-audio{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-audio-button .vjs-icon-placeholder:before,.vjs-icon-audio:before{content:"\f11e"}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:"\f11f"}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:"\f120"}.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder,.vjs-icon-picture-in-picture-enter{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before,.vjs-icon-picture-in-picture-enter:before{content:"\f121"}.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder,.vjs-icon-picture-in-picture-exit{font-family:VideoJS;font-weight:400;font-style:normal}.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before,.vjs-icon-picture-in-picture-exit:before{content:"\f122"}.video-js{display:block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:0}.video-js *,.video-js :after,.video-js :before{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.video-js.vjs-1-1,.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-9-16,.video-js.vjs-fluid{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js.vjs-9-16{padding-top:177.7777777778%}.video-js.vjs-1-1{padding-top:100%}.video-js.vjs-fill{width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}body.vjs-full-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen:not(.vjs-ios-native-fs){width:100%!important;height:100%!important;padding-top:0!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:rgba(43,51,63,.7);border-radius:.3em;transition:all .4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-.81666em;margin-left:-1.5em}.video-js .vjs-big-play-button:focus,.video-js:hover .vjs-big-play-button{border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,.5);transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-error .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button{display:block}.video-js button{background:0 0;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.js-focus-visible .vjs-menu li.vjs-menu-item:hover,.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:rgba(115,133,159,.5)}.js-focus-visible .vjs-menu li.vjs-selected:hover,.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.js-focus-visible .vjs-menu :not(.vjs-selected):focus:not(.focus-visible),.video-js .vjs-menu :not(.vjs-selected):focus:not(:focus-visible){background:0 0}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em 0;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0;margin-bottom:1.5em;border-top-color:rgba(43,51,63,.7)}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:rgba(43,51,63,.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-menu-button-popup .vjs-menu.vjs-lock-showing,.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline:hover .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:rgba(43,51,63,.7)}.vjs-has-started .vjs-control-bar{display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;pointer-events:none;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-error .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.vjs-button>.vjs-icon-placeholder{display:block}.video-js .vjs-control:focus,.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before{text-shadow:0 0 1em #fff}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-progress-holder{flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;top:-.3333333333em;z-index:1}.video-js .vjs-load-progress{background:rgba(115,133,159,.5)}.video-js .vjs-load-progress div{background:rgba(115,133,159,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:rgba(255,255,255,.8);border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display{display:none}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em 0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#73859f;background-color:rgba(115,133,159,.5)}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{transition:width 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control,.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control{visibility:visible;opacity:1;position:relative;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em;margin-right:0}.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical{left:-3.5em;transition:left 0s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active{width:10em;transition:width .1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em;visibility:visible;opacity:1;position:relative;transition:none}.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{position:absolute;bottom:3em;left:.5em}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em;z-index:1}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em;z-index:1}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-.3em;right:-.5em}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:rgba(43,51,63,.7)}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.video-js .vjs-volume-tooltip{background-color:#fff;background-color:rgba(255,255,255,.8);border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip,.video-js .vjs-volume-control:hover .vjs-volume-tooltip{display:block;font-size:1em;visibility:visible}.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip,.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip{left:1em;top:-12px}.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip{font-size:1em}.video-js .vjs-volume-control .vjs-mouse-display{display:none;position:absolute;width:100%;height:1px;background-color:#000;z-index:1}.video-js .vjs-volume-horizontal .vjs-mouse-display{width:1px;height:100%}.vjs-no-flex .vjs-volume-control .vjs-mouse-display{z-index:0}.video-js .vjs-volume-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-volume-control .vjs-mouse-display{display:none}.vjs-mouse-display .vjs-volume-tooltip{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.vjs-poster{display:inline-block;vertical-align:middle;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;background-color:#000;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js.vjs-liveui .vjs-live-control,.video-js:not(.vjs-live) .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{align-items:center;cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:.5em;padding-right:.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.vjs-no-flex .vjs-seek-to-live-control{display:table-cell;width:auto;text-align:left}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:.5em;color:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control{display:none}.video-js .vjs-current-time,.vjs-no-flex .vjs-current-time{display:none}.video-js .vjs-duration,.vjs-no-flex .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-live .vjs-time-divider{display:none}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{transform:translateY(-3em)}.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{transform:translateY(-1.5em)}.video-js .vjs-picture-in-picture-control{cursor:pointer;flex:none}.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.vjs-playback-rate .vjs-playback-rate-value,.vjs-playback-rate>.vjs-menu-button{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-error .vjs-error-display:before{color:#fff;content:"X";font-family:Arial,Helvetica,sans-serif;font-size:4em;left:0;line-height:1;margin-top:-.5em;position:absolute;text-shadow:.05em .05em .1em #000;text-align:center;top:50%;vertical-align:middle;width:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:.85;text-align:left;border:6px solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block;-webkit-animation:vjs-spinner-show 0s linear .3s forwards;animation:vjs-spinner-show 0s linear .3s forwards}.vjs-loading-spinner:after,.vjs-loading-spinner:before{content:"";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;-webkit-animation-delay:.44s;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@-webkit-keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{100%{transform:rotate(360deg)}}@-webkit-keyframes vjs-spinner-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}@-webkit-keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js.vjs-layout-small .vjs-current-time,.video-js.vjs-layout-small .vjs-duration,.video-js.vjs-layout-small .vjs-playback-rate,.video-js.vjs-layout-small .vjs-remaining-time,.video-js.vjs-layout-small .vjs-time-divider,.video-js.vjs-layout-small .vjs-volume-control,.video-js.vjs-layout-tiny .vjs-current-time,.video-js.vjs-layout-tiny .vjs-duration,.video-js.vjs-layout-tiny .vjs-playback-rate,.video-js.vjs-layout-tiny .vjs-remaining-time,.video-js.vjs-layout-tiny .vjs-time-divider,.video-js.vjs-layout-tiny .vjs-volume-control,.video-js.vjs-layout-x-small .vjs-current-time,.video-js.vjs-layout-x-small .vjs-duration,.video-js.vjs-layout-x-small .vjs-playback-rate,.video-js.vjs-layout-x-small .vjs-remaining-time,.video-js.vjs-layout-x-small .vjs-time-divider,.video-js.vjs-layout-x-small .vjs-volume-control{display:none}.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover{width:auto;width:initial}.video-js.vjs-layout-tiny .vjs-progress-control,.video-js.vjs-layout-x-small .vjs-progress-control{display:none}.video-js.vjs-layout-x-small .vjs-custom-control-spacer{flex:auto;display:block}.video-js.vjs-layout-x-small.vjs-no-flex .vjs-custom-control-spacer{width:auto}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:rgba(43,51,63,.75);color:#fff;height:70%}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-controls,.vjs-text-track-settings .vjs-track-settings-font{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display:grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0 24px}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-track-setting>select{margin-right:1em;margin-bottom:.5em}.vjs-text-track-settings fieldset{margin:5px;padding:3px;border:none}.vjs-text-track-settings fieldset span{display:inline-block}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;margin:0 0 5px 0}.vjs-text-track-settings .vjs-label{position:absolute;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);display:block;margin:0 0 5px 0;padding:0;border:0;height:1px;width:1px;overflow:hidden}.vjs-track-settings-controls button:active,.vjs-track-settings-controls button:focus{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,#73859f 100%)}.vjs-track-settings-controls button:hover{color:rgba(43,51,63,.75)}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,#73859f 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}@media print{.video-js>:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js :focus:not(.focus-visible){outline:0}.video-js :focus:not(:focus-visible){outline:0} \ No newline at end of file diff --git a/packages/renderer/public/video.min.js b/packages/renderer/public/video.min.js new file mode 100644 index 0000000..eac3058 --- /dev/null +++ b/packages/renderer/public/video.min.js @@ -0,0 +1,25 @@ +/** + * @license + * Video.js 7.18.1 + * Copyright Brightcove, Inc. + * Available under Apache License Version 2.0 + * + * + * Includes vtt.js + * Available under Apache License Version 2.0 + * + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).videojs=t()}(this,function(){"use strict";for(var e,u="7.18.1",i={},a=function(e,t){return i[e]=i[e]||[],t&&(i[e]=i[e].concat(t)),i[e]},n=function(e,t){t=a(e).indexOf(t);return!(t<=-1)&&(i[e]=i[e].slice(),i[e].splice(t,1),!0)},l={prefixed:!0},t=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror","fullscreen"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror","-webkit-full-screen"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror","-moz-full-screen"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError","-ms-fullscreen"]],r=t[0],s=0;s + * Copyright (c) 2014 David Björklund + * Available under the MIT license + * + */ +var $t=function(e){var n={};return e&&e.trim().split("\n").forEach(function(e){var t=e.indexOf(":"),i=e.slice(0,t).trim().toLowerCase(),t=e.slice(t+1).trim();"undefined"==typeof n[i]?n[i]=t:Array.isArray(n[i])?n[i].push(t):n[i]=[n[i],t]}),n},Jt=ei,I=ei;function Zt(e,t,i){var n=e;return Yt(t)?(i=t,"string"==typeof e&&(n={uri:e})):n=g({},t,{uri:e}),n.callback=i,n}function ei(e,t,i){return ti(t=Zt(e,t,i))}function ti(n){if("undefined"==typeof n.callback)throw new Error("callback argument missing");var r=!1,a=function(e,t,i){r||(r=!0,n.callback(e,t,i))};function s(){var e=void 0,e=l.response||l.responseText||function(e){try{if("document"===e.responseType)return e.responseXML;var t=e.responseXML&&"parsererror"===e.responseXML.documentElement.nodeName;if(""===e.responseType&&!t)return e.responseXML}catch(e){}return null}(l);if(m)try{e=JSON.parse(e)}catch(e){}return e}function t(e){return clearTimeout(u),(e=!(e instanceof Error)?new Error(""+(e||"Unknown XMLHttpRequest Error")):e).statusCode=0,a(e,g)}function e(){if(!o){clearTimeout(u);var e=n.useXDR&&void 0===l.status?200:1223===l.status?204:l.status,t=g,i=null;return 0!==e?(t={body:s(),statusCode:e,method:d,headers:{},url:c,rawRequest:l},l.getAllResponseHeaders&&(t.headers=$t(l.getAllResponseHeaders()))):i=new Error("Internal XMLHttpRequest Error"),a(i,t,t.body)}}var i,o,u,l=n.xhr||null,c=(l=l||new(n.cors||n.useXDR?ei.XDomainRequest:ei.XMLHttpRequest)).url=n.uri||n.url,d=l.method=n.method||"GET",h=n.body||n.data,p=l.headers=n.headers||{},f=!!n.sync,m=!1,g={body:void 0,headers:{},statusCode:0,method:d,url:c,rawRequest:l};if("json"in n&&!1!==n.json&&(m=!0,p.accept||p.Accept||(p.Accept="application/json"),"GET"!==d&&"HEAD"!==d&&(p["content-type"]||p["Content-Type"]||(p["Content-Type"]="application/json"),h=JSON.stringify(!0===n.json?h:n.json))),l.onreadystatechange=function(){4===l.readyState&&setTimeout(e,0)},l.onload=e,l.onerror=t,l.onprogress=function(){},l.onabort=function(){o=!0},l.ontimeout=t,l.open(d,c,!f,n.username,n.password),f||(l.withCredentials=!!n.withCredentials),!f&&0=e||r.startTime===r.endTime&&r.startTime<=e&&r.startTime+.5>=e)&&t.push(r)}if(o=!1,t.length!==this.activeCues_.length)o=!0;else for(var a=0;a]*>?)?/);return e=e[1]||e[2],t=t.substr(e.length),e}());)"<"!==i[0]?p.appendChild(e.document.createTextNode((s=i,yi.innerHTML=s,s=yi.textContent,yi.textContent="",s))):"/"!==i[1]?(a=pi(i.substr(1,i.length-2)))?(n=e.document.createProcessingInstruction("timestamp",a),p.appendChild(n)):(r=i.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/))&&(l=r[1],c=r[3],d=void 0,d=vi[l],(n=d?(d=e.document.createElement(d),(l=bi[l])&&c&&(d[l]=c.trim()),d):null)&&(o=p,Ti[(u=n).localName]&&Ti[u.localName]!==o.localName||(r[2]&&((a=r[2].split(".")).forEach(function(e){var t=/^bg_/.test(e),e=t?e.slice(3):e;_i.hasOwnProperty(e)&&(e=_i[e],n.style[t?"background-color":"color"]=e)}),n.className=a.join(" ")),f.push(r[1]),p.appendChild(n),p=n))):f.length&&f[f.length-1]===i.substr(2).replace(">","")&&(f.pop(),p=p.parentNode);return h}var wi=[[1470,1470],[1472,1472],[1475,1475],[1478,1478],[1488,1514],[1520,1524],[1544,1544],[1547,1547],[1549,1549],[1563,1563],[1566,1610],[1645,1647],[1649,1749],[1765,1766],[1774,1775],[1786,1805],[1807,1808],[1810,1839],[1869,1957],[1969,1969],[1984,2026],[2036,2037],[2042,2042],[2048,2069],[2074,2074],[2084,2084],[2088,2088],[2096,2110],[2112,2136],[2142,2142],[2208,2208],[2210,2220],[8207,8207],[64285,64285],[64287,64296],[64298,64310],[64312,64316],[64318,64318],[64320,64321],[64323,64324],[64326,64449],[64467,64829],[64848,64911],[64914,64967],[65008,65020],[65136,65140],[65142,65276],[67584,67589],[67592,67592],[67594,67637],[67639,67640],[67644,67644],[67647,67669],[67671,67679],[67840,67867],[67872,67897],[67903,67903],[67968,68023],[68030,68031],[68096,68096],[68112,68115],[68117,68119],[68121,68147],[68160,68167],[68176,68184],[68192,68223],[68352,68405],[68416,68437],[68440,68466],[68472,68479],[68608,68680],[126464,126467],[126469,126495],[126497,126498],[126500,126500],[126503,126503],[126505,126514],[126516,126519],[126521,126521],[126523,126523],[126530,126530],[126535,126535],[126537,126537],[126539,126539],[126541,126543],[126545,126546],[126548,126548],[126551,126551],[126553,126553],[126555,126555],[126557,126557],[126559,126559],[126561,126562],[126564,126564],[126567,126570],[126572,126578],[126580,126583],[126585,126588],[126590,126590],[126592,126601],[126603,126619],[126625,126627],[126629,126633],[126635,126651],[1114109,1114109]];function Ei(e){var t=[],i="";if(!e||!e.childNodes)return"ltr";function a(e,t){for(var i=t.childNodes.length-1;0<=i;i--)e.push(t.childNodes[i])}for(a(t,e);i=function e(t){if(!t||!t.length)return null;var i=t.pop(),n=i.textContent||i.innerText;if(n){var r=n.match(/^.*(\n|\r)/);return r?r[t.length=0]:n}return"ruby"===i.tagName?e(t):i.childNodes?(a(t,i),e(t)):void 0}(t);)for(var n=0;n=i[0]&&e<=i[1])return 1}}(i.charCodeAt(n)))return"rtl";return"ltr"}function ki(){}function Ci(e,t,i){ki.call(this),this.cue=t,this.cueDiv=Si(e,t.text);var n={color:"rgba(255, 255, 255, 1)",backgroundColor:"rgba(0, 0, 0, 0.8)",position:"relative",left:0,right:0,top:0,bottom:0,display:"inline",writingMode:""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",unicodeBidi:"plaintext"};this.applyStyles(n,this.cueDiv),this.div=e.document.createElement("div"),n={direction:Ei(this.cueDiv),writingMode:""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",unicodeBidi:"plaintext",textAlign:"middle"===t.align?"center":t.align,font:i.font,whiteSpace:"pre-line",position:"absolute"},this.applyStyles(n),this.div.appendChild(this.cueDiv);var r=0;switch(t.positionAlign){case"start":r=t.position;break;case"center":r=t.position-t.size/2;break;case"end":r=t.position-t.size}""===t.vertical?this.applyStyles({left:this.formatStyle(r,"%"),width:this.formatStyle(t.size,"%")}):this.applyStyles({top:this.formatStyle(r,"%"),height:this.formatStyle(t.size,"%")}),this.move=function(e){this.applyStyles({top:this.formatStyle(e.top,"px"),bottom:this.formatStyle(e.bottom,"px"),left:this.formatStyle(e.left,"px"),right:this.formatStyle(e.right,"px"),height:this.formatStyle(e.height,"px"),width:this.formatStyle(e.width,"px")})}}function Ii(e){var t,i,n,r;e.div&&(t=e.div.offsetHeight,i=e.div.offsetWidth,n=e.div.offsetTop,r=(r=e.div.childNodes)&&(r=r[0])&&r.getClientRects&&r.getClientRects(),e=e.div.getBoundingClientRect(),r=r?Math.max(r[0]&&r[0].height||0,e.height/r.length):0),this.left=e.left,this.right=e.right,this.top=e.top||n,this.height=e.height||t,this.bottom=e.bottom||n+(e.height||t),this.width=e.width||i,this.lineHeight=void 0!==r?r:e.lineHeight}function xi(e,t,o,u){var i,n=new Ii(t),r=t.cue,a=function(e){if("number"==typeof e.line&&(e.snapToLines||0<=e.line&&e.line<=100))return e.line;if(!e.track||!e.track.textTrackList||!e.track.textTrackList.mediaElement)return-1;for(var t=e.track,i=t.textTrackList,n=0,r=0;rd&&(c=c<0?-1:1,c*=Math.ceil(d/l)*l),a<0&&(c+=""===r.vertical?o.height:o.width,s=s.reverse()),n.move(h,c)}else{var p=n.lineHeight/o.height*100;switch(r.lineAlign){case"center":a-=p/2;break;case"end":a-=p}switch(r.vertical){case"":t.applyStyles({top:t.formatStyle(a,"%")});break;case"rl":t.applyStyles({left:t.formatStyle(a,"%")});break;case"lr":t.applyStyles({right:t.formatStyle(a,"%")})}s=["+y","-x","+x","-y"],n=new Ii(t)}n=function(e,t){for(var i,n=new Ii(e),r=1,a=0;ae.left&&this.tope.top},Ii.prototype.overlapsAny=function(e){for(var t=0;t=e.top&&this.bottom<=e.bottom&&this.left>=e.left&&this.right<=e.right},Ii.prototype.overlapsOppositeAxis=function(e,t){switch(t){case"+x":return this.lefte.right;case"+y":return this.tope.bottom}},Ii.prototype.intersectPercentage=function(e){return Math.max(0,Math.min(this.right,e.right)-Math.max(this.left,e.left))*Math.max(0,Math.min(this.bottom,e.bottom)-Math.max(this.top,e.top))/(this.height*this.width)},Ii.prototype.toCSSCompatValues=function(e){return{top:this.top-e.top,bottom:e.bottom-this.bottom,left:this.left-e.left,right:e.right-this.right,height:this.height,width:this.width}},Ii.getSimpleBoxPosition=function(e){var t=e.div?e.div.offsetHeight:e.tagName?e.offsetHeight:0,i=e.div?e.div.offsetWidth:e.tagName?e.offsetWidth:0,n=e.div?e.div.offsetTop:e.tagName?e.offsetTop:0;return{left:(e=e.div?e.div.getBoundingClientRect():e.tagName?e.getBoundingClientRect():e).left,right:e.right,top:e.top||n,height:e.height||t,bottom:e.bottom||n+(e.height||t),width:e.width||i}},Ai.StringDecoder=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}},Ai.convertCueToDOMTree=function(e,t){return e&&t?Si(e,t):null};Ai.processCues=function(n,r,e){if(!n||!r||!e)return null;for(;e.firstChild;)e.removeChild(e.firstChild);var a=n.document.createElement("div");if(a.style.position="absolute",a.style.left="0",a.style.right="0",a.style.top="0",a.style.bottom="0",a.style.margin="1.5%",e.appendChild(a),function(e){for(var t=0;tt.length;u--)l.el_.removeChild(n[u-1]);n.length=t.length})},e}(pt)),pt.registerComponent("TimeTooltip",function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=We(Ve(ft(t),t.update),30),t}mt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-time-tooltip"},{"aria-hidden":"true"})},t.update=function(e,t,i){var n=he(this.el_),r=de(this.player_.el()),a=e.width*t;r&&n&&(t=e.left-r.left+a,r=e.width-a+(r.right-e.right),t<(e=n.width/2)?e+=e-t:rn.width&&(e=n.width),e=Math.round(e),this.el_.style.right="-"+e+"px",this.write(i))},t.write=function(e){J(this.el_,e)},t.updateTime=function(n,r,a,s){var o=this;this.requestNamedAnimationFrame("TimeTooltip#updateTime",function(){var e,t,i=o.player_.duration();i=o.player_.liveTracker&&o.player_.liveTracker.isLive()?((t=(e=o.player_.liveTracker.liveWindow())-r*e)<1?"":"-")+ln(t,e):ln(a,i),o.update(n,r,i),s&&s()})},e}(pt));Xt=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=We(Ve(ft(t),t.update),30),t}mt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar"},{"aria-hidden":"true"})},t.update=function(e,t){var i,n=this.getChild("timeTooltip");n&&(i=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),n.updateTime(e,t,i))},e}(pt);Xt.prototype.options_={children:[]},q||A||Xt.prototype.options_.children.push("timeTooltip"),pt.registerComponent("PlayProgressBar",Xt);I=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=We(Ve(ft(t),t.update),30),t}mt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},t.update=function(e,t){var i=this,n=t*this.player_.duration();this.getChild("timeTooltip").updateTime(e,t,n,function(){i.el_.style.left=e.width*t+"px"})},e}(pt);I.prototype.options_={children:["timeTooltip"]},pt.registerComponent("MouseTimeDisplay",I);Bt=function(a){function e(e,t){t=a.call(this,e,t)||this;return t.setEventHandlers_(),t}mt(e,a);var t=e.prototype;return t.setEventHandlers_=function(){var t=this;this.update_=Ve(this,this.update),this.update=We(this.update_,30),this.on(this.player_,["ended","durationchange","timeupdate"],this.update),this.player_.liveTracker&&this.on(this.player_.liveTracker,"liveedgechange",this.update),this.updateInterval=null,this.enableIntervalHandler_=function(e){return t.enableInterval_(e)},this.disableIntervalHandler_=function(e){return t.disableInterval_(e)},this.on(this.player_,["playing"],this.enableIntervalHandler_),this.on(this.player_,["ended","pause","waiting"],this.disableIntervalHandler_),"hidden"in document&&"visibilityState"in document&&this.on(document,"visibilitychange",this.toggleVisibility_)},t.toggleVisibility_=function(e){"hidden"===document.visibilityState?(this.cancelNamedAnimationFrame("SeekBar#update"),this.cancelNamedAnimationFrame("Slider#update"),this.disableInterval_(e)):(this.player_.ended()||this.player_.paused()||this.enableInterval_(),this.update())},t.enableInterval_=function(){this.updateInterval||(this.updateInterval=this.setInterval(this.update,30))},t.disableInterval_=function(e){this.player_.liveTracker&&this.player_.liveTracker.isLive()&&e&&"ended"!==e.type||this.updateInterval&&(this.clearInterval(this.updateInterval),this.updateInterval=null)},t.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":this.localize("Progress Bar")})},t.update=function(e){var n=this;if("hidden"!==document.visibilityState){var r=a.prototype.update.call(this);return this.requestNamedAnimationFrame("SeekBar#update",function(){var e=n.player_.ended()?n.player_.duration():n.getCurrentTime_(),t=n.player_.liveTracker,i=n.player_.duration();t&&t.isLive()&&(i=n.player_.liveTracker.liveCurrentTime()),n.percent_!==r&&(n.el_.setAttribute("aria-valuenow",(100*r).toFixed(2)),n.percent_=r),n.currentTime_===e&&n.duration_===i||(n.el_.setAttribute("aria-valuetext",n.localize("progress bar timing: currentTime={1} duration={2}",[ln(e,i),ln(i,i)],"{1} of {2}")),n.currentTime_=e,n.duration_=i),n.bar&&n.bar.update(de(n.el()),n.getProgress())}),r}},t.userSeek_=function(e){this.player_.liveTracker&&this.player_.liveTracker.isLive()&&this.player_.liveTracker.nextSeekedFromUser(),this.player_.currentTime(e)},t.getCurrentTime_=function(){return this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime()},t.getPercent=function(){var e,t=this.getCurrentTime_(),i=this.player_.liveTracker;return i&&i.isLive()?(e=(t-i.seekableStart())/i.liveWindow(),i.atLiveEdge()&&(e=1)):e=t/this.player_.duration(),e},t.handleMouseDown=function(e){_e(e)&&(e.stopPropagation(),this.videoWasPlaying=!this.player_.paused(),this.player_.pause(),a.prototype.handleMouseDown.call(this,e))},t.handleMouseMove=function(e,t){if(void 0===t&&(t=!1),_e(e)){t||this.player_.scrubbing()||this.player_.scrubbing(!0);var i=this.calculateDistance(e),n=this.player_.liveTracker;if(n&&n.isLive()){if(.99<=i)return void n.seekToLiveEdge();var r,t=n.seekableStart(),e=n.liveCurrentTime();if((r=(r=e<=(r=t+i*n.liveWindow())?e:r)<=t?t+.1:r)===1/0)return}else(r=i*this.player_.duration())===this.player_.duration()&&(r-=.1);this.userSeek_(r)}},t.enable=function(){a.prototype.enable.call(this);var e=this.getChild("mouseTimeDisplay");e&&e.show()},t.disable=function(){a.prototype.disable.call(this);var e=this.getChild("mouseTimeDisplay");e&&e.hide()},t.handleMouseUp=function(e){a.prototype.handleMouseUp.call(this,e),e&&e.stopPropagation(),this.player_.scrubbing(!1),this.player_.trigger({type:"timeupdate",target:this,manuallyTriggered:!0}),this.videoWasPlaying?Et(this.player_.play()):this.update_()},t.stepForward=function(){this.userSeek_(this.player_.currentTime()+5)},t.stepBack=function(){this.userSeek_(this.player_.currentTime()-5)},t.handleAction=function(e){this.player_.paused()?this.player_.play():this.player_.pause()},t.handleKeyDown=function(e){var t,i=this.player_.liveTracker;ht.isEventKey(e,"Space")||ht.isEventKey(e,"Enter")?(e.preventDefault(),e.stopPropagation(),this.handleAction(e)):ht.isEventKey(e,"Home")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(0)):ht.isEventKey(e,"End")?(e.preventDefault(),e.stopPropagation(),i&&i.isLive()?this.userSeek_(i.liveCurrentTime()):this.userSeek_(this.player_.duration())):/^[0-9]$/.test(ht(e))?(e.preventDefault(),e.stopPropagation(),t=10*(ht.codes[ht(e)]-ht.codes[0])/100,i&&i.isLive()?this.userSeek_(i.seekableStart()+i.liveWindow()*t):this.userSeek_(this.player_.duration()*t)):ht.isEventKey(e,"PgDn")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(this.player_.currentTime()-60)):ht.isEventKey(e,"PgUp")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(this.player_.currentTime()+60)):a.prototype.handleKeyDown.call(this,e)},t.dispose=function(){this.disableInterval_(),this.off(this.player_,["ended","durationchange","timeupdate"],this.update),this.player_.liveTracker&&this.off(this.player_.liveTracker,"liveedgechange",this.update),this.off(this.player_,["playing"],this.enableIntervalHandler_),this.off(this.player_,["ended","pause","waiting"],this.disableIntervalHandler_),"hidden"in document&&"visibilityState"in document&&this.off(document,"visibilitychange",this.toggleVisibility_),a.prototype.dispose.call(this)},e}(li);Bt.prototype.options_={children:["loadProgressBar","playProgressBar"],barName:"playProgressBar"},q||A||Bt.prototype.options_.children.splice(1,0,"mouseTimeDisplay"),pt.registerComponent("SeekBar",Bt);Ft=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.handleMouseMove=We(Ve(ft(i),i.handleMouseMove),30),i.throttledHandleMouseSeek=We(Ve(ft(i),i.handleMouseSeek),30),i.handleMouseUpHandler_=function(e){return i.handleMouseUp(e)},i.handleMouseDownHandler_=function(e){return i.handleMouseDown(e)},i.enable(),i}mt(e,n);var t=e.prototype;return t.createEl=function(){return n.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},t.handleMouseMove=function(e){var t,i,n,r,a=this.getChild("seekBar");a&&(t=a.getChild("playProgressBar"),i=a.getChild("mouseTimeDisplay"),(t||i)&&(r=he(n=a.el()),e=pe(n,e).x,e=cn(e,0,1),i&&i.update(r,e),t&&t.update(r,a.getProgress())))},t.handleMouseSeek=function(e){var t=this.getChild("seekBar");t&&t.handleMouseMove(e)},t.enabled=function(){return this.enabled_},t.disable=function(){var e;this.children().forEach(function(e){return e.disable&&e.disable()}),this.enabled()&&(this.off(["mousedown","touchstart"],this.handleMouseDownHandler_),this.off(this.el_,"mousemove",this.handleMouseMove),this.removeListenersAddedOnMousedownAndTouchstart(),this.addClass("disabled"),this.enabled_=!1,this.player_.scrubbing()&&(e=this.getChild("seekBar"),this.player_.scrubbing(!1),e.videoWasPlaying&&Et(this.player_.play())))},t.enable=function(){this.children().forEach(function(e){return e.enable&&e.enable()}),this.enabled()||(this.on(["mousedown","touchstart"],this.handleMouseDownHandler_),this.on(this.el_,"mousemove",this.handleMouseMove),this.removeClass("disabled"),this.enabled_=!0)},t.removeListenersAddedOnMousedownAndTouchstart=function(){var e=this.el_.ownerDocument;this.off(e,"mousemove",this.throttledHandleMouseSeek),this.off(e,"touchmove",this.throttledHandleMouseSeek),this.off(e,"mouseup",this.handleMouseUpHandler_),this.off(e,"touchend",this.handleMouseUpHandler_)},t.handleMouseDown=function(e){var t=this.el_.ownerDocument,i=this.getChild("seekBar");i&&i.handleMouseDown(e),this.on(t,"mousemove",this.throttledHandleMouseSeek),this.on(t,"touchmove",this.throttledHandleMouseSeek),this.on(t,"mouseup",this.handleMouseUpHandler_),this.on(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseUp=function(e){var t=this.getChild("seekBar");t&&t.handleMouseUp(e),this.removeListenersAddedOnMousedownAndTouchstart()},e}(pt);Ft.prototype.options_={children:["seekBar"]},pt.registerComponent("ProgressControl",Ft);jt=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on(e,["enterpictureinpicture","leavepictureinpicture"],function(e){return i.handlePictureInPictureChange(e)}),i.on(e,["disablepictureinpicturechanged","loadedmetadata"],function(e){return i.handlePictureInPictureEnabledChange(e)}),i.disable(),i}mt(e,n);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-picture-in-picture-control "+n.prototype.buildCSSClass.call(this)},t.handlePictureInPictureEnabledChange=function(){document.pictureInPictureEnabled&&!1===this.player_.disablePictureInPicture()?this.enable():this.disable()},t.handlePictureInPictureChange=function(e){this.player_.isInPictureInPicture()?this.controlText("Exit Picture-in-Picture"):this.controlText("Picture-in-Picture"),this.handlePictureInPictureEnabledChange()},t.handleClick=function(e){this.player_.isInPictureInPicture()?this.player_.exitPictureInPicture():this.player_.requestPictureInPicture()},e}(sn);jt.prototype.controlText_="Picture-in-Picture",pt.registerComponent("PictureInPictureToggle",jt);j=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on(e,"fullscreenchange",function(e){return i.handleFullscreenChange(e)}),!1===document[e.fsApi_.fullscreenEnabled]&&i.disable(),i}mt(e,n);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-fullscreen-control "+n.prototype.buildCSSClass.call(this)},t.handleFullscreenChange=function(e){this.player_.isFullscreen()?this.controlText("Non-Fullscreen"):this.controlText("Fullscreen")},t.handleClick=function(e){this.player_.isFullscreen()?this.player_.exitFullscreen():this.player_.requestFullscreen()},e}(sn);j.prototype.controlText_="Fullscreen",pt.registerComponent("FullscreenToggle",j);pt.registerComponent("VolumeLevel",function(t){function e(){return t.apply(this,arguments)||this}return mt(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-volume-level"});return e.appendChild(t.prototype.createEl.call(this,"span",{className:"vjs-control-text"})),e},e}(pt)),pt.registerComponent("VolumeLevelTooltip",function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=We(Ve(ft(t),t.update),30),t}mt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-volume-tooltip"},{"aria-hidden":"true"})},t.update=function(e,t,i,n){if(!i){var r=de(this.el_),a=de(this.player_.el()),i=e.width*t;if(!a||!r)return;t=e.left-a.left+i,a=e.width-i+(a.right-e.right),e=r.width/2;tr.width&&(e=r.width),this.el_.style.right="-"+e+"px"}this.write(n+"%")},t.write=function(e){J(this.el_,e)},t.updateVolume=function(e,t,i,n,r){var a=this;this.requestNamedAnimationFrame("VolumeLevelTooltip#updateVolume",function(){a.update(e,t,i,n.toFixed(0)),r&&r()})},e}(pt));k=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=We(Ve(ft(t),t.update),30),t}mt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},t.update=function(e,t,i){var n=this,r=100*t;this.getChild("volumeLevelTooltip").updateVolume(e,t,i,r,function(){i?n.el_.style.bottom=e.height*t+"px":n.el_.style.left=e.width*t+"px"})},e}(pt);k.prototype.options_={children:["volumeLevelTooltip"]},pt.registerComponent("MouseVolumeLevelDisplay",k);f=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on("slideractive",function(e){return i.updateLastVolume_(e)}),i.on(e,"volumechange",function(e){return i.updateARIAAttributes(e)}),e.ready(function(){return i.updateARIAAttributes()}),i}mt(e,n);var t=e.prototype;return t.createEl=function(){return n.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":this.localize("Volume Level"),"aria-live":"polite"})},t.handleMouseDown=function(e){_e(e)&&n.prototype.handleMouseDown.call(this,e)},t.handleMouseMove=function(e){var t,i,n,r=this.getChild("mouseVolumeLevelDisplay");r&&(t=de(n=this.el()),i=this.vertical(),n=pe(n,e),n=i?n.y:n.x,n=cn(n,0,1),r.update(t,n,i)),_e(e)&&(this.checkMuted(),this.player_.volume(this.calculateDistance(e)))},t.checkMuted=function(){this.player_.muted()&&this.player_.muted(!1)},t.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},t.stepForward=function(){this.checkMuted(),this.player_.volume(this.player_.volume()+.1)},t.stepBack=function(){this.checkMuted(),this.player_.volume(this.player_.volume()-.1)},t.updateARIAAttributes=function(e){var t=this.player_.muted()?0:this.volumeAsPercentage_();this.el_.setAttribute("aria-valuenow",t),this.el_.setAttribute("aria-valuetext",t+"%")},t.volumeAsPercentage_=function(){return Math.round(100*this.player_.volume())},t.updateLastVolume_=function(){var e=this,t=this.player_.volume();this.one("sliderinactive",function(){0===e.player_.volume()&&e.player_.lastVolume_(t)})},e}(li);f.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},q||A||f.prototype.options_.children.splice(0,0,"mouseVolumeLevelDisplay"),f.prototype.playerEvent="volumechange",pt.registerComponent("VolumeBar",f);ui=function(a){function e(e,t){var i,n,r;return(t=void 0===t?{}:t).vertical=t.vertical||!1,"undefined"!=typeof t.volumeBar&&!S(t.volumeBar)||(t.volumeBar=t.volumeBar||{},t.volumeBar.vertical=t.vertical),i=a.call(this,e,t)||this,n=ft(i),(r=e).tech_&&!r.tech_.featuresVolumeControl&&n.addClass("vjs-hidden"),n.on(r,"loadstart",function(){r.tech_.featuresVolumeControl?n.removeClass("vjs-hidden"):n.addClass("vjs-hidden")}),i.throttledHandleMouseMove=We(Ve(ft(i),i.handleMouseMove),30),i.handleMouseUpHandler_=function(e){return i.handleMouseUp(e)},i.on("mousedown",function(e){return i.handleMouseDown(e)}),i.on("touchstart",function(e){return i.handleMouseDown(e)}),i.on("mousemove",function(e){return i.handleMouseMove(e)}),i.on(i.volumeBar,["focus","slideractive"],function(){i.volumeBar.addClass("vjs-slider-active"),i.addClass("vjs-slider-active"),i.trigger("slideractive")}),i.on(i.volumeBar,["blur","sliderinactive"],function(){i.volumeBar.removeClass("vjs-slider-active"),i.removeClass("vjs-slider-active"),i.trigger("sliderinactive")}),i}mt(e,a);var t=e.prototype;return t.createEl=function(){var e="vjs-volume-horizontal";return this.options_.vertical&&(e="vjs-volume-vertical"),a.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control "+e})},t.handleMouseDown=function(e){var t=this.el_.ownerDocument;this.on(t,"mousemove",this.throttledHandleMouseMove),this.on(t,"touchmove",this.throttledHandleMouseMove),this.on(t,"mouseup",this.handleMouseUpHandler_),this.on(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseUp=function(e){var t=this.el_.ownerDocument;this.off(t,"mousemove",this.throttledHandleMouseMove),this.off(t,"touchmove",this.throttledHandleMouseMove),this.off(t,"mouseup",this.handleMouseUpHandler_),this.off(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseMove=function(e){this.volumeBar.handleMouseMove(e)},e}(pt);ui.prototype.options_={children:["volumeBar"]},pt.registerComponent("VolumeControl",ui);Xt=function(a){function e(e,t){var i,n,r=a.call(this,e,t)||this;return i=ft(r),(n=e).tech_&&!n.tech_.featuresMuteControl&&i.addClass("vjs-hidden"),i.on(n,"loadstart",function(){n.tech_.featuresMuteControl?i.removeClass("vjs-hidden"):i.addClass("vjs-hidden")}),r.on(e,["loadstart","volumechange"],function(e){return r.update(e)}),r}mt(e,a);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-mute-control "+a.prototype.buildCSSClass.call(this)},t.handleClick=function(e){var t=this.player_.volume(),i=this.player_.lastVolume_();0===t?(this.player_.volume(i<.1?.1:i),this.player_.muted(!1)):this.player_.muted(!this.player_.muted())},t.update=function(e){this.updateIcon_(),this.updateControlText_()},t.updateIcon_=function(){var e=this.player_.volume(),t=3;q&&this.player_.tech_&&this.player_.tech_.el_&&this.player_.muted(this.player_.tech_.el_.muted),0===e||this.player_.muted()?t=0:e<.33?t=1:e<.67&&(t=2);for(var i=0;i<4;i++)ie(this.el_,"vjs-vol-"+i);te(this.el_,"vjs-vol-"+t)},t.updateControlText_=function(){var e=this.player_.muted()||0===this.player_.volume()?"Unmute":"Mute";this.controlText()!==e&&this.controlText(e)},e}(sn);Xt.prototype.controlText_="Mute",pt.registerComponent("MuteToggle",Xt);I=function(n){function e(e,t){var i;return"undefined"!=typeof(t=void 0===t?{}:t).inline?t.inline=t.inline:t.inline=!0,"undefined"!=typeof t.volumeControl&&!S(t.volumeControl)||(t.volumeControl=t.volumeControl||{},t.volumeControl.vertical=!t.inline),(i=n.call(this,e,t)||this).handleKeyPressHandler_=function(e){return i.handleKeyPress(e)},i.on(e,["loadstart"],function(e){return i.volumePanelState_(e)}),i.on(i.muteToggle,"keyup",function(e){return i.handleKeyPress(e)}),i.on(i.volumeControl,"keyup",function(e){return i.handleVolumeControlKeyUp(e)}),i.on("keydown",function(e){return i.handleKeyPress(e)}),i.on("mouseover",function(e){return i.handleMouseOver(e)}),i.on("mouseout",function(e){return i.handleMouseOut(e)}),i.on(i.volumeControl,["slideractive"],i.sliderActive_),i.on(i.volumeControl,["sliderinactive"],i.sliderInactive_),i}mt(e,n);var t=e.prototype;return t.sliderActive_=function(){this.addClass("vjs-slider-active")},t.sliderInactive_=function(){this.removeClass("vjs-slider-active")},t.volumePanelState_=function(){this.volumeControl.hasClass("vjs-hidden")&&this.muteToggle.hasClass("vjs-hidden")&&this.addClass("vjs-hidden"),this.volumeControl.hasClass("vjs-hidden")&&!this.muteToggle.hasClass("vjs-hidden")&&this.addClass("vjs-mute-toggle-only")},t.createEl=function(){var e="vjs-volume-panel-horizontal";return this.options_.inline||(e="vjs-volume-panel-vertical"),n.prototype.createEl.call(this,"div",{className:"vjs-volume-panel vjs-control "+e})},t.dispose=function(){this.handleMouseOut(),n.prototype.dispose.call(this)},t.handleVolumeControlKeyUp=function(e){ht.isEventKey(e,"Esc")&&this.muteToggle.focus()},t.handleMouseOver=function(e){this.addClass("vjs-hover"),Be(document,"keyup",this.handleKeyPressHandler_)},t.handleMouseOut=function(e){this.removeClass("vjs-hover"),Fe(document,"keyup",this.handleKeyPressHandler_)},t.handleKeyPress=function(e){ht.isEventKey(e,"Esc")&&this.handleMouseOut()},e}(pt);I.prototype.options_={children:["muteToggle","volumeControl"]},pt.registerComponent("VolumePanel",I);var hn=function(n){function e(e,t){var i=n.call(this,e,t)||this;return t&&(i.menuButton_=t.menuButton),i.focusedChild_=-1,i.on("keydown",function(e){return i.handleKeyDown(e)}),i.boundHandleBlur_=function(e){return i.handleBlur(e)},i.boundHandleTapClick_=function(e){return i.handleTapClick(e)},i}mt(e,n);var t=e.prototype;return t.addEventListenerForItem=function(e){e instanceof pt&&(this.on(e,"blur",this.boundHandleBlur_),this.on(e,["tap","click"],this.boundHandleTapClick_))},t.removeEventListenerForItem=function(e){e instanceof pt&&(this.off(e,"blur",this.boundHandleBlur_),this.off(e,["tap","click"],this.boundHandleTapClick_))},t.removeChild=function(e){"string"==typeof e&&(e=this.getChild(e)),this.removeEventListenerForItem(e),n.prototype.removeChild.call(this,e)},t.addItem=function(e){e=this.addChild(e);e&&this.addEventListenerForItem(e)},t.createEl=function(){var e=this.options_.contentElType||"ul";this.contentEl_=$(e,{className:"vjs-menu-content"}),this.contentEl_.setAttribute("role","menu");e=n.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return e.appendChild(this.contentEl_),Be(e,"click",function(e){e.preventDefault(),e.stopImmediatePropagation()}),e},t.dispose=function(){this.contentEl_=null,this.boundHandleBlur_=null,this.boundHandleTapClick_=null,n.prototype.dispose.call(this)},t.handleBlur=function(e){var t=e.relatedTarget||document.activeElement;this.children().some(function(e){return e.el()===t})||(e=this.menuButton_)&&e.buttonPressed_&&t!==e.el().firstChild&&e.unpressButton()},t.handleTapClick=function(t){var e;this.menuButton_&&(this.menuButton_.unpressButton(),e=this.children(),!Array.isArray(e)||(e=e.filter(function(e){return e.el()===t.target})[0])&&"CaptionSettingsMenuItem"!==e.name()&&this.menuButton_.focus())},t.handleKeyDown=function(e){ht.isEventKey(e,"Left")||ht.isEventKey(e,"Down")?(e.preventDefault(),e.stopPropagation(),this.stepForward()):(ht.isEventKey(e,"Right")||ht.isEventKey(e,"Up"))&&(e.preventDefault(),e.stopPropagation(),this.stepBack())},t.stepForward=function(){var e=0;void 0!==this.focusedChild_&&(e=this.focusedChild_+1),this.focus(e)},t.stepBack=function(){var e=0;void 0!==this.focusedChild_&&(e=this.focusedChild_-1),this.focus(e)},t.focus=function(e){void 0===e&&(e=0);var t=this.children().slice();t.length&&t[0].hasClass("vjs-menu-title")&&t.shift(),0=t.length&&(e=t.length-1),t[this.focusedChild_=e].el_.focus())},e}(pt);pt.registerComponent("Menu",hn);Bt=function(n){function e(e,t){var i;(i=n.call(this,e,t=void 0===t?{}:t)||this).menuButton_=new sn(e,t),i.menuButton_.controlText(i.controlText_),i.menuButton_.el_.setAttribute("aria-haspopup","true");t=sn.prototype.buildCSSClass();i.menuButton_.el_.className=i.buildCSSClass()+" "+t,i.menuButton_.removeClass("vjs-control"),i.addChild(i.menuButton_),i.update(),i.enabled_=!0;t=function(e){return i.handleClick(e)};return i.handleMenuKeyUp_=function(e){return i.handleMenuKeyUp(e)},i.on(i.menuButton_,"tap",t),i.on(i.menuButton_,"click",t),i.on(i.menuButton_,"keydown",function(e){return i.handleKeyDown(e)}),i.on(i.menuButton_,"mouseenter",function(){i.addClass("vjs-hover"),i.menu.show(),Be(document,"keyup",i.handleMenuKeyUp_)}),i.on("mouseleave",function(e){return i.handleMouseLeave(e)}),i.on("keydown",function(e){return i.handleSubmenuKeyDown(e)}),i}mt(e,n);var t=e.prototype;return t.update=function(){var e=this.createMenu();this.menu&&(this.menu.dispose(),this.removeChild(this.menu)),this.menu=e,this.addChild(e),this.buttonPressed_=!1,this.menuButton_.el_.setAttribute("aria-expanded","false"),this.items&&this.items.length<=this.hideThreshold_?this.hide():this.show()},t.createMenu=function(){var e,t=new hn(this.player_,{menuButton:this});if(this.hideThreshold_=0,this.options_.title&&(e=$("li",{className:"vjs-menu-title",textContent:ut(this.options_.title),tabIndex:-1}),e=new pt(this.player_,{el:e}),t.addItem(e)),this.items=this.createItems(),this.items)for(var i=0;i select",id:"captions-background-color-%s",label:"Color",options:[ui,Bt,jt,Ft,j,C,I,Xt]},backgroundOpacity:{selector:".vjs-bg-opacity > select",id:"captions-background-opacity-%s",label:"Transparency",options:[k,li,f]},color:{selector:".vjs-fg-color > select",id:"captions-foreground-color-%s",label:"Color",options:[Bt,ui,jt,Ft,j,C,I,Xt]},edgeStyle:{selector:".vjs-edge-style > select",id:"%s",label:"Text Edge Style",options:[["none","None"],["raised","Raised"],["depressed","Depressed"],["uniform","Uniform"],["dropshadow","Dropshadow"]]},fontFamily:{selector:".vjs-font-family > select",id:"captions-font-family-%s",label:"Font Family",options:[["proportionalSansSerif","Proportional Sans-Serif"],["monospaceSansSerif","Monospace Sans-Serif"],["proportionalSerif","Proportional Serif"],["monospaceSerif","Monospace Serif"],["casual","Casual"],["script","Script"],["small-caps","Small Caps"]]},fontPercent:{selector:".vjs-font-percent > select",id:"captions-font-size-%s",label:"Font Size",options:[["0.50","50%"],["0.75","75%"],["1.00","100%"],["1.25","125%"],["1.50","150%"],["1.75","175%"],["2.00","200%"],["3.00","300%"],["4.00","400%"]],default:2,parser:function(e){return"1.00"===e?null:Number(e)}},textOpacity:{selector:".vjs-text-opacity > select",id:"captions-foreground-opacity-%s",label:"Transparency",options:[k,li]},windowColor:{selector:".vjs-window-color > select",id:"captions-window-color-%s",label:"Color"},windowOpacity:{selector:".vjs-window-opacity > select",id:"captions-window-opacity-%s",label:"Transparency",options:[f,li,k]}};function wn(e,t){if((e=t?t(e):e)&&"none"!==e)return e}Sn.windowColor.options=Sn.backgroundColor.options,pt.registerComponent("TextTrackSettings",function(n){function e(e,t){var i;return t.temporary=!1,(i=n.call(this,e,t)||this).updateDisplay=i.updateDisplay.bind(ft(i)),i.fill(),i.hasBeenOpened_=i.hasBeenFilled_=!0,i.endDialog=$("p",{className:"vjs-control-text",textContent:i.localize("End of dialog window.")}),i.el().appendChild(i.endDialog),i.setDefaults(),void 0===t.persistTextTrackSettings&&(i.options_.persistTextTrackSettings=i.options_.playerOptions.persistTextTrackSettings),i.on(i.$(".vjs-done-button"),"click",function(){i.saveSettings(),i.close()}),i.on(i.$(".vjs-default-button"),"click",function(){i.setDefaults(),i.updateDisplay()}),_(Sn,function(e){i.on(i.$(e.selector),"change",i.updateDisplay)}),i.options_.persistTextTrackSettings&&i.restoreSettings(),i}mt(e,n);var t=e.prototype;return t.dispose=function(){this.endDialog=null,n.prototype.dispose.call(this)},t.createElSelect_=function(e,t,i){var n=this;void 0===t&&(t=""),void 0===i&&(i="label");var e=Sn[e],r=e.id.replace("%s",this.id_),a=[t,r].join(" ").trim();return["<"+i+' id="'+r+'" class="'+("label"===i?"vjs-label":"")+'">',this.localize(e.label),"",'").join("")},t.createElFgColor_=function(){var e="captions-text-legend-"+this.id_;return['

','',this.localize("Text"),"",this.createElSelect_("color",e),'',this.createElSelect_("textOpacity",e),"","
"].join("")},t.createElBgColor_=function(){var e="captions-background-"+this.id_;return['
','',this.localize("Background"),"",this.createElSelect_("backgroundColor",e),'',this.createElSelect_("backgroundOpacity",e),"","
"].join("")},t.createElWinColor_=function(){var e="captions-window-"+this.id_;return['
','',this.localize("Window"),"",this.createElSelect_("windowColor",e),'',this.createElSelect_("windowOpacity",e),"","
"].join("")},t.createElColors_=function(){return $("div",{className:"vjs-track-settings-colors",innerHTML:[this.createElFgColor_(),this.createElBgColor_(),this.createElWinColor_()].join("")})},t.createElFont_=function(){return $("div",{className:"vjs-track-settings-font",innerHTML:['
',this.createElSelect_("fontPercent","","legend"),"
",'
',this.createElSelect_("edgeStyle","","legend"),"
",'
',this.createElSelect_("fontFamily","","legend"),"
"].join("")})},t.createElControls_=function(){var e=this.localize("restore all settings to the default values");return $("div",{className:"vjs-track-settings-controls",innerHTML:['",'"].join("")})},t.content=function(){return[this.createElColors_(),this.createElFont_(),this.createElControls_()]},t.label=function(){return this.localize("Caption Settings Dialog")},t.description=function(){return this.localize("Beginning of dialog window. Escape will cancel and close the window.")},t.buildCSSClass=function(){return n.prototype.buildCSSClass.call(this)+" vjs-text-track-settings"},t.getValues=function(){var i,n,e,r=this;return n=function(e,t,i){var n,t=(n=r.$(t.selector),t=t.parser,wn(n.options[n.options.selectedIndex].value,t));return void 0!==t&&(e[i]=t),e},void 0===(e={})&&(e=0),v(i=Sn).reduce(function(e,t){return n(e,i[t],t)},e)},t.setValues=function(i){var n=this;_(Sn,function(e,t){!function(e,t,i){if(t)for(var n=0;nthis.options_.liveTolerance,(t=!this.timeupdateSeen_||e===1/0?!1:t)!==this.behindLiveEdge_&&(this.behindLiveEdge_=t,this.trigger("liveedgechange")))},t.handleDurationchange=function(){this.toggleTracking()},t.toggleTracking=function(){this.player_.duration()===1/0&&this.liveWindow()>=this.options_.trackingThreshold?(this.player_.options_.liveui&&this.player_.addClass("vjs-liveui"),this.startTracking()):(this.player_.removeClass("vjs-liveui"),this.stopTracking())},t.startTracking=function(){this.isTracking()||(this.timeupdateSeen_||(this.timeupdateSeen_=this.player_.hasStarted()),this.trackingInterval_=this.setInterval(this.trackLiveHandler_,30),this.trackLive_(),this.on(this.player_,["play","pause"],this.trackLiveHandler_),this.timeupdateSeen_?this.on(this.player_,"seeked",this.handleSeeked_):(this.one(this.player_,"play",this.handlePlay_),this.one(this.player_,"timeupdate",this.handleFirstTimeupdate_)))},t.handleFirstTimeupdate=function(){this.timeupdateSeen_=!0,this.on(this.player_,"seeked",this.handleSeeked_)},t.handleSeeked=function(){var e=Math.abs(this.liveCurrentTime()-this.player_.currentTime());this.seekedBehindLive_=this.nextSeekedFromUser_&&2"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function ua(e,t){if(t(e))return 1;if(e=e.firstChild)do{if(ua(e,t))return 1}while(e=e.nextSibling)}function la(){}function ca(e,t,i){e&&e._inc++,i.namespaceURI===Or.XMLNS&&delete t._nsMap[i.prefix?i.localName:""]}function da(e,t,i){if(e&&e._inc){e._inc++;var n=t.childNodes;if(i)n[n.length++]=i;else{for(var r=t.firstChild,a=0;r;)r=(n[a++]=r).nextSibling;n.length=a}}}function ha(e,t){var i=t.previousSibling,n=t.nextSibling;return i?i.nextSibling=n:e.firstChild=n,n?n.previousSibling=i:e.lastChild=i,da(e.ownerDocument,e),t}function pa(e,t,i){var n=t.parentNode;if(n&&n.removeChild(t),t.nodeType===Kr){var r=t.firstChild;if(null==r)return t;var a=t.lastChild}else r=a=t;n=i?i.previousSibling:e.lastChild;for(r.previousSibling=n,a.nextSibling=i,n?n.nextSibling=r:e.firstChild=r,null==i?e.lastChild=a:i.previousSibling=a;r.parentNode=e,r!==a&&(r=r.nextSibling););return da(e.ownerDocument||e,e),t.nodeType==Kr&&(t.firstChild=t.lastChild=null),t}function fa(){this._nsMap={}}function ma(){}function ga(){}function ya(){}function va(){}function _a(){}function ba(){}function Ta(){}function Sa(){}function wa(){}function Ea(){}function ka(){}function Ca(){}function Ia(e,t){var i,n=[],r=9==this.nodeType&&this.documentElement||this,a=r.prefix,s=r.namespaceURI;return Pa(this,n,e,t,i=s&&null==a&&null==(a=r.lookupPrefix(s))?[{namespace:s,prefix:null}]:i),n.join("")}function xa(e,t,i){var n=e.prefix||"",r=e.namespaceURI;if(r&&("xml"!==n||r!==Or.XML)&&r!==Or.XMLNS){for(var a=i.length;a--;){var s=i[a];if(s.prefix===n)return s.namespace!==r}return 1}}function Aa(e,t,i){e.push(" ",t,'="',i.replace(/[<&"]/g,oa),'"')}function Pa(e,t,i,n,r){if(r=r||[],n){if(!(e=n(e)))return;if("string"==typeof e)return void t.push(e)}switch(e.nodeType){case Fr:var a=e.attributes,s=a.length,o=e.firstChild,u=e.tagName,l=u;if(!(i=Or.isHTML(e.namespaceURI)||i)&&!e.prefix&&e.namespaceURI){for(var c,d=0;d"),i&&/^script$/i.test(u))for(;o;)o.data?t.push(o.data):Pa(o,t,i,n,r.slice()),o=o.nextSibling;else for(;o;)Pa(o,t,i,n,r.slice()),o=o.nextSibling;t.push("")}else t.push("/>");return;case zr:case Kr:for(o=e.firstChild;o;)Pa(o,t,i,n,r.slice()),o=o.nextSibling;return;case jr:return Aa(t,e.name,e.value),0;case Hr:return t.push(e.data.replace(/[<&]/g,oa).replace(/]]>/g,"]]>"));case qr:return t.push("");case Gr:return t.push("\x3c!--",e.data,"--\x3e");case Xr:var v=e.publicId,_=e.systemId;return t.push("")):_&&"."!=_?t.push(" SYSTEM ",_,">"):((_=e.internalSubset)&&t.push(" [",_,"]"),t.push(">")));case Wr:return t.push("");case Vr:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function La(e,t,i){e[t]=i}x.INVALID_STATE_ERR=(Yr[11]="Invalid state",11),x.SYNTAX_ERR=(Yr[12]="Syntax error",12),x.INVALID_MODIFICATION_ERR=(Yr[13]="Invalid modification",13),x.NAMESPACE_ERR=(Yr[14]="Invalid namespace",14),x.INVALID_ACCESS_ERR=(Yr[15]="Invalid access",15),$r.prototype=Error.prototype,Ur(x,$r),Jr.prototype={length:0,item:function(e){return this[e]||null},toString:function(e,t){for(var i=[],n=0;n",lt:"<",quot:'"'}),t.HTML_ENTITIES=i({lt:"<",gt:">",amp:"&",quot:'"',apos:"'",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",times:"×",divide:"÷",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",euro:"€",trade:"™",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"}),t.entityMap=t.HTML_ENTITIES});Da.XML_ENTITIES,Da.HTML_ENTITIES,Da.entityMap;var Oa=Dr.NAMESPACE,zt=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,ar=new RegExp("[\\-\\.0-9"+zt.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),Ra=new RegExp("^"+zt.source+ar.source+"*(?::"+zt.source+ar.source+"*)?$"),Ma=0,Na=1,Ua=2,Ba=3,Fa=4,ja=5,Ha=6,qa=7;function Va(e,t){this.message=e,this.locator=t,Error.captureStackTrace&&Error.captureStackTrace(this,Va)}function Wa(){}function Ga(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function za(e,t,i){for(var n=e.tagName,r=null,a=e.length;a--;){var s=e[a],o=s.qName,u=s.value,o=0<(c=o.indexOf(":"))?(l=s.prefix=o.slice(0,c),d=o.slice(c+1),"xmlns"===l&&d):(l=null,"xmlns"===(d=o)&&"");s.localName=d,!1!==o&&(null==r&&(r={},Xa(i,i={})),i[o]=r[o]=u,s.uri=Oa.XMLNS,t.startPrefixMapping(o,u))}for(var l,a=e.length;a--;)(l=(s=e[a]).prefix)&&("xml"===l&&(s.uri=Oa.XML),"xmlns"!==l&&(s.uri=i[l||""]));var c,d=0<(c=n.indexOf(":"))?(l=e.prefix=n.slice(0,c),e.localName=n.slice(c+1)):(l=null,e.localName=n),h=e.uri=i[l||""];if(t.startElement(h,d,n,e),!e.closed)return e.currentNSMap=i,e.localNSMap=r,1;if(t.endElement(h,d,n),r)for(l in r)t.endPrefixMapping(l)}function Xa(e,t){for(var i in e)t[i]=e[i]}function Ka(){this.attributeNames={}}(Va.prototype=new Error).name=Va.name,Wa.prototype={parse:function(e,t,i){var n=this.domBuilder;n.startDocument(),Xa(t,t={}),function(i,e,n,r,a){function s(e){var t=e.slice(1,-1);return t in n?n[t]:"#"===t.charAt(0)?65535<(t=parseInt(t.substr(1).replace("x","0x")))?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):String.fromCharCode(t):(a.error("entity not found:"+e),e)}function t(e){var t;f",y+3),_=i.substring(y+2,v).replace(/[ \t\n\r]+$/g,""),b=h.pop();v<0?(_=i.substring(y+2).replace(/[\s<].*/,""),a.error("end tag name: "+_+" is not complete:"+b.tagName),v=y+1+_.length):_.match(/\s",t);if(n){t=e.substring(t,n).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);return t?(t[0].length,i.processingInstruction(t[1],t[2]),n+2):-1}return-1}(i,y,r);break;case"!":d&&o(y),v=function(e,t,i,n){{if("-"===e.charAt(t+2)){if("-"!==e.charAt(t+3))return-1;var r=e.indexOf("--\x3e",t+4);return t",t+9);return i.startCDATA(),i.characters(e,t+9,r-t-9),i.endCDATA(),r+3}var a=function(e,t){var i,n=[],r=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;r.lastIndex=t,r.exec(e);for(;i=r.exec(e);)if(n.push(i),i[1])return n}(e,t),n=a.length;if(1":switch(l){case Ma:n.setTagName(e.slice(t,u));case ja:case Ha:case qa:break;case Fa:case Na:"/"===(d=e.slice(t,u)).slice(-1)&&(n.closed=!0,d=d.slice(0,-1));case Ua:l===Ua&&(d=o),l==Fa?(a.warning('attribute "'+d+'" missed quot(")!'),s(o,d.replace(/&#?\w+;/g,r),t)):(Oa.isHTML(i[""])&&d.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+d+'" missed value!! "'+d+'" instead!!'),s(d,d,t));break;case Ba:throw new Error("attribute value missed!!")}return u;case"€":c=" ";default:if(c<=" ")switch(l){case Ma:n.setTagName(e.slice(t,u)),l=Ha;break;case Na:o=e.slice(t,u),l=Ua;break;case Fa:var d=e.slice(t,u).replace(/&#?\w+;/g,r);a.warning('attribute "'+d+'" missed quot(")!!'),s(o,d,t);case ja:l=Ha}else switch(l){case Ua:n.tagName,Oa.isHTML(i[""])&&o.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!'),s(o,o,t),t=u,l=Na;break;case ja:a.warning('attribute space is required"'+o+'"!!');case Ha:l=Na,t=u;break;case Ba:l=Fa,t=u;break;case qa:throw new Error("elements closed character '/' and '>' must be connected to")}}u++}}(i,y,E,k,s,a),C=E.length;if(!E.closed&&function(e,t,i,n){var r=n[i];null==r&&((r=e.lastIndexOf(""))",t),e=e.substring(t+1,a);if(/[&<]/.test(e))return/^script$/i.test(i)||(e=e.replace(/&#?\w+;/g,n)),r.characters(e,0,e.length),a}return t+1}(i,v,E.tagName,s,r):v++}}catch(e){if(e instanceof Va)throw e;a.error("element parse error: "+e),v=-1}f=t+i||t?new java.lang.String(e,t,i)+"":e}function rs(e,t){(e.currentElement||e.doc).appendChild(t)}Za.prototype.parseFromString=function(e,t){var i=this.options,n=new Ja,r=i.domBuilder||new es,a=i.errorHandler,s=i.locator,o=i.xmlns||{},u=/\/x?html?$/.test(t),t=u?Da.HTML_ENTITIES:Da.XML_ENTITIES;return s&&r.setDocumentLocator(s),n.errorHandler=function(n,e,r){if(!n){if(e instanceof es)return e;n=e}var a={},s=n instanceof Function;function t(t){var i=n[t];!i&&s&&(i=2==n.length?function(e){n(t,e)}:n),a[t]=i?function(e){i("[xmldom "+t+"]\t"+e+is(r))}:function(){}}return r=r||{},t("warning"),t("error"),t("fatalError"),a}(a,r,s),n.domBuilder=i.domBuilder||r,u&&(o[""]=Qa.HTML),o.xml=o.xml||Qa.XML,e&&"string"==typeof e?n.parse(e,o,t):n.errorHandler.error("invalid doc source"),r.doc},es.prototype={startDocument:function(){this.doc=(new Ya).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(e,t,i,n){var r=this.doc,a=r.createElementNS(e,i||t),s=n.length;rs(this,a),this.currentElement=a,this.locator&&ts(this.locator,a);for(var o=0;ot.timeline?1:-1});var i}function ys(e){var r,a,s=[];return r=e,a=function(e,t,i,n){s=s.concat(e.playlists||[])},po.forEach(function(e){for(var t in r.mediaGroups[e])for(var i in r.mediaGroups[e][t]){var n=r.mediaGroups[e][t][i];a(n,e,t,i)}}),s}function vs(e){var i=e.playlist,e=e.mediaSequence;i.mediaSequence=e,i.segments.forEach(function(e,t){e.number=i.mediaSequence+t})}function _s(e){var r,a,t=e.oldManifest,i=e.newManifest,n=t.playlists.concat(ys(t)),e=i.playlists.concat(ys(i));return i.timelineStarts=gs([t.timelineStarts,i.timelineStarts]),n={oldPlaylists:n,newPlaylists:e,timelineStarts:i.timelineStarts},r=n.oldPlaylists,e=n.newPlaylists,a=n.timelineStarts,e.forEach(function(t){t.discontinuitySequence=cs(a,function(e){return e.timeline===t.timeline});var e=function(e,t){for(var i=0;ie.timeline||e.segments.length&&t.timeline>e.segments[e.segments.length-1].timeline)&&t.discontinuitySequence--);e.segments[n].discontinuity&&!i.discontinuity&&(i.discontinuity=!0,t.discontinuityStarts.unshift(0),t.discontinuitySequence--),vs({playlist:t,mediaSequence:e.segments[n].number})}}),i}function bs(e){return e&&e.uri+"-"+(t=e.byterange,e="bigint"==typeof t.offset||"bigint"==typeof t.length?window.BigInt(t.offset)+window.BigInt(t.length)-window.BigInt(1):t.offset+t.length-1,t.offset+"-"+e);var t}function Ts(e){return os(e.reduce(function(e,t){var i,n=t.attributes.id+(t.attributes.lang||"");return e[n]?(t.segments&&(t.segments[0]&&(t.segments[0].discontinuity=!0),(i=e[n].segments).push.apply(i,t.segments)),t.attributes.contentProtection&&(e[n].attributes.contentProtection=t.attributes.contentProtection)):(e[n]=t,e[n].attributes.timelineStarts=[]),e[n].attributes.timelineStarts.push({start:t.attributes.periodStart,timeline:t.attributes.periodStart}),e},{})).map(function(e){var t,n;return e.discontinuityStarts=(t=e.segments||[],n="discontinuity",t.reduce(function(e,t,i){return t[n]&&e.push(i),e},[])),e})}function Ss(e,t){var i=bs(e.sidx);return(i=i&&t[i]&&t[i].sidx)&&ms(e,i,e.sidx.resolvedUri),e}function ws(e,h,p){var f;return void 0===h&&(h={}),void 0===p&&(p=!1),e=e.reduce(function(e,t){var i=t.attributes.role&&t.attributes.role.value||"",n=t.attributes.lang||"",r=t.attributes.label||"main";e[r=n&&!t.attributes.label?t.attributes.lang+(i?" ("+i+")":""):r]||(e[r]={language:n,autoselect:!0,default:"main"===i,playlists:[],uri:""});var a,s,o,u,l,c,d,u=Ss((s=p,o=(a=t).attributes,u=a.segments,l=a.sidx,c=a.mediaSequence,d=a.discontinuitySequence,n=a.discontinuityStarts,u={attributes:((a={NAME:o.id,BANDWIDTH:o.bandwidth,CODECS:o.codecs})["PROGRAM-ID"]=1,a),uri:"",endList:"static"===o.type,timeline:o.periodStart,resolvedUri:"",targetDuration:o.duration,discontinuitySequence:d,discontinuityStarts:n,timelineStarts:o.timelineStarts,mediaSequence:c,segments:u},o.contentProtection&&(u.contentProtection=o.contentProtection),l&&(u.sidx=l),s&&(u.attributes.AUDIO="audio",u.attributes.SUBTITLES="subs"),u),h);return e[r].playlists.push(u),"undefined"==typeof f&&"main"===i&&((f=t).default=!0),e},{}),f||(e[Object.keys(e)[0]].default=!0),e}function Es(e){var t=e.attributes,i=e.segments,n=e.sidx,r=e.discontinuityStarts,i={attributes:((e={NAME:t.id,AUDIO:"audio",SUBTITLES:"subs",RESOLUTION:{width:t.width,height:t.height},CODECS:t.codecs,BANDWIDTH:t.bandwidth})["PROGRAM-ID"]=1,e),uri:"",endList:"static"===t.type,timeline:t.periodStart,resolvedUri:"",targetDuration:t.duration,discontinuityStarts:r,timelineStarts:t.timelineStarts,segments:i};return t.contentProtection&&(i.contentProtection=t.contentProtection),n&&(i.sidx=n),i}function ks(e){return"video/mp4"===(e=e.attributes).mimeType||"video/webm"===e.mimeType||"video"===e.contentType}function Cs(e){return"audio/mp4"===(e=e.attributes).mimeType||"audio/webm"===e.mimeType||"audio"===e.contentType}function Is(e){return"text/vtt"===(e=e.attributes).mimeType||"text"===e.contentType}function xs(i){return i?Object.keys(i).reduce(function(e,t){t=i[t];return e.concat(t.playlists)},[]):[]}function As(e){var t=e.dashPlaylists,i=e.locations,n=void 0===(c=e.sidxMapping)?{}:c,r=e.previousManifest;if(!t.length)return{};var a=(d=t[0].attributes).sourceDuration,s=d.type,o=d.suggestedPresentationDelay,u=d.minimumUpdatePeriod,l=Ts(t.filter(ks)).map(Es),c=Ts(t.filter(Cs)),e=Ts(t.filter(Is)),d=t.map(function(e){return e.attributes.captionServices}).filter(Boolean),a={allowCache:!0,discontinuityStarts:[],segments:[],endList:!0,mediaGroups:((t={AUDIO:{},VIDEO:{}})["CLOSED-CAPTIONS"]={},t.SUBTITLES={},t),uri:"",duration:a,playlists:function(e,t){if(void 0===t&&(t={}),!Object.keys(t).length)return e;for(var i in e)e[i]=Ss(e[i],t);return e}(l,n)};0<=u&&(a.minimumUpdatePeriod=1e3*u),i&&(a.locations=i),"dynamic"===s&&(a.suggestedPresentationDelay=o);var h,p,o=0===a.playlists.length,o=c.length?ws(c,n,o):null,n=e.length?(void 0===(h=n)&&(h={}),e.reduce(function(e,t){var i=t.attributes.lang||"text";return e[i]||(e[i]={language:i,default:!1,autoselect:!1,playlists:[],uri:""}),e[i].playlists.push(Ss(function(e){var t=e.attributes,i=e.segments,n=e.mediaSequence,r=e.discontinuityStarts,a=e.discontinuitySequence;"undefined"==typeof i&&(i=[{uri:t.baseUrl,timeline:t.periodStart,resolvedUri:t.baseUrl||"",duration:t.sourceDuration,number:0}],t.duration=t.sourceDuration);(e={NAME:t.id,BANDWIDTH:t.bandwidth})["PROGRAM-ID"]=1;return t.codecs&&(e.CODECS=t.codecs),{attributes:e,uri:"",endList:"static"===t.type,timeline:t.periodStart,resolvedUri:t.baseUrl||"",targetDuration:t.duration,timelineStarts:t.timelineStarts,discontinuityStarts:r,discontinuitySequence:a,mediaSequence:n,segments:i}}(t),h)),e},{})):null,l=(e=l.concat(xs(o),xs(n))).map(function(e){return e.timelineStarts});return a.timelineStarts=gs(l),e=e,p=a.timelineStarts,e.forEach(function(t){t.mediaSequence=0,t.discontinuitySequence=cs(p,function(e){return e.timeline===t.timeline}),t.segments&&t.segments.forEach(function(e,t){e.number=t})}),o&&(a.mediaGroups.AUDIO.audio=o),n&&(a.mediaGroups.SUBTITLES.subs=n),d.length&&(a.mediaGroups["CLOSED-CAPTIONS"].cc=d.reduce(function(n,e){return e&&e.forEach(function(e){var t=e.channel,i=e.language;n[i]={autoselect:!1,default:!1,instreamId:t,language:i},e.hasOwnProperty("aspectRatio")&&(n[i].aspectRatio=e.aspectRatio),e.hasOwnProperty("easyReader")&&(n[i].easyReader=e.easyReader),e.hasOwnProperty("3D")&&(n[i]["3D"]=e["3D"])}),n},{})),r?_s({oldManifest:r,newManifest:a}):a}function Ps(e,t){for(var i,n,r,a,s,o,u=e.type,l=e.minimumUpdatePeriod,c=void 0===l?0:l,d=void 0===(l=e.media)?"":l,h=e.sourceDuration,p=void 0===(l=e.timescale)?1:l,f=void 0===(l=e.startNumber)?1:l,m=e.periodStart,g=[],y=-1,v=0;v=e.length&&n.call(e,function(e,t){return e===(a[t]?a[t]&i[r+t]:i[r+t])})}function Qs(e,t){return void 0===t&&(t=0),(e=zs(e)).length-t<10||!Ys(e,So,{offset:t})?t:Qs(e,t+=function(e,t){void 0===t&&(t=0);var i=(e=zs(e))[t+5],t=e[t+6]<<21|e[t+7]<<14|e[t+8]<<7|e[t+9];return(16&i)>>4?20+t:10+t}(e,t))}function $s(e){return"string"==typeof e?Ks(e):e}function Js(e,t,i){var n;void 0===i&&(i=!1),n=t,t=Array.isArray(n)?n.map($s):[$s(n)],e=zs(e);var r=[];if(!t.length)return r;for(var a=0;a>>0,o=e.subarray(a+4,a+8);if(0==s)break;var u=a+s;if(u>e.length){if(i)break;u=e.length}s=e.subarray(a+8,u);Ys(o,t[0])&&(1===t.length?r.push(s):r.push.apply(r,Js(s,t.slice(1),i))),a=u}return r}function Zs(e,t,i,n){void 0===i&&(i=!0),void 0===n&&(n=!1);var r=function(e){for(var t=1,i=0;i=t.length)return t.length;var n=Zs(t,i,!1);if(Ys(e.bytes,n.bytes))return i;var r=Zs(t,i+n.length);return to(e,t,i+r.length+r.value+n.length)}function io(e,t){var i;i=t,t=Array.isArray(i)?i.map(eo):[eo(i)],e=zs(e);var n=[];if(!t.length)return n;for(var r=0;re.length?e.length:o+s.value,u=e.subarray(o,u);Ys(t[0],a.bytes)&&(1===t.length?n.push(u):n=n.concat(io(u,t.slice(1)))),r+=a.length+s.length+u.length}return n}function no(e,t,i,n){void 0===n&&(n=1/0),e=zs(e),i=[].concat(i);for(var r,a=0,s=0;a>1&63),-1!==i.indexOf(u)&&(r=a+o),a+=o+("h264"===t?1:2)}else a++}return e.subarray(0,0)}var ro={__DOMHandler:es,DOMParser:Za,DOMImplementation:U.DOMImplementation,XMLSerializer:U.XMLSerializer}.DOMParser,ao="INVALID_NUMBER_OF_PERIOD",so="DASH_EMPTY_MANIFEST",oo="DASH_INVALID_XML",uo="NO_BASE_URL",lo="SEGMENT_TIME_UNSPECIFIED",co="UNSUPPORTED_UTC_TIMING_SCHEME",ho={static:function(e){var t=e.duration,i=e.timescale,n=void 0===i?1:i,r=e.sourceDuration,i=e.periodDuration,e=hs(e.endNumber),n=t/n;return"number"==typeof e?{start:0,end:e}:"number"==typeof i?{start:0,end:i/n}:{start:0,end:r/n}},dynamic:function(e){var t=e.NOW,i=e.clientOffset,n=e.availabilityStartTime,r=e.timescale,a=void 0===r?1:r,s=e.duration,o=e.periodStart,u=void 0===o?0:o,r=e.minimumUpdatePeriod,o=void 0===r?0:r,r=e.timeShiftBufferDepth,r=void 0===r?1/0:r,e=hs(e.endNumber),i=(t+i)/1e3,u=n+u,o=Math.ceil((i+o-u)*a/s),r=Math.floor((i-u-r)*a/s),s=Math.floor((i-u)*a/s);return{start:Math.max(0,r),end:"number"==typeof e?e:Math.min(o,s)}}},po=["AUDIO","SUBTITLES"],fo=/\$([A-z]*)(?:(%0)([0-9]+)d)?\$/g,mo={mediaPresentationDuration:Us,availabilityStartTime:function(e){return/^\d+-\d+-\d+T\d+:\d+:\d+(\.\d+)?$/.test(e=e)&&(e+="Z"),Date.parse(e)/1e3},minimumUpdatePeriod:Us,suggestedPresentationDelay:Us,type:function(e){return e},timeShiftBufferDepth:Us,start:Us,width:function(e){return parseInt(e,10)},height:function(e){return parseInt(e,10)},bandwidth:function(e){return parseInt(e,10)},startNumber:function(e){return parseInt(e,10)},timescale:function(e){return parseInt(e,10)},presentationTimeOffset:function(e){return parseInt(e,10)},duration:function(e){var t=parseInt(e,10);return isNaN(t)?Us(e):t},d:function(e){return parseInt(e,10)},t:function(e){return parseInt(e,10)},r:function(e){return parseInt(e,10)},DEFAULT:function(e){return e}},go={"urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b":"org.w3.clearkey","urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed":"com.widevine.alpha","urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95":"com.microsoft.playready","urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb":"com.adobe.primetime"},yo=Math.pow(2,32),vo=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength);return t.getBigUint64?(e=t.getBigUint64(0))>>7,referencedSize:2147483647&t.getUint32(n),subsegmentDuration:t.getUint32(n+4),startsWithSap:!!(128&e[n+8]),sapType:(112&e[n+8])>>>4,sapDeltaTime:268435455&t.getUint32(n+8)});return i},bo=window.BigInt||Number,To=[bo("0x1"),bo("0x100"),bo("0x10000"),bo("0x1000000"),bo("0x100000000"),bo("0x10000000000"),bo("0x1000000000000"),bo("0x100000000000000"),bo("0x10000000000000000")],So=zs([73,68,51]),wo={EBML:zs([26,69,223,163]),DocType:zs([66,130]),Segment:zs([24,83,128,103]),SegmentInfo:zs([21,73,169,102]),Tracks:zs([22,84,174,107]),Track:zs([174]),TrackNumber:zs([215]),DefaultDuration:zs([35,227,131]),TrackEntry:zs([174]),TrackType:zs([131]),FlagDefault:zs([136]),CodecID:zs([134]),CodecPrivate:zs([99,162]),VideoTrack:zs([224]),AudioTrack:zs([225]),Cluster:zs([31,67,182,117]),Timestamp:zs([231]),TimestampScale:zs([42,215,177]),BlockGroup:zs([160]),BlockDuration:zs([155]),Block:zs([161]),SimpleBlock:zs([163])},Eo=[128,64,32,16,8,4,2,1],ko=zs([0,0,0,1]),Co=zs([0,0,1]),Io=zs([0,0,3]),xo={webm:zs([119,101,98,109]),matroska:zs([109,97,116,114,111,115,107,97]),flac:zs([102,76,97,67]),ogg:zs([79,103,103,83]),ac3:zs([11,119]),riff:zs([82,73,70,70]),avi:zs([65,86,73]),wav:zs([87,65,86,69]),"3gp":zs([102,116,121,112,51,103]),mp4:zs([102,116,121,112]),fmp4:zs([115,116,121,112]),mov:zs([102,116,121,112,113,116]),moov:zs([109,111,111,118]),moof:zs([109,111,111,102])},Ao={aac:function(e){var t=Qs(e);return Ys(e,[255,16],{offset:t,mask:[255,22]})},mp3:function(e){var t=Qs(e);return Ys(e,[255,2],{offset:t,mask:[255,6]})},webm:function(e){e=io(e,[wo.EBML,wo.DocType])[0];return Ys(e,xo.webm)},mkv:function(e){e=io(e,[wo.EBML,wo.DocType])[0];return Ys(e,xo.matroska)},mp4:function(e){return!Ao["3gp"](e)&&!Ao.mov(e)&&(!(!Ys(e,xo.mp4,{offset:4})&&!Ys(e,xo.fmp4,{offset:4}))||(!(!Ys(e,xo.moof,{offset:4})&&!Ys(e,xo.moov,{offset:4}))||void 0))},mov:function(e){return Ys(e,xo.mov,{offset:4})},"3gp":function(e){return Ys(e,xo["3gp"],{offset:4})},ac3:function(e){var t=Qs(e);return Ys(e,xo.ac3,{offset:t})},ts:function(e){if(e.length<189&&1<=e.length)return 71===e[0];for(var t=0;t+188"):function(){}}function Ro(e,t){var i,n=[];if(e&&e.length)for(i=0;i "+e.end(i));return t.join(", ")}function Bo(e){for(var t=[],i=0;iDate.now()}function $o(e){return e.excludeUntil&&e.excludeUntil===1/0}function Jo(e){var t=Qo(e);return!e.disabled&&!t}function Zo(e,t){return t.attributes&&t.attributes[e]}function eu(e,t){if(1===e.playlists.length)return!0;var i=t.attributes.BANDWIDTH||Number.MAX_VALUE;return 0===e.playlists.filter(function(e){return!!Jo(e)&&(e.attributes.BANDWIDTH||0)n+.25*a.duration)return null;i=a}return{segment:i,estimatedStart:i.videoTimingInfo?i.videoTimingInfo.transmuxedPresentationStart:n-i.duration,type:i.videoTimingInfo?"accurate":"estimate"}}(n,t))?"estimate"===e.type?i({message:"Accurate programTime could not be determined. Please seek to e.seekTime and try again",seekTime:e.estimatedStart}):(t={mediaSeconds:n},(e=function(e,t){if(!t.dateTimeObject)return null;var i=t.videoTimingInfo.transmuxerPrependedSeconds,i=e-(t.videoTimingInfo.transmuxedPresentationStart+i);return new Date(t.dateTimeObject.getTime()+1e3*i)}(n,e.segment))&&(t.programDateTime=e.toISOString()),i(null,t)):i({message:"valid programTime was not found"}):i({message:"getProgramTime: playlist and time must be provided"})}function Eu(e){var t=e.programTime,i=e.playlist,n=e.retryCount,r=void 0===n?2:n,a=e.seekTo,s=e.pauseAfterSeek,o=void 0===s||s,u=e.tech,l=e.callback;if(!l)throw new Error("seekToProgramTime: callback must be provided");return"undefined"!=typeof t&&i&&a?i.endList||u.hasStarted_?function(e){if(!e.segments||0===e.segments.length)return!1;for(var t=0;ti||e.height>n})).filter(function(e){return e.width===h[0].width&&e.height===h[0].height}),c=p[p.length-1],p=p.filter(function(e){return e.bandwidth===c.bandwidth})[0]),a.experimentalLeastPixelDiffSelector&&(m=d.map(function(e){return e.pixelDiff=Math.abs(e.width-i)+Math.abs(e.height-n),e}),Ju(m,function(e,t){return e.pixelDiff===t.pixelDiff?t.bandwidth-e.bandwidth:e.pixelDiff-t.pixelDiff}),f=m[0]);var m=f||p||e||o||l[0]||u[0];if(m&&m.playlist){u="sortedPlaylistReps";return f?u="leastPixelDiffRep":p?u="resolutionPlusOneRep":e?u="resolutionBestRep":o?u="bandwidthBestRep":l[0]&&(u="enabledPlaylistReps"),Ll("choosing "+Qu(m)+" using "+u+" with options",s),m.playlist}return Ll("could not choose a playlist with options",s),null}}function tl(e){var t=e.inbandTextTracks,i=e.metadataArray,r=e.timestampOffset,n=e.videoDuration;if(i){var a=window.WebKitDataCue||window.VTTCue,s=t.metadataTrack_;if(s&&(i.forEach(function(e){var n=e.cueTime+r;!("number"!=typeof n||window.isNaN(n)||n<0)&&n<1/0&&e.frames.forEach(function(e){var t,i=new a(n,n,e.value||e.url||e.data||"");i.frame=e,i.value=e,t=i,Object.defineProperties(t.frame,{id:{get:function(){return tr.log.warn("cue.frame.id is deprecated. Use cue.value.key instead."),t.value.key}},value:{get:function(){return tr.log.warn("cue.frame.value is deprecated. Use cue.value.data instead."),t.value.data}},privateData:{get:function(){return tr.log.warn("cue.frame.privateData is deprecated. Use cue.value.data instead."),t.value.data}}}),s.addCue(i)})}),s.cues&&s.cues.length)){for(var o=s.cues,u=[],l=0;l=e&&r.endTime<=t&&i.removeCue(r)}function nl(e){return"number"==typeof e&&isFinite(e)}function rl(e){var t=e.startOfSegment,i=e.duration,n=e.segment,r=e.part,a=e.playlist,s=a.mediaSequence,o=a.id,u=a.segments,l=e.mediaIndex,c=e.partIndex,d=e.timeline,h=(void 0===u?[]:u).length-1,p="mediaIndex/partIndex increment";return e.getMediaInfoForTime?p="getMediaInfoForTime ("+e.getMediaInfoForTime+")":e.isSyncRequest&&(p="getSyncSegmentCandidate (isSyncRequest)"),e.independent&&(p+=" with independent "+e.independent),a="number"==typeof c,u=e.segment.uri?"segment":"pre-segment",e=a?Wo({preloadSegment:n})-1:0,u+" ["+(s+l)+"/"+(s+h)+"]"+(a?" part ["+c+"/"+e+"]":"")+" segment start/end ["+n.start+" => "+n.end+"]"+(a?" part start/end ["+r.start+" => "+r.end+"]":"")+" startOfSegment ["+t+"] duration ["+i+"] timeline ["+d+"] selected by ["+p+"] playlist ["+o+"]"}function al(e){return e+"TimingInfo"}function sl(e){var t=e.timelineChangeController,i=e.currentTimeline,n=e.segmentTimeline,r=e.loaderType,e=e.audioDisabled;if(i!==n){if("audio"===r){i=t.lastTimelineChange({type:"main"});return!i||i.to!==n}if("main"===r&&e){t=t.pendingTimelineChange({type:"audio"});return t&&t.to===n?!1:!0}}}function ol(e){var t=e.segmentDuration,e=e.maxDuration;return!!t&&Math.round(t)>e+hl}function ul(e,t){if("hls"!==t)return null;var n,r,i=(n={audioTimingInfo:e.audioTimingInfo,videoTimingInfo:e.videoTimingInfo},r=0,["video","audio"].forEach(function(e){var t,i=n[e+"TimingInfo"];i&&(e=i.start,i=i.end,"bigint"==typeof e||"bigint"==typeof i?t=window.BigInt(i)-window.BigInt(e):"number"==typeof e&&"number"==typeof i&&(t=i-e),"undefined"!=typeof t&&r=r+i)return o(e,{response:n.subarray(i,i+r),status:t.status,uri:t.uri});u.request=u.vhs_.xhr({uri:s,responseType:"arraybuffer",headers:gu({byterange:a.sidx.byterange})},o)})):this.mediaRequest_=window.setTimeout(function(){return r(!1)},0)},t.dispose=function(){this.trigger("dispose"),this.stopRequest(),this.loadedPlaylists_={},window.clearTimeout(this.minimumUpdatePeriodTimeout_),window.clearTimeout(this.mediaRequest_),window.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null,this.mediaRequest_=null,this.minimumUpdatePeriodTimeout_=null,this.masterPlaylistLoader_.createMupOnMedia_&&(this.off("loadedmetadata",this.masterPlaylistLoader_.createMupOnMedia_),this.masterPlaylistLoader_.createMupOnMedia_=null),this.off()},t.hasPendingRequest=function(){return this.request||this.mediaRequest_},t.stopRequest=function(){var e;this.request&&(e=this.request,this.request=null,e.onreadystatechange=null,e.abort())},t.media=function(t){var i=this;if(!t)return this.media_;if("HAVE_NOTHING"===this.state)throw new Error("Cannot switch media playlist from "+this.state);var n=this.state;if("string"==typeof t){if(!this.masterPlaylistLoader_.master.playlists[t])throw new Error("Unknown playlist URI: "+t);t=this.masterPlaylistLoader_.master.playlists[t]}var e=!this.media_||t.id!==this.media_.id;if(e&&this.loadedPlaylists_[t.id]&&this.loadedPlaylists_[t.id].endList)return this.state="HAVE_METADATA",this.media_=t,void(e&&(this.trigger("mediachanging"),this.trigger("mediachange")));e&&(this.media_&&this.trigger("mediachanging"),this.addSidxSegments_(t,n,function(e){i.haveMetadata({startingState:n,playlist:t})}))},t.haveMetadata=function(e){var t=e.startingState,e=e.playlist;this.state="HAVE_METADATA",this.loadedPlaylists_[e.id]=e,this.mediaRequest_=null,this.refreshMedia_(e.id),"HAVE_MASTER"===t?this.trigger("loadedmetadata"):this.trigger("mediachange")},t.pause=function(){this.masterPlaylistLoader_.createMupOnMedia_&&(this.off("loadedmetadata",this.masterPlaylistLoader_.createMupOnMedia_),this.masterPlaylistLoader_.createMupOnMedia_=null),this.stopRequest(),window.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null,this.isMaster_&&(window.clearTimeout(this.masterPlaylistLoader_.minimumUpdatePeriodTimeout_),this.masterPlaylistLoader_.minimumUpdatePeriodTimeout_=null),"HAVE_NOTHING"===this.state&&(this.started=!1)},t.load=function(e){var t=this;window.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null;var i=this.media();e?(e=i?i.targetDuration/2*1e3:5e3,this.mediaUpdateTimeout=window.setTimeout(function(){return t.load()},e)):this.started?i&&!i.endList?(this.isMaster_&&!this.minimumUpdatePeriodTimeout_&&(this.trigger("minimumUpdatePeriod"),this.updateMinimumUpdatePeriodTimeout_()),this.trigger("mediaupdatetimeout")):this.trigger("loadedplaylist"):this.start()},t.start=function(){var i=this;this.started=!0,this.isMaster_?this.requestMaster_(function(e,t){i.haveMaster_(),i.hasPendingRequest()||i.media_||i.media(i.masterPlaylistLoader_.master.playlists[0])}):this.mediaRequest_=window.setTimeout(function(){return i.haveMaster_()},0)},t.requestMaster_=function(n){var r=this;this.request=this.vhs_.xhr({uri:this.masterPlaylistLoader_.srcUrl,withCredentials:this.withCredentials},function(e,t){if(!r.requestErrored_(e,t)){var i=t.responseText!==r.masterPlaylistLoader_.masterXml_;return r.masterPlaylistLoader_.masterXml_=t.responseText,t.responseHeaders&&t.responseHeaders.date?r.masterLoaded_=Date.parse(t.responseHeaders.date):r.masterLoaded_=Date.now(),r.masterPlaylistLoader_.srcUrl=Do(r.handleManifestRedirects,r.masterPlaylistLoader_.srcUrl,t),i?(r.handleMaster_(),void r.syncClientServerClock_(function(){return n(t,i)})):n(t,i)}"HAVE_NOTHING"===r.state&&(r.started=!1)})},t.syncClientServerClock_=function(i){var n=this,r=Gs(this.masterPlaylistLoader_.masterXml_);return null===r?(this.masterPlaylistLoader_.clientOffset_=this.masterLoaded_-Date.now(),i()):"DIRECT"===r.method?(this.masterPlaylistLoader_.clientOffset_=r.value-Date.now(),i()):void(this.request=this.vhs_.xhr({uri:dl(this.masterPlaylistLoader_.srcUrl,r.value),method:r.method,withCredentials:this.withCredentials},function(e,t){if(n.request){if(e)return n.masterPlaylistLoader_.clientOffset_=n.masterLoaded_-Date.now(),i();t="HEAD"===r.method?t.responseHeaders&&t.responseHeaders.date?Date.parse(t.responseHeaders.date):n.masterLoaded_:Date.parse(t.responseText);n.masterPlaylistLoader_.clientOffset_=t-Date.now(),i()}}))},t.haveMaster_=function(){this.state="HAVE_MASTER",this.isMaster_?this.trigger("loadedplaylist"):this.media_||this.media(this.childPlaylist_)},t.handleMaster_=function(){this.mediaRequest_=null;var e,t,i,n,r=this.masterPlaylistLoader_.master,t=(a={masterXml:this.masterPlaylistLoader_.masterXml_,srcUrl:this.masterPlaylistLoader_.srcUrl,clientOffset:this.masterPlaylistLoader_.clientOffset_,sidxMapping:this.masterPlaylistLoader_.sidxMapping_,previousManifest:r},e=a.masterXml,t=a.srcUrl,i=a.clientOffset,n=a.sidxMapping,a=a.previousManifest,a=Ws(e,{manifestUri:t,clientOffset:i,sidxMapping:n,previousManifest:a}),ou(a,t),a);r&&(t=function(e,t,i){for(var a=!0,s=bl(e,{duration:t.duration,minimumUpdatePeriod:t.minimumUpdatePeriod,timelineStarts:t.timelineStarts}),n=0;n>>1,e.samplingfrequencyindex<<7|e.channelcount<<3,6,1,2]))},f=function(e){return u(T.hdlr,I[e])},p=function(e){var t=new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,0,1,95,144,e.duration>>>24&255,e.duration>>>16&255,e.duration>>>8&255,255&e.duration,85,196,0,0]);return e.samplerate&&(t[12]=e.samplerate>>>24&255,t[13]=e.samplerate>>>16&255,t[14]=e.samplerate>>>8&255,t[15]=255&e.samplerate),u(T.mdhd,t)},h=function(e){return u(T.mdia,p(e),f(e.type),a(e))},r=function(e){return u(T.mfhd,new Uint8Array([0,0,0,0,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e]))},a=function(e){return u(T.minf,"video"===e.type?u(T.vmhd,x):u(T.smhd,A),t(),g(e))},We=function(e,t){for(var i=[],n=t.length;n--;)i[n]=v(t[n]);return u.apply(null,[T.moof,r(e)].concat(i))},s=function(e){for(var t=e.length,i=[];t--;)i[t]=c(e[t]);return u.apply(null,[T.moov,l(4294967295)].concat(i).concat(o(e)))},o=function(e){for(var t=e.length,i=[];t--;)i[t]=_(e[t]);return u.apply(null,[T.mvex].concat(i))},l=function(e){e=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,0,1,95,144,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return u(T.mvhd,e)},m=function(e){for(var t,i=e.samples||[],n=new Uint8Array(4+i.length),r=0;r>>8),a.push(255&n[o].byteLength),a=a.concat(Array.prototype.slice.call(n[o]));for(o=0;o>>8),s.push(255&r[o].byteLength),s=s.concat(Array.prototype.slice.call(r[o]));return t=[T.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(65280&e.width)>>8,255&e.width,(65280&e.height)>>8,255&e.height,0,72,0,0,0,72,0,0,0,0,0,0,0,1,19,118,105,100,101,111,106,115,45,99,111,110,116,114,105,98,45,104,108,115,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u(T.avcC,new Uint8Array([1,e.profileIdc,e.profileCompatibility,e.levelIdc,255].concat([n.length],a,[r.length],s))),u(T.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192]))],e.sarRatio&&(i=e.sarRatio[0],e=e.sarRatio[1],t.push(u(T.pasp,new Uint8Array([(4278190080&i)>>24,(16711680&i)>>16,(65280&i)>>8,255&i,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e])))),u.apply(null,t)},N=function(e){return u(T.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,(65280&e.channelcount)>>8,255&e.channelcount,(65280&e.samplesize)>>8,255&e.samplesize,0,0,0,0,(65280&e.samplerate)>>8,255&e.samplerate,0,0]),i(e))},d=function(e){e=new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,0,(4278190080&e.duration)>>24,(16711680&e.duration)>>16,(65280&e.duration)>>8,255&e.duration,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,(65280&e.width)>>8,255&e.width,0,0,(65280&e.height)>>8,255&e.height,0,0]);return u(T.tkhd,e)},v=function(e){var t,i=u(T.tfhd,new Uint8Array([0,0,0,58,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0])),n=Math.floor(e.baseMediaDecodeTime/V),r=Math.floor(e.baseMediaDecodeTime%V),n=u(T.tfdt,new Uint8Array([1,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,r>>>24&255,r>>>16&255,r>>>8&255,255&r]));return"audio"===e.type?(t=b(e,92),u(T.traf,i,n,t)):(r=m(e),t=b(e,r.length+92),u(T.traf,i,n,t,r))},c=function(e){return e.duration=e.duration||4294967295,u(T.trak,d(e),h(e))},_=function(e){var t=new Uint8Array([0,0,0,0,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return"video"!==e.type&&(t[t.length-1]=0),u(T.trex,t)},U=function(e,t){var i=0,n=0,r=0,a=0;return e.length&&(void 0!==e[0].duration&&(i=1),void 0!==e[0].size&&(n=2),void 0!==e[0].flags&&(r=4),void 0!==e[0].compositionTimeOffset&&(a=8)),[0,0,i|n|r|a,1,(4278190080&e.length)>>>24,(16711680&e.length)>>>16,(65280&e.length)>>>8,255&e.length,(4278190080&t)>>>24,(16711680&t)>>>16,(65280&t)>>>8,255&t]},B=function(e,t){var i,n,r,a,s=e.samples||[];for(t+=20+16*s.length,t=U(s,t),(n=new Uint8Array(t.length+16*s.length)).set(t),i=t.length,a=0;a>>24,n[i++]=(16711680&r.duration)>>>16,n[i++]=(65280&r.duration)>>>8,n[i++]=255&r.duration,n[i++]=(4278190080&r.size)>>>24,n[i++]=(16711680&r.size)>>>16,n[i++]=(65280&r.size)>>>8,n[i++]=255&r.size,n[i++]=r.flags.isLeading<<2|r.flags.dependsOn,n[i++]=r.flags.isDependedOn<<6|r.flags.hasRedundancy<<4|r.flags.paddingValue<<1|r.flags.isNonSyncSample,n[i++]=61440&r.flags.degradationPriority,n[i++]=15&r.flags.degradationPriority,n[i++]=(4278190080&r.compositionTimeOffset)>>>24,n[i++]=(16711680&r.compositionTimeOffset)>>>16,n[i++]=(65280&r.compositionTimeOffset)>>>8,n[i++]=255&r.compositionTimeOffset;return u(T.trun,n)},F=function(e,t){var i,n,r,a,s=e.samples||[];for(t+=20+8*s.length,t=U(s,t),(i=new Uint8Array(t.length+8*s.length)).set(t),n=t.length,a=0;a>>24,i[n++]=(16711680&r.duration)>>>16,i[n++]=(65280&r.duration)>>>8,i[n++]=255&r.duration,i[n++]=(4278190080&r.size)>>>24,i[n++]=(16711680&r.size)>>>16,i[n++]=(65280&r.size)>>>8,i[n++]=255&r.size;return u(T.trun,i)},b=function(e,t){return("audio"===e.type?F:B)(e,t)};n=function(){return u(T.ftyp,S,w,S,E)};function W(e,t){var i={size:0,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0,degradationPriority:0,isNonSyncSample:1}};return i.dataOffset=t,i.compositionTimeOffset=e.pts-e.dts,i.duration=e.duration,i.size=4*e.length,i.size+=e.byteLength,e.keyFrame&&(i.flags.dependsOn=2,i.flags.isNonSyncSample=0),i}function G(e){for(var t=[];e--;)t.push(0);return t}function z(){var e,i;return X||(e={96e3:[ie,[227,64],G(154),[56]],88200:[ie,[231],G(170),[56]],64e3:[ie,[248,192],G(240),[56]],48e3:[ie,[255,192],G(268),[55,148,128],G(54),[112]],44100:[ie,[255,192],G(268),[55,163,128],G(84),[112]],32e3:[ie,[255,192],G(268),[55,234],G(226),[112]],24e3:[ie,[255,192],G(268),[55,255,128],G(268),[111,112],G(126),[224]],16e3:[ie,[255,192],G(268),[55,255,128],G(268),[111,255],G(269),[223,108],G(195),[1,192]],12e3:[ne,G(268),[3,127,248],G(268),[6,255,240],G(268),[13,255,224],G(268),[27,253,128],G(259),[56]],11025:[ne,G(268),[3,127,248],G(268),[6,255,240],G(268),[13,255,224],G(268),[27,255,192],G(268),[55,175,128],G(108),[112]],8e3:[ne,G(268),[3,121,16],G(47),[7]]},i=e,X=Object.keys(i).reduce(function(e,t){return e[t]=new Uint8Array(i[t].reduce(function(e,t){return e.concat(t)},[])),e},{})),X}var X,K=function(e){return u(T.mdat,e)},Y=We,Q=function(e){var t=n(),i=s(e),e=new Uint8Array(t.byteLength+i.byteLength);return e.set(t),e.set(i,t.byteLength),e},$=function(e){var t,i,n=[],r=[];for(r.byteLength=0,r.nalCount=0,r.duration=0,t=n.byteLength=0;t=i?e:(t.minSegmentDts=1/0,e.filter(function(e){return e.dts>=i&&(t.minSegmentDts=Math.min(t.minSegmentDts,e.dts),t.minSegmentPts=t.minSegmentDts,!0)}))},ge=function(e){for(var t,i=[],n=0;n=this.virtualRowCount&&"function"==typeof this.beforeRowOverflow&&this.beforeRowOverflow(e),0this.virtualRowCount;)this.rows.shift(),this.rowIdx--},Ae.prototype.isEmpty=function(){return 0===this.rows.length||1===this.rows.length&&""===this.rows[0]},Ae.prototype.addText=function(e){this.rows[this.rowIdx]+=e},Ae.prototype.backspace=function(){var e;this.isEmpty()||(e=this.rows[this.rowIdx],this.rows[this.rowIdx]=e.substr(0,e.length-1))};function Le(e,t,i){this.serviceNum=e,this.text="",this.currentWindow=new Ae(-1),this.windows=[],this.stream=i,"string"==typeof t&&this.createTextDecoder(t)}Le.prototype.init=function(e,t){this.startPts=e;for(var i=0;i<8;i++)this.windows[i]=new Ae(i),"function"==typeof t&&(this.windows[i].beforeRowOverflow=t)},Le.prototype.setCurrentWindow=function(e){this.currentWindow=this.windows[e]},Le.prototype.createTextDecoder=function(t){if("undefined"==typeof TextDecoder)this.stream.trigger("log",{level:"warn",message:"The `encoding` option is unsupported without TextDecoder support"});else try{this.textDecoder_=new TextDecoder(t)}catch(e){this.stream.trigger("log",{level:"warn",message:"TextDecoder could not be created with "+t+" encoding. "+e})}};var De=function e(t){t=t||{},e.prototype.init.call(this);var i,n=this,r=t.captionServices||{},a={};Object.keys(r).forEach(function(e){i=r[e],/^SERVICE/.test(e)&&(a[e]=i.encoding)}),this.serviceEncodings=a,this.current708Packet=null,this.services={},this.push=function(e){(3===e.type||null===n.current708Packet)&&n.new708Packet(),n.add708Bytes(e)}};De.prototype=new j,De.prototype.new708Packet=function(){null!==this.current708Packet&&this.push708Packet(),this.current708Packet={data:[],ptsVals:[]}},De.prototype.add708Bytes=function(e){var t=e.ccData,i=t>>>8,t=255&t;this.current708Packet.ptsVals.push(e.pts),this.current708Packet.data.push(i),this.current708Packet.data.push(t)},De.prototype.push708Packet=function(){var e,t=this.current708Packet,i=t.data,n=null,r=0,a=i[r++];for(t.seq=a>>6,t.sizeCode=63&a;r>5)&&0>5,t.rowLock=(16&n)>>4,t.columnLock=(8&n)>>3,t.priority=7&n,n=i[++e],t.relativePositioning=(128&n)>>7,t.anchorVertical=127&n,n=i[++e],t.anchorHorizontal=n,n=i[++e],t.anchorPoint=(240&n)>>4,t.rowCount=15&n,n=i[++e],t.columnCount=63&n,n=i[++e],t.windowStyle=(56&n)>>3,t.penStyle=7&n,t.virtualRowCount=t.rowCount+1,e},De.prototype.setWindowAttributes=function(e,t){var i=this.current708Packet.data,n=i[e],t=t.currentWindow.winAttr,n=i[++e];return t.fillOpacity=(192&n)>>6,t.fillRed=(48&n)>>4,t.fillGreen=(12&n)>>2,t.fillBlue=3&n,n=i[++e],t.borderType=(192&n)>>6,t.borderRed=(48&n)>>4,t.borderGreen=(12&n)>>2,t.borderBlue=3&n,n=i[++e],t.borderType+=(128&n)>>5,t.wordWrap=(64&n)>>6,t.printDirection=(48&n)>>4,t.scrollDirection=(12&n)>>2,t.justify=3&n,n=i[++e],t.effectSpeed=(240&n)>>4,t.effectDirection=(12&n)>>2,t.displayEffect=3&n,e},De.prototype.flushDisplayed=function(e,t){for(var i=[],n=0;n<8;n++)t.windows[n].visible&&!t.windows[n].isEmpty()&&i.push(t.windows[n].getText());t.endPts=e,t.text=i.join("\n\n"),this.pushCaption(t),t.startPts=e},De.prototype.pushCaption=function(e){""!==e.text&&(this.trigger("data",{startPts:e.startPts,endPts:e.endPts,text:e.text,stream:"cc708_"+e.serviceNum}),e.text="",e.startPts=e.endPts)},De.prototype.displayWindows=function(e,t){var i=this.current708Packet.data[++e],n=this.getPts(e);this.flushDisplayed(n,t);for(var r=0;r<8;r++)i&1<>4,t.offset=(12&n)>>2,t.penSize=3&n,n=i[++e],t.italics=(128&n)>>7,t.underline=(64&n)>>6,t.edgeType=(56&n)>>3,t.fontStyle=7&n,e},De.prototype.setPenColor=function(e,t){var i=this.current708Packet.data,n=i[e],t=t.currentWindow.penColor,n=i[++e];return t.fgOpacity=(192&n)>>6,t.fgRed=(48&n)>>4,t.fgGreen=(12&n)>>2,t.fgBlue=3&n,n=i[++e],t.bgOpacity=(192&n)>>6,t.bgRed=(48&n)>>4,t.bgGreen=(12&n)>>2,t.bgBlue=3&n,n=i[++e],t.edgeRed=(48&n)>>4,t.edgeGreen=(12&n)>>2,t.edgeBlue=3&n,e},De.prototype.setPenLocation=function(e,t){var i=this.current708Packet.data,n=i[e],r=t.currentWindow.penLoc;return t.currentWindow.pendingNewLine=!0,n=i[++e],r.row=15&n,n=i[++e],r.column=63&n,e},De.prototype.reset=function(e,t){var i=this.getPts(e);return this.flushDisplayed(i,t),this.initService(t.serviceNum,e)};function Oe(e){return null===e?"":(e=Me[e]||e,String.fromCharCode(e))}function Re(){for(var e=[],t=15;t--;)e.push("");return e}var Me={42:225,92:233,94:237,95:243,96:250,123:231,124:247,125:209,126:241,127:9608,304:174,305:176,306:189,307:191,308:8482,309:162,310:163,311:9834,312:224,313:160,314:232,315:226,316:234,317:238,318:244,319:251,544:193,545:201,546:211,547:218,548:220,549:252,550:8216,551:161,552:42,553:39,554:8212,555:169,556:8480,557:8226,558:8220,559:8221,560:192,561:194,562:199,563:200,564:202,565:203,566:235,567:206,568:207,569:239,570:212,571:217,572:249,573:219,574:171,575:187,800:195,801:227,802:205,803:204,804:236,805:210,806:242,807:213,808:245,809:123,810:125,811:92,812:94,813:95,814:124,815:126,816:196,817:228,818:214,819:246,820:223,821:165,822:164,823:9474,824:197,825:229,826:216,827:248,828:9484,829:9488,830:9492,831:9496},Ne=[4352,4384,4608,4640,5376,5408,5632,5664,5888,5920,4096,4864,4896,5120,5152],Ue=function e(t,i){e.prototype.init.call(this),this.field_=t||0,this.dataChannel_=i||0,this.name_="CC"+(1+(this.field_<<1|this.dataChannel_)),this.setConstants(),this.reset(),this.push=function(e){var t,i,n,r,a=32639&e.ccData;a!==this.lastControlCode_?(4096==(61440&a)?this.lastControlCode_=a:a!==this.PADDING_&&(this.lastControlCode_=null),t=a>>>8,i=255&a,a===this.PADDING_||(a===this.RESUME_CAPTION_LOADING_?this.mode_="popOn":a===this.END_OF_CAPTION_?(this.mode_="popOn",this.clearFormatting(e.pts),this.flushDisplayed(e.pts),r=this.displayed_,this.displayed_=this.nonDisplayed_,this.nonDisplayed_=r,this.startPts_=e.pts):a===this.ROLL_UP_2_ROWS_?(this.rollUpRows_=2,this.setRollUp(e.pts)):a===this.ROLL_UP_3_ROWS_?(this.rollUpRows_=3,this.setRollUp(e.pts)):a===this.ROLL_UP_4_ROWS_?(this.rollUpRows_=4,this.setRollUp(e.pts)):a===this.CARRIAGE_RETURN_?(this.clearFormatting(e.pts),this.flushDisplayed(e.pts),this.shiftRowsUp_(),this.startPts_=e.pts):a===this.BACKSPACE_?"popOn"===this.mode_?this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0,-1):this.displayed_[this.row_]=this.displayed_[this.row_].slice(0,-1):a===this.ERASE_DISPLAYED_MEMORY_?(this.flushDisplayed(e.pts),this.displayed_=Re()):a===this.ERASE_NON_DISPLAYED_MEMORY_?this.nonDisplayed_=Re():a===this.RESUME_DIRECT_CAPTIONING_?("paintOn"!==this.mode_&&(this.flushDisplayed(e.pts),this.displayed_=Re()),this.mode_="paintOn",this.startPts_=e.pts):this.isSpecialCharacter(t,i)?(n=Oe((t=(3&t)<<8)|i),this[this.mode_](e.pts,n),this.column_++):this.isExtCharacter(t,i)?("popOn"===this.mode_?this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0,-1):this.displayed_[this.row_]=this.displayed_[this.row_].slice(0,-1),n=Oe((t=(3&t)<<8)|i),this[this.mode_](e.pts,n),this.column_++):this.isMidRowCode(t,i)?(this.clearFormatting(e.pts),this[this.mode_](e.pts," "),this.column_++,14==(14&i)&&this.addFormatting(e.pts,["i"]),1==(1&i)&&this.addFormatting(e.pts,["u"])):this.isOffsetControlCode(t,i)?this.column_+=3&i:this.isPAC(t,i)?(r=Ne.indexOf(7968&a),"rollUp"===this.mode_&&(r-this.rollUpRows_+1<0&&(r=this.rollUpRows_-1),this.setRollUp(e.pts,r)),r!==this.row_&&(this.clearFormatting(e.pts),this.row_=r),1&i&&-1===this.formatting_.indexOf("u")&&this.addFormatting(e.pts,["u"]),16==(16&a)&&(this.column_=4*((14&a)>>1)),this.isColorPAC(i)&&14==(14&i)&&this.addFormatting(e.pts,["i"])):this.isNormalChar(t)&&(0===i&&(i=null),n=Oe(t),n+=Oe(i),this[this.mode_](e.pts,n),this.column_+=n.length))):this.lastControlCode_=null}};Ue.prototype=new j,Ue.prototype.flushDisplayed=function(e){var t=this.displayed_.map(function(e,t){try{return e.trim()}catch(e){return this.trigger("log",{level:"warn",message:"Skipping a malformed 608 caption at index "+t+"."}),""}},this).join("\n").replace(/^\n+|\n+$/g,"");t.length&&this.trigger("data",{startPts:this.startPts_,endPts:e,text:t,stream:this.name_})},Ue.prototype.reset=function(){this.mode_="popOn",this.topRow_=0,this.startPts_=0,this.displayed_=Re(),this.nonDisplayed_=Re(),this.lastControlCode_=null,this.column_=0,this.row_=14,this.rollUpRows_=2,this.formatting_=[]},Ue.prototype.setConstants=function(){0===this.dataChannel_?(this.BASE_=16,this.EXT_=17,this.CONTROL_=(20|this.field_)<<8,this.OFFSET_=23):1===this.dataChannel_&&(this.BASE_=24,this.EXT_=25,this.CONTROL_=(28|this.field_)<<8,this.OFFSET_=31),this.PADDING_=0,this.RESUME_CAPTION_LOADING_=32|this.CONTROL_,this.END_OF_CAPTION_=47|this.CONTROL_,this.ROLL_UP_2_ROWS_=37|this.CONTROL_,this.ROLL_UP_3_ROWS_=38|this.CONTROL_,this.ROLL_UP_4_ROWS_=39|this.CONTROL_,this.CARRIAGE_RETURN_=45|this.CONTROL_,this.RESUME_DIRECT_CAPTIONING_=41|this.CONTROL_,this.BACKSPACE_=33|this.CONTROL_,this.ERASE_DISPLAYED_MEMORY_=44|this.CONTROL_,this.ERASE_NON_DISPLAYED_MEMORY_=46|this.CONTROL_},Ue.prototype.isSpecialCharacter=function(e,t){return e===this.EXT_&&48<=t&&t<=63},Ue.prototype.isExtCharacter=function(e,t){return(e===this.EXT_+1||e===this.EXT_+2)&&32<=t&&t<=63},Ue.prototype.isMidRowCode=function(e,t){return e===this.EXT_&&32<=t&&t<=47},Ue.prototype.isOffsetControlCode=function(e,t){return e===this.OFFSET_&&33<=t&&t<=35},Ue.prototype.isPAC=function(e,t){return e>=this.BASE_&&e"},"");this[this.mode_](e,t)},Ue.prototype.clearFormatting=function(e){var t;this.formatting_.length&&(t=this.formatting_.reverse().reduce(function(e,t){return e+""},""),this.formatting_=[],this[this.mode_](e,t))},Ue.prototype.popOn=function(e,t){var i=this.nonDisplayed_[this.row_];this.nonDisplayed_[this.row_]=i+=t},Ue.prototype.rollUp=function(e,t){var i=this.displayed_[this.row_];this.displayed_[this.row_]=i+=t},Ue.prototype.shiftRowsUp_=function(){for(var e=0;e>>2,s*=4,s+=3&a[7],o.timeStamp=s,void 0===t.pts&&void 0===t.dts&&(t.pts=o.timeStamp,t.dts=o.timeStamp),this.trigger("timestamp",o))),t.frames.push(o),i+=10,(i+=n)>>4&&(i+=e[i]+1),0===t.pid)t.type="pat",n(e.subarray(i),t),this.trigger("data",t);else if(t.pid===this.pmtPid)for(t.type="pmt",n(e.subarray(i),t),this.trigger("data",t);this.packetsWaitingForPmt.length;)this.processPes_.apply(this,this.packetsWaitingForPmt.shift());else void 0===this.programMapTable?this.packetsWaitingForPmt.push([e,i,t]):this.processPes_(e,i,t)},this.processPes_=function(e,t,i){i.pid===this.programMapTable.video?i.streamType=je.H264_STREAM_TYPE:i.pid===this.programMapTable.audio?i.streamType=je.ADTS_STREAM_TYPE:i.streamType=this.programMapTable["timed-metadata"][i.pid],i.type="pes",i.data=e.subarray(t),this.trigger("data",i)}}).prototype=new j,Xe.STREAM_TYPES={h264:27,adts:15},(Ke=function(){function n(e,t,i){var n,r,a,s,o=new Uint8Array(e.size),u={type:t},l=0,c=0;if(e.data.length&&!(e.size<9)){for(u.trackId=e.data[0].pid,l=0;l>>3,a.pts*=4,a.pts+=(6&r[13])>>>1,a.dts=a.pts,64&s&&(a.dts=(14&r[14])<<27|(255&r[15])<<20|(254&r[16])<<12|(255&r[17])<<5|(254&r[18])>>>3,a.dts*=4,a.dts+=(6&r[18])>>>1)),a.data=r.subarray(9+r[8])),t="video"===t||u.packetLength<=e.size,(i||t)&&(e.size=0,e.data.length=0),t&&d.trigger("data",u)}}var t,d=this,r=!1,a={data:[],size:0},s={data:[],size:0},o={data:[],size:0};Ke.prototype.init.call(this),this.push=function(i){({pat:function(){},pes:function(){var e,t;switch(i.streamType){case je.H264_STREAM_TYPE:e=a,t="video";break;case je.ADTS_STREAM_TYPE:e=s,t="audio";break;case je.METADATA_STREAM_TYPE:e=o,t="timed-metadata";break;default:return}i.payloadUnitStartIndicator&&n(e,t,!0),e.data.push(i),e.size+=i.data.byteLength},pmt:function(){var e={type:"metadata",tracks:[]};null!==(t=i.programMapTable).video&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.video,codec:"avc",type:"video"}),null!==t.audio&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.audio,codec:"adts",type:"audio"}),r=!0,d.trigger("data",e)}})[i.type]()},this.reset=function(){a.size=0,a.data.length=0,s.size=0,s.data.length=0,this.trigger("reset")},this.flushStreams_=function(){n(a,"video"),n(s,"audio"),n(o,"timed-metadata")},this.flush=function(){var e;!r&&t&&(e={type:"metadata",tracks:[]},null!==t.video&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.video,codec:"avc",type:"video"}),null!==t.audio&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.audio,codec:"adts",type:"audio"}),d.trigger("data",e)),r=!1,this.flushStreams_(),this.trigger("done")}}).prototype=new j;var Qe,$e={PAT_PID:0,MP2T_PACKET_LENGTH:188,TransportPacketStream:Ye,TransportParseStream:Xe,ElementaryStream:Ke,TimestampRolloverStream:We,CaptionStream:Fe.CaptionStream,Cea608Stream:Fe.Cea608Stream,Cea708Stream:Fe.Cea708Stream,MetadataStream:e};for(Qe in je)je.hasOwnProperty(Qe)&&($e[Qe]=je[Qe]);var Je=$e,Ze=ue,et=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],tt=function(u){var l,c=0;tt.prototype.init.call(this),this.skipWarn_=function(e,t){this.trigger("log",{level:"warn",message:"adts skiping bytes "+e+" to "+t+" in frame "+c+" outside syncword"})},this.push=function(e){var t,i,n,r,a,s,o=0;if(u||(c=0),"audio"===e.type){for(l&&l.length?(n=l,(l=new Uint8Array(n.byteLength+e.data.byteLength)).set(n),l.set(e.data,n.byteLength)):l=e.data;o+7>5,a=(r=1024*(1+(3&l[o+6])))*Ze/et[(60&l[o+2])>>>2],l.byteLength-o>>6&3),channelcount:(1&l[o+2])<<2|(192&l[o+3])>>>6,samplerate:et[(60&l[o+2])>>>2],samplingfrequencyindex:(60&l[o+2])>>>2,samplesize:16,data:l.subarray(o+7+i,o+t)}),c++,o+=t}else"number"!=typeof s&&(s=o),o++;"number"==typeof s&&(this.skipWarn_(s,o),s=null),l=l.subarray(o)}},this.flush=function(){c=0,this.trigger("done")},this.reset=function(){l=void 0,this.trigger("reset")},this.endTimeline=function(){l=void 0,this.trigger("endedtimeline")}};tt.prototype=new j;var it,nt,rt=tt,at=function(n){var r=n.byteLength,a=0,s=0;this.length=function(){return 8*r},this.bitsAvailable=function(){return 8*r+s},this.loadWord=function(){var e=n.byteLength-r,t=new Uint8Array(4),i=Math.min(4,r);if(0===i)throw new Error("no bytes available");t.set(n.subarray(e,e+i)),a=new DataView(t.buffer).getUint32(0),s=8*i,r-=i},this.skipBits=function(e){var t;e>>32-t;return 0<(s-=t)?a<<=t:0>>e))return a<<=e,s-=e,e;return this.loadWord(),e+this.skipLeadingZeros()},this.skipUnsignedExpGolomb=function(){this.skipBits(1+this.skipLeadingZeros())},this.skipExpGolomb=function(){this.skipBits(1+this.skipLeadingZeros())},this.readUnsignedExpGolomb=function(){var e=this.skipLeadingZeros();return this.readBits(e+1)-1},this.readExpGolomb=function(){var e=this.readUnsignedExpGolomb();return 1&e?1+e>>>1:-1*(e>>>1)},this.readBoolean=function(){return 1===this.readBits(1)},this.readUnsignedByte=function(){return this.readBits(8)},this.loadWord()},st=function(){var n,r,a=0;st.prototype.init.call(this),this.push=function(e){for(var t,i=(r=r?((t=new Uint8Array(r.byteLength+e.data.byteLength)).set(r),t.set(e.data,r.byteLength),t):e.data).byteLength;a>4?i+20:i+10}function ut(e,t){return e.length-t<10||e[t]!=="I".charCodeAt(0)||e[t+1]!=="D".charCodeAt(0)||e[t+2]!=="3".charCodeAt(0)?t:ut(e,t+=ot(e,t))}function lt(e){return e[0]<<21|e[1]<<14|e[2]<<7|e[3]}var e={H264Stream:it,NalByteStream:st},ct=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],dt={isLikelyAacData:function(e){var t=ut(e,0);return e.length>=t+2&&255==(255&e[t])&&240==(240&e[t+1])&&16==(22&e[t+1])},parseId3TagSize:ot,parseAdtsSize:function(e,t){var i=(224&e[t+5])>>5,n=e[t+4]<<3;return 6144&e[t+3]|n|i},parseType:function(e,t){return e[t]==="I".charCodeAt(0)&&e[t+1]==="D".charCodeAt(0)&&e[t+2]==="3".charCodeAt(0)?"timed-metadata":!0&e[t]&&240==(240&e[t+1])?"audio":null},parseSampleRate:function(e){for(var t=0;t+5>>2];t++}return null},parseAacTimestamp:function(e){var t,i=10;64&e[5]&&(i+=4,i+=lt(e.subarray(10,14)));do{if((t=lt(e.subarray(i+4,i+8)))<1)return null;if("PRIV"===String.fromCharCode(e[i],e[i+1],e[i+2],e[i+3]))for(var n=e.subarray(i+10,i+t+10),r=0;r>>2;return s*=4,s+=3&a[7]}}while(i+=10,(i+=t)a.length)break;t={type:"audio",data:a.subarray(r,r+n),pts:s,dts:s},this.trigger("data",t),r+=n}else{if(a.length-r<10)break;if(r+(n=dt.parseId3TagSize(a,r))>a.length)break;t={type:"timed-metadata",data:a.subarray(r,r+n)},this.trigger("data",t),r+=n}e=a.length-r,a=0i.pts?u++:(t++,a-=n.byteLength,s-=n.nalCount,o-=n.duration);return 0===t?e:t===e.length?null:((r=e.slice(t)).byteLength=a,r.duration=o,r.nalCount=s,r.pts=r[0].pts,r.dts=r[0].dts,r)},this.alignGopsAtEnd_=function(e){for(var t,i,n=l.length-1,r=e.length-1,a=null,s=!1;0<=n&&0<=r;){if(t=l[n],i=e[r],t.pts===i.pts){s=!0;break}t.pts>i.pts?n--:(n===l.length-1&&(a=r),r--)}if(!s&&null===a)return null;if(0===(u=s?r:a))return e;var o=e.slice(u),u=o.reduce(function(e,t){return e.byteLength+=t.byteLength,e.duration+=t.duration,e.nalCount+=t.nalCount,e},{byteLength:0,duration:0,nalCount:0});return o.byteLength=u.byteLength,o.duration=u.duration,o.nalCount=u.nalCount,o.pts=o[0].pts,o.dts=o[0].dts,o},this.alignGopsWith=function(e){l=e}}).prototype=new j,(_t=function(e,t){this.numberOfTracks=0,this.metadataStream=t,"undefined"!=typeof(e=e||{}).remux?this.remuxTracks=!!e.remux:this.remuxTracks=!0,"boolean"==typeof e.keepOriginalTimestamps?this.keepOriginalTimestamps=e.keepOriginalTimestamps:this.keepOriginalTimestamps=!1,this.pendingTracks=[],this.videoTrack=null,this.pendingBoxes=[],this.pendingCaptions=[],this.pendingMetadata=[],this.pendingBytes=0,this.emittedTracks=0,_t.prototype.init.call(this),this.push=function(e){return e.text?this.pendingCaptions.push(e):e.frames?this.pendingMetadata.push(e):(this.pendingTracks.push(e.track),this.pendingBytes+=e.boxes.byteLength,"video"===e.track.type&&(this.videoTrack=e.track,this.pendingBoxes.push(e.boxes)),void("audio"===e.track.type&&(this.audioTrack=e.track,this.pendingBoxes.unshift(e.boxes))))}}).prototype=new j,_t.prototype.flush=function(e){var t,i,n,r=0,a={captions:[],captionStreams:{},metadata:[],info:{}},s=0;if(this.pendingTracks.length=this.numberOfTracks&&(this.trigger("done"),this.emittedTracks=0))}if(this.videoTrack?(s=this.videoTrack.timelineStartInfo.pts,St.forEach(function(e){a.info[e]=this.videoTrack[e]},this)):this.audioTrack&&(s=this.audioTrack.timelineStartInfo.pts,Tt.forEach(function(e){a.info[e]=this.audioTrack[e]},this)),this.videoTrack||this.audioTrack){for(1===this.pendingTracks.length?a.type=this.pendingTracks[0].type:a.type="combined",this.emittedTracks+=this.pendingTracks.length,e=Q(this.pendingTracks),a.initSegment=new Uint8Array(e.byteLength),a.initSegment.set(e),a.data=new Uint8Array(this.pendingBytes),n=0;n=this.numberOfTracks&&(this.trigger("done"),this.emittedTracks=0)},_t.prototype.setRemux=function(e){this.remuxTracks=e},(vt=function(n){var r,a,s=this,i=!0;vt.prototype.init.call(this),this.baseMediaDecodeTime=(n=n||{}).baseMediaDecodeTime||0,this.transmuxPipeline_={},this.setupAacPipeline=function(){var t={};(this.transmuxPipeline_=t).type="aac",t.metadataStream=new Je.MetadataStream,t.aacStream=new bt,t.audioTimestampRolloverStream=new Je.TimestampRolloverStream("audio"),t.timedMetadataTimestampRolloverStream=new Je.TimestampRolloverStream("timed-metadata"),t.adtsStream=new rt,t.coalesceStream=new _t(n,t.metadataStream),t.headOfPipeline=t.aacStream,t.aacStream.pipe(t.audioTimestampRolloverStream).pipe(t.adtsStream),t.aacStream.pipe(t.timedMetadataTimestampRolloverStream).pipe(t.metadataStream).pipe(t.coalesceStream),t.metadataStream.on("timestamp",function(e){t.aacStream.setTimestamp(e.timeStamp)}),t.aacStream.on("data",function(e){"timed-metadata"!==e.type&&"audio"!==e.type||t.audioSegmentStream||(a=a||{timelineStartInfo:{baseMediaDecodeTime:s.baseMediaDecodeTime},codec:"adts",type:"audio"},t.coalesceStream.numberOfTracks++,t.audioSegmentStream=new Ct(a,n),t.audioSegmentStream.on("log",s.getLogTrigger_("audioSegmentStream")),t.audioSegmentStream.on("timingInfo",s.trigger.bind(s,"audioTimingInfo")),t.adtsStream.pipe(t.audioSegmentStream).pipe(t.coalesceStream),s.trigger("trackinfo",{hasAudio:!!a,hasVideo:!!r}))}),t.coalesceStream.on("data",this.trigger.bind(this,"data")),t.coalesceStream.on("done",this.trigger.bind(this,"done")),ft(this,t)},this.setupTsPipeline=function(){var i={};(this.transmuxPipeline_=i).type="ts",i.metadataStream=new Je.MetadataStream,i.packetStream=new Je.TransportPacketStream,i.parseStream=new Je.TransportParseStream,i.elementaryStream=new Je.ElementaryStream,i.timestampRolloverStream=new Je.TimestampRolloverStream,i.adtsStream=new rt,i.h264Stream=new wt,i.captionStream=new Je.CaptionStream(n),i.coalesceStream=new _t(n,i.metadataStream),i.headOfPipeline=i.packetStream,i.packetStream.pipe(i.parseStream).pipe(i.elementaryStream).pipe(i.timestampRolloverStream),i.timestampRolloverStream.pipe(i.h264Stream),i.timestampRolloverStream.pipe(i.adtsStream),i.timestampRolloverStream.pipe(i.metadataStream).pipe(i.coalesceStream),i.h264Stream.pipe(i.captionStream).pipe(i.coalesceStream),i.elementaryStream.on("data",function(e){var t;if("metadata"===e.type){for(t=e.tracks.length;t--;)r||"video"!==e.tracks[t].type?a||"audio"!==e.tracks[t].type||((a=e.tracks[t]).timelineStartInfo.baseMediaDecodeTime=s.baseMediaDecodeTime):(r=e.tracks[t]).timelineStartInfo.baseMediaDecodeTime=s.baseMediaDecodeTime;r&&!i.videoSegmentStream&&(i.coalesceStream.numberOfTracks++,i.videoSegmentStream=new yt(r,n),i.videoSegmentStream.on("log",s.getLogTrigger_("videoSegmentStream")),i.videoSegmentStream.on("timelineStartInfo",function(e){a&&!n.keepOriginalTimestamps&&(a.timelineStartInfo=e,i.audioSegmentStream.setEarliestDts(e.dts-s.baseMediaDecodeTime))}),i.videoSegmentStream.on("processedGopsInfo",s.trigger.bind(s,"gopInfo")),i.videoSegmentStream.on("segmentTimingInfo",s.trigger.bind(s,"videoSegmentTimingInfo")),i.videoSegmentStream.on("baseMediaDecodeTime",function(e){a&&i.audioSegmentStream.setVideoBaseMediaDecodeTime(e)}),i.videoSegmentStream.on("timingInfo",s.trigger.bind(s,"videoTimingInfo")),i.h264Stream.pipe(i.videoSegmentStream).pipe(i.coalesceStream)),a&&!i.audioSegmentStream&&(i.coalesceStream.numberOfTracks++,i.audioSegmentStream=new Ct(a,n),i.audioSegmentStream.on("log",s.getLogTrigger_("audioSegmentStream")),i.audioSegmentStream.on("timingInfo",s.trigger.bind(s,"audioTimingInfo")),i.audioSegmentStream.on("segmentTimingInfo",s.trigger.bind(s,"audioSegmentTimingInfo")),i.adtsStream.pipe(i.audioSegmentStream).pipe(i.coalesceStream)),s.trigger("trackinfo",{hasAudio:!!a,hasVideo:!!r})}}),i.coalesceStream.on("data",this.trigger.bind(this,"data")),i.coalesceStream.on("id3Frame",function(e){e.dispatchType=i.metadataStream.dispatchType,s.trigger("id3Frame",e)}),i.coalesceStream.on("caption",this.trigger.bind(this,"caption")),i.coalesceStream.on("done",this.trigger.bind(this,"done")),ft(this,i)},this.setBaseMediaDecodeTime=function(e){var t=this.transmuxPipeline_;n.keepOriginalTimestamps||(this.baseMediaDecodeTime=e),a&&(a.timelineStartInfo.dts=void 0,a.timelineStartInfo.pts=void 0,_e(a),t.audioTimestampRolloverStream&&t.audioTimestampRolloverStream.discontinuity()),r&&(t.videoSegmentStream&&(t.videoSegmentStream.gopCache_=[]),r.timelineStartInfo.dts=void 0,r.timelineStartInfo.pts=void 0,_e(r),t.captionStream.reset()),t.timestampRolloverStream&&t.timestampRolloverStream.discontinuity()},this.setAudioAppendStart=function(e){a&&this.transmuxPipeline_.audioSegmentStream.setAudioAppendStart(e)},this.setRemux=function(e){var t=this.transmuxPipeline_;n.remux=e,t&&t.coalesceStream&&t.coalesceStream.setRemux(e)},this.alignGopsWith=function(e){r&&this.transmuxPipeline_.videoSegmentStream&&this.transmuxPipeline_.videoSegmentStream.alignGopsWith(e)},this.getLogTrigger_=function(t){var i=this;return function(e){e.stream=t,i.trigger("log",e)}},this.push=function(e){var t;i&&((t=Et(e))&&"aac"!==this.transmuxPipeline_.type?this.setupAacPipeline():t||"ts"===this.transmuxPipeline_.type||this.setupTsPipeline(),i=!1),this.transmuxPipeline_.headOfPipeline.push(e)},this.flush=function(){i=!0,this.transmuxPipeline_.headOfPipeline.flush()},this.endTimeline=function(){this.transmuxPipeline_.headOfPipeline.endTimeline()},this.reset=function(){this.transmuxPipeline_.headOfPipeline&&this.transmuxPipeline_.headOfPipeline.reset()},this.resetCaptions=function(){this.transmuxPipeline_.captionStream&&this.transmuxPipeline_.captionStream.reset()}}).prototype=new j;function It(e,c){var i=Mt(e,["moof","traf"]),e=Mt(e,["mdat"]),d={},n=[];return e.forEach(function(e,t){t=i[t];n.push({mdat:e,traf:t})}),n.forEach(function(e){var t,i,n,r,a,s=e.mdat,o=e.traf,u=Mt(o,["tfhd"]),l=Ht(u[0]),e=l.trackId,u=Mt(o,["tfdt"]),u=0>>4&&(t+=e[4]+1),t}function Lt(e){switch(e){case 5:return"slice_layer_without_partitioning_rbsp_idr";case 6:return"sei_rbsp";case 7:return"seq_parameter_set_rbsp";case 8:return"pic_parameter_set_rbsp";case 9:return"access_unit_delimiter_rbsp";default:return null}}var Dt={Transmuxer:vt,VideoSegmentStream:yt,AudioSegmentStream:Ct,AUDIO_PROPERTIES:Tt,VIDEO_PROPERTIES:St,generateSegmentTimingInfo:gt},e=function(e){return e>>>0},Ot=function(e){var t="";return t+=String.fromCharCode(e[0]),t+=String.fromCharCode(e[1]),t+=String.fromCharCode(e[2]),t+=String.fromCharCode(e[3])},Rt=e,Mt=function e(t,i){var n,r,a,s=[];if(!i.length)return null;for(n=0;n>>2,dependsOn:3&e[0],isDependedOn:(192&e[1])>>>6,hasRedundancy:(48&e[1])>>>4,paddingValue:(14&e[1])>>>1,isNonSyncSample:1&e[1],degradationPriority:e[2]<<8|e[3]}},jt=function(e){var t,i={version:e[0],flags:new Uint8Array(e.subarray(1,4)),samples:[]},n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=1&i.flags[2],a=4&i.flags[2],s=1&i.flags[1],o=2&i.flags[1],u=4&i.flags[1],l=8&i.flags[1],c=n.getUint32(4),d=8;for(r&&(i.dataOffset=n.getInt32(d),d+=4),a&&c&&(t={flags:Ft(e.subarray(d,d+4))},d+=4,s&&(t.duration=n.getUint32(d),d+=4),o&&(t.size=n.getUint32(d),d+=4),l&&(1===i.version?t.compositionTimeOffset=n.getInt32(d):t.compositionTimeOffset=n.getUint32(d),d+=4),i.samples.push(t),c--);c--;)t={},s&&(t.duration=n.getUint32(d),d+=4),o&&(t.size=n.getUint32(d),d+=4),u&&(t.flags=Ft(e.subarray(d,d+4)),d+=4),l&&(1===i.version?t.compositionTimeOffset=n.getInt32(d):t.compositionTimeOffset=n.getUint32(d),d+=4),i.samples.push(t);return i},Ht=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength),i={version:e[0],flags:new Uint8Array(e.subarray(1,4)),trackId:t.getUint32(4)},n=1&i.flags[2],r=2&i.flags[2],a=8&i.flags[2],s=16&i.flags[2],o=32&i.flags[2],u=65536&i.flags[0],l=131072&i.flags[0],e=8;return n&&(e+=4,i.baseDataOffset=t.getUint32(12),e+=4),r&&(i.sampleDescriptionIndex=t.getUint32(e),e+=4),a&&(i.defaultSampleDuration=t.getUint32(e),e+=4),s&&(i.defaultSampleSize=t.getUint32(e),e+=4),o&&(i.defaultSampleFlags=t.getUint32(e)),u&&(i.durationIsEmpty=!0),!n&&l&&(i.baseDataOffsetIsMoof=!0),i},j="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},j="undefined"!=typeof window?window:"undefined"!=typeof j?j:"undefined"!=typeof self?self:{},qt=j,Vt=ke,Wt=Fe.CaptionStream,Gt=function(){var t,r,a,s,o,i,n=!1;this.isInitialized=function(){return n},this.init=function(e){t=new Wt,n=!0,i=!!e&&e.isPartial,t.on("data",function(e){e.startTime=e.startPts/s,e.endTime=e.endPts/s,o.captions.push(e),o.captionStreams[e.stream]=!0}),t.on("log",function(e){o.logs.push(e)})},this.isNewInit=function(e,t){return!(e&&0===e.length||t&&"object"==typeof t&&0===Object.keys(t).length)&&(a!==e[0]||s!==t[a])},this.parse=function(e,t,i){if(!this.isInitialized())return null;if(!t||!i)return null;if(this.isNewInit(t,i))a=t[0],s=i[a];else if(null===a||!s)return r.push(e),null;for(;0>>2&63).replace(/^0/,"")):t.codec="mp4a.40.2"):t.codec=t.codec.toLowerCase()));e=Mt(e,["mdia","mdhd"])[0];e&&(t.timescale=Yt(e)),s.push(t)}),s},Qt=ke,$t=q,Jt=Ie,Zt={};Zt.ts={parseType:function(e,t){e=xt(e);return 0===e?"pat":e===t?"pmt":t?"pes":null},parsePat:function(e){var t=At(e),i=4+Pt(e);return t&&(i+=e[i]+1),(31&e[i+10])<<8|e[i+11]},parsePmt:function(e){var t={},i=At(e),n=4+Pt(e);if(i&&(n+=e[n]+1),1&e[n+5]){for(var r=3+((15&e[n+1])<<8|e[n+2])-4,a=12+((15&e[n+10])<<8|e[n+11]);a=e.byteLength)return null;var i=null,n=e[t+7];return 192&n&&((i={}).pts=(14&e[t+9])<<27|(255&e[t+10])<<20|(254&e[t+11])<<12|(255&e[t+12])<<5|(254&e[t+13])>>>3,i.pts*=4,i.pts+=(6&e[t+13])>>>1,i.dts=i.pts,64&n&&(i.dts=(14&e[t+14])<<27|(255&e[t+15])<<20|(254&e[t+16])<<12|(255&e[t+17])<<5|(254&e[t+18])>>>3,i.dts*=4,i.dts+=(6&e[t+18])>>>1)),i},videoPacketContainsKeyFrame:function(e){for(var t=4+Pt(e),i=e.subarray(t),n=0,r=0,a=!1;re.length){i=!0;break}null===a&&(t=e.subarray(o,o+s),a=Zt.aac.parseAacTimestamp(t)),o+=s;break;case"audio":if(e.length-o<7){i=!0;break}if((s=Zt.aac.parseAdtsSize(e,o))>e.length){i=!0;break}null===r&&(t=e.subarray(o,o+s),r=Zt.aac.parseSampleRate(t)),n++,o+=s;break;default:o++}if(i)return null}if(null===r||null===a)return null;var u=ii/r;return{audio:[{type:"audio",dts:a,pts:a},{type:"audio",dts:a+1024*n*u,pts:a+1024*n*u}]}}:ti)(e);return r&&(r.audio||r.video)?(e=t,(t=r).audio&&t.audio.length&&("undefined"!=typeof(i=e)&&!isNaN(i)||(i=t.audio[0].dts),t.audio.forEach(function(e){e.dts=Jt(e.dts,i),e.pts=Jt(e.pts,i),e.dtsTime=e.dts/ii,e.ptsTime=e.pts/ii})),t.video&&t.video.length&&("undefined"!=typeof(n=e)&&!isNaN(n)||(n=t.video[0].dts),t.video.forEach(function(e){e.dts=Jt(e.dts,n),e.pts=Jt(e.pts,n),e.dtsTime=e.dts/ii,e.ptsTime=e.pts/ii}),t.firstKeyFrame&&((t=t.firstKeyFrame).dts=Jt(t.dts,n),t.pts=Jt(t.pts,n),t.dtsTime=t.dts/ii,t.ptsTime=t.pts/ii)),r):null},ri=function(){function e(e,t){this.options=t||{},this.self=e,this.init()}var t=e.prototype;return t.init=function(){var i,e;this.transmuxer&&this.transmuxer.dispose(),this.transmuxer=new Dt.Transmuxer(this.options),i=this.self,(e=this.transmuxer).on("data",function(e){var t=e.initSegment;e.initSegment={data:t.buffer,byteOffset:t.byteOffset,byteLength:t.byteLength};t=e.data;e.data=t.buffer,i.postMessage({action:"data",segment:e,byteOffset:t.byteOffset,byteLength:t.byteLength},[e.data])}),e.on("done",function(e){i.postMessage({action:"done"})}),e.on("gopInfo",function(e){i.postMessage({action:"gopInfo",gopInfo:e})}),e.on("videoSegmentTimingInfo",function(e){var t={start:{decode:ce(e.start.dts),presentation:ce(e.start.pts)},end:{decode:ce(e.end.dts),presentation:ce(e.end.pts)},baseMediaDecodeTime:ce(e.baseMediaDecodeTime)};e.prependedContentDuration&&(t.prependedContentDuration=ce(e.prependedContentDuration)),i.postMessage({action:"videoSegmentTimingInfo",videoSegmentTimingInfo:t})}),e.on("audioSegmentTimingInfo",function(e){var t={start:{decode:ce(e.start.dts),presentation:ce(e.start.pts)},end:{decode:ce(e.end.dts),presentation:ce(e.end.pts)},baseMediaDecodeTime:ce(e.baseMediaDecodeTime)};e.prependedContentDuration&&(t.prependedContentDuration=ce(e.prependedContentDuration)),i.postMessage({action:"audioSegmentTimingInfo",audioSegmentTimingInfo:t})}),e.on("id3Frame",function(e){i.postMessage({action:"id3Frame",id3Frame:e})}),e.on("caption",function(e){i.postMessage({action:"caption",caption:e})}),e.on("trackinfo",function(e){i.postMessage({action:"trackinfo",trackInfo:e})}),e.on("audioTimingInfo",function(e){i.postMessage({action:"audioTimingInfo",audioTimingInfo:{start:ce(e.start),end:ce(e.end)}})}),e.on("videoTimingInfo",function(e){i.postMessage({action:"videoTimingInfo",videoTimingInfo:{start:ce(e.start),end:ce(e.end)}})}),e.on("log",function(e){i.postMessage({action:"log",log:e})})},t.pushMp4Captions=function(e){this.captionParser||(this.captionParser=new Gt,this.captionParser.init());var t=new Uint8Array(e.data,e.byteOffset,e.byteLength),e=this.captionParser.parse(t,e.trackIds,e.timescales);this.self.postMessage({action:"mp4Captions",captions:e&&e.captions||[],logs:e&&e.logs||[],data:t.buffer},[t.buffer])},t.probeMp4StartTime=function(e){var t=e.timescales,e=e.data,t=Qt(t,e);this.self.postMessage({action:"probeMp4StartTime",startTime:t,data:e},[e.buffer])},t.probeMp4Tracks=function(e){var t=e.data,e=$t(t);this.self.postMessage({action:"probeMp4Tracks",tracks:e,data:t},[t.buffer])},t.probeTs=function(e){var t=e.data,i=e.baseStartTime,e="number"!=typeof i||isNaN(i)?void 0:i*ue,i=ni(t,e),e=null;i&&((e={hasVideo:i.video&&2===i.video.length||!1,hasAudio:i.audio&&2===i.audio.length||!1}).hasVideo&&(e.videoStart=i.video[0].ptsTime),e.hasAudio&&(e.audioStart=i.audio[0].ptsTime)),this.self.postMessage({action:"probeTs",result:e,data:t},[t.buffer])},t.clearAllMp4Captions=function(){this.captionParser&&this.captionParser.clearAllCaptions()},t.clearParsedMp4Captions=function(){this.captionParser&&this.captionParser.clearParsedCaptions()},t.push=function(e){e=new Uint8Array(e.data,e.byteOffset,e.byteLength);this.transmuxer.push(e)},t.reset=function(){this.transmuxer.reset()},t.setTimestampOffset=function(e){e=e.timestampOffset||0;this.transmuxer.setBaseMediaDecodeTime(Math.round(le(e)))},t.setAudioAppendStart=function(e){this.transmuxer.setAudioAppendStart(Math.ceil(le(e.appendStart)))},t.setRemux=function(e){this.transmuxer.setRemux(e.remux)},t.flush=function(e){this.transmuxer.flush(),self.postMessage({action:"done",type:"transmuxed"})},t.endTimeline=function(){this.transmuxer.endTimeline(),self.postMessage({action:"endedtimeline",type:"transmuxed"})},t.alignGopsWith=function(e){this.transmuxer.alignGopsWith(e.gopsToAlignWith.slice())},e}();self.onmessage=function(e){"init"===e.data.action&&e.data.options?this.messageHandlers=new ri(self,e.data.options):(this.messageHandlers||(this.messageHandlers=new ri(self)),e.data&&e.data.action&&"init"!==e.data.action&&this.messageHandlers[e.data.action]&&this.messageHandlers[e.data.action](e.data))}}))),El=function(e){e.currentTransmux=null,e.transmuxQueue.length&&(e.currentTransmux=e.transmuxQueue.shift(),"function"==typeof e.currentTransmux?e.currentTransmux():Pu(e.currentTransmux))},kl=function(e){Du("reset",e)},Cl=function(e){var t=new wl;t.currentTransmux=null,t.transmuxQueue=[];var i=t.terminate;return t.terminate=function(){return t.currentTransmux=null,t.transmuxQueue.length=0,i.call(t)},t.postMessage({action:"init",options:e}),t},Il=2,xl=-101,Al=-102,Pl=Oo("CodecUtils"),Ll=Oo("PlaylistSelector"),ar=function(){var e=this.useDevicePixelRatio&&window.devicePixelRatio||1;return el(this.playlists.master,this.systemBandwidth,parseInt($u(this.tech_.el(),"width"),10)*e,parseInt($u(this.tech_.el(),"height"),10)*e,this.limitRenditionByPlayerDimensions,this.masterPlaylistController_)},Dl=function(n){function e(e,t){var i=n.call(this)||this;if(!e)throw new TypeError("Initialization settings are required");if("function"!=typeof e.currentTime)throw new TypeError("No currentTime getter specified");if(!e.mediaSource)throw new TypeError("No MediaSource specified");return i.bandwidth=e.bandwidth,i.throughput={rate:0,count:0},i.roundTrip=NaN,i.resetStats_(),i.mediaIndex=null,i.partIndex=null,i.hasPlayed_=e.hasPlayed,i.currentTime_=e.currentTime,i.seekable_=e.seekable,i.seeking_=e.seeking,i.duration_=e.duration,i.mediaSource_=e.mediaSource,i.vhs_=e.vhs,i.loaderType_=e.loaderType,i.currentMediaInfo_=void 0,i.startingMediaInfo_=void 0,i.segmentMetadataTrack_=e.segmentMetadataTrack,i.goalBufferLength_=e.goalBufferLength,i.sourceType_=e.sourceType,i.sourceUpdater_=e.sourceUpdater,i.inbandTextTracks_=e.inbandTextTracks,i.state_="INIT",i.timelineChangeController_=e.timelineChangeController,i.shouldSaveSegmentTimingInfo_=!0,i.parse708captions_=e.parse708captions,i.captionServices_=e.captionServices,i.experimentalExactManifestTimings=e.experimentalExactManifestTimings,i.checkBufferTimeout_=null,i.error_=void 0,i.currentTimeline_=-1,i.pendingSegment_=null,i.xhrOptions_=null,i.pendingSegments_=[],i.audioDisabled_=!1,i.isPendingTimestampOffset_=!1,i.gopBuffer_=[],i.timeMapping_=0,i.safeAppend_=11<=tr.browser.IE_VERSION,i.appendInitSegment_={audio:!0,video:!0},i.playlistOfLastInitSegment_={audio:null,video:null},i.callQueue_=[],i.loadQueue_=[],i.metadataQueue_={id3:[],caption:[]},i.waitingOnRemove_=!1,i.quotaExceededErrorRetryTimeout_=null,i.activeInitSegmentId_=null,i.initSegments_={},i.cacheEncryptionKeys_=e.cacheEncryptionKeys,i.keyCache_={},i.decrypter_=e.decrypter,i.syncController_=e.syncController,i.syncPoint_={segmentIndex:0,time:0},i.transmuxer_=i.createTransmuxer_(),i.triggerSyncInfoUpdate_=function(){return i.trigger("syncinfoupdate")},i.syncController_.on("syncinfoupdate",i.triggerSyncInfoUpdate_),i.mediaSource_.addEventListener("sourceopen",function(){i.isEndOfStream_()||(i.ended_=!1)}),i.fetchAtBuffer_=!1,i.logger_=Oo("SegmentLoader["+i.loaderType_+"]"),Object.defineProperty(ft(i),"state",{get:function(){return this.state_},set:function(e){e!==this.state_&&(this.logger_(this.state_+" -> "+e),this.state_=e,this.trigger("statechange"))}}),i.sourceUpdater_.on("ready",function(){i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),"main"===i.loaderType_&&i.timelineChangeController_.on("pendingtimelinechange",function(){i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),"audio"===i.loaderType_&&i.timelineChangeController_.on("timelinechange",function(){i.hasEnoughInfoToLoad_()&&i.processLoadQueue_(),i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),i}mt(e,n);var t=e.prototype;return t.createTransmuxer_=function(){return Cl({remux:!1,alignGopsAtEnd:this.safeAppend_,keepOriginalTimestamps:!0,parse708captions:this.parse708captions_,captionServices:this.captionServices_})},t.resetStats_=function(){this.mediaBytesTransferred=0,this.mediaRequests=0,this.mediaRequestsAborted=0,this.mediaRequestsTimedout=0,this.mediaRequestsErrored=0,this.mediaTransferDuration=0,this.mediaSecondsLoaded=0,this.mediaAppends=0},t.dispose=function(){this.trigger("dispose"),this.state="DISPOSED",this.pause(),this.abort_(),this.transmuxer_&&this.transmuxer_.terminate(),this.resetStats_(),this.checkBufferTimeout_&&window.clearTimeout(this.checkBufferTimeout_),this.syncController_&&this.triggerSyncInfoUpdate_&&this.syncController_.off("syncinfoupdate",this.triggerSyncInfoUpdate_),this.off()},t.setAudio=function(e){this.audioDisabled_=!e,e?this.appendInitSegment_.audio=!0:this.sourceUpdater_.removeAudio(0,this.duration_())},t.abort=function(){"WAITING"===this.state?(this.abort_(),this.state="READY",this.paused()||this.monitorBuffer_()):this.pendingSegment_&&(this.pendingSegment_=null)},t.abort_=function(){this.pendingSegment_&&this.pendingSegment_.abortRequests&&this.pendingSegment_.abortRequests(),this.pendingSegment_=null,this.callQueue_=[],this.loadQueue_=[],this.metadataQueue_.id3=[],this.metadataQueue_.caption=[],this.timelineChangeController_.clearPendingTimelineChange(this.loaderType_),this.waitingOnRemove_=!1,window.clearTimeout(this.quotaExceededErrorRetryTimeout_),this.quotaExceededErrorRetryTimeout_=null},t.checkForAbort_=function(e){return"APPENDING"!==this.state||this.pendingSegment_?!this.pendingSegment_||this.pendingSegment_.requestId!==e:(this.state="READY",!0)},t.error=function(e){return"undefined"!=typeof e&&(this.logger_("error occurred:",e),this.error_=e),this.pendingSegment_=null,this.error_},t.endOfStream=function(){this.ended_=!0,this.transmuxer_&&kl(this.transmuxer_),this.gopBuffer_.length=0,this.pause(),this.trigger("ended")},t.buffered_=function(){var e=this.getMediaInfo_();if(!this.sourceUpdater_||!e)return tr.createTimeRanges();if("main"===this.loaderType_){var t=e.hasAudio,i=e.hasVideo,e=e.isMuxed;if(i&&t&&!this.audioDisabled_&&!e)return this.sourceUpdater_.buffered();if(i)return this.sourceUpdater_.videoBuffered()}return this.sourceUpdater_.audioBuffered()},t.initSegmentForMap=function(e,t){if(void 0===t&&(t=!1),!e)return null;var i=bu(e),n=this.initSegments_[i];return t&&!n&&e.bytes&&(this.initSegments_[i]=n={resolvedUri:e.resolvedUri,byterange:e.byterange,bytes:e.bytes,tracks:e.tracks,timescales:e.timescales}),n||e},t.segmentKey=function(e,t){if(void 0===t&&(t=!1),!e)return null;var i=Tu(e),n=this.keyCache_[i];this.cacheEncryptionKeys_&&t&&!n&&e.bytes&&(this.keyCache_[i]=n={resolvedUri:e.resolvedUri,bytes:e.bytes});e={resolvedUri:(n||e).resolvedUri};return n&&(e.bytes=n.bytes),e},t.couldBeginLoading_=function(){return this.playlist_&&!this.paused()},t.load=function(){if(this.monitorBuffer_(),this.playlist_)return"INIT"===this.state&&this.couldBeginLoading_()?this.init_():void(!this.couldBeginLoading_()||"READY"!==this.state&&"INIT"!==this.state||(this.state="READY"))},t.init_=function(){return this.state="READY",this.resetEverything(),this.monitorBuffer_()},t.playlist=function(e,t){if(void 0===t&&(t={}),e){var i=this.playlist_,n=this.pendingSegment_;this.playlist_=e,this.xhrOptions_=t,"INIT"===this.state&&(e.syncInfo={mediaSequence:e.mediaSequence,time:0},"main"===this.loaderType_&&this.syncController_.setDateTimeMappingForStart(e));var r=null;if(i&&(i.id?r=i.id:i.uri&&(r=i.uri)),this.logger_("playlist update ["+r+" => "+(e.id||e.uri)+"]"),this.trigger("syncinfoupdate"),"INIT"===this.state&&this.couldBeginLoading_())return this.init_();if(!i||i.uri!==e.uri)return null!==this.mediaIndex&&(e.endList?this.resyncLoader():this.resetLoader()),this.currentMediaInfo_=void 0,void this.trigger("playlistupdate");t=e.mediaSequence-i.mediaSequence;this.logger_("live window shift ["+t+"]"),null!==this.mediaIndex&&(this.mediaIndex-=t,this.mediaIndex<0?(this.mediaIndex=null,this.partIndex=null):(r=this.playlist_.segments[this.mediaIndex],!this.partIndex||r.parts&&r.parts.length&&r.parts[this.partIndex]||(r=this.mediaIndex,this.logger_("currently processing part (index "+this.partIndex+") no longer exists."),this.resetLoader(),this.mediaIndex=r))),n&&(n.mediaIndex-=t,n.mediaIndex<0?(n.mediaIndex=null,n.partIndex=null):(0<=n.mediaIndex&&(n.segment=e.segments[n.mediaIndex]),0<=n.partIndex&&n.segment.parts&&(n.part=n.segment.parts[n.partIndex]))),this.syncController_.saveExpiredSegmentInfo(i,e)}},t.pause=function(){this.checkBufferTimeout_&&(window.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=null)},t.paused=function(){return null===this.checkBufferTimeout_},t.resetEverything=function(e){this.ended_=!1,this.appendInitSegment_={audio:!0,video:!0},this.resetLoader(),this.remove(0,1/0,e),this.transmuxer_&&(this.transmuxer_.postMessage({action:"clearAllMp4Captions"}),this.transmuxer_.postMessage({action:"reset"}))},t.resetLoader=function(){this.fetchAtBuffer_=!1,this.resyncLoader()},t.resyncLoader=function(){this.transmuxer_&&kl(this.transmuxer_),this.mediaIndex=null,this.partIndex=null,this.syncPoint_=null,this.isPendingTimestampOffset_=!1,this.callQueue_=[],this.loadQueue_=[],this.metadataQueue_.id3=[],this.metadataQueue_.caption=[],this.abort(),this.transmuxer_&&this.transmuxer_.postMessage({action:"clearParsedMp4Captions"})},t.remove=function(e,t,i,n){if(void 0===i&&(i=function(){}),void 0===n&&(n=!1),(t=t===1/0?this.duration_():t)<=e)this.logger_("skipping remove because end ${end} is <= start ${start}");else if(this.sourceUpdater_&&this.getMediaInfo_()){var r,a=1,s=function(){0===--a&&i()};for(r in!n&&this.audioDisabled_||(a++,this.sourceUpdater_.removeAudio(e,t,s)),!n&&"main"!==this.loaderType_||(this.gopBuffer_=function(e,t,i,n){for(var r=Math.ceil((t-n)*cl),a=Math.ceil((i-n)*cl),n=e.slice(),s=e.length;s--&&!(e[s].pts<=a););if(-1===s)return n;for(var o=s+1;o--&&!(e[o].pts<=r););return o=Math.max(o,0),n.splice(o,s-o+1),n}(this.gopBuffer_,e,t,this.timeMapping_),a++,this.sourceUpdater_.removeVideo(e,t,s)),this.inbandTextTracks_)il(e,t,this.inbandTextTracks_[r]);il(e,t,this.segmentMetadataTrack_),s()}else this.logger_("skipping remove because no source updater or starting media info")},t.monitorBuffer_=function(){this.checkBufferTimeout_&&window.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=window.setTimeout(this.monitorBufferTick_.bind(this),1)},t.monitorBufferTick_=function(){"READY"===this.state&&this.fillBuffer_(),this.checkBufferTimeout_&&window.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=window.setTimeout(this.monitorBufferTick_.bind(this),500)},t.fillBuffer_=function(){var e;this.sourceUpdater_.updating()||(e=this.chooseNextRequest_())&&("number"==typeof e.timestampOffset&&(this.isPendingTimestampOffset_=!1,this.timelineChangeController_.pendingTimelineChange({type:this.loaderType_,from:this.currentTimeline_,to:e.timeline})),this.loadSegment_(e))},t.isEndOfStream_=function(e,t,i){if(void 0===e&&(e=this.mediaIndex),void 0===t&&(t=this.playlist_),void 0===i&&(i=this.partIndex),!t||!this.mediaSource_)return!1;var n="number"==typeof e&&t.segments[e],e=e+1===t.segments.length,n=!n||!n.parts||i+1===n.parts.length;return t.endList&&"open"===this.mediaSource_.readyState&&e&&n},t.chooseNextRequest_=function(){var e=this.buffered_(),t=Fo(e)||0,i=jo(e,this.currentTime_()),n=!this.hasPlayed_()&&1<=i,r=i>=this.goalBufferLength_(),e=this.playlist_.segments;if(!e.length||n||r)return null;this.syncPoint_=this.syncPoint_||this.syncController_.getSyncPoint(this.playlist_,this.duration_(),this.currentTimeline_,this.currentTime_());var a,n={partIndex:null,mediaIndex:null,startOfSegment:null,playlist:this.playlist_,isSyncRequest:Boolean(!this.syncPoint_)};n.isSyncRequest?n.mediaIndex=function(e,t,i){t=t||[];for(var n=[],r=0,a=0;a=e.length-1&&s&&!this.seeking_()?null:this.generateSegmentInfo_(n)},t.generateSegmentInfo_=function(e){var t=e.independent,i=e.playlist,n=e.mediaIndex,r=e.startOfSegment,a=e.isSyncRequest,s=e.partIndex,o=e.forceTimestampOffset,u=e.getMediaInfoForTime,l=i.segments[n],e="number"==typeof s&&l.parts[s],t={requestId:"segment-loader-"+Math.random(),uri:e&&e.resolvedUri||l.resolvedUri,mediaIndex:n,partIndex:e?s:null,isSyncRequest:a,startOfSegment:r,playlist:i,bytes:null,encryptedBytes:null,timestampOffset:null,timeline:l.timeline,duration:e&&e.duration||l.duration,segment:l,part:e,byteLength:0,transmuxer:this.transmuxer_,getMediaInfoForTime:u,independent:t},o="undefined"!=typeof o?o:this.isPendingTimestampOffset_;t.timestampOffset=this.timestampOffsetForSegment_({segmentTimeline:l.timeline,currentTimeline:this.currentTimeline_,startOfSegment:r,buffered:this.buffered_(),overrideCheck:o});o=Fo(this.sourceUpdater_.audioBuffered());return"number"==typeof o&&(t.audioAppendStart=o-this.sourceUpdater_.audioTimestampOffset()),this.sourceUpdater_.videoBuffered().length&&(t.gopsToAlignWith=function(e,t,i){if("undefined"==typeof t||null===t||!e.length)return[];for(var n=Math.ceil((t-i+3)*cl),r=0;rn);r++);return e.slice(r)}(this.gopBuffer_,this.currentTime_()-this.sourceUpdater_.videoTimestampOffset(),this.timeMapping_)),t},t.timestampOffsetForSegment_=function(e){return i=(t=e).segmentTimeline,n=t.currentTimeline,r=t.startOfSegment,e=t.buffered,t.overrideCheck||i!==n?!(i "+p+" for "+e),t=m,i=v.vhs_.tech_,t[n=e]||(i.trigger({type:"usage",name:"vhs-608"}),i.trigger({type:"usage",name:"hls-608"}),/^cc708_/.test(r=n)&&(r="SERVICE"+n.split("_")[1]),(o=i.textTracks().getTrackById(r))?t[n]=o:(s=a=n,d=!1,(o=(i.options_.vhs&&i.options_.vhs.captionServices||{})[r])&&(a=o.label,s=o.language,d=o.default),t[n]=i.addRemoteTextTrack({kind:"captions",id:r,default:d,label:a,language:s},!1).track)),il(h,p,m[e]),l=(f={captionArray:f,inbandTextTracks:m,timestampOffset:g}).inbandTextTracks,m=f.captionArray,c=f.timestampOffset,m&&(u=window.WebKitDataCue||window.VTTCue,m.forEach(function(e){var t=e.stream;l[t].addCue(new u(e.startTime+c,e.endTime+c,e.text))}))}),this.transmuxer_&&this.transmuxer_.postMessage({action:"clearParsedMp4Captions"})):this.metadataQueue_.caption.push(this.handleCaptions_.bind(this,e,t)):this.logger_("SegmentLoader received no captions from a caption event"))},t.handleId3_=function(e,t,i){var n,r,a,s;this.earlyAbortWhenNeeded_(e.stats),this.checkForAbort_(e.requestId)||(this.pendingSegment_.hasAppendedData_?(n=null===this.sourceUpdater_.videoTimestampOffset()?this.sourceUpdater_.audioTimestampOffset():this.sourceUpdater_.videoTimestampOffset(),r=this.inbandTextTracks_,a=i,s=this.vhs_.tech_,r.metadataTrack_||(r.metadataTrack_=s.addRemoteTextTrack({kind:"metadata",label:"Timed Metadata"},!1).track,r.metadataTrack_.inBandMetadataTrackDispatchType=a),tl({inbandTextTracks:this.inbandTextTracks_,metadataArray:t,timestampOffset:n,videoDuration:this.duration_()})):this.metadataQueue_.id3.push(this.handleId3_.bind(this,e,t,i)))},t.processMetadataQueue_=function(){this.metadataQueue_.id3.forEach(function(e){return e()}),this.metadataQueue_.caption.forEach(function(e){return e()}),this.metadataQueue_.id3=[],this.metadataQueue_.caption=[]},t.processCallQueue_=function(){var e=this.callQueue_;this.callQueue_=[],e.forEach(function(e){return e()})},t.processLoadQueue_=function(){var e=this.loadQueue_;this.loadQueue_=[],e.forEach(function(e){return e()})},t.hasEnoughInfoToLoad_=function(){if("audio"!==this.loaderType_)return!0;var e=this.pendingSegment_;return!!e&&(!this.getCurrentMediaInfo_()||!sl({timelineChangeController:this.timelineChangeController_,currentTimeline:this.currentTimeline_,segmentTimeline:e.timeline,loaderType:this.loaderType_,audioDisabled:this.audioDisabled_}))},t.getCurrentMediaInfo_=function(e){return(e=void 0===e?this.pendingSegment_:e)&&e.trackInfo||this.currentMediaInfo_},t.getMediaInfo_=function(e){return void 0===e&&(e=this.pendingSegment_),this.getCurrentMediaInfo_(e)||this.startingMediaInfo_},t.hasEnoughInfoToAppend_=function(){if(!this.sourceUpdater_.ready())return!1;if(this.waitingOnRemove_||this.quotaExceededErrorRetryTimeout_)return!1;var e=this.pendingSegment_,t=this.getCurrentMediaInfo_();if(!e||!t)return!1;var i=t.hasAudio,n=t.hasVideo,t=t.isMuxed;return!(n&&!e.videoTimingInfo)&&(!(i&&!this.audioDisabled_&&!t&&!e.audioTimingInfo)&&!sl({timelineChangeController:this.timelineChangeController_,currentTimeline:this.currentTimeline_,segmentTimeline:e.timeline,loaderType:this.loaderType_,audioDisabled:this.audioDisabled_}))},t.handleData_=function(e,t){if(this.earlyAbortWhenNeeded_(e.stats),!this.checkForAbort_(e.requestId))if(!this.callQueue_.length&&this.hasEnoughInfoToAppend_()){var i,n=this.pendingSegment_;if(this.setTimeMapping_(n.timeline),this.updateMediaSecondsLoaded_(n.part||n.segment),"closed"!==this.mediaSource_.readyState){if(e.map&&(e.map=this.initSegmentForMap(e.map,!0),n.segment.map=e.map),e.key&&this.segmentKey(e.key,!0),n.isFmp4=e.isFmp4,n.timingInfo=n.timingInfo||{},n.isFmp4?(this.trigger("fmp4"),n.timingInfo.start=n[al(t.type)].start):(i=this.getCurrentMediaInfo_(),(i="main"===this.loaderType_&&i&&i.hasVideo)&&(r=n.videoTimingInfo.start),n.timingInfo.start=this.trueSegmentStart_({currentStart:n.timingInfo.start,playlist:n.playlist,mediaIndex:n.mediaIndex,currentVideoTimestampOffset:this.sourceUpdater_.videoTimestampOffset(),useVideoTimingInfo:i,firstVideoFrameTimeForData:r,videoTimingInfo:n.videoTimingInfo,audioTimingInfo:n.audioTimingInfo})),this.updateAppendInitSegmentStatus(n,t.type),this.updateSourceBufferTimestampOffset_(n),n.isSyncRequest){this.updateTimingInfoEnd_(n),this.syncController_.saveSegmentTimingInfo({segmentInfo:n,shouldSaveTimelineMapping:"main"===this.loaderType_});var r=this.chooseNextRequest_();if(r.mediaIndex!==n.mediaIndex||r.partIndex!==n.partIndex)return void this.logger_("sync segment was incorrect, not appending");this.logger_("sync segment was correct, appending")}n.hasAppendedData_=!0,this.processMetadataQueue_(),this.appendData_(n,t)}}else this.callQueue_.push(this.handleData_.bind(this,e,t))},t.updateAppendInitSegmentStatus=function(e,t){"main"!==this.loaderType_||"number"!=typeof e.timestampOffset||e.changedTimestampOffset||(this.appendInitSegment_={audio:!0,video:!0}),this.playlistOfLastInitSegment_[t]!==e.playlist&&(this.appendInitSegment_[t]=!0)},t.getInitSegmentAndUpdateState_=function(e){var t=e.type,i=e.initSegment,n=e.map,r=e.playlist;if(n){e=bu(n);if(this.activeInitSegmentId_===e)return null;i=this.initSegmentForMap(n,!0).bytes,this.activeInitSegmentId_=e}return i&&this.appendInitSegment_[t]?(this.playlistOfLastInitSegment_[t]=r,this.appendInitSegment_[t]=!1,this.activeInitSegmentId_=null,i):null},t.handleQuotaExceededError_=function(e,t){var i=this,n=e.segmentInfo,r=e.type,a=e.bytes,s=this.sourceUpdater_.audioBuffered(),o=this.sourceUpdater_.videoBuffered();1=n);r++);return e.slice(0,r).concat(t)}(this.gopBuffer_,i.gopInfo,this.safeAppend_)),this.state="APPENDING",this.trigger("appending"),this.waitForAppendsToComplete_(e)}},t.setTimeMapping_=function(e){e=this.syncController_.mappingForTimeline(e);null!==e&&(this.timeMapping_=e)},t.updateMediaSecondsLoaded_=function(e){"number"==typeof e.start&&"number"==typeof e.end?this.mediaSecondsLoaded+=e.end-e.start:this.mediaSecondsLoaded+=e.duration},t.shouldUpdateTransmuxerTimestampOffset_=function(e){return null!==e&&("main"===this.loaderType_&&e!==this.sourceUpdater_.videoTimestampOffset()||!this.audioDisabled_&&e!==this.sourceUpdater_.audioTimestampOffset())},t.trueSegmentStart_=function(e){var t=e.currentStart,i=e.playlist,n=e.mediaIndex,r=e.firstVideoFrameTimeForData,a=e.currentVideoTimestampOffset,s=e.useVideoTimingInfo,o=e.videoTimingInfo,e=e.audioTimingInfo;if("undefined"!=typeof t)return t;if(!s)return e.start;i=i.segments[n-1];return 0!==n&&i&&"undefined"!=typeof i.start&&i.end===r+a?o.start:r},t.waitForAppendsToComplete_=function(e){var t=this.getCurrentMediaInfo_(e);if(!t)return this.error({message:"No starting media returned, likely due to an unsupported media format.",blacklistDuration:1/0}),void this.trigger("error");var i=t.hasAudio,n=t.hasVideo,t=t.isMuxed,n="main"===this.loaderType_&&n,t=!this.audioDisabled_&&i&&!t;if(e.waitingOnAppends=0,!e.hasAppendedData_)return e.timingInfo||"number"!=typeof e.timestampOffset||(this.isPendingTimestampOffset_=!0),e.timingInfo={start:0},e.waitingOnAppends++,this.isPendingTimestampOffset_||(this.updateSourceBufferTimestampOffset_(e),this.processMetadataQueue_()),void this.checkAppendsDone_(e);n&&e.waitingOnAppends++,t&&e.waitingOnAppends++,n&&this.sourceUpdater_.videoQueueCallback(this.checkAppendsDone_.bind(this,e)),t&&this.sourceUpdater_.audioQueueCallback(this.checkAppendsDone_.bind(this,e))},t.checkAppendsDone_=function(e){this.checkForAbort_(e.requestId)||(e.waitingOnAppends--,0===e.waitingOnAppends&&this.handleAppendsDone_())},t.checkForIllegalMediaSwitch=function(e){var t,i,e=(t=this.loaderType_,i=this.getCurrentMediaInfo_(),e=e,"main"===t&&i&&e?e.hasAudio||e.hasVideo?i.hasVideo&&!e.hasVideo?"Only audio found in segment when we expected video. We can't switch to audio only from a stream that had video. To get rid of this message, please add codec information to the manifest.":!i.hasVideo&&e.hasVideo?"Video found in segment when we expected only audio. We can't switch to a stream with video from an audio only stream. To get rid of this message, please add codec information to the manifest.":null:"Neither audio nor video found in segment.":null);return!!e&&(this.error({message:e,blacklistDuration:1/0}),this.trigger("error"),!0)},t.updateSourceBufferTimestampOffset_=function(e){var t;null===e.timestampOffset||"number"!=typeof e.timingInfo.start||e.changedTimestampOffset||"main"!==this.loaderType_||(t=!1,e.timestampOffset-=e.timingInfo.start,e.changedTimestampOffset=!0,e.timestampOffset!==this.sourceUpdater_.videoTimestampOffset()&&(this.sourceUpdater_.videoTimestampOffset(e.timestampOffset),t=!0),e.timestampOffset!==this.sourceUpdater_.audioTimestampOffset()&&(this.sourceUpdater_.audioTimestampOffset(e.timestampOffset),t=!0),t&&this.trigger("timestampoffset"))},t.updateTimingInfoEnd_=function(e){e.timingInfo=e.timingInfo||{};var t=this.getMediaInfo_(),t="main"===this.loaderType_&&t&&t.hasVideo&&e.videoTimingInfo?e.videoTimingInfo:e.audioTimingInfo;t&&(e.timingInfo.end="number"==typeof t.end?t.end:t.start+e.duration)},t.handleAppendsDone_=function(){if(this.pendingSegment_&&this.trigger("appendsdone"),!this.pendingSegment_)return this.state="READY",void(this.paused()||this.monitorBuffer_());var e=this.pendingSegment_;this.updateTimingInfoEnd_(e),this.shouldSaveSegmentTimingInfo_&&this.syncController_.saveSegmentTimingInfo({segmentInfo:e,shouldSaveTimelineMapping:"main"===this.loaderType_});var t=ul(e,this.sourceType_);if(t&&("warn"===t.severity?tr.log.warn(t.message):this.logger_(t.message)),this.recordThroughput_(e),this.pendingSegment_=null,this.state="READY",!e.isSyncRequest||(this.trigger("syncinfoupdate"),e.hasAppendedData_)){this.logger_("Appended "+rl(e)),this.addSegmentMetadataCue_(e),this.fetchAtBuffer_=!0,this.currentTimeline_!==e.timeline&&(this.timelineChangeController_.lastTimelineChange({type:this.loaderType_,from:this.currentTimeline_,to:e.timeline}),"main"!==this.loaderType_||this.audioDisabled_||this.timelineChangeController_.lastTimelineChange({type:"audio",from:this.currentTimeline_,to:e.timeline})),this.currentTimeline_=e.timeline,this.trigger("syncinfoupdate");var i=e.segment,t=e.part,i=i.end&&this.currentTime_()-i.end>3*e.playlist.targetDuration,t=t&&t.end&&this.currentTime_()-t.end>3*e.playlist.partTargetDuration;if(i||t)return this.logger_("bad "+(i?"segment":"part")+" "+rl(e)),void this.resetEverything();null!==this.mediaIndex&&this.trigger("bandwidthupdate"),this.trigger("progress"),this.mediaIndex=e.mediaIndex,this.partIndex=e.partIndex,this.isEndOfStream_(e.mediaIndex,e.playlist,e.partIndex)&&this.endOfStream(),this.trigger("appended"),e.hasAppendedData_&&this.mediaAppends++,this.paused()||this.monitorBuffer_()}else this.logger_("Throwing away un-appended sync request "+rl(e))},t.recordThroughput_=function(e){var t,i;e.duration<1/60?this.logger_("Ignoring segment's throughput because its duration of "+e.duration+" is less than the min to record "+1/60):(t=this.throughput.rate,i=Date.now()-e.endOfAllRequests+1,i=Math.floor(e.byteLength/i*8*1e3),this.throughput.rate+=(i-t)/++this.throughput.count)},t.addSegmentMetadataCue_=function(e){var t,i,n,r;this.segmentMetadataTrack_&&(i=(t=e.segment).start,r=t.end,nl(i)&&nl(r)&&(il(i,r,this.segmentMetadataTrack_),n=window.WebKitDataCue||window.VTTCue,e={custom:t.custom,dateTimeObject:t.dateTimeObject,dateTimeString:t.dateTimeString,bandwidth:e.playlist.attributes.BANDWIDTH,resolution:e.playlist.attributes.RESOLUTION,codecs:e.playlist.attributes.CODECS,byteLength:e.byteLength,uri:e.uri,timeline:e.timeline,playlist:e.playlist.id,start:i,end:r},(r=new n(i,r,JSON.stringify(e))).value=e,this.segmentMetadataTrack_.addCue(r)))},e}(tr.EventTarget);function Ol(){}function Rl(e){return"string"!=typeof e?e:e.replace(/./,function(e){return e.toUpperCase()})}function Ml(e,t){var i=t[e+"Buffer"];return i&&i.updating||t.queuePending[e]}function Nl(e,t){if(0!==t.queue.length){var i=0,n=t.queue[i];if("mediaSource"!==n.type){if("mediaSource"!==e&&t.ready()&&"closed"!==t.mediaSource.readyState&&!Ml(e,t)){if(n.type!==e){if(null===(i=function(e,t){for(var i=0;i=e.playlist.segments.length){e=null;break}e=this.generateSegmentInfo_({playlist:e.playlist,mediaIndex:e.mediaIndex+1,startOfSegment:e.startOfSegment+e.duration,isSyncRequest:e.isSyncRequest})}return e},t.stopForError=function(e){this.error(e),this.state="READY",this.pause(),this.trigger("error")},t.segmentRequestFinished_=function(e,t,i){var n=this;if(this.subtitlesTrack_){if(this.saveTransferStats_(t.stats),!this.pendingSegment_)return this.state="READY",void(this.mediaRequestsAborted+=1);if(e)return e.code===xl&&this.handleTimeout_(),e.code===Al?this.mediaRequestsAborted+=1:this.mediaRequestsErrored+=1,void this.stopForError(e);var r=this.pendingSegment_;this.saveBandwidthRelatedStats_(r.duration,t.stats),this.state="APPENDING",this.trigger("appending");var a=r.segment;if(a.map&&(a.map.bytes=t.map.bytes),r.bytes=t.bytes,"function"!=typeof window.WebVTT&&this.subtitlesTrack_&&this.subtitlesTrack_.tech_){var s=function(){n.subtitlesTrack_.tech_.off("vttjsloaded",o),n.stopForError({message:"Error loading vtt.js"})},o=function(){n.subtitlesTrack_.tech_.off("vttjserror",s),n.segmentRequestFinished_(e,t,i)};return this.state="WAITING_ON_VTTJS",this.subtitlesTrack_.tech_.one("vttjsloaded",o),void this.subtitlesTrack_.tech_.one("vttjserror",s)}a.requested=!0;try{this.parseVTTCues_(r)}catch(e){return void this.stopForError({message:e.message})}if(this.updateTimeMapping_(r,this.syncController_.timelines[r.timeline],this.playlist_),r.cues.length?r.timingInfo={start:r.cues[0].startTime,end:r.cues[r.cues.length-1].endTime}:r.timingInfo={start:r.startOfSegment,end:r.startOfSegment+r.duration},r.isSyncRequest)return this.trigger("syncinfoupdate"),this.pendingSegment_=null,void(this.state="READY");r.byteLength=r.bytes.byteLength,this.mediaSecondsLoaded+=a.duration,r.cues.forEach(function(e){n.subtitlesTrack_.addCue(n.featuresNativeTextTracks_?new window.VTTCue(e.startTime,e.endTime,e.text):e)}),function(t){var e=t.cues;if(e)for(var i=0;iu)&&(r=void 0,r=o<0?i.start-Ko({defaultDuration:t.targetDuration,durationList:t.segments,startIndex:e.mediaIndex,endIndex:a}):i.end+Ko({defaultDuration:t.targetDuration,durationList:t.segments,startIndex:e.mediaIndex+1,endIndex:a}),this.discontinuities[s]={time:r,accuracy:u})}},t.dispose=function(){this.trigger("dispose"),this.off()},e}(tr.EventTarget),dc=function(t){function e(){var e=t.call(this)||this;return e.pendingTimelineChanges_={},e.lastTimelineChanges_={},e}mt(e,t);var i=e.prototype;return i.clearPendingTimelineChange=function(e){this.pendingTimelineChanges_[e]=null,this.trigger("pendingtimelinechange")},i.pendingTimelineChange=function(e){var t=e.type,i=e.from,e=e.to;return"number"==typeof i&&"number"==typeof e&&(this.pendingTimelineChanges_[t]={type:t,from:i,to:e},this.trigger("pendingtimelinechange")),this.pendingTimelineChanges_[t]},i.lastTimelineChange=function(e){var t=e.type,i=e.from,e=e.to;return"number"==typeof i&&"number"==typeof e&&(this.lastTimelineChanges_[t]={type:t,from:i,to:e},delete this.pendingTimelineChanges_[t],this.trigger("timelinechange")),this.lastTimelineChanges_[t]},i.dispose=function(){this.trigger("dispose"),this.pendingTimelineChanges_={},this.lastTimelineChanges_={},this.off()},e}(tr.EventTarget),hc=x(U(W(function(){function e(e,t,i){return e(i={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&i.path)}},i.exports),i.exports}var t=e(function(e){function n(e,t){for(var i=0;i>7))^f]=f;for(e=t=0;!c[e];e^=i||1,t=p[t]||1)for(s=16843009*h[n=h[i=h[d[c[e]=r=(r=t^t<<1^t<<2^t<<3^t<<4)>>8^255&r^99]=e]]]^65537*n^257*i^16843008*e,a=257*h[r]^16843008*r,f=0;f<4;f++)u[f][e]=a=a<<24^a>>>8,l[f][r]=s=s<<24^s>>>8;for(f=0;f<5;f++)u[f]=u[f].slice(0),l[f]=l[f].slice(0);return o}(),this._tables=[[c[0][0].slice(),c[0][1].slice(),c[0][2].slice(),c[0][3].slice(),c[0][4].slice()],[c[1][0].slice(),c[1][1].slice(),c[1][2].slice(),c[1][3].slice(),c[1][4].slice()]];var r=this._tables[0][4],a=this._tables[1],s=e.length,o=1;if(4!==s&&6!==s&&8!==s)throw new Error("Invalid aes key size");var u=e.slice(0),l=[];for(this._key=[u,l],t=s;t<4*s+28;t++)n=u[t-1],(t%s==0||8===s&&t%s==4)&&(n=r[n>>>24]<<24^r[n>>16&255]<<16^r[n>>8&255]<<8^r[255&n],t%s==0&&(n=n<<8^n>>>24^o<<24,o=o<<1^283*(o>>7))),u[t]=u[t-s]^n;for(i=0;t;i++,t--)n=u[3&i?t:t-4],l[i]=t<=4||i<4?n:a[0][r[n>>>24]]^a[1][r[n>>16&255]]^a[2][r[n>>8&255]]^a[3][r[255&n]]}return e.prototype.decrypt=function(e,t,i,n,r,a){for(var s,o,u,l=this._key[1],c=e^l[0],d=n^l[1],h=i^l[2],p=t^l[3],f=l.length/4-2,m=4,t=this._tables[1],g=t[0],y=t[1],v=t[2],_=t[3],b=t[4],T=0;T>>24]^y[d>>16&255]^v[h>>8&255]^_[255&p]^l[m],o=g[d>>>24]^y[h>>16&255]^v[p>>8&255]^_[255&c]^l[m+1],u=g[h>>>24]^y[p>>16&255]^v[c>>8&255]^_[255&d]^l[m+2],p=g[p>>>24]^y[c>>16&255]^v[d>>8&255]^_[255&h]^l[m+3],m+=4,c=s,d=o,h=u;for(T=0;T<4;T++)r[(3&-T)+a]=b[c>>>24]<<24^b[d>>16&255]<<16^b[h>>8&255]<<8^b[255&p]^l[m++],s=c,c=d,d=h,h=p,p=s},e}(),l=function(t){function e(){var e=t.call(this,r)||this;return e.jobs=[],e.delay=1,e.timeout_=null,e}n(e,t);var i=e.prototype;return i.processJob_=function(){this.jobs.shift()(),this.jobs.length?this.timeout_=setTimeout(this.processJob_.bind(this),this.delay):this.timeout_=null},i.push=function(e){this.jobs.push(e),this.timeout_||(this.timeout_=setTimeout(this.processJob_.bind(this),this.delay))},e}(r),g=function(e){return e<<24|(65280&e)<<8|(16711680&e)>>8|e>>>24},a=function(){function u(e,t,i,n){var r=u.STEP,a=new Int32Array(e.buffer),s=new Uint8Array(e.byteLength),o=0;for(this.asyncStream_=new l,this.asyncStream_.push(this.decryptChunk_(a.subarray(o,o+r),t,i,s)),o=r;o>2),u=new m(Array.prototype.slice.call(t)),e=new Uint8Array(e.byteLength),l=new Int32Array(e.buffer),c=i[0],d=i[1],h=i[2],p=i[3],f=0;f "+n+" from "+t),this.tech_.trigger({type:"usage",name:"vhs-rendition-change-"+t})),this.masterPlaylistLoader_.media(e,i)},t.startABRTimer_=function(){var e=this;this.stopABRTimer_(),this.abrTimer_=window.setInterval(function(){return e.checkABR_()},250)},t.stopABRTimer_=function(){this.tech_.scrubbing&&this.tech_.scrubbing()||(window.clearInterval(this.abrTimer_),this.abrTimer_=null)},t.getAudioTrackPlaylists_=function(){var e=this.master(),t=e&&e.playlists||[];if(!e||!e.mediaGroups||!e.mediaGroups.AUDIO)return t;var i,n=e.mediaGroups.AUDIO,r=Object.keys(n);if(Object.keys(this.mediaTypes_.AUDIO.groups).length)i=this.mediaTypes_.AUDIO.activeTrack();else{var a,s=n.main||r.length&&n[r[0]];for(a in s)if(s[a].default){i={label:a};break}}if(!i)return t;var o,u=[];for(o in n)if(n[o][i.label]){var l=n[o][i.label];if(l.playlists&&l.playlists.length)u.push.apply(u,l.playlists);else if(l.uri)u.push(l);else if(e.playlists.length)for(var c=0;c "+r.id;if(!t)return l(c+" as current playlist is not set"),!0;if(r.id===t.id)return!1;e=Boolean(Mo(i,n).length);if(!t.endList)return e||"number"!=typeof t.partTargetDuration?(l(c+" as current playlist is live"),!0):(l("not "+c+" as current playlist is live llhls, but currentTime isn't in buffered."),!1);i=jo(i,n),n=u?Sl.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE:Sl.MAX_BUFFER_LOW_WATER_LINE;if(o= bufferLowWaterLine ("+i+" >= "+a+")";return u&&(a+=" and next bandwidth > current bandwidth ("+n+" > "+r+")"),l(a),!0}return l("not "+c+" as no switching criteria met"),!1}({buffered:this.tech_.buffered(),currentTime:i,currentPlaylist:t,nextPlaylist:e,bufferLowWaterLine:n,bufferHighWaterLine:r,duration:this.duration(),experimentalBufferBasedABR:this.experimentalBufferBasedABR,log:this.logger_})},t.setupSegmentLoaderListeners_=function(){var t=this;this.experimentalBufferBasedABR||(this.mainSegmentLoader_.on("bandwidthupdate",function(){var e=t.selectPlaylist();t.shouldSwitchToMedia_(e)&&t.switchMedia_(e,"bandwidthupdate"),t.tech_.trigger("bandwidthupdate")}),this.mainSegmentLoader_.on("progress",function(){t.trigger("progress")})),this.mainSegmentLoader_.on("error",function(){t.blacklistCurrentPlaylist(t.mainSegmentLoader_.error())}),this.mainSegmentLoader_.on("appenderror",function(){t.error=t.mainSegmentLoader_.error_,t.trigger("error")}),this.mainSegmentLoader_.on("syncinfoupdate",function(){t.onSyncInfoUpdate_()}),this.mainSegmentLoader_.on("timestampoffset",function(){t.tech_.trigger({type:"usage",name:"vhs-timestamp-offset"}),t.tech_.trigger({type:"usage",name:"hls-timestamp-offset"})}),this.audioSegmentLoader_.on("syncinfoupdate",function(){t.onSyncInfoUpdate_()}),this.audioSegmentLoader_.on("appenderror",function(){t.error=t.audioSegmentLoader_.error_,t.trigger("error")}),this.mainSegmentLoader_.on("ended",function(){t.logger_("main segment loader ended"),t.onEndOfStream()}),this.mainSegmentLoader_.on("earlyabort",function(e){t.experimentalBufferBasedABR||(t.delegateLoaders_("all",["abort"]),t.blacklistCurrentPlaylist({message:"Aborted early because there isn't enough bandwidth to complete the request without rebuffering."},120))});function e(){if(!t.sourceUpdater_.hasCreatedSourceBuffers())return t.tryToCreateSourceBuffers_();var e=t.getCodecsOrExclude_();e&&t.sourceUpdater_.addOrChangeSourceBuffers(e)}this.mainSegmentLoader_.on("trackinfo",e),this.audioSegmentLoader_.on("trackinfo",e),this.mainSegmentLoader_.on("fmp4",function(){t.triggeredFmp4Usage||(t.tech_.trigger({type:"usage",name:"vhs-fmp4"}),t.tech_.trigger({type:"usage",name:"hls-fmp4"}),t.triggeredFmp4Usage=!0)}),this.audioSegmentLoader_.on("fmp4",function(){t.triggeredFmp4Usage||(t.tech_.trigger({type:"usage",name:"vhs-fmp4"}),t.tech_.trigger({type:"usage",name:"hls-fmp4"}),t.triggeredFmp4Usage=!0)}),this.audioSegmentLoader_.on("ended",function(){t.logger_("audioSegmentLoader ended"),t.onEndOfStream()})},t.mediaSecondsLoaded_=function(){return Math.max(this.audioSegmentLoader_.mediaSecondsLoaded+this.mainSegmentLoader_.mediaSecondsLoaded)},t.load=function(){this.mainSegmentLoader_.load(),this.mediaTypes_.AUDIO.activePlaylistLoader&&this.audioSegmentLoader_.load(),this.mediaTypes_.SUBTITLES.activePlaylistLoader&&this.subtitleSegmentLoader_.load()},t.smoothQualityChange_=function(e){void 0===e&&(e=this.selectPlaylist()),this.fastQualityChange_(e)},t.fastQualityChange_=function(e){var t=this;(e=void 0===e?this.selectPlaylist():e)!==this.masterPlaylistLoader_.media()?(this.switchMedia_(e,"fast-quality"),this.mainSegmentLoader_.resetEverything(function(){tr.browser.IE_VERSION||tr.browser.IS_EDGE?t.tech_.setCurrentTime(t.tech_.currentTime()+.04):t.tech_.setCurrentTime(t.tech_.currentTime())})):this.logger_("skipping fastQualityChange because new media is same as old")},t.play=function(){if(!this.setupFirstPlay()){this.tech_.ended()&&this.tech_.setCurrentTime(0),this.hasPlayed_&&this.load();var e=this.tech_.seekable();return this.tech_.duration()===1/0&&this.tech_.currentTime()this.maxPlaylistRetries?1/0:Date.now()+1e3*t,i.excludeUntil=a,e.reason&&(i.lastExcludeReason_=e.reason),this.tech_.trigger("blacklistplaylist"),this.tech_.trigger({type:"usage",name:"vhs-rendition-blacklisted"}),this.tech_.trigger({type:"usage",name:"hls-rendition-blacklisted"});r=this.selectPlaylist();if(!r)return this.error="Playback cannot continue. No available working or supported playlists.",void this.trigger("error");t=e.internal?this.logger_:tr.log.warn,a=e.message?" "+e.message:"";t((e.internal?"Internal problem":"Problem")+" encountered with playlist "+i.id+"."+a+" Switching to playlist "+r.id+"."),r.attributes.AUDIO!==i.attributes.AUDIO&&this.delegateLoaders_("audio",["abort","pause"]),r.attributes.SUBTITLES!==i.attributes.SUBTITLES&&this.delegateLoaders_("subtitle",["abort","pause"]),this.delegateLoaders_("main",["abort","pause"]);a=r.targetDuration/2*1e3||5e3,a="number"==typeof r.lastRequest&&Date.now()-r.lastRequest<=a;return this.switchMedia_(r,"exclude",s||a)},t.pauseLoading=function(){this.delegateLoaders_("all",["abort","pause"]),this.stopABRTimer_()},t.delegateLoaders_=function(i,e){var n=this,r=[],t="all"===i;!t&&"main"!==i||r.push(this.masterPlaylistLoader_);var a=[];!t&&"audio"!==i||a.push("AUDIO"),!t&&"subtitle"!==i||(a.push("CLOSED-CAPTIONS"),a.push("SUBTITLES")),a.forEach(function(e){e=n.mediaTypes_[e]&&n.mediaTypes_[e].activePlaylistLoader;e&&r.push(e)}),["main","audio","subtitle"].forEach(function(e){var t=n[e+"SegmentLoader_"];!t||i!==e&&"all"!==i||r.push(t)}),r.forEach(function(t){return e.forEach(function(e){"function"==typeof t[e]&&t[e]()})})},t.setCurrentTime=function(e){var t=Mo(this.tech_.buffered(),e);return this.masterPlaylistLoader_&&this.masterPlaylistLoader_.media()&&this.masterPlaylistLoader_.media().segments?t&&t.length?e:(this.mainSegmentLoader_.resetEverything(),this.mainSegmentLoader_.abort(),this.mediaTypes_.AUDIO.activePlaylistLoader&&(this.audioSegmentLoader_.resetEverything(),this.audioSegmentLoader_.abort()),this.mediaTypes_.SUBTITLES.activePlaylistLoader&&(this.subtitleSegmentLoader_.resetEverything(),this.subtitleSegmentLoader_.abort()),void this.load()):0},t.duration=function(){if(!this.masterPlaylistLoader_)return 0;var e=this.masterPlaylistLoader_.media();return e?e.endList?this.mediaSource?this.mediaSource.duration:Kl.Playlist.duration(e):1/0:0},t.seekable=function(){return this.seekable_},t.onSyncInfoUpdate_=function(){var e;if(this.masterPlaylistLoader_){var t=this.masterPlaylistLoader_.media();if(t){var i=this.syncController_.getExpiredTime(t,this.duration());if(null!==i){var n,r,a=this.masterPlaylistLoader_.master,s=Kl.Playlist.seekable(t,i,Kl.Playlist.liveEdgeDelay(a,t));if(0!==s.length){if(this.mediaTypes_.AUDIO.activePlaylistLoader){if(t=this.mediaTypes_.AUDIO.activePlaylistLoader.media(),null===(i=this.syncController_.getExpiredTime(t,this.duration())))return;if(0===(e=Kl.Playlist.seekable(t,i,Kl.Playlist.liveEdgeDelay(a,t))).length)return}this.seekable_&&this.seekable_.length&&(n=this.seekable_.end(0),r=this.seekable_.start(0)),!e||e.start(0)>s.end(0)||s.start(0)>e.end(0)?this.seekable_=s:this.seekable_=tr.createTimeRanges([[(e.start(0)>s.start(0)?e:s).start(0),(e.end(0) "'+a[e]+'"')}),u.length)return void this.blacklistCurrentPlaylist({playlist:this.media(),message:"Codec switching not supported: "+u.join(", ")+".",blacklistDuration:1/0,internal:!0})}return a}t=Object.keys(o).reduce(function(e,t){return e&&(e+=", "),e+=t+' does not support codec(s): "'+o[t].join(",")+'"'},"")+".";this.blacklistCurrentPlaylist({playlist:this.media(),internal:!0,message:t,blacklistDuration:1/0})}else this.blacklistCurrentPlaylist({playlist:this.media(),message:"Could not determine codecs for playlist.",blacklistDuration:1/0})},t.tryToCreateSourceBuffers_=function(){var e;"open"!==this.mediaSource.readyState||this.sourceUpdater_.hasCreatedSourceBuffers()||!this.areMediaTypesKnown_()||(e=this.getCodecsOrExclude_())&&(this.sourceUpdater_.createSourceBuffers(e),e=[e.video,e.audio].filter(Boolean).join(","),this.excludeIncompatibleVariants_(e))},t.excludeUnsupportedVariants_=function(){var n=this,r=this.master().playlists,a=[];Object.keys(r).forEach(function(e){var t,i=r[e];-1===a.indexOf(i.id)&&(a.push(i.id),t=[],!(e=Yu(n.master,i)).audio||yr(e.audio)||gr(e.audio)||t.push("audio codec "+e.audio),!e.video||yr(e.video)||gr(e.video)||t.push("video codec "+e.video),e.text&&"stpp.ttml.im1t"===e.text&&t.push("text codec "+e.text),t.length&&(i.excludeUntil=1/0,n.logger_("excluding "+i.id+" for unsupported: "+t.join(", "))))})},t.excludeIncompatibleVariants_=function(e){var r=this,a=[],s=this.master().playlists,e=Xu(pr(e)),o=Ku(e),u=e.video&&pr(e.video)[0]||null,l=e.audio&&pr(e.audio)[0]||null;Object.keys(s).forEach(function(e){var t,i,n=s[e];-1===a.indexOf(n.id)&&n.excludeUntil!==1/0&&(a.push(n.id),t=[],i=Yu(r.masterPlaylistLoader_.master,n),e=Ku(i),(i.audio||i.video)&&(e!==o&&t.push('codec count "'+e+'" !== "'+o+'"'),r.sourceUpdater_.canChangeType()||(e=i.video&&pr(i.video)[0]||null,i=i.audio&&pr(i.audio)[0]||null,e&&u&&e.type.toLowerCase()!==u.type.toLowerCase()&&t.push('video codec "'+e.type+'" !== "'+u.type+'"'),i&&l&&i.type.toLowerCase()!==l.type.toLowerCase()&&t.push('audio codec "'+i.type+'" !== "'+l.type+'"')),t.length&&(n.excludeUntil=1/0,r.logger_("blacklisting "+n.id+": "+t.join(" && ")))))})},t.updateAdCues_=function(e){var t=0,i=this.seekable();i.length&&(t=i.start(0)),function(e,t,i){if(void 0===i&&(i=0),e.segments)for(var n=i,r=0;r=r.adStartTime&&t<=r.adEndTime)return r}return null}(t,n+u.duration/2)){if("cueIn"in u){o.endTime=n,o.adEndTime=n,n+=u.duration,o=null;continue}if(n=t.end(t.length-1)))return this.techWaiting_();5<=this.consecutiveUpdates&&e===this.lastRecordedTime?(this.consecutiveUpdates++,this.waiting_()):e===this.lastRecordedTime?this.consecutiveUpdates++:(this.consecutiveUpdates=0,this.lastRecordedTime=e)}},t.cancelTimer_=function(){this.consecutiveUpdates=0,this.timer_&&(this.logger_("cancelTimer_"),clearTimeout(this.timer_)),this.timer_=null},t.fixesBadSeeks_=function(){if(!this.tech_.seeking())return!1;var e,t=this.seekable(),i=this.tech_.currentTime();if(this.afterSeekableWindow_(t,i,this.media(),this.allowSeeksWithinUnsafeLiveWindow)&&(e=t.end(t.length-1)),"undefined"!=typeof(e=this.beforeSeekableWindow_(t,i)?(a=t.start(0))+(a===t.end(0)?0:.1):e))return this.logger_("Trying to seek outside of seekable at time "+i+" with seekable range "+Uo(t)+". Seeking to "+e+"."),this.tech_.setCurrentTime(e),!0;for(var n=this.masterPlaylistController_.sourceUpdater_,r=this.tech_.buffered(),a=n.audioBuffer?n.audioBuffered():null,t=n.videoBuffer?n.videoBuffered():null,n=this.media(),s=n.partTargetDuration||2*(n.targetDuration-hl),o=[a,t],u=0;u "+t.end(0)+"]. Attempting to resume playback by seeking to the current time."),this.tech_.trigger({type:"usage",name:"vhs-unknown-waiting"}),this.tech_.trigger({type:"usage",name:"hls-unknown-waiting"})))},t.techWaiting_=function(){var e=this.seekable(),t=this.tech_.currentTime();if(this.tech_.seeking()||null!==this.timer_)return!0;if(this.beforeSeekableWindow_(e,t)){var i=e.end(e.length-1);return this.logger_("Fell out of live window at time "+t+". Seeking to live point (seekable end) "+i),this.cancelTimer_(),this.tech_.setCurrentTime(i),this.tech_.trigger({type:"usage",name:"vhs-live-resync"}),this.tech_.trigger({type:"usage",name:"hls-live-resync"}),!0}e=this.tech_.vhs.masterPlaylistController_.sourceUpdater_,i=this.tech_.buffered();if(this.videoUnderflow_({audioBuffered:e.audioBuffered(),videoBuffered:e.videoBuffered(),currentTime:t}))return this.cancelTimer_(),this.tech_.setCurrentTime(t),this.tech_.trigger({type:"usage",name:"vhs-video-underflow"}),this.tech_.trigger({type:"usage",name:"hls-video-underflow"}),!0;e=No(i,t);if(0JryDpiGmuXMQYCWRlDr&u=y`S$| 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 literal 0 HcmV?d00001 diff --git a/packages/renderer/public/wasm_exec.js b/packages/renderer/public/wasm_exec.js new file mode 100644 index 0000000..3d072e7 --- /dev/null +++ b/packages/renderer/public/wasm_exec.js @@ -0,0 +1,527 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// This file has been modified for use by the TinyGo compiler. + +(() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + + if (typeof global !== "undefined") { + // global already exists + } else if (typeof window !== "undefined") { + window.global = window; + } else if (typeof self !== "undefined") { + self.global = self; + } else { + throw new Error("cannot export Go (neither global, window nor self is defined)"); + } + + if (!global.require && typeof require !== "undefined") { + global.require = require; + } + + if (!global.fs && global.require) { + global.fs = require("fs"); + } + + const enosys = () => { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + return err; + }; + + if (!global.fs) { + let outputBuf = ""; + global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + chmod(path, mode, callback) { callback(enosys()); }, + chown(path, uid, gid, callback) { callback(enosys()); }, + close(fd, callback) { callback(enosys()); }, + fchmod(fd, mode, callback) { callback(enosys()); }, + fchown(fd, uid, gid, callback) { callback(enosys()); }, + fstat(fd, callback) { callback(enosys()); }, + fsync(fd, callback) { callback(null); }, + ftruncate(fd, length, callback) { callback(enosys()); }, + lchown(path, uid, gid, callback) { callback(enosys()); }, + link(path, link, callback) { callback(enosys()); }, + lstat(path, callback) { callback(enosys()); }, + mkdir(path, perm, callback) { callback(enosys()); }, + open(path, flags, mode, callback) { callback(enosys()); }, + read(fd, buffer, offset, length, position, callback) { callback(enosys()); }, + readdir(path, callback) { callback(enosys()); }, + readlink(path, callback) { callback(enosys()); }, + rename(from, to, callback) { callback(enosys()); }, + rmdir(path, callback) { callback(enosys()); }, + stat(path, callback) { callback(enosys()); }, + symlink(path, link, callback) { callback(enosys()); }, + truncate(path, length, callback) { callback(enosys()); }, + unlink(path, callback) { callback(enosys()); }, + utimes(path, atime, mtime, callback) { callback(enosys()); }, + }; + } + + if (!global.process) { + global.process = { + getuid() { return -1; }, + getgid() { return -1; }, + geteuid() { return -1; }, + getegid() { return -1; }, + getgroups() { throw enosys(); }, + pid: -1, + ppid: -1, + umask() { throw enosys(); }, + cwd() { throw enosys(); }, + chdir() { throw enosys(); }, + } + } + + if (!global.crypto) { + const nodeCrypto = require("crypto"); + global.crypto = { + getRandomValues(b) { + nodeCrypto.randomFillSync(b); + }, + }; + } + + if (!global.performance) { + global.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + if (!global.TextEncoder) { + global.TextEncoder = require("util").TextEncoder; + } + + if (!global.TextDecoder) { + global.TextDecoder = require("util").TextDecoder; + } + + // End of polyfills for common API. + + const encoder = new TextEncoder("utf-8"); + const decoder = new TextDecoder("utf-8"); + var logLine = []; + + global.Go = class { + constructor() { + this._callbackTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const mem = () => { + // The buffer may change when requesting more memory. + return new DataView(this._inst.exports.memory.buffer); + } + + const setInt64 = (addr, v) => { + mem().setUint32(addr + 0, v, true); + mem().setUint32(addr + 4, Math.floor(v / 4294967296), true); + } + + const getInt64 = (addr) => { + const low = mem().getUint32(addr + 0, true); + const high = mem().getInt32(addr + 4, true); + return low + high * 4294967296; + } + + const loadValue = (addr) => { + const f = mem().getFloat64(addr, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = mem().getUint32(addr, true); + return this._values[id]; + } + + const storeValue = (addr, v) => { + const nanHead = 0x7FF80000; + + if (typeof v === "number") { + if (isNaN(v)) { + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 0, true); + return; + } + if (v === 0) { + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 1, true); + return; + } + mem().setFloat64(addr, v, true); + return; + } + + switch (v) { + case undefined: + mem().setFloat64(addr, 0, true); + return; + case null: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 2, true); + return; + case true: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 3, true); + return; + case false: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 4, true); + return; + } + + let id = this._ids.get(v); + if (id === undefined) { + id = this._idPool.pop(); + if (id === undefined) { + id = this._values.length; + } + this._values[id] = v; + this._goRefCounts[id] = 0; + this._ids.set(v, id); + } + this._goRefCounts[id]++; + let typeFlag = 1; + switch (typeof v) { + case "string": + typeFlag = 2; + break; + case "symbol": + typeFlag = 3; + break; + case "function": + typeFlag = 4; + break; + } + mem().setUint32(addr + 4, nanHead | typeFlag, true); + mem().setUint32(addr, id, true); + } + + const loadSlice = (array, len, cap) => { + return new Uint8Array(this._inst.exports.memory.buffer, array, len); + } + + const loadSliceOfValues = (array, len, cap) => { + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + } + + const loadString = (ptr, len) => { + return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len)); + } + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + wasi_snapshot_preview1: { + // https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write + fd_write: function(fd, iovs_ptr, iovs_len, nwritten_ptr) { + let nwritten = 0; + if (fd == 1) { + for (let iovs_i=0; iovs_i { + if (global.process) { + // Node.js + process.exit(code); + } else { + // Can't exit in a browser. + throw 'trying to exit with code ' + code; + } + }, + }, + env: { + // func ticks() float64 + "runtime.ticks": () => { + return timeOrigin + performance.now(); + }, + + // func sleepTicks(timeout float64) + "runtime.sleepTicks": (timeout) => { + // Do not sleep, only reactivate scheduler after the given timeout. + setTimeout(this._inst.exports.go_scheduler, timeout); + }, + + // func finalizeRef(v ref) + "syscall/js.finalizeRef": (sp) => { + // Note: TinyGo does not support finalizers so this should never be + // called. + //console.error('syscall/js.finalizeRef not implemented'); + }, + + // func stringVal(value string) ref + "syscall/js.stringVal": (ret_ptr, value_ptr, value_len) => { + const s = loadString(value_ptr, value_len); + storeValue(ret_ptr, s); + }, + + // func valueGet(v ref, p string) ref + "syscall/js.valueGet": (retval, v_addr, p_ptr, p_len) => { + let prop = loadString(p_ptr, p_len); + let value = loadValue(v_addr); + let result = Reflect.get(value, prop); + storeValue(retval, result); + }, + + // func valueSet(v ref, p string, x ref) + "syscall/js.valueSet": (v_addr, p_ptr, p_len, x_addr) => { + const v = loadValue(v_addr); + const p = loadString(p_ptr, p_len); + const x = loadValue(x_addr); + Reflect.set(v, p, x); + }, + + // func valueDelete(v ref, p string) + "syscall/js.valueDelete": (v_addr, p_ptr, p_len) => { + const v = loadValue(v_addr); + const p = loadString(p_ptr, p_len); + Reflect.deleteProperty(v, p); + }, + + // func valueIndex(v ref, i int) ref + "syscall/js.valueIndex": (ret_addr, v_addr, i) => { + storeValue(ret_addr, Reflect.get(loadValue(v_addr), i)); + }, + + // valueSetIndex(v ref, i int, x ref) + "syscall/js.valueSetIndex": (v_addr, i, x_addr) => { + Reflect.set(loadValue(v_addr), i, loadValue(x_addr)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + "syscall/js.valueCall": (ret_addr, v_addr, m_ptr, m_len, args_ptr, args_len, args_cap) => { + const v = loadValue(v_addr); + const name = loadString(m_ptr, m_len); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + try { + const m = Reflect.get(v, name); + storeValue(ret_addr, Reflect.apply(m, v, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr + 8, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + "syscall/js.valueInvoke": (ret_addr, v_addr, args_ptr, args_len, args_cap) => { + try { + const v = loadValue(v_addr); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + storeValue(ret_addr, Reflect.apply(v, undefined, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr + 8, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + "syscall/js.valueNew": (ret_addr, v_addr, args_ptr, args_len, args_cap) => { + const v = loadValue(v_addr); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + try { + storeValue(ret_addr, Reflect.construct(v, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr+ 8, 0); + } + }, + + // func valueLength(v ref) int + "syscall/js.valueLength": (v_addr) => { + return loadValue(v_addr).length; + }, + + // valuePrepareString(v ref) (ref, int) + "syscall/js.valuePrepareString": (ret_addr, v_addr) => { + const s = String(loadValue(v_addr)); + const str = encoder.encode(s); + storeValue(ret_addr, str); + setInt64(ret_addr + 8, str.length); + }, + + // valueLoadString(v ref, b []byte) + "syscall/js.valueLoadString": (v_addr, slice_ptr, slice_len, slice_cap) => { + const str = loadValue(v_addr); + loadSlice(slice_ptr, slice_len, slice_cap).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + "syscall/js.valueInstanceOf": (v_addr, t_addr) => { + return loadValue(v_addr) instanceof loadValue(t_addr); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + "syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, source_addr) => { + let num_bytes_copied_addr = ret_addr; + let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable + + const dst = loadSlice(dest_addr, dest_len); + const src = loadValue(source_addr); + if (!(src instanceof Uint8Array)) { + mem().setUint8(returned_status_addr, 0); // Return "not ok" status + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(num_bytes_copied_addr, toCopy.length); + mem().setUint8(returned_status_addr, 1); // Return "ok" status + }, + + // copyBytesToJS(dst ref, src []byte) (int, bool) + // Originally copied from upstream Go project, then modified: + // https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416 + "syscall/js.copyBytesToJS": (ret_addr, dest_addr, source_addr, source_len, source_cap) => { + let num_bytes_copied_addr = ret_addr; + let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable + + const dst = loadValue(dest_addr); + const src = loadSlice(source_addr, source_len); + if (!(dst instanceof Uint8Array)) { + mem().setUint8(returned_status_addr, 0); // Return "not ok" status + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(num_bytes_copied_addr, toCopy.length); + mem().setUint8(returned_status_addr, 1); // Return "ok" status + }, + } + }; + } + + async run(instance) { + this._inst = instance; + this._values = [ // JS values that Go currently has references to, indexed by reference id + NaN, + 0, + null, + true, + false, + global, + this, + ]; + this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id + this._ids = new Map(); // mapping from JS values to reference ids + this._idPool = []; // unused ids that have been garbage collected + this.exited = false; // whether the Go program has exited + + const mem = new DataView(this._inst.exports.memory.buffer) + + while (true) { + const callbackPromise = new Promise((resolve) => { + this._resolveCallbackPromise = () => { + if (this.exited) { + throw new Error("bad callback: Go program has already exited"); + } + setTimeout(resolve, 0); // make sure it is asynchronous + }; + }); + this._inst.exports._start(); + if (this.exited) { + break; + } + await callbackPromise; + } + } + + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.resume(); + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + } + + if ( + global.require && + global.require.main === module && + global.process && + global.process.versions && + !global.process.versions.electron + ) { + if (process.argv.length != 3) { + console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); + process.exit(1); + } + + const go = new Go(); + WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { + return go.run(result.instance); + }).catch((err) => { + console.error(err); + process.exit(1); + }); + } +})(); diff --git a/packages/renderer/src/App.vue b/packages/renderer/src/App.vue new file mode 100644 index 0000000..2e37a39 --- /dev/null +++ b/packages/renderer/src/App.vue @@ -0,0 +1,36 @@ + + + diff --git a/packages/renderer/src/aliapi/alihttp.ts b/packages/renderer/src/aliapi/alihttp.ts new file mode 100644 index 0000000..65ca8b3 --- /dev/null +++ b/packages/renderer/src/aliapi/alihttp.ts @@ -0,0 +1,373 @@ +import { ITokenInfo } from '@/user/userstore' +import UserDAL from '@/user/userdal' +import axios, { AxiosRequestHeaders, AxiosResponse } from 'axios' +import jschardet from 'jschardet' +import AliUser from './user' +import message from '@/utils/message' +import DebugLog from '@/utils/debuglog' + +export interface IUrlRespData { + code: number + header: string + body: any +} +function BlobToString(body: Blob, encoding: string): Promise { + return new Promise((resolve) => { + const reader = new FileReader() + reader.readAsText(body, encoding) + reader.onload = function () { + resolve((reader.result as string) || '') + } + }) +} + +function BlobToBuff(body: Blob): Promise { + return new Promise((resolve) => { + const reader = new FileReader() + reader.readAsArrayBuffer(body) + reader.onload = function () { + resolve(reader.result as ArrayBuffer) + } + }) +} + + +function HttpCodeBreak(code: number) { + if (code >= 200 && code <= 300) return true + if (code == 400) return true + //if (code == 401) return true + if (code >= 402 && code <= 428) return true + if (code == 403) return true + if (code == 404) return true + if (code == 409) return true + return false +} + +function Sleep(msTime: number) { + return new Promise((resolve) => + setTimeout( + () => + resolve({ + success: true, + time: msTime + }), + msTime + ) + ) +} + +const isdebughttp = false +export default class AliHttp { + static LimitMax = 100 + static baseapi = 'https://api.aliyundrive.com/' + + static IsSuccess(code: number) { + return code >= 200 && code <= 300 + } + + static CatchError(error: any, token: ITokenInfo | undefined) { + try { + if (isdebughttp) console.log('CALLURLError ', error) + let errormessage = error.message || '' + if (error.response) { + + let islog = true + if (error.response.status == 429) islog = false + if (error.response.data && error.response.data.code) { + + if (error.response.data.code == 'InvalidParameter.Limit') islog = false + if (error.response.data.code == 'ForbiddenFileInTheRecycleBin') islog = false + if (error.response.data.code == 'PreHashMatched') islog = false + if (error.response.data.code == 'InvalidResource.SharePwd') islog = false + if (error.response.data.code == 'ShareLink.Expired') islog = false + if (error.response.data.code == 'FileShareNotAllowed') islog = false + if (error.response.data.code == 'CannotFollowYourself') islog = false + } + if (islog) DebugLog.mSaveLog('warning', 'HttpError4 status=' + error.response.status + ' code=' + error.response.data?.code + ' message=' + errormessage) + + + if (token && error.response.status == 401 && error.response.data && error.response.data.code == 'AccessTokenInvalid') { + + return AliUser.ApiTokenRefreshAccount(token, true).then((islogin: boolean) => { + + return { code: 401, header: '', body: 'NetError 账号需要重新登录' } + }) + } + + if (error.code == 'ERR_NETWORK' || (error.response.status == 0 && !error.response.headers)) { + DebugLog.mSaveLog('warning', 'HttpError0 message=' + errormessage) + return { code: 600, header: '', body: 'NetError 网络无法连接' } + } + + return { + code: error.response.status, + header: error.response.headers, + body: error.response.data + } + } else if (error.request) { + + message.error('网络请求超时,似乎网络不太顺畅') + DebugLog.mSaveLog('warning', 'HttpError1 message=' + errormessage) + return { code: 601, header: '', body: 'NetError ' + errormessage } + } else if (error.message) { + DebugLog.mSaveLog('warning', 'HttpError3 status=' + error.response?.status || '' + ' message=' + errormessage) + return { code: 603, header: '', body: 'NetError ' + errormessage } + } else { + + DebugLog.mSaveLog('warning', 'HttpError2 message=' + errormessage) + return { code: 602, header: '', body: 'NetError ' + errormessage } + } + } catch (e: any) { + + DebugLog.mSaveLog('warning', 'HttpError5 message=' + (e.message || '')) + return { code: 605, header: '', body: 'NetError catch=' + (e.message || '') } + } + } + + static async Get(url: string, user_id: string): Promise { + if (url.startsWith('http') == false) url = AliHttp.baseapi + url + for (let i = 0; i <= 5; i++) { + let resp = await AliHttp._Get(url, user_id) + if (HttpCodeBreak(resp.code)) return resp + else if (i == 5) return resp + else await Sleep(2000) + } + return { code: 607, header: '', body: 'NetError GetLost' } + } + + static _Get(url: string, user_id: string): Promise { + return UserDAL.GetUserTokenFromDB(user_id).then((token) => { + const headers: AxiosRequestHeaders = {} + if (token) { + headers.Authorization = token.token_type + ' ' + token.access_token + } + return axios + .get(url, { + withCredentials: false, + responseType: 'json', + timeout: 30000, + headers: headers + }) + .then((response: AxiosResponse) => { + return { + code: response.status, + header: JSON.stringify(response.headers), + body: response.data + } + }) + .catch(function (error: any) { + return AliHttp.CatchError(error, token) + }) + }) + } + + + static async GetString(url: string, user_id: string, filesize: number, maxsize: number): Promise { + if (url.startsWith('http') == false) url = AliHttp.baseapi + url + for (let i = 0; i <= 5; i++) { + let resp = await AliHttp._GetString(url, user_id, filesize, maxsize) + if (HttpCodeBreak(resp.code)) return resp + else if (i == 5) return resp + else await Sleep(2000) + } + return { code: 609, header: '', body: 'NetError GetStringLost' } + } + + static _GetString(url: string, user_id: string, filesize: number, maxsize: number): Promise { + return UserDAL.GetUserTokenFromDB(user_id).then((token) => { + const headers: AxiosRequestHeaders = {} + if (token) { + headers.Authorization = token.token_type + ' ' + token.access_token + } + headers.Range = 'bytes=0-' + (Math.min(filesize, maxsize) - 1).toString() + + return axios + .get(url, { + withCredentials: false, + responseType: 'blob', + timeout: 30000, + headers: headers + }) + .then((response: AxiosResponse) => { + const data = response.data as Blob + if (data.size == 0) { + response.data = '文件是空的' + return response + } + const test = data.slice(0, data.size > 10240 ? 10240 : data.size - 1) + return BlobToBuff(test).then((abuff: ArrayBuffer | undefined) => { + let encoding = 'utf-8' + if (abuff != undefined && abuff.byteLength > 3) { + const buff = Buffer.from(abuff) + if (buff[0].toString(16).toLowerCase() == 'ef' && buff[1].toString(16).toLowerCase() == 'bb' && buff[2].toString(16).toLowerCase() == 'bf') { + + encoding = 'utf-8' + } else if (buff[0] == 239 && buff[1] == 191 && buff[2] == 189) { + encoding = 'GB2312' + } else { + try { + const info = jschardet.detect(buff) + encoding = info.encoding + if (encoding == 'ascii') encoding = 'utf-8' + } catch { + encoding = 'utf-8' + } + } + } + return BlobToString(data, encoding).then((str) => { + response.data = str + return response + }) + }) + }) + .then((response: AxiosResponse) => { + const r = { + code: response.status, + header: JSON.stringify(response.headers), + body: response.data + } + + if (typeof r.body === 'string' && r.body.length > 5) { + + let sub = r.body.substring(0, Math.min(200, r.body.length)) + if (sub.indexOf('{') >= 0 && sub.indexOf(':') > 0 && sub.indexOf('}') > 0 && sub.indexOf('"') > 0) { + + try { + r.body = JSON.stringify(JSON.parse(r.body), undefined, 2) + } catch {} + } + } + return r + }) + .catch(function (error: any) { + return AliHttp.CatchError(error, token) + }) + }) + } + + + static async GetBlob(url: string, user_id: string): Promise { + if (url.startsWith('http') == false) url = AliHttp.baseapi + url + for (let i = 0; i <= 5; i++) { + let resp = await AliHttp._GetBlob(url, user_id) + if (HttpCodeBreak(resp.code)) return resp + else if (i == 5) return resp + else await Sleep(2000) + } + return { code: 611, header: '', body: 'NetError GetBlobLost' } + } + + static _GetBlob(url: string, user_id: string): Promise { + return UserDAL.GetUserTokenFromDB(user_id).then((token) => { + const headers: AxiosRequestHeaders = {} + if (token) { + headers.Authorization = token.token_type + ' ' + token.access_token + } + return axios + .get(url, { + withCredentials: false, + responseType: 'blob', + timeout: 30000, + headers: headers + }) + .then((response: AxiosResponse) => { + return { + code: response.status, + header: JSON.stringify(response.headers), + body: response.data + } + }) + .catch(function (error) { + return AliHttp.CatchError(error, token) + }) + }) + } + + static async Post(url: string, postdata: any, user_id: string, share_token: string): Promise { + if (url.startsWith('http') == false) url = AliHttp.baseapi + url + for (let i = 0; i <= 5; i++) { + let resp = await AliHttp._Post(url, postdata, user_id, share_token) + if (resp.code == 400 && (url.includes('/file/search') || url.includes('/file/list') || url.includes('/file/walk') || url.includes('/file/scan')) && !resp.body?.code) await Sleep(2000) + else if (HttpCodeBreak(resp.code)) return resp + else if (i == 5) return resp + else await Sleep(2000) + } + return { code: 608, header: '', body: 'NetError PostLost' } + } + + static _Post(url: string, postdata: any, user_id: string, share_token: string): Promise { + return UserDAL.GetUserTokenFromDB(user_id).then((token) => { + const headers: AxiosRequestHeaders = {} + if (url.includes('aliyundrive')) { + headers['Content-Type'] = 'application/json' + } + if (token) { + headers.Authorization = token.token_type + ' ' + token.access_token + } + if (share_token) { + headers['x-share-token'] = share_token + } + if (url.includes('ali')) headers['content-type'] = 'application/json;charset-utf-8' + let timeout = 30000 + if (url.includes('/batch')) timeout = 60000 + return axios + .post(url, postdata, { + withCredentials: false, + responseType: 'json', + timeout: timeout, + headers: headers + }) + .then((response: AxiosResponse) => { + return { + code: response.status, + header: JSON.stringify(response.headers), + body: response.data + } + }) + .catch(function (error: any) { + return AliHttp.CatchError(error, token) + }) + }) + } + + static async PostString(url: string, postdata: any, user_id: string, share_token: string): Promise { + if (url.startsWith('http') == false) url = AliHttp.baseapi + url + for (let i = 0; i <= 5; i++) { + let resp = await AliHttp._PostString(url, postdata, user_id, share_token) + if (HttpCodeBreak(resp.code)) return resp + else if (i == 5) return resp + else await Sleep(2000) + } + return { code: 610, header: '', body: 'NetError PostStringLost' } + } + + static _PostString(url: string, postdata: any, user_id: string, share_token: string): Promise { + const headers: AxiosRequestHeaders = {} + return UserDAL.GetUserTokenFromDB(user_id).then((token) => { + if (token) { + headers.Authorization = token.token_type + ' ' + token.access_token + } + if (share_token) { + headers['x-share-token'] = share_token + } + + return axios + .post(url, postdata, { + withCredentials: false, + responseType: 'text', + timeout: 50000, + headers: headers + }) + .then((response: AxiosResponse) => { + return { + code: response.status, + header: JSON.stringify(response.headers), + body: response.data + } + }) + .catch(function (error) { + return AliHttp.CatchError(error, token) + }) + }) + } +} diff --git a/packages/renderer/src/aliapi/alimodels.ts b/packages/renderer/src/aliapi/alimodels.ts new file mode 100644 index 0000000..fbfc10d --- /dev/null +++ b/packages/renderer/src/aliapi/alimodels.ts @@ -0,0 +1,238 @@ + +export interface IAliFileItem { + drive_id: string + domain_id: string + description?: string + file_id: string + compilation_id?:string + name: string + type: string + video_type?:string + content_type: string + created_at: string + updated_at: string + last_played_at?:string + gmt_cleaned?: string + gmt_deleted?: string + file_extension?: string + hidden: boolean + size: number + starred: boolean + status: string + upload_id: string + parent_file_id: string + crc64_hash: string + content_hash: string + content_hash_name: string + download_url: string + url: string + category: string + encrypt_mode: string + punish_flag: number + thumbnail?: string + mime_extension: string + mime_type: string + play_cursor: number + video_media_metadata?: { + duration?: string | number + height?: number + width?: number + time?: string + video_media_video_stream?: IAliFileVideoMeta[] | IAliFileVideoMeta + video_media_audio_stream?: IAliFileAudioMeta[] | IAliFileAudioMeta + } + + video_preview_metadata?: { + duration?: string | number + height?: number + width?: number + audio_format?: string + bitrate?: string + frame_rate?: string + video_format?: string + template_list?: [{ template_id: string; status: string }] + audio_template_list?: [{ template_id: string; status: string }] + } + + image_media_metadata?: { + height?: number + width?: number + exif?: string + } + + user_meta?: string +} + +export interface IAliFileVideoMeta { + bitrate?: string + clarity?: string + code_name?: string + duration?: string + fps?: string +} +export interface IAliFileAudioMeta { + bit_rate?: string + channel_layout?: string + channels?: number + code_name?: string + duration?: string + sample_rate?: string +} + + +export interface IAliOtherFollowingModel { + avatar: string + description: string + is_following: boolean + nick_name: string + phone: string + user_id: string + follower_count: number +} + + +export interface IAliMyFollowingModel { + avatar: string + description: string + has_unread_message: boolean + is_following: boolean + latest_messages: IAliMyFollowingMessageModel[] + nick_name: string + phone: string + user_id: string + SearchName: string +} + +interface IAliMyFollowingMessageModel { + action: string + content: { + file_id_list: string[] + share: { popularity: number; popularity_emoji: string; popularity_str: string; share_id: string; share_pwd: string } + } + created: number + createdstr: string + creator: IAliOtherFollowingModel + creator_id: string + display_action: string + sequence_id: number +} + + +export interface IAliShareItem { + created_at: string + creator: string + description: string + display_name: string + download_count: number + drive_id: string + expiration: string + expired: boolean + file_id: string + file_id_list: string[] + icon: string + first_file?: IAliFileItem + preview_count: number + save_count: number + share_id: string + + share_msg: string + share_name: string + share_policy: string + share_pwd: string + share_url: string + status: string + updated_at: string +} + +export interface IAliShareAnonymous { + shareinfo: { + shareid: string + creator_id: string + creator_name: string + creator_phone: string + display_name: string + expiration: string + file_count: number + share_name: string + created_at: string + updated_at: string + vip: string + } + shareinfojson: string + error: string +} + + +export interface IAliShareFileItem { + drive_id: string + //domain_id: string + file_id: string + name: string + type: string + //created_at: string + //updated_at: string + //hidden: boolean + //starred: boolean + //status: string + parent_file_id: string + //encrypt_mode: string + //revision_id: string + + file_extension?: string + mime_extension: string + mime_type: string + size: number + //content_hash: string + //content_hash_name: string + category: string + punish_flag: number + + + isdir: boolean + sizestr: string + icon: string +} + + +export interface IAliGetForderSizeModel { + size: number + folder_count: number + file_count: number + reach_limit?: boolean +} + + +export interface IAliGetDirModel { + __v_skip: true + drive_id: string + file_id: string + parent_file_id: string + name: string + namesearch: string + size: number + time: number + + description: string +} + + +export interface IAliGetFileModel { + __v_skip: true + drive_id: string + file_id: string + parent_file_id: string + name: string + namesearch: string + ext: string + category: string + icon: string + size: number + sizestr: string + time: number + timestr: string + starred: boolean + isdir: boolean + thumbnail: string + description: string + compilation_id?: string +} diff --git a/packages/renderer/src/aliapi/batch.ts b/packages/renderer/src/aliapi/batch.ts new file mode 100644 index 0000000..46de060 --- /dev/null +++ b/packages/renderer/src/aliapi/batch.ts @@ -0,0 +1,27 @@ +import message from '@/utils/message' + + +export async function RunBatch(title: string, list: any[], max: number, func: (t: any) => Promise) { + const loadingkey = 'runbatch' + Date.now().toString() + '_' + title + if (title) message.success('正在执行' + title + '( 0 / ' + list.length + ' )', 0, loadingkey) + let parr: Promise[] = [] + for (let i = 0, maxi = list.length; i < maxi; i++) { + parr.push(func(list[i])) + if (parr.length == max) { + await Promise.all(parr) + .catch(() => {}) + .then(() => { + parr = [] + }) + if (title) message.success('正在执行' + title + '( ' + i + ' / ' + maxi + ' )', 0, loadingkey) + } + } + if (parr.length > 0) + await Promise.all(parr) + .catch(() => {}) + .then(() => { + parr = [] + }) + + if (title) message.success('成功执行' + title, 1, loadingkey) +} diff --git a/packages/renderer/src/aliapi/dirfilelist.ts b/packages/renderer/src/aliapi/dirfilelist.ts new file mode 100644 index 0000000..7df3dbb --- /dev/null +++ b/packages/renderer/src/aliapi/dirfilelist.ts @@ -0,0 +1,402 @@ +import { ITokenInfo, usePanFileStore, useSettingStore } from '@/store' +import DebugLog from '@/utils/debuglog' +import { humanSize } from '@/utils/format' +import message from '@/utils/message' +import { HanToPin } from '@/utils/utils' +import AliHttp, { IUrlRespData } from './alihttp' +import { IAliFileItem, IAliGetFileModel } from './alimodels' +import getFileIcon from './fileicon' + +export interface IAliFileResp { + items: IAliGetFileModel[] + itemsKey: Set + punished_file_count: number + + next_marker: string + + m_user_id: string + m_drive_id: string + m_dir_id: string + m_dir_name: string +} + +export function NewIAliFileResp(user_id: string, drive_id: string, dir_id: string, dir_name: string) { + return { + items: [], + itemsKey: new Set(), + punished_file_count: 0, + next_marker: '', + m_user_id: user_id, + m_drive_id: drive_id, + m_dir_id: dir_id, + m_dir_name: dir_name + } +} + +export default class AliDirFileList { + + static LimitMax = 100 + + + static getFileInfo(item: IAliFileItem, downurl: string): IAliGetFileModel { + + + + + + + + const size = item.size ? item.size : 0 + const date = new Date(item.updated_at || item.gmt_deleted || item.last_played_at || '') + const y = date.getFullYear().toString() + let m: number | string = date.getMonth() + 1 + m = m < 10 ? '0' + m.toString() : m.toString() + let d: number | string = date.getDate() + d = d < 10 ? '0' + d.toString() : d.toString() + let h: number | string = date.getHours() + h = h < 10 ? '0' + h.toString() : h.toString() + let minute: number | string = date.getMinutes() + minute = minute < 10 ? '0' + minute.toString() : minute.toString() + let second: number | string = date.getSeconds() + second = second < 10 ? '0' + second.toString() : second.toString() + + const isdir = item.type == 'folder' + + const add: IAliGetFileModel = { + __v_skip: true, + drive_id: item.drive_id, + file_id: item.file_id, + parent_file_id: item.parent_file_id || '', + name: item.name, + namesearch: HanToPin(item.name), + ext: item.file_extension?.toLowerCase() || '', + category: item.category || '', + starred: item.starred || false, + time: date.getTime() , + size: size, + sizestr: humanSize(size), + timestr: y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second , + icon: 'iconfolder', + isdir: isdir, + thumbnail: '', + description: item.description || '' + } + if (!isdir) { + const icon = getFileIcon(add.category, add.ext, item.mime_extension, item.mime_type, add.size) + add.category = icon[0] + add.icon = icon[1] + if (downurl) { + if (add.category == 'image') { + add.thumbnail = downurl + '&drive_id=' + add.drive_id + '&file_id=' + add.file_id + '&image_thumbnail_process=image%2Fresize%2Cl_260%2Fformat%2Cjpg%2Fauto-orient%2C1' + } else if (add.category == 'image2') { + add.thumbnail = downurl + '&drive_id=' + add.drive_id + '&file_id=' + add.file_id + } else if (add.category.startsWith('video')) { + add.thumbnail = downurl + '&drive_id=' + add.drive_id + '&file_id=' + add.file_id + '&video_thumbnail_process=video%2Fsnapshot%2Ct_106000%2Cf_jpg%2Car_auto%2Cw_260%2Cm_fast' + } else if (add.category == 'doc' || add.category == 'doc2') { + if (add.ext != 'txt') { + add.thumbnail = downurl + '&drive_id=' + add.drive_id + '&file_id=' + add.file_id + '&office_thumbnail_process=image%2Fresize%2Cl_260%2Fformat%2Cjpg%2Fauto-orient%2C1' + } + } + } + } + if (item.punish_flag == 2) add.icon = 'iconweifa' + else if (item.punish_flag > 0) add.icon = 'iconweixiang' + + return add + } + + /** + * 一个文件夹的全部文件列表 + * type folder file '' + */ + static async ApiDirFileList(user_id: string, drive_id: string, dir_id: string, dir_name: string, order: string, type: string = '', max: number = useSettingStore().debugFileListMax): Promise { + const dir: IAliFileResp = { + items: [], + itemsKey: new Set(), + punished_file_count: 0, + next_marker: '', + m_user_id: user_id, + m_drive_id: drive_id, + m_dir_id: dir_id, + m_dir_name: dir_name + } + + if (!order) order = 'updated_at desc' + order = order.replace(' desc', ' DESC').replace(' asc', ' ASC') + let orders = order.split(' ') + + let pageindex = 0 + if (dir_id == 'video') { + await AliDirFileList._ApiVideoListRecent(dir) + pageindex++ + } + do { + let isget = false + if (dir_id == 'favorite') isget = await AliDirFileList._ApiFavorFileListOnePage(orders[0], orders[1], dir, pageindex) + else if (dir_id == 'trash') isget = await AliDirFileList._ApiTrashFileListOnePage(orders[0], orders[1], dir, pageindex) + else if (dir_id == 'recover') isget = await AliDirFileList._ApiDeleteedFileListOnePage(orders[0], orders[1], dir, pageindex) + else if (dir_id.startsWith('color')) isget = await AliDirFileList._ApiSearchFileListOnePage(order, dir, pageindex) + else if (dir_id.startsWith('search')) isget = await AliDirFileList._ApiSearchFileListOnePage(order, dir, pageindex) + else if (dir_id == 'video') isget = await AliDirFileList._ApiVideoListOnePage(order, dir, pageindex) + else if (dir_id.startsWith('video')) isget = await AliDirFileList._ApiVideoFileListOnePage(order, dir, pageindex) + else isget = await AliDirFileList._ApiDirFileListOnePage(orders[0], orders[1], dir, type, pageindex) + if (isget != true) { + break + } + if (dir.items.length >= max) { + dir.next_marker = '' + break + } + pageindex++ + } while (dir.next_marker) + + return dir + } + + static async _ApiDirFileListOnePage(orderby: string, order: string, dir: IAliFileResp, type: string, pageindex: number) { + const url = 'adrive/v3/file/list?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + let postdata = { + drive_id: dir.m_drive_id, + parent_file_id: dir.m_dir_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + all: false, + url_expire_sec: 14400, + fields: '*', + order_by: orderby, + order_direction: order.toUpperCase() + } + if (type) postdata = Object.assign(postdata, { type }) + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + static async _ApiFavorFileListOnePage(orderby: string, order: string, dir: IAliFileResp, pageindex: number) { + const url = 'v2/file/list_by_custom_index_key?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + const postdata = { + drive_id: dir.m_drive_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + url_expire_sec: 14400, + fields: '*', + order_by: orderby, + order_direction: order.toUpperCase(), + custom_index_key: 'starred_yes', + parent_file_id: 'root' + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + static async _ApiTrashFileListOnePage(orderby: string, order: string, dir: IAliFileResp, pageindex: number) { + const url = 'v2/recyclebin/list?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + const postdata = { + drive_id: dir.m_drive_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + all: false, + url_expire_sec: 14400, + fields: 'thumbnail', + order_by: orderby, + order_direction: order.toUpperCase() + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + static async _ApiDeleteedFileListOnePage(orderby: string, order: string, dir: IAliFileResp, pageindex: number) { + const url = 'adrive/v1/file/listDeleted' + const postdata = { + drive_id: dir.m_drive_id, + album_drive_id: dir.m_drive_id, + marker: dir.next_marker + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + static async _ApiSearchFileListOnePage(orderby: string, dir: IAliFileResp, pageindex: number) { + const url = 'adrive/v3/file/search?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + + + let query = '' + if (dir.m_dir_id.startsWith('color')) { + let color = dir.m_dir_id.substring('color'.length).split(' ')[0].replace('#', 'c') + query = 'description="' + color + '"' + } else if (dir.m_dir_id.startsWith('search')) { + let search = dir.m_dir_id.substring('search'.length).split(' ') + + let word = '' + for (let i = 0; i < search.length; i++) { + let itemstr = search[i] + if (itemstr.split(':').length !== 2) { + word += itemstr + ' ' + continue + } + + let kv = search[i].split(':') + let k = kv[0] + let v = kv[1] + if (k == 'type') { + let arr = v.split(',') + let type = '' + for (let j = 0; j < arr.length; j++) { + if (arr[j] == 'folder') type += 'type="' + arr[j] + '" or ' + else if (arr[j]) type += 'category="' + arr[j] + '" or ' + } + type = type.substring(0, type.length - 4).trim() + if (type && type.indexOf(' or ') > 0) query += '(' + type + ') and ' + else if (type) query += type + ' and ' + } else if (k == 'size') { + let size = parseInt(v) + if (size > 0) query += 'size = ' + v + ' and ' + } else if (k == 'max') { + let max = parseInt(v) + if (max > 0) query += 'size <= ' + v + ' and ' + } else if (k == 'min') { + let min = parseInt(v) + if (min > 0) query += 'size >= ' + v + ' and ' + } else if (k == 'begin') { + let dt = new Date(v).toISOString() + query += 'updated_at >= "' + dt.substring(0, dt.lastIndexOf('.')) + '" and ' + } else if (k == 'end') { + let dt = new Date(v).toISOString() + query += 'updated_at <= "' + dt.substring(0, dt.lastIndexOf('.')) + '" and ' + } else if (k == 'ext') { + let arr = v.split(',') + let extin = '' + for (let j = 0; j < arr.length; j++) { + extin += '"' + arr[j] + '",' + } + if (extin.length > 0) extin = extin.substring(0, extin.length - 1) + if (extin) query += 'file_extension in [' + extin + '] and ' + } else if (k == 'fav') query += 'starred = ' + v + ' and ' + } + word = word.trim() + if (word) query += 'name match "' + word.replaceAll('"', '\\"') + '" and ' + if (query.length > 0) query = query.substring(0, query.length - 5) + if (query.startsWith('(') && query.endsWith(')')) query = query.substring(1, query.length - 1) + } + const postdata = { + drive_id: dir.m_drive_id, + marker: dir.next_marker, + limit: 100 , + fields: '*', + query: query, + order_by: orderby + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + + static async _ApiVideoListRecent(dir: IAliFileResp) { + //https://api.aliyundrive.com/adrive/v2/video/recentList + const url = 'adrive/v2/video/recentList' + const postdata = {} + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, 0) + } + static async _ApiVideoListOnePage(order_by: string, dir: IAliFileResp, pageindex: number) { + const url = 'adrive/v2/video/list' + const postdata = { + use_compilation: true, + duration: 0, + order_by: order_by.toLowerCase(), + hidden_type: 'NO_HIDDEN', + limit: AliDirFileList.LimitMax, + marker: dir.next_marker, + url_expire_sec: 14400 + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + static async _ApiVideoFileListOnePage(order_by: string, dir: IAliFileResp, pageindex: number) { + const url = 'adrive/v2/video/compilation/list' + const postdata = { + name: dir.m_dir_id.substring('video'.length), + use_compilation: true, + duration: 0, + order_by: order_by.toLowerCase(), + hidden_type: 'NO_HIDDEN', + limit: AliDirFileList.LimitMax, + marker: dir.next_marker, + url_expire_sec: 14400 + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliDirFileList._FileListOnePage(dir, resp, pageindex) + } + + + static _FileListOnePage(dir: IAliFileResp, resp: IUrlRespData, pageindex: number) { + try { + if (AliHttp.IsSuccess(resp.code)) { + const dirpart: IAliFileResp = { + items: [], + itemsKey: new Set(), + punished_file_count: 0, + next_marker: dir.next_marker, + m_user_id: dir.m_user_id, + m_drive_id: dir.m_drive_id, + m_dir_id: dir.m_dir_id, + m_dir_name: dir.m_dir_name + } + + dir.next_marker = resp.body.next_marker || '' + const isrecover = dir.m_dir_id == 'recover' + const isvideo = dir.m_dir_id.startsWith('video') + const downurl = isrecover ? '' : 'https://api.aliyundrive.com/v2/file/download?t=' + Date.now().toString() + if (resp.body.items) { + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliFileItem + if (isvideo) { + if (!item.compilation_id && (!item.drive_id || !item.file_id)) continue + /** 1.单独的一个视频并且不属于任何专辑 有drive_id,file_id */ + if (!item.compilation_id) { + item.type = 'file' + item.compilation_id = item.drive_id + '_' + item.file_id + } + /** 2.一个文件夹&&一个专辑 有compilation_id */ + if (item.video_type == 'COMPILATION') { + item.type = 'folder' + item.drive_id = item.compilation_id.split('_')[0] + item.file_id = item.compilation_id.split('_')[1] + } + /** 3.一个文件&&属于一个专辑 有compilation_id,drive_id,file_id */ + } + if (dir.itemsKey.has(item.file_id)) continue + const add = AliDirFileList.getFileInfo(item, downurl) + if (isrecover) add.description = item.content_hash + if (isvideo) { + add.compilation_id = item.compilation_id + } + dirpart.items.push(add) + dir.items.push(add) + dir.itemsKey.add(item.file_id) + } + } + dirpart.punished_file_count = resp.body.punished_file_count || 0 + dir.punished_file_count += resp.body.punished_file_count || 0 + + let pan = usePanFileStore() + if (pan.DriveID == dir.m_drive_id) pan.mSaveDirFileLoadingPart(pageindex, dirpart) + + if (isvideo && dir.items.length >= 500) dir.next_marker = '' + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出文件出错 ' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_FileListOnePage' + dir.m_dir_id + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } +} + +/** + category,created_at,domain_id,drive_id,file_extension,file_id,hidden,image_media_metadata,mime_extension,mime_type,name,parent_file_id,punish_flag,revision_id,size,starred,type,updated_at,description + */ diff --git a/packages/renderer/src/aliapi/dirlist.ts b/packages/renderer/src/aliapi/dirlist.ts new file mode 100644 index 0000000..db0941b --- /dev/null +++ b/packages/renderer/src/aliapi/dirlist.ts @@ -0,0 +1,185 @@ +import DebugLog from '@/utils/debuglog' +import { HanToPin } from '@/utils/utils' +import AliHttp from './alihttp' +import { IAliGetDirModel, IAliGetFileModel } from './alimodels' +import AliDirFileList from './dirfilelist' + +export interface IAliDirResp { + items: IAliGetDirModel[] + next_marker: string + + m_user_id: string + m_drive_id: string + m_dir_id: string + m_dir_name: string +} + +export interface IAliDirBatchResp { + items: IAliGetFileModel[] + itemsKey: Set + next_marker: string + dir_id: string +} + +export default class AliDirList { + + static async ApiFastAllDirList(user_id: string, drive_id: string): Promise { + const Lock = new Set() + const list1: IAliGetDirModel[] = [] + const list2: IAliGetDirModel[] = [] + let errmsg = '' + let next_marker1 = '' + let next_marker2 = '' + while (true) { + let postdata = '{"requests":[' + postdata += '{"body": {"drive_id": "' + drive_id + '","query": "type = \\"folder\\"","limit": 100,"fields": "thumbnail","order_by":"name ASC"' + (next_marker1 ? ',"marker":"' + next_marker1 + '"' : '') + '},' + postdata += '"headers": { "Content-Type": "application/json" }, "id": "id1","method": "POST","url": "/file/search"},' + postdata += '{"body": {"drive_id": "' + drive_id + '","query": "type = \\"folder\\"","limit": 100,"fields": "thumbnail","order_by":"name DESC"' + (next_marker2 ? ',"marker":"' + next_marker2 + '"' : '') + '},' + postdata += '"headers": { "Content-Type": "application/json" }, "id": "id2","method": "POST","url": "/file/search"}' + postdata += '],"resource":"file"}' + + const url = 'v2/batch?jsonmask=responses(id%2Cstatus%2Cbody(next_marker%2Citems(name%2Cfile_id%2Cdrive_id%2Cupdated_at%2Csize%2Cdescription%2Cparent_file_id)))' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const resp1 = resp.body.responses[0] + const resp2 = resp.body.responses[1] + if (resp1.status >= 200 && resp1.status <= 205 && resp2.status >= 200 && resp2.status <= 205) { + next_marker1 = resp1.body.next_marker + next_marker2 = resp2.body.next_marker + + let isFind = false + for (let i = 0, maxi = resp1.body.items.length; i < maxi; i++) { + let item = resp1.body.items[i] + if (Lock.has(item.file_id)) { + isFind = true + } else { + list1.push({ + __v_skip: true, + drive_id: item.drive_id, + file_id: item.file_id, + parent_file_id: item.parent_file_id, + name: item.name, + namesearch: '', + size: item.size || 0, + time: new Date(item.updated_at).getTime(), + + description: item.description || '' + }) + Lock.add(item.file_id) + } + } + for (let i = 0, maxi = resp2.body.items.length; i < maxi; i++) { + let item = resp2.body.items[i] + if (Lock.has(item.file_id)) { + isFind = true + } else { + list2.push({ + __v_skip: true, + drive_id: item.drive_id, + file_id: item.file_id, + parent_file_id: item.parent_file_id, + name: item.name, + namesearch: '', + size: item.size || 0, + time: new Date(item.updated_at).getTime(), + + description: item.description || '' + }) + Lock.add(item.file_id) + } + } + if (isFind) break + if (resp1.body.next_marker == '' && resp2.body.next_marker == '') break + } else { + + errmsg += 'err1' + (resp1.status || '') + errmsg += 'err2' + (resp2.status || '') + break + } + } + } catch (err: any) { + + errmsg += 'err' + (err.message || '') + DebugLog.mSaveLog('warning', 'ApiFastAllDirList err=' + (err.message || '')) + break + } + } + + const list = list1.concat(list2.reverse()) + const result: IAliDirResp = { + items: errmsg ? [] : list, + next_marker: errmsg, + m_user_id: user_id, + m_drive_id: drive_id, + m_dir_id: 'root', + m_dir_name: '' + } + return result + } + + static async ApiBatchDirFileList(user_id: string, drive_id: string, dirlist: IAliDirBatchResp[], limit: number, listtypeorquery: string) { + let postdata = '{"requests":[' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (i > 0) postdata = postdata + ',' + + let query = 'parent_file_id="' + dirlist[i].dir_id + '"' + if (listtypeorquery == 'all') query = 'parent_file_id="' + dirlist[i].dir_id + '"' + else if (listtypeorquery == 'folder') query = 'parent_file_id="' + dirlist[i].dir_id + '" and type = "folder"' + else if (listtypeorquery == 'file') query = 'parent_file_id="' + dirlist[i].dir_id + '" and type = "file"' + else query = query + listtypeorquery + const data2 = { + body: { + drive_id: drive_id, + query: query, + marker: dirlist[i].next_marker, + url_expire_sec: 14400, + limit: limit, + //fields: 'thumbnail', + image_thumbnail_process: '', + video_thumbnail_process: '', + image_url_process: '' + }, + headers: { 'Content-Type': 'application/json' }, + id: dirlist[i].dir_id, + method: 'POST', + url: '/file/search' + } + postdata = postdata + JSON.stringify(data2) + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let j = 0, maxj = responses.length; j < maxj; j++) { + const status = responses[j].status as number + if (status >= 200 && status <= 205) { + const respi = responses[j] + const id = respi.id || '' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].dir_id == id) { + const dir = dirlist[i] + dir.next_marker = respi.body.next_marker + const items = respi.body.items + for (let i = 0, maxi = items.length; i < maxi; i++) { + const add = AliDirFileList.getFileInfo(items[i], '') + dir.items.push(add) + } + break + } + } + } + } + return true + } + } catch (err: any) { + DebugLog.mSaveLog('warning', 'ApiBatchDirFileList err=' + (err.message || '')) + } + return false + } +} diff --git a/packages/renderer/src/aliapi/file.ts b/packages/renderer/src/aliapi/file.ts new file mode 100644 index 0000000..a3ed1d5 --- /dev/null +++ b/packages/renderer/src/aliapi/file.ts @@ -0,0 +1,390 @@ +import { useSettingStore } from '@/store' +import message from '@/utils/message' +import { HanToPin } from '@/utils/utils' +import AliHttp from './alihttp' +import { IAliFileItem, IAliGetDirModel, IAliGetFileModel, IAliGetForderSizeModel } from './alimodels' +import AliDirFileList from './dirfilelist' +import { IDownloadUrl, IOfficePreViewUrl, IVideoPreviewUrl, IVideoXBTUrl } from './models' + +export default class AliFile { + + static async ApiFileInfo(user_id: string, drive_id: string, file_id: string): Promise { + const url = 'v2/file/get' + const postdata = { + drive_id: drive_id, + file_id: file_id, + url_expire_sec: 14400, + office_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_url_process: 'image/resize,w_1920/format,jpeg', + video_thumbnail_process: 'video/snapshot,t_106000,f_jpg,ar_auto,m_fast,w_400' + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + return resp.body as IAliFileItem + } + return undefined + } + + static async ApiFileInfoByPath(user_id: string, drive_id: string, file_path: string): Promise { + if (file_path.startsWith('/') == false) file_path = '/' + file_path + const url = 'v2/file/get_by_path' + const postdata = { + drive_id: drive_id, + file_path: file_path, + url_expire_sec: 14400, + office_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_url_process: 'image/resize,w_1920/format,jpeg', + video_thumbnail_process: 'video/snapshot,t_106000,f_jpg,ar_auto,m_fast,w_400' + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + return resp.body as IAliFileItem + } + return undefined + } + + static async ApiFileDownloadUrl(user_id: string, drive_id: string, file_id: string, expire_sec: number): Promise { + const url = 'v2/file/get_download_url' + const postdata = { drive_id: drive_id, file_id: file_id, expire_sec: expire_sec } + const resp = await AliHttp.Post(url, postdata, user_id, '') + const data: IDownloadUrl = { + drive_id: drive_id, + file_id: file_id, + expire_sec: expire_sec, + url: '', + size: 0 + } + if (AliHttp.IsSuccess(resp.code)) { + data.url = resp.body.url + + data.size = resp.body.size + return data + } else if (resp.body.code == 'NotFound.FileId') { + return '文件已从网盘中彻底删除' + } else if (resp.body.code == 'ForbiddenFileInTheRecycleBin') { + return '文件已放入回收站' + } else if (resp.body.code) { + return resp.body.code as string + } + return '网络错误' + } + + static async ApiVideoPreviewUrl(user_id: string, drive_id: string, file_id: string): Promise { + + const url = 'v2/file/get_video_preview_play_info' + + const postdata = { drive_id: drive_id, file_id: file_id, category: 'live_transcoding', template_id: '', get_subtitle_info: true, url_expire_sec: 14400 } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (resp.body.code == 'VideoPreviewWaitAndRetry') { + message.warning('视频正在转码中,稍后重试') + return undefined + } + + const data: IVideoPreviewUrl = { + drive_id: drive_id, + file_id: file_id, + expire_sec: 0, + width: 0, + height: 0, + url: '', + duration: 0, + url_FHD: '', + url_HD: '', + url_SD: '', + url_LD: '', + subtitles: [] + } + if (AliHttp.IsSuccess(resp.code)) { + const subtitle = resp.body.video_preview_play_info?.live_transcoding_subtitle_task_list || [] + for (let i = 0, maxi = subtitle.length; i < maxi; i++) { + if (subtitle[i].status == 'finished') { + data.subtitles.push({ language: subtitle[i].language, url: subtitle[i].url }) + } + } + const task_list = resp.body.video_preview_play_info?.live_transcoding_task_list || [] + + for (let i = 0, maxi = task_list.length; i < maxi; i++) { + if (task_list[i].template_id && task_list[i].template_id == 'FHD' && task_list[i].status == 'finished') { + + data.url_FHD = task_list[i].url + } else if (task_list[i].template_id && task_list[i].template_id == 'HD' && task_list[i].status == 'finished') { + + data.url_HD = task_list[i].url + } else if (task_list[i].template_id && task_list[i].template_id == 'SD' && task_list[i].status == 'finished') { + + data.url_SD = task_list[i].url + } else if (task_list[i].template_id && task_list[i].template_id == 'LD' && task_list[i].status == 'finished') { + + data.url_LD = task_list[i].url + } + } + data.url = data.url_FHD || data.url_HD || data.url_SD || data.url_LD || '' + + data.duration = Math.floor(resp.body.video_preview_play_info?.meta?.duration || 0) + data.width = resp.body.video_preview_play_info?.meta?.width || 0 + data.height = resp.body.video_preview_play_info?.meta?.height || 0 + data.expire_sec = 14400 + return data + } + return undefined + } + + static async ApiAudioPreviewUrl(user_id: string, drive_id: string, file_id: string): Promise { + + const url = 'v2/file/get_audio_play_info' + + const postdata = { drive_id: drive_id, file_id: file_id, url_expire_sec: 14400 } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (resp.body.code == 'AudioPreviewWaitAndRetry') { + message.warning('音频正在转码中,稍后重试') + } + + const data: IDownloadUrl = { + drive_id: drive_id, + file_id: file_id, + expire_sec: 0, + url: '', + size: 0 + } + if (AliHttp.IsSuccess(resp.code)) { + const task_list = resp.body.template_list || [] + if (!data.url) { + for (let i = 0, maxi = task_list.length; i < maxi; i++) { + if (task_list[i].template_id && task_list[i].template_id == 'HQ' && task_list[i].status == 'finished') data.url = task_list[i].url + } + } + if (!data.url) { + for (let i = 0, maxi = task_list.length; i < maxi; i++) { + if (task_list[i].template_id && task_list[i].template_id == 'LQ' && task_list[i].status == 'finished') data.url = task_list[i].url + } + } + + return data + } else { + } + return undefined + } + static async ApiOfficePreViewUrl(user_id: string, drive_id: string, file_id: string): Promise { + const url = 'v2/file/get_office_preview_url' + const postdata = { drive_id: drive_id, file_id: file_id, url_expire_sec: 14400 } + const resp = await AliHttp.Post(url, postdata, user_id, '') + const data: IOfficePreViewUrl = { + drive_id: drive_id, + file_id: file_id, + access_token: '', + preview_url: '' + } + if (AliHttp.IsSuccess(resp.code)) { + data.access_token = resp.body.access_token + data.preview_url = resp.body.preview_url + return data + } + return undefined + } + + static async ApiGetFile(user_id: string, drive_id: string, file_id: string): Promise { + const url = 'v2/file/get' + const postdata = { + drive_id: drive_id, + file_id: file_id, + url_expire_sec: 14400, + office_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_url_process: 'image/resize,w_1920/format,jpeg', + video_thumbnail_process: 'video/snapshot,t_106000,f_jpg,ar_auto,m_fast,w_400' + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + return AliDirFileList.getFileInfo(resp.body as IAliFileItem, '') + } + return undefined + } + + static async ApiFileGetPath(user_id: string, drive_id: string, file_id: string): Promise { + const url = 'adrive/v1/file/get_path' + const postdata = { + drive_id: drive_id, + file_id: file_id + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code) && resp.body.items && resp.body.items.length > 0) { + const list: IAliGetDirModel[] = [] + for (let i = resp.body.items.length - 1; i >= 0; i--) { + let item = resp.body.items[i] + list.push({ + __v_skip: true, + drive_id: item.drive_id, + file_id: item.file_id, + parent_file_id: item.parent_file_id, + name: item.name, + namesearch: HanToPin(item.name), + size: item.size || 0, + time: new Date(item.updated_at).getTime(), + + description: item.description || '' + }) + } + return list + } + return [] + } + + static async ApiFileGetPathString(user_id: string, drive_id: string, file_id: string, dirsplit: string): Promise { + const url = 'adrive/v1/file/get_path' + const postdata = { + drive_id: drive_id, + file_id: file_id + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code) && resp.body.items && resp.body.items.length > 0) { + const list: string[] = [] + for (let i = resp.body.items.length - 1; i >= 0; i--) { + let item = resp.body.items[i] + list.push(item.name) + } + return list.join(dirsplit) + } + return '' + } + + + static async ApiFileGetFolderSize(user_id: string, drive_id: string, file_id: string): Promise { + const url = 'adrive/v1/file/get_folder_size_info' + + const postdata = { + drive_id: drive_id, + file_id: file_id + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + return resp.body as IAliGetForderSizeModel + } + return { size: 0, folder_count: 0, file_count: 600, reach_limit: true } + } + + /** 在线预览文本文件 */ + static async ApiFileDownText(user_id: string, drive_id: string, file_id: string, filesize: number, maxsize: number): Promise { + const url = 'v2/file/get_download_url' + const postdata = { drive_id: drive_id, file_id: file_id, expire_sec: 14400 } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + const downurl = resp.body.url + const resp2 = await AliHttp.GetString(downurl, '', filesize, maxsize) + if (AliHttp.IsSuccess(resp2.code)) { + if (typeof resp2.body == 'string') return resp2.body + return JSON.stringify(resp2.body, undefined, 2) + } + } else { + console.log('error', resp) + } + return '' + } + + + static async ApiBiXueTuBatch(user_id: string, drive_id: string, file_id: string, duration: number, imgcount: number, imgwidth: number): Promise { + if (duration <= 0) return [] + const batchlist: string[] = [] + let mtime = 0 + let subtime = Math.floor(duration / (imgcount + 2)) + if (subtime < 1) subtime = 1 + + const imglist: IVideoXBTUrl[] = [] + for (let i = 0; i < imgcount; i++) { + mtime += subtime + if (mtime > duration) break + const postdata = { + body: { drive_id: drive_id, file_id: file_id, url_expire_sec: 14400, video_thumbnail_process: 'video/snapshot,t_' + mtime.toString() + '000,f_jpg,ar_auto,m_fast,w_' + imgwidth.toString() }, + headers: { 'Content-Type': 'application/json' }, + id: (i.toString() + file_id).substr(0, file_id.length), + method: 'POST', + url: '/file/get' + } + batchlist.push(JSON.stringify(postdata)) + + const time = + Math.floor(mtime / 3600) + .toString() + .padStart(2, '0') + + ':' + + Math.floor((mtime % 3600) / 60) + .toString() + .padStart(2, '0') + + ':' + + Math.floor(mtime % 60) + .toString() + .padStart(2, '0') + imglist.push({ time, url: '' }) + } + + let postdata = '{"requests":[' + let add = 0 + for (let i = 0, maxi = batchlist.length; i < maxi; i++) { + if (add > 0) postdata = postdata + ',' + add++ + postdata = postdata + batchlist[i] + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch' + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let i = 0, maxi = responses.length; i < maxi; i++) { + const status = responses[i].status as number + if (status >= 200 && status <= 205) { + imglist[i].url = responses[i].body?.thumbnail || '' + } else { + console.log(responses[i]) + } + } + } else { + console.log(resp) + } + return imglist + } + + + static async ApiUpdateVideoTime(user_id: string, drive_id: string, file_id: string, play_cursor: number): Promise { + if (!useSettingStore().uiAutoPlaycursorVideo) return + + const url = 'v2/file/get' + const postdata = { + drive_id: drive_id, + file_id: file_id, + url_expire_sec: 14400, + office_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_thumbnail_process: 'image/resize,w_400/format,jpeg', + image_url_process: 'image/resize,w_1920/format,jpeg', + video_thumbnail_process: 'video/snapshot,t_' + Math.floor(play_cursor) + ',f_jpg,w_0,h_0,m_fast' + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + let info = resp.body as IAliFileItem + + const urlvideo = 'adrive/v2/video/update' + const postvideodata = { + drive_id: drive_id, + file_id: file_id, + play_cursor: play_cursor.toString(), + thumbnail: info.thumbnail || '' + } + const respvideo = await AliHttp.Post(urlvideo, postvideodata, user_id, '') + if (AliHttp.IsSuccess(respvideo.code)) { + return respvideo.body as IAliFileItem + } + } + return undefined + } +} diff --git a/packages/renderer/src/aliapi/filecmd.ts b/packages/renderer/src/aliapi/filecmd.ts new file mode 100644 index 0000000..fccd0c0 --- /dev/null +++ b/packages/renderer/src/aliapi/filecmd.ts @@ -0,0 +1,135 @@ +import message from '@/utils/message' +import AliHttp from './alihttp' +import { ApiBatch, ApiBatchMaker, ApiBatchMaker2, ApiBatchSuccess, ApiWaitAsyncTask } from './utils' + +export default class AliFileCmd { + + static async ApiCreatNewForder(user_id: string, drive_id: string, parentid: string, name: string): Promise { + const url = 'adrive/v2/file/createWithFolders' + + const postdata = JSON.stringify({ + drive_id: drive_id, + parent_file_id: parentid, + name: name, + check_name_mode: 'refuse', + type: 'folder' + }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + const file_id = resp.body.file_id as string | undefined + if (file_id) return file_id + } + if (resp.body?.code == 'QuotaExhausted.Drive') return '网盘空间已满,无法创建' + return undefined + } + + + static async ApiTrashBatch(user_id: string, drive_id: string, files: string[]): Promise { + const batchlist = ApiBatchMaker('/recyclebin/trash', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id } + }) + return ApiBatchSuccess('放入回收站', batchlist, user_id, '') + } + + + static async ApiDeleteBatch(user_id: string, drive_id: string, files: string[]): Promise { + const batchlist = ApiBatchMaker('/file/delete', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id } + }) + return ApiBatchSuccess('彻底删除', batchlist, user_id, '') + } + + + static async ApiRenameBatch(user_id: string, drive_id: string, files: string[], names: string[]): Promise<{ file_id: string; parent_file_id: string; name: string; isdir: boolean }[]> { + const batchlist = ApiBatchMaker2('/file/update', files, names, (file_id: string, name: string) => { + return { drive_id: drive_id, file_id: file_id, name: name, check_name_mode: 'refuse' } + }) + + if (batchlist.length == 0) return Promise.resolve([]) + let successlist: { file_id: string; parent_file_id: string; name: string; isdir: boolean }[] = [] + const result = await ApiBatch(files.length <= 1 ? '' : '批量重命名', batchlist, user_id, '') + result.reslut.map((t) => successlist.push({ file_id: t.file_id!, name: t.name!, parent_file_id: t.parent_file_id!, isdir: t.type !== 'folder' })) + return successlist + } + + + static async ApiFavorBatch(user_id: string, drive_id: string, isfavor: boolean, ismessage: boolean, files: string[]): Promise { + const batchlist = ApiBatchMaker('/file/update', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id, custom_index_key: isfavor ? 'starred_yes' : '', starred: isfavor } + }) + return ApiBatchSuccess(ismessage ? (isfavor ? '收藏文件' : '取消收藏') : '', batchlist, user_id, '') + } + + static async ApiTrashCleanBatch(user_id: string, drive_id: string, ismessage: boolean, files: string[]): Promise { + const batchlist = ApiBatchMaker('/file/delete', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id } + }) + return ApiBatchSuccess(ismessage ? '从回收站删除' : '', batchlist, user_id, '') + } + + static async ApiTrashRestoreBatch(user_id: string, drive_id: string, ismessage: boolean, files: string[]): Promise { + const batchlist = ApiBatchMaker('/recyclebin/restore', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id } + }) + return ApiBatchSuccess(ismessage ? '从回收站还原' : '', batchlist, user_id, '') + } + + static async ApiFileColorBatch(user_id: string, drive_id: string, color: string, files: string[]): Promise { + const batchlist = ApiBatchMaker('/file/update', files, (file_id: string) => { + return { drive_id: drive_id, file_id: file_id, description: color } + }) + return ApiBatchSuccess(color=='c5b89b8'?'':'标记文件', batchlist, user_id, '') + } + + static async ApiRecoverBatch(user_id: string, resumelist: { drive_id: string; file_id: string; content_hash: string; size: number; name: string }[]): Promise { + let successlist: string[] = [] + if (!resumelist || resumelist.length == 0) return Promise.resolve(successlist) + + const url = 'adrive/v1/file/resumeDeleted' + const postdata = JSON.stringify({ resume_file_list: resumelist }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + const task_id = resp.body.task_id as string + for (let j = 0; j < 100; j++) { + const url2 = 'adrive/v1/file/checkResumeTask' + const resp2 = await AliHttp.Post(url2, { task_id }, user_id, '') + if (AliHttp.IsSuccess(resp2.code)) { + + if (resp2.body.state == 'running') continue + if (resp2.body.state == 'done') { + let results = resp2.body.results as any[] + if (results) { + results.map((t) => { + if (t.status && t.status == 200) successlist.push(t.file_id) + }) + } + return successlist + } + } + } + } else if (resp.code && resp.code == 403) { + if (resp.body?.code == 'UserNotVip') message.error('文件恢复功能需要开通阿里云盘会员') + else message.error(resp.body?.code || '拒绝访问') + } else { + message.error('操作失败') + } + return successlist + } + + + static async ApiMoveBatch(user_id: string, drive_id: string, files: string[], moveto_drive_id: string, moveto_dir_id: string): Promise { + const batchlist = ApiBatchMaker('/file/move', files, (file_id: string) => { + if (drive_id == moveto_drive_id) return { drive_id: drive_id, file_id: file_id, to_parent_file_id: moveto_dir_id, auto_rename: true } + else return { drive_id: drive_id, file_id: file_id, to_drive_id: moveto_drive_id, to_parent_file_id: moveto_dir_id, auto_rename: true } + }) + return ApiBatchSuccess(files.length <= 1 ? '移动' : '批量移动', batchlist, user_id, '') + } + + static async ApiCopyBatch(user_id: string, drive_id: string, files: string[], moveto_drive_id: string, moveto_dir_id: string): Promise { + const batchlist = ApiBatchMaker('/file/copy', files, (file_id: string) => { + if (drive_id == moveto_drive_id) return { drive_id: drive_id, file_id: file_id, to_parent_file_id: moveto_dir_id, auto_rename: true } + else return { drive_id: drive_id, file_id: file_id, to_drive_id: moveto_drive_id, to_parent_file_id: moveto_dir_id, auto_rename: true } + }) + return ApiBatchSuccess(files.length <= 1 ? '复制' : '批量复制', batchlist, user_id, '') + } +} diff --git a/packages/renderer/src/aliapi/fileicon.ts b/packages/renderer/src/aliapi/fileicon.ts new file mode 100644 index 0000000..bae14cb --- /dev/null +++ b/packages/renderer/src/aliapi/fileicon.ts @@ -0,0 +1,93 @@ +export default function getFileIcon(category: string | undefined, ext: string | undefined, mimext: string | undefined, mime: string | undefined, size: number): string[] { + if (!ext) ext = '' + if (!mime) mime = '' + if (!mimext) mimext = '' + if (!category) category = 'others' + + /** + * 1、图片支持以下格式:JPEG、BMP、PNG、JPG + * 2、视频文件支持以下格式:MP4、3GP、AVI、FLV、Webm、MOV、AMR、ASF、VCD(MPEG-1 video)、DVD(MPEG-2)、M4V、3G2、MJPEG、DATA、AVI(H261,H263,H264)、DV、GXF、CAVS video、DNxHD、FFM + * 3、音频文件支持以下格式:MP3、FLAC、AC3、Ogg、ADX、WAV、AIFF、ALAW、AU、DTS、MP2、Dirac、HLS + * 4、文档/文本文件支持以下格式:PDF、WORD、TXT、PPT、EXCEL + */ + + ext = '.' + ext.toLowerCase().replace('.', '').trim() + '.' + mimext = '.' + mimext.toLowerCase().replace('.', '').trim() + '.' + + switch (ext) { + case '.txt.': + return ['doc', 'iconfile-txt'] + case '.rar.': + return ['zip', 'iconfile-rar'] + case '.rtf.': + return ['doc', 'iconfile-doc'] + case '.psd.': + return ['others', 'iconfile-psd'] + case '.torrent.': + return ['others', 'iconfile-bt'] + case '.iso.': + return ['others', 'iconfile-iso'] + case '.exe.': + return ['others', 'iconfile-exe'] + case '.apk.': + return ['others', 'iconfile-apk'] + case '.tar.': + return ['others', 'iconfile-tar'] + case '.7z.': + return ['others', 'iconfile-7z'] + case '.svg.': + return ['image3', 'iconfile-image'] + case '.azw.': + return ['doc', 'iconwenjian'] + case '.azw3.': + return ['doc', 'iconwenjian'] + case '.epub.': + return ['doc', 'iconwenjian'] + } + + if (category == 'zip' || mimext == '.zip.') { + + return ['zip', 'iconfile-zip'] + } + + + if (';.apng.avif.ico.webp.gif.'.indexOf(ext) > 0) { + return ['image2', 'iconfile-img'] + } + + if (category == 'image') { + return ['image', 'iconfile-img'] + } + + if (mime.startsWith('image/')) return ['image3', 'iconfile-image'] + if (ext == '.pdf.' || mimext == '.pdf.') return ['doc', 'iconfile-pdf'] + + if (';.doc.docm.docx.dot.dotm.dotx.wps.wpt.'.indexOf(ext) > 0) return ['doc', 'iconfile-doc'] + if (';.pot.ett.'.indexOf(ext) > 0) return ['doc2', 'iconfile-doc'] + if ((mimext.startsWith('.txt') || mimext.startsWith('.doc') || mimext.startsWith('.ppt')) && ';.dps.dpt.potm.potx.pps.ppsm.ppsx.ppt.pptm.pptx.'.indexOf(ext) > 0) return ['doc', 'iconfile-ppt'] + if ((mimext.startsWith('.txt') || mimext.startsWith('.xls')) && ';.xls.xlsx.et.xlsm.xlt.xltm.xltx.'.indexOf(ext) > 0) return ['doc', 'iconfile-xsl'] + + if (mime.startsWith('text/')) return ['others', 'iconfile_txt2'] + if (ext == '.json.') return ['others', 'iconfile_txt2'] + + if (category == 'video') { + + return ['video', 'iconfile_video'] + } + if (mime.startsWith('video/')) return ['video2', 'iconfile_video'] + if (ext == '.ts.' && size > 5 * 1024 * 1024) return ['video2', 'iconfile_video'] + if (';.3iv.cpk.divx.hdv.fli.f4v.f4p.m2t.m2ts.mts.trp.mkv.mp4.mpg4.nsv.nut.nuv.rm.rmvb.vob.wmv.mk3d.hevc.yuv.y4m.mov.avi.flv.mpg.3gp.m4v.mpeg.asf.wmz.webm.pmp.mpga'.indexOf(ext) > 0) { + return ['video2', 'iconfile_video'] + } + if (ext == '.mp3.' && category == 'audio') return ['audio', 'iconfile-mp3'] + if (category == 'audio' && mimext != '.unknown.') { + + return ['audio', 'iconfile-audio'] + } + if (mime.startsWith('audio/')) return ['audio', 'iconfile-audio'] + if (';.ape.aac.cda.dsf.dtshd.eac3.m1a.m2a.m4a.mka.mpa.mpc.opus.ra.tak.tta.wma.wv.'.indexOf(ext) > 0) { + return ['audio2', 'iconfile-audio'] + } + + return ['others', 'iconwenjian'] +} diff --git a/packages/renderer/src/aliapi/following.ts b/packages/renderer/src/aliapi/following.ts new file mode 100644 index 0000000..19602c0 --- /dev/null +++ b/packages/renderer/src/aliapi/following.ts @@ -0,0 +1,204 @@ +import { humanTimeAgo } from '@/utils/format' +import message from '@/utils/message' +import DebugLog from '@/utils/debuglog' +import AliHttp, { IUrlRespData } from './alihttp' +import { IAliOtherFollowingModel, IAliMyFollowingModel } from './alimodels' + +export interface IAliOtherFollowingResp { + items: IAliOtherFollowingModel[] + itemsKey: Set + next_marker: string + + m_time: number + m_user_id: string +} +export interface IAliMyFollowingResp { + items: IAliMyFollowingModel[] + itemsKey: Set + next_marker: string + + m_time: number + m_user_id: string +} +export default class AliFollowing { + + static async ApiOtherFollowingListAll(user_id: string) { + const dir: IAliOtherFollowingResp = { + items: [], + itemsKey: new Set(), + next_marker: '', + m_time: 0, + m_user_id: user_id + } + + do { + const isget = await AliFollowing.ApiOtherFollowingListOnePage(dir) + if (isget != true) { + break + } + } while (dir.next_marker) + return dir + } + + static async ApiOtherFollowingListOnePage(dir: IAliOtherFollowingResp) { + const url = 'adrive/v1/timeline/user/recommend' + let postdata = { + user_id: dir.m_user_id, + limit: 100, + order_by: 'updated_at', + order_direction: 'DESC' + } + if (dir.next_marker) postdata = Object.assign(postdata, { marker: dir.next_marker }) + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliFollowing._OtherFollowingListOnePage(dir, resp) + } + + static _OtherFollowingListOnePage(dir: IAliOtherFollowingResp, resp: IUrlRespData) { + try { + if (AliHttp.IsSuccess(resp.code)) { + dir.next_marker = resp.body.next_marker || '' + + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliOtherFollowingModel + if (dir.itemsKey.has(item.user_id)) continue + const add = Object.assign({}, item) + dir.items.push(add) + dir.itemsKey.add(add.user_id) + } + + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出官方推荐列表出错' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_OtherFollowingListOnePage' + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } + + + + + static async ApiMyFollowingListAll(user_id: string) { + const dir: IAliMyFollowingResp = { + items: [], + itemsKey: new Set(), + next_marker: '', + m_time: 0, + m_user_id: user_id + } + + do { + const isget = await AliFollowing.ApiMyFollowingListOnePage(dir) + if (isget != true) { + break + } + } while (dir.next_marker) + return dir + } + + static async ApiMyFollowingListOnePage(dir: IAliMyFollowingResp) { + const url = 'adrive/v1/member/list_following' + const postdata = { + marker: dir.next_marker, + limit: 100, + order_by: 'updated_at', + order_direction: 'DESC' + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliFollowing._MyFollowingListOnePage(dir, resp) + } + + static _MyFollowingListOnePage(dir: IAliMyFollowingResp, resp: IUrlRespData) { + try { + if (AliHttp.IsSuccess(resp.code)) { + dir.next_marker = resp.body.next_marker || '' + + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliMyFollowingModel + if (dir.itemsKey.has(item.user_id)) continue + const add = Object.assign({}, item) + if (add.latest_messages && add.latest_messages.length > 0) { + for (let j = 0; j < add.latest_messages.length; j++) { + add.latest_messages[j].createdstr = humanTimeAgo(add.latest_messages[j].created) + } + } else { + add.latest_messages = [ + { + action: '', + content: { + file_id_list: [], + share: { popularity: 0, popularity_emoji: '', popularity_str: '', share_id: '', share_pwd: '' } + }, + created: 0, + createdstr: '', + creator: { avatar: '', description: '', is_following: false, nick_name: '', phone: '', user_id: '', follower_count: 0 }, + creator_id: '', + display_action: '', + sequence_id: 0 + } + ] + } + dir.items.push(add) + dir.itemsKey.add(add.user_id) + } + + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出订阅列表出错' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_MyFollowingListOnePage' + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } + + + static async ApiSetFollowing(user_id: string, followingid: string, following: boolean, tip: boolean) { + let url = 'adrive/v1/member/follow_user' + if (!following) url = 'adrive/v1/member/unfollow_user' + const postdata = JSON.stringify({ user_id: followingid }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + if (tip) message.success(following ? '订阅成功' : '取消订阅成功') + } else { + message.error((following ? '订阅' : '取消订阅') + ' 操作失败,请稍后重试') + } + } + + + static async ApiSetFollowingMarkRead(user_id: string, followingid: string) { + const url = 'adrive/v1/member/mark_read' + const postdata = JSON.stringify({ user_id: followingid }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + } else { + } + } + + + + static async ApiOtherFollowingClassListAll() { + const url = 'https://gitee.com/liupanxiaobaiyang/aliyunpan/raw/master/follow.json' + const resp = await AliHttp.Get(url, '') + return resp.body?.FollowList || [] + } +} diff --git a/packages/renderer/src/aliapi/models.ts b/packages/renderer/src/aliapi/models.ts new file mode 100644 index 0000000..730d3b9 --- /dev/null +++ b/packages/renderer/src/aliapi/models.ts @@ -0,0 +1,169 @@ + +export interface IDownloadUrl { + drive_id: string + file_id: string + expire_sec: number + url: string + size: number +} + + +export interface IVideoPreviewUrl { + drive_id: string + file_id: string + expire_sec: number + url: string + duration: number + width: number + height: number + url_FHD: string + url_HD: string + url_SD: string + url_LD: string + subtitles: { + language: string + url: string + }[] +} + + +export interface IOfficePreViewUrl { + drive_id: string + file_id: string + access_token: string + preview_url: string +} + + +export interface IVideoXBTUrl { + time: string + url: string +} + + +export interface IUploadCreat { + user_id: string + drive_id: string + file_id: string + israpid: boolean + isexist: boolean + upload_id: string + part_info_list: { + upload_url: string + part_number: number + part_size: number + isupload: boolean + }[] + errormsg: string +} + +export interface IAliBatchResult { + count: number + async_task: { + drive_id: string + file_id: string + task_id: string + newdrive_id: string + newfile_id: string + }[] + reslut: { + id: string + file_id?: string + + name?: string + type?: string + parent_file_id?: string + + share_id?: string + share_pwd?: string + expiration?: string + share_name?: string + }[] + error: { + id: string + code: string + message: string + }[] +} + +export interface IBatchResult { + count: number + task: { + file_id: string + task_id: string + newdrive_id: string + newfile_id: string + }[] + reslut: { + id: string + file_id: string + }[] + error: { + id: string + code: string + message: string + }[] +} + + +export interface IAliGetAlbumModel { + album_id: string + created_at: number + description: string + file_count: number + image_count: number + name: string + owner: string + updated_at: number + video_count: number +} + + +export interface IStateUploadFile { + UploadID: string + Info: { + user_id: string + + localFilePath: string + + parent_id: string + drive_id: string + + path: string + + name: string + + size: number + sizestr: string + icon: string + isDir: boolean + /** 是否秒传 */ + isMiaoChuan: boolean + + sha1: string + + crc64: string + } + + Upload: { + DownState: string + DownTime: number + DownSize: number + DownSpeed: number + DownSpeedStr: string + DownProcess: number + IsStop: boolean + IsDowning: boolean + IsCompleted: boolean + IsFailed: boolean + /** 失败的代码 */ + FailedCode: number + /** 失败的消息 */ + FailedMessage: string + AutoTry: number + upload_id: string + file_id: string + /** 是否覆盖上传 */ + IsBreakExist: boolean + } +} diff --git a/packages/renderer/src/aliapi/server.tsx b/packages/renderer/src/aliapi/server.tsx new file mode 100644 index 0000000..edd6007 --- /dev/null +++ b/packages/renderer/src/aliapi/server.tsx @@ -0,0 +1,184 @@ +import { B64decode, b64decode, b64encode } from '@/utils/format' +import axios, { AxiosResponse } from 'axios' +import Config from '@/utils/config' +import message from '@/utils/message' +import { IShareSiteModel, useServerStore } from '@/store' +import { Modal } from '@arco-design/web-vue' +import { h } from 'vue' +import { getAppNewPath, openExternal } from '@/utils/electronhelper' +import ShareDAL from '@/share/share/ShareDAL' +import DebugLog from '@/utils/debuglog' +import { writeFileSync, rmSync } from 'fs' + +export interface IServerRespData { + state: string + msg: string + [k: string]: any +} +export default class ServerHttp { + static baseapi = b64decode('aHR0cDovLzEyMS41LjE0NC44NDo1MjgyLw==') + static async PostToServer(postdata: any): Promise { + postdata.appVersion = Config.appVersion + const str = JSON.stringify(postdata) + if (window.postdataFunc) { + let enstr = '' + try { + enstr = window.postdataFunc(str) + } catch { + return { state: 'error', msg: '联网失败' } + } + return ServerHttp.Post(enstr).catch(() => { + return { state: 'error', msg: '网络错误' } + }) + } else { + return { state: 'error', msg: '程序错误' } + } + } + + static async Post(postdata: any, isfirst = true): Promise { + const url = ServerHttp.baseapi + 'xby2' + //const url = "http://192.168.31.74:2018/" + 'xby2' + return axios + .post(url, postdata, { + responseType: 'arraybuffer', + timeout: 30000, + headers: {} + }) + .then((response: AxiosResponse) => { + if (response.status != 200) return { state: 'error', msg: '网络错误' } + const buff = response.data as ArrayBuffer + const uint8array = new Uint8Array(buff) + for (let i = 0, maxi = uint8array.byteLength; i < maxi; i++) { + uint8array[i] ^= 9 + (i % 200) + } + const str = new TextDecoder().decode(uint8array) + return JSON.parse(str) as IServerRespData + }) + .catch(() => { + return { state: 'error', msg: '网络错误' } + }) + .then((resp) => { + if (resp.state == 'error' && resp.msg == '网络错误' && isfirst == true) { + + return ServerHttp.Sleep(2000).then(() => { + return ServerHttp.Post(postdata, false) + }) + } else return resp + }) + } + static Sleep(msTime: number) { + return new Promise((resolve) => + setTimeout( + () => + resolve({ + success: true, + time: msTime + }), + msTime + ) + ) + } + + //console.log(b64encode('https://gitee.com/liupanxiaobaiyang/aliyunpan/raw/master/config2.json')) + + static configUrl = b64decode('aHR0cHM6Ly9naXRlZS5jb20vbGl1cGFueGlhb2JhaXlhbmcvYWxpeXVucGFuL3Jhdy9tYXN0ZXIvY29uZmlnMy5qc29u') + + static showVer = false + + static async CheckUpgrade(showUpgred: boolean) { + axios + .get(ServerHttp.configUrl, { + withCredentials: false, + responseType: 'json', + timeout: 30000 + }) + .then(async (response: AxiosResponse) => { + console.log('CheckUpgrade', showUpgred, response) + if (response.data.SIP) { + const SIP = B64decode(response.data.SIP) + if (SIP.length > 0) ServerHttp.baseapi = SIP + } + if (response.data.SSList) { + const list: IShareSiteModel[] = [] + for (let i = 0, maxi = response.data.SSList.length; i < maxi; i++) { + const item = response.data.SSList[i] + const add = { title: item.title, url: item.url, tip: item.tip } + if (add.url.length > 0) list.push(add) + } + ShareDAL.SaveShareSite(list) + } + if (response.data.HELP) { + useServerStore().mSaveHelpUrl(response.data.HELP) + } + if (showUpgred && response.data.ExeVer) { + const v1 = Config.appVersion.replaceAll('v', '').replaceAll('.', '').trim() + const v2 = response.data.ExeVer.replaceAll('v', '').replaceAll('.', '').trim() + const info = response.data.VerInfo as string + const verurl = response.data.VerUrl || '' + const appnewurl = response.data.AppNewUrl || '' + + if (parseInt(v2) > parseInt(v1)) { + if (appnewurl) { + message.info('检测到新版本 ' + response.data.ExeVer) + let isdown = await this.AutoDownload(B64decode(appnewurl)) + if (isdown) return + } + + if (ServerHttp.showVer == false) { + ServerHttp.showVer = true + + Modal.confirm({ + okText: '确认', + cancelText: '取消', + title: () => h('div', { innerHTML: '有新版可以升级' + response.data.ExeVer + '', class: { vermodalhead: true }, style: { minWidth: '540px' } }), + mask: true, + maskClosable: false, + escToClose: false, + alignCenter: true, + simple: true, + onOk: () => { + if (verurl.length > 0) openExternal(B64decode(verurl)) + }, + onClose: () => { + ServerHttp.showVer = false + }, + content: () => h('div', { innerHTML: info, class: { vermodal: true }, style: { minWidth: '540px' } }) + }) + } + } else { + message.info('已经是最新版 ' + response.data.ExeVer + ' 一般每周日晚8-10点发布新版') + } + } + }) + .catch((e: any) => { + DebugLog.mSaveLog('danger', e.message) + }) + } + + static async AutoDownload(appnewurl: string): Promise { + const appnew = getAppNewPath() + return axios + .get(appnewurl, { + withCredentials: false, + responseType: 'arraybuffer', + timeout: 60000, + headers: { + 'Cache-Control': 'no-cache', + Pragma: 'no-cache', + Expires: '0' + } + }) + .then((response: AxiosResponse) => { + writeFileSync(appnew, Buffer.from(response.data)) + return true + }) + .catch((e) => { + rmSync(appnew, { force: true }) + return false + }) + } +} + + + + diff --git a/packages/renderer/src/aliapi/share.ts b/packages/renderer/src/aliapi/share.ts new file mode 100644 index 0000000..df3302a --- /dev/null +++ b/packages/renderer/src/aliapi/share.ts @@ -0,0 +1,352 @@ +import DebugLog from '@/utils/debuglog' +import { humanDateTime, humanExpiration, humanSize } from '@/utils/format' +import message from '@/utils/message' +import AliHttp, { IUrlRespData } from './alihttp' +import ServerHttp from './server' +import { ApiBatch, ApiBatchMaker, ApiBatchSuccess } from './utils' +import { useSettingStore } from '@/store' +import { IAliShareItem, IAliShareAnonymous, IAliShareFileItem } from './alimodels' +import getFileIcon from './fileicon' + +export interface IAliShareFileResp { + items: IAliShareFileItem[] + itemsKey: Set + punished_file_count: number + + next_marker: string + + m_user_id: string + m_share_id: string + m_dir_id: string + m_dir_name: string +} + +export interface UpdateShareModel { + share_id: string + share_pwd: string + expiration: string + share_name: string +} + +export default class AliShare { + + static async ApiGetShareAnonymous(shareid: string) { + + + const share: IAliShareAnonymous = { + shareinfo: { + shareid: shareid, + creator_id: '', + creator_name: '', + creator_phone: '', + display_name: '', + expiration: '', + file_count: 0, + share_name: '', + created_at: '', + updated_at: '', + vip: '' + }, + shareinfojson: '', + error: '解析分享链接失败' + } + const url = 'adrive/v2/share_link/get_share_by_anonymous?share_id=' + shareid + const postdata = { share_id: shareid } + const resp = await AliHttp.Post(url, postdata, '', '') + if (AliHttp.IsSuccess(resp.code)) { + if (resp.body.creator_id) { + share.shareinfo.shareid = shareid + share.shareinfo.creator_id = resp.body.creator_id || '' + share.shareinfo.creator_name = resp.body.creator_name || '' + share.shareinfo.creator_phone = resp.body.creator_phone || '' + share.shareinfo.display_name = resp.body.display_name || '' + share.shareinfo.expiration = resp.body.expiration || '' + share.shareinfo.file_count = resp.body.file_count || 0 + share.shareinfo.share_name = resp.body.share_name || '' + share.shareinfo.created_at = resp.body.created_at || '' + share.shareinfo.updated_at = resp.body.updated_at || '' + share.shareinfo.vip = resp.body.vip || '' + share.shareinfojson = JSON.stringify(resp.body) + share.error = '' + return share + } + } + + if (resp.body?.code == 'ShareLink.Cancelled') share.error = '分享链接被取消分享了' + else if (resp.body?.code == 'ShareLink.Expired') share.error = '分享链接过期失效了' + else if (resp.body?.code == 'ShareLink.Forbidden') share.error = '分享链接违规禁止访问' + else if (resp.body?.code) share.error = resp.body.code + else share.error = '解析分享链接失败' + return share + } + + + static async ApisSubscription(user_id: string, shareid: string) { + const url = 'adrive/v1/share_link/subscription/update' + const postdata = { share_id: shareid, update_last_seen: true } + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + return true + } + return false + } + + + static async ApiGetShareToken(shareid: string, pwd: string) { + + + + const url = 'v2/share_link/get_share_token' + const postdata = { share_id: shareid, share_pwd: pwd } + + let resp = await AliHttp.Post(url, postdata, '', '') + let isgetpwd = false + + if (resp.body?.code == 'InvalidResource.SharePwd') { + if (useSettingStore().yinsiLinkPassword) { + const serdata = await ServerHttp.PostToServer({ cmd: 'GetAliSharePwd', shareid }) + if (serdata.password) { + isgetpwd = true + postdata.share_pwd = serdata.password + resp = await AliHttp.Post(url, postdata, '', '') + } + } + } + + + if (resp.body?.code == 'InvalidResource.SharePwd') return ',提取码错误' + if (resp.body?.code == 'ShareLink.Cancelled') return ',分享链接被取消分享了' + if (resp.body?.code == 'ShareLink.Expired') return ',分享链接过期失效了' + if (resp.body?.code == 'ShareLink.Forbidden') return ',分享链接违规禁止访问' + if (resp.body?.code) return ',' + resp.body.code + + + if (AliHttp.IsSuccess(resp.code)) { + if (useSettingStore().yinsiLinkPassword && isgetpwd == false) ServerHttp.PostToServer({ cmd: 'PostAliShare', shareid, password: postdata.share_pwd }) + return (resp.body.share_token as string | undefined) || ',share_token错误' + } + return ',网络错误请重试' + } + + + static async ApiShareFileList(share_id: string, share_token: string, dir_id: string): Promise { + const dir: IAliShareFileResp = { + items: [], + itemsKey: new Set(), + punished_file_count: 0, + next_marker: '', + m_user_id: '', + m_share_id: share_id, + m_dir_id: dir_id, + m_dir_name: '' + } + do { + const isget = await AliShare.ApiShareFileListOnePage(dir, share_token) + if (isget != true) { + break + } + } while (dir.next_marker) + + return dir + } + + + static async ApiShareFileListOnePage(dir: IAliShareFileResp, share_token: string) { + const url = 'adrive/v3/file/list?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + let postdata = { + share_id: dir.m_share_id, + parent_file_id: dir.m_dir_id, + limit: 100, + url_expire_sec: 14400, + fields: 'thumbnail', + order_by: 'name', + order_direction: 'DESC' + } + if (dir.next_marker) postdata = Object.assign(postdata, { marker: dir.next_marker }) + const resp = await AliHttp.Post(url, postdata, '', share_token) + return AliShare._ShareFileListOnePage(dir, resp) + } + + static _ShareFileListOnePage(dir: IAliShareFileResp, resp: IUrlRespData) { + try { + if (AliHttp.IsSuccess(resp.code)) { + dir.next_marker = resp.body.next_marker + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliShareFileItem + if (dir.itemsKey.has(item.file_id)) continue + const add = { + drive_id: item.drive_id, + file_id: item.file_id, + name: item.name, + type: item.type, + parent_file_id: item.parent_file_id, + + file_extension: item.file_extension || '', + mime_extension: item.mime_extension || '', + mime_type: item.mime_type || '', + size: item.size || 0, + category: item.category || '', + punish_flag: item.punish_flag || 0, + isdir: item.type == 'folder', + sizestr: item.type == 'folder' ? '' : humanSize(item.size), + icon: getFileIcon(item.category, item.file_extension, item.mime_extension, item.mime_type, item.size)[1] + } + dir.items.push(add) + dir.itemsKey.add(add.file_id) + } + dir.punished_file_count += resp.body.punished_file_count || 0 + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出分享链接内文件出错 ' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_ShareFileListOnePage' + dir.m_dir_id + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } + + + static async ApiCreatShare(user_id: string, drive_id: string, expiration: string, share_pwd: string, share_name: string, file_id_list: string[]): Promise { + + + + const url = 'adrive/v2/share_link/create' + const postdata = JSON.stringify({ drive_id, expiration, share_pwd: share_pwd, share_name: share_name, file_id_list }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (AliHttp.IsSuccess(resp.code)) { + const item = resp.body as IAliShareItem + const add: IAliShareItem = Object.assign({}, item, { first_file: undefined, icon: 'iconwenjian' }) + if (item.created_at) add.created_at = humanDateTime(item.created_at) + if (item.updated_at) add.updated_at = humanDateTime(item.updated_at) + add.share_msg = humanExpiration(item.expiration) + return add + } + + if (resp.body?.code.startsWith('UserPunished')) return '账号分享行为异常,无法分享' + else if (resp.body?.code == 'InvalidParameter.FileIdList') return '选择文件过多,无法分享' + else if (resp.body?.message && resp.body.message.indexOf('size of file_id_list') >= 0) return '选择文件过多,无法分享' + else if (resp.body?.code == 'FileShareNotAllowed') return '这个文件禁止分享' + else if (resp.body?.code) return resp.body.code.toString() + else return '创建分享链接失败' + } + + static async ApiCreatShareBatch(user_id: string, drive_id: string, expiration: string, share_pwd: string, file_id_list: string[]): Promise { + const batchlist: string[] = [] + for (let i = 0, maxi = file_id_list.length; i < maxi; i++) { + const postdata: any = { + body: { + drive_id, + expiration, + share_pwd: share_pwd, + file_id_list: [file_id_list[i]] + }, + headers: { + 'Content-Type': 'application/json' + }, + id: file_id_list[i], + method: 'POST', + url: '/share_link/create' + } + batchlist.push(JSON.stringify(postdata)) + } + const result = await ApiBatch('', batchlist, user_id, '') + return result.count + } + + + static async ApiCancelShareBatch(user_id: string, shareidlist: string[]): Promise { + const batchlist = ApiBatchMaker('/share_link/cancel', shareidlist, (share_id: string) => { + return { share_id: share_id } + }) + return ApiBatchSuccess(shareidlist.length > 1 ? '批量取消分享' : '取消分享', batchlist, user_id, '') + } + + + static async ApiUpdateShareBatch(user_id: string, shareidlist: string[], expirationlist: string[], share_pwdlist: string[], share_namelist: string[] | undefined) { + + + + + if (!shareidlist || shareidlist.length == 0) return [] + const batchlist: string[] = [] + if (share_namelist != undefined) { + for (let i = 0, maxi = shareidlist.length; i < maxi; i++) { + batchlist.push( + JSON.stringify({ + body: { share_id: shareidlist[i], share_pwd: share_pwdlist[i], expiration: expirationlist[i], share_name: share_namelist[i] }, + headers: { 'Content-Type': 'application/json' }, + id: shareidlist[i], + method: 'POST', + url: '/share_link/update' + }) + ) + } + } else { + for (let i = 0, maxi = shareidlist.length; i < maxi; i++) { + batchlist.push(JSON.stringify({ body: { share_id: shareidlist[i], share_pwd: share_pwdlist[i], expiration: expirationlist[i] }, headers: { 'Content-Type': 'application/json' }, id: shareidlist[i], method: 'POST', url: '/share_link/update' })) + } + } + + let successlist: UpdateShareModel[] = [] + const result = await ApiBatch(shareidlist.length > 1 ? '批量更新分享链接' : '更新分享链接', batchlist, user_id, '') + result.reslut.map((t) => successlist.push({ share_id: t.share_id!, share_pwd: t.share_pwd!, expiration: t.expiration!, share_name: t.share_name! })) + return successlist + } + + + static async ApiSaveShareFilesBatch(shareid: string, share_token: string, user_id: string, drive_id: string, parentid: string, files: string[]) { + + + + + + if (!files || files.length == 0) return 'success' + const batchlist: string[] = [] + for (let i = 0, maxi = files.length; i < maxi; i++) { + const postdata = + '{"body":{"share_id":"' + + shareid + + '","file_id_list":["' + + //files[i] + + '"],"file_id":"' + + files[i] + + '","to_drive_id":"' + + drive_id + + '","to_parent_file_id":"' + + parentid + + '","auto_rename":true},"headers":{"Content-Type":"application/json"},"id":"' + + files[i] + + '","method":"POST","url":"/file/copy"}' + batchlist.push(postdata) + } + const result = await ApiBatch('', batchlist, user_id, share_token) + if (result.count == files.length) { + if (result.async_task.length > 0) return 'async' + else return 'success' + } else { + if (result.error.length > 0) { + if (result.error[0].code == 'QuotaExhausted.Drive') return '网盘空间已满' + else return result.error[0].code + } + return 'error' + } + + /** + * 异步任务,查询结果 + * punished_file_count 部分文件由于违规,已封禁 + * + * some if(data.state=='PartialSucceed'&&data.message=='ErrQuotaExhausted') 空间不足,已保存部分文件 + * every if(data.state=='Failed') 可用空间不足,保存失败 + */ + } +} diff --git a/packages/renderer/src/aliapi/sharelist.ts b/packages/renderer/src/aliapi/sharelist.ts new file mode 100644 index 0000000..b968238 --- /dev/null +++ b/packages/renderer/src/aliapi/sharelist.ts @@ -0,0 +1,103 @@ +import DebugLog from '@/utils/debuglog' +import { humanDateTime, humanExpiration } from '@/utils/format' +import message from '@/utils/message' +import AliHttp, { IUrlRespData } from './alihttp' +import { IAliShareItem } from './alimodels' +import AliDirFileList from './dirfilelist' + +export interface IAliShareResp { + items: IAliShareItem[] + itemsKey: Set + next_marker: string + + m_time: number + m_user_id: string +} +export default class AliShareList { + + static async ApiShareListAll(user_id: string) { + const dir: IAliShareResp = { + items: [], + itemsKey: new Set(), + next_marker: '', + m_time: 0, + m_user_id: user_id + } + + do { + const isget = await AliShareList.ApiShareListOnePage(dir) + if (isget != true) { + break + } + } while (dir.next_marker) + return dir + } + + static async ApiShareListOnePage(dir: IAliShareResp) { + const url = 'adrive/v3/share_link/list' + const postdata = { + + marker: dir.next_marker, + creator: dir.m_user_id, + include_canceled: false, + order_by: 'created_at', + order_direction: 'DESC' + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliShareList._ShareListOnePage(dir, resp) + } + + static _ShareListOnePage(dir: IAliShareResp, resp: IUrlRespData) { + try { + if (AliHttp.IsSuccess(resp.code)) { + dir.next_marker = resp.body.next_marker + const downurl = 'https://api.aliyundrive.com/v2/file/download?t=' + Date.now().toString() + const timenow = new Date().getTime() + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliShareItem + if (dir.itemsKey.has(item.share_id)) continue + let icon = 'iconwenjian' + let first_file = undefined + if (item.first_file) { + first_file = AliDirFileList.getFileInfo(item.first_file, downurl) + icon = first_file.icon || 'iconwenjian' + } + const add = Object.assign({}, item, { first_file, icon }) + if (!add.share_msg) add.share_msg = '' + if (!add.share_name) add.share_name = 'share_name' + if (!add.share_pwd) add.share_pwd = '' + if (!add.preview_count) add.preview_count = 0 + if (!add.download_count) add.download_count = 0 + if (!add.save_count) add.save_count = 0 + if (!add.expired) add.expired = false + if (item.created_at) { + add.created_at = humanDateTime(new Date(item.created_at).getTime()) + } else { + add.created_at = '' + } + + add.share_msg = humanExpiration(item.expiration, timenow) + if (item.status == 'forbidden') add.share_msg = '分享违规' + dir.items.push(add) + dir.itemsKey.add(add.share_id) + } + + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出分享列表出错' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_ShareListOnePage' + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } +} diff --git a/packages/renderer/src/aliapi/trash.ts b/packages/renderer/src/aliapi/trash.ts new file mode 100644 index 0000000..d8cfeae --- /dev/null +++ b/packages/renderer/src/aliapi/trash.ts @@ -0,0 +1,143 @@ +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import AliHttp, { IUrlRespData } from './alihttp' +import { IAliFileItem } from './alimodels' +import AliDirFileList, { IAliFileResp } from './dirfilelist' + +export default class AliTrash { + + static async ApiTrashFileListOnePageForClean(orderby: string, order: string, dir: IAliFileResp) { + const url = 'v2/recyclebin/list?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + const postdata = { + drive_id: dir.m_drive_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + all: false, + url_expire_sec: 14400, + fields: 'thumbnail', + order_by: orderby, + order_direction: order.toUpperCase() + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliTrash._FileListOnePage(dir, resp) + } + + static async ApiFavorFileListOnePageForClean(orderby: string, order: string, dir: IAliFileResp) { + const url = 'v2/file/list_by_custom_index_key?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + const postdata = { + drive_id: dir.m_drive_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + url_expire_sec: 14400, + fields: '*', + order_by: orderby, + order_direction: order.toUpperCase(), + custom_index_key: 'starred_yes', + parent_file_id: 'root' + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliTrash._FileListOnePage(dir, resp) + } + + /** + * 一个文件夹的全部文件列表,copy弹窗调用 + */ + static async ApiDirFileListNoLock(user_id: string, drive_id: string, dir_id: string, dir_name: string, order: string, type: string = '', max: number = 3000): Promise { + const dir: IAliFileResp = { + items: [], + itemsKey: new Set(), + punished_file_count: 0, + next_marker: '', + m_user_id: user_id, + m_drive_id: drive_id, + m_dir_id: dir_id, + m_dir_name: dir_name + } + + if (!order) order = 'updated_at desc' + let orders = order.split(' ') + do { + const isget = await AliTrash._ApiDirFileListOnePage(orders[0], orders[1], dir, type) + if (isget != true) { + break + } + if (dir.items.length >= max) { + dir.next_marker = '' + break + } + } while (dir.next_marker != '') + return dir + } + static async _ApiDirFileListOnePage(orderby: string, order: string, dir: IAliFileResp, type: string = '') { + const url = 'adrive/v3/file/list?jsonmask=next_marker,items(category,created_at,domain_id,drive_id,file_extension,file_id,hidden,mime_extension,mime_type,name,parent_file_id,punish_flag,size,starred,type,updated_at,description)' + let postdata = { + drive_id: dir.m_drive_id, + parent_file_id: dir.m_dir_id, + marker: dir.next_marker, + limit: AliDirFileList.LimitMax, + all: false, + url_expire_sec: 14400, + fields: '*', + order_by: orderby, + order_direction: order.toUpperCase() + } + if (type) postdata = Object.assign(postdata, { type }) + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + return AliTrash._FileListOnePage(dir, resp) + } + static _FileListOnePage(dir: IAliFileResp, resp: IUrlRespData) { + try { + if (AliHttp.IsSuccess(resp.code)) { + dir.next_marker = resp.body.next_marker + const isrecover = dir.m_dir_id == 'recover' + const downurl = isrecover ? '' : 'https://api.aliyundrive.com/v2/file/download?t=' + Date.now().toString() + + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const item = resp.body.items[i] as IAliFileItem + if (dir.itemsKey.has(item.file_id)) continue + const add = AliDirFileList.getFileInfo(item, downurl) + if (isrecover) add.description = item.content_hash + dir.items.push(add) + dir.itemsKey.add(item.file_id) + } + dir.punished_file_count = resp.body.punished_file_count || 0 + + return true + } else if (resp.code == 404) { + + dir.items.length = 0 + dir.next_marker = '' + return true + } else if (resp.body && resp.body.code) { + dir.items.length = 0 + dir.next_marker = resp.body.code + message.warning('列出文件出错 ' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', '_FileListOnePage' + dir.m_dir_id + ' error=' + (e.message || '')) + } + dir.next_marker = 'error ' + resp.code + return false + } + + + static async ApiFileListOnePageAria(orderby: string, order: string, dir: IAliFileResp) { + const url = 'adrive/v3/file/list' + const postdata = { + drive_id: dir.m_drive_id, + parent_file_id: dir.m_dir_id, + marker: dir.next_marker, + limit: 100, + all: false, + url_expire_sec: 14400, + fields: 'thumbnail', + order_by: orderby, + order_direction: order + } + const resp = await AliHttp.Post(url, postdata, dir.m_user_id, '') + //todo:: + //return AliDirFileList._FileListOnePage(dir, resp) + return Promise.resolve(false) + } +} diff --git a/packages/renderer/src/aliapi/upload.ts b/packages/renderer/src/aliapi/upload.ts new file mode 100644 index 0000000..58ae50d --- /dev/null +++ b/packages/renderer/src/aliapi/upload.ts @@ -0,0 +1,484 @@ +import UserDAL from '@/user/userdal' +import DebugLog from '@/utils/debuglog' +import AliHttp from './alihttp' +import { IStateUploadFile, IUploadCreat } from './models' +import AliUser from './user' +import { IsSuccess } from './utils' +import { FileHandle } from 'fs/promises' +import fsPromises from 'fs/promises' +import axios from 'axios'; + +const filelist: Map = new Map(); + +export default class AliUpload { + + static async UploadCreatFile(user_id: string, drive_id: string, parentid: string, name: string, size: number, hash: string, prehash: string): Promise { + //const url = 'https://api.aliyundrive.com/adrive/v2/file/createWithFolders'; + const url = 'v2/file/create'; + const postdata: { + drive_id: string; + parent_file_id: string; + name: string; + type: string; + check_name_mode: string; + size: number; + content_hash?: string; + content_hash_name?: string; + proof_code?: string; + proof_version?: string; + pre_hash?: string; + } = { + drive_id, + parent_file_id: parentid, + name, + type: 'file', + check_name_mode: 'refuse', + size, + }; + + if (hash != '') { + postdata.content_hash = hash.toUpperCase(); + postdata.content_hash_name = 'sha1'; + } else { + postdata.pre_hash = prehash; + } + const resp = await AliHttp.Post(url, postdata, user_id, ''); + const result: IUploadCreat = { + user_id: user_id, + drive_id: '', + file_id: '', + israpid: false, + isexist: false, + upload_id: '', + part_info_list: [], + errormsg: '', + }; + + if (typeof resp.body === 'object' && JSON.stringify(resp.body).indexOf('file size is exceed') > 0) { + result.errormsg = '创建文件失败(单文件最大2TB)'; + return result; + } + if (resp.body.code && resp.body.code == 'PreHashMatched') { + result.errormsg = 'PreHashMatched'; + return result; + } + if (resp.body.code && resp.body.code == 'QuotaExhausted.Drive') { + result.errormsg = '网盘空间已满保存文件失败'; + return result; + } + if (IsSuccess(resp.code)) { + result.file_id = resp.body.file_id; + + if (resp.body.exist) { + const issame = await AliUpload.UploadFileCheckHash(user_id, drive_id, result.file_id, hash); + if (!issame) { + await AliUpload.UploadFileDelete(user_id, drive_id, result.file_id); + return await AliUpload.UploadCreatFile(user_id, drive_id, parentid, name, size, hash, prehash); + } + } + result.israpid = resp.body.rapid_upload || resp.body.exist || false; + result.upload_id = resp.body.upload_id || ''; + if (resp.body.part_info_list && resp.body.part_info_list.length > 0) { + for (let i = 0; i < resp.body.part_info_list.length; i++) { + const item = resp.body.part_info_list[i]; + result.part_info_list.push({ upload_url: item.upload_url, part_number: item.part_number, + part_size: item.part_size, isupload: false }); + } + } + return result; + } else { + result.errormsg = '创建文件失败' + resp.code.toString(); + return result; + } + } + + /** + * 上传时创建文件与文件夹 + * @param user_id 用户ID + * @param drive_id 网盘ID + * @param parentid 父目录ID + * @param name 名称 + * @param filesize 文件大小 + * @param hash 哈希值 + * @param proof_code + * @param prehash + * @param IsBreakExist 是否覆盖 + */ + static async UploadCreatFileWithFolders(user_id: string, drive_id: string, parentid: string, name: string, filesize: number, hash: string, proof_code: string, prehash: string, IsBreakExist: boolean): Promise { + const url = 'adrive/v2/file/createWithFolders' + const postdata: { + drive_id: string + parent_file_id: string + name: string + type: string + check_name_mode: string + size: number + content_hash?: string + content_hash_name?: string + proof_code?: string + proof_version?: string + pre_hash?: string + part_info_list: { part_number: number; part_size: number }[] + } = { + drive_id: drive_id, + parent_file_id: parentid, + name: name, + type: 'file', + check_name_mode: 'refuse', + size: filesize, + part_info_list: [] + } + + if (hash) { + postdata.content_hash = hash.toUpperCase() + postdata.content_hash_name = 'sha1' + postdata.proof_version = 'v1' + postdata.proof_code = proof_code + + } else { + hash = '' + postdata.pre_hash = prehash + } + + let partsize = 10485760 + if (filesize > 0) { + let partindex = 0 + + while (filesize > partsize * 8000) partsize = partsize + 10485760 + + while (partindex * partsize < filesize) { + postdata.part_info_list.push({ part_number: partindex + 1, part_size: partsize }) + partindex++ + } + postdata.part_info_list[partindex - 1].part_size = filesize - (partindex - 1) * partsize + } + const resp = await AliHttp.Post(url, postdata, user_id, '') + const result: IUploadCreat = { + user_id, + drive_id, + israpid: false, + isexist: false, + upload_id: '', + file_id: '', + part_info_list: [], + errormsg: '' + } + + if (typeof resp.body === 'object' && JSON.stringify(resp.body).indexOf('file size is exceed') > 0) { + result.errormsg = '创建文件失败(单文件最大2TB)' + return result + } + + if (resp.body && resp.body.code) { + if (resp.body?.code == 'PreHashMatched') result.errormsg = 'PreHashMatched' + + else if (resp.body?.code == 'QuotaExhausted.Drive') result.errormsg = '创建文件失败,网盘空间已满' + else if (resp.body?.code == 'InvalidRapidProof') { + + let token = UserDAL.GetUserToken(user_id) + if (token) await AliUser.ApiTokenRefreshAccount(token, true).catch(() => {}) + result.errormsg = resp.body.code + } else result.errormsg = resp.body?.code || '创建失败,网络错误' + + return result + } + + + if (IsSuccess(resp.code)) { + result.file_id = resp.body.file_id + if (resp.body.exist) { + if (IsBreakExist) { + const issame = await AliUpload.UploadFileCheckHash(user_id, drive_id, result.file_id, hash) + if (!issame) { + await AliUpload.UploadFileDelete(user_id, drive_id, result.file_id).catch(() => {}) + return await AliUpload.UploadCreatFileWithFolders(user_id, drive_id, parentid, name, filesize, hash, proof_code, prehash, IsBreakExist) + } else { + result.israpid = true + } + } else { + result.israpid = true + } + } + result.isexist = resp.body.exist || false + result.israpid = result.israpid || resp.body.rapid_upload || false + result.upload_id = resp.body.upload_id || '' + if (resp.body.part_info_list && resp.body.part_info_list.length > 0) { + const part_info_list = resp.body.part_info_list + for (let i = 0, maxi = part_info_list.length; i < maxi; i++) { + const item = part_info_list[i] + result.part_info_list.push({ upload_url: item.upload_url, part_number: item.part_number, part_size: partsize, isupload: false }) + } + } + return result + } else { + result.errormsg = '创建文件失败' + resp.code.toString() + return result + } + } + + static async UploadFileCheckHash(user_id: string, drive_id: string, file_id: string, hash: string): Promise { + const url = 'v2/file/get' + const postdata = { drive_id: drive_id, file_id: file_id } + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (IsSuccess(resp.code) && resp.body.content_hash) { + const content_hash = resp.body.content_hash.toUpperCase() + hash = hash.toUpperCase() + return hash === content_hash + } else return false + } + + static async UploadFileDelete(user_id: string, drive_id: string, file_id: string, permanently: boolean = false): Promise { + const url = 'v2/recyclebin/trash' + const postdata = { drive_id: drive_id, file_id: file_id, permanently } + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (IsSuccess(resp.code)) { + return true + } else return false + } + + static async UploadFileComplete(user_id: string, drive_id: string, file_id: string, upload_id: string, filesize: number): Promise { + const url = 'v2/file/complete' + const postdata = { drive_id: drive_id, upload_id: upload_id, file_id: file_id } + let resp = await AliHttp.Post(url, postdata, user_id, '') + if (resp.code == 400) { + resp = await AliHttp.Post(url, postdata, user_id, '') + } + + if (IsSuccess(resp.code)) { + if (resp.body.size == filesize) return true + else { + + await AliUpload.UploadFileDelete(user_id, drive_id, file_id, true).catch(() => {}) + DebugLog.mSaveLog('danger', '合并文件后发现大小不一致,删除已上传的文件,重新上传') + return false + } + } else { + DebugLog.mSaveLog('danger', '合并文件时出错' + resp.code + ' ' + JSON.stringify(resp.header || {}) + ' ' + JSON.stringify(resp.body || {})) + return false + } + } + + static async UploadFilePartUrl(user_id: string, drive_id: string, file_id: string, upload_id: string, filesize: number, result: IUploadCreat) { + const url = 'v2/file/get_upload_url' + const postdata: { + drive_id: string + upload_id: string + file_id: string + part_info_list: { part_number: number; part_size: number }[] + } = { + drive_id: drive_id, + upload_id: upload_id, + file_id: file_id, + part_info_list: [] + } + let partindex = 0 + + let partsize = 10485760 + while (filesize > partsize * 8000) partsize = partsize + 10485760 + + while (partindex * partsize < filesize) { + postdata.part_info_list.push({ part_number: partindex + 1, part_size: partsize }) + partindex++ + } + postdata.part_info_list[partindex - 1].part_size = filesize - (partindex - 1) * partsize + + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (IsSuccess(resp.code)) { + if (resp.body.part_info_list && resp.body.part_info_list.length > 0) { + const part_info_list = resp.body.part_info_list + if (result.part_info_list.length == 0) { + + for (let i = 0, maxi = part_info_list.length; i < maxi; i++) { + const item = part_info_list[i] + result.part_info_list.push({ upload_url: item.upload_url, part_number: item.part_number, part_size: partsize, isupload: false }) + } + } else { + + for (let i = 0, maxi = part_info_list.length; i < maxi; i++) { + const item = part_info_list[i] + result.part_info_list[item.part_number - 1].upload_url = item.upload_url + } + } + } + } + } + + static async UploadFileListUploadedParts(user_id: string, drive_id: string, file_id: string, upload_id: string, part_number_marker: number, result: IUploadCreat) { + const url = 'v2/file/list_uploaded_parts' + const postdata = { drive_id: drive_id, upload_id: upload_id, file_id: file_id, part_number_marker /*1开始*/ } + const resp = await AliHttp.Post(url, postdata, user_id, '') + + if (IsSuccess(resp.code)) { + if (resp.body.uploaded_parts && resp.body.uploaded_parts.length > 0) { + const uploaded_parts = resp.body.uploaded_parts + for (let i = 0, maxi = uploaded_parts.length; i < maxi; i++) { + const item = uploaded_parts[i] + const part_number = item.part_number + result.part_info_list[part_number - 1].isupload = true + } + } + if (resp.body.next_part_number_marker && parseInt(resp.body.next_part_number_marker) > 0) { + const next = parseInt(resp.body.next_part_number_marker) + await AliUpload.UploadFileListUploadedParts(user_id, drive_id, file_id, upload_id, next, result).catch(() => {}) + } + } + } + + /** + * 获得文件上传证明的速度 + * @param UploadID + */ + static GetFileUploadProofSpeed(UploadID: string) { + return filelist.get(UploadID) || 0; + } + + /** + * 上传一个文件 + * @param user_id + * @param uploadinfo + * @param file + */ + static async UploadOneFile(user_id: string, uploadinfo: IUploadCreat, file: IStateUploadFile): Promise { + if (uploadinfo.part_info_list.length > 1) + return AliUpload.UploadOneFileBig(user_id, uploadinfo, file); //10MB 分片上传 + const upload_url = uploadinfo.part_info_list[0].upload_url; + const filehandle = await fsPromises.open(file.Info.localFilePath, 'r').catch(() => { + return undefined; + }); + if (!filehandle) return '打开文件失败,请重试'; + filelist.set(file.UploadID, 0); + let isok = ''; + for (let j = 0; j < 3; j++) { + isok = await AliUpload.UploadOneFilePart(user_id, file.UploadID, filehandle, 0, file.Info.size, upload_url); + if (isok == 'success') { + break; + } + } + await filehandle?.close(); + filelist.delete(file.UploadID); + return AliUpload.UploadFileComplete(user_id, file.Info.drive_id, file.Upload.file_id, file.Upload.upload_id, file.Info.size) + .then((issuccess) => { + if (issuccess) return 'success'; + else return '合并文件时出错,请重试'; + }) + .catch(() => { + return '合并文件时出错,请重试'; + }); + } + + /** + * 上传一个大文件 + * @param user_id + * @param uploadinfo + * @param file + */ + static async UploadOneFileBig(user_id: string, uploadinfo: IUploadCreat, file: IStateUploadFile): Promise { + filelist.set(file.UploadID, 0); + const filehandle = await fsPromises.open(file.Info.localFilePath, 'r').catch(() => { + return undefined; + }); + if (!filehandle) return '打开文件失败,请重试'; + const filesize = file.Info.size; + for (let i = 0; i < uploadinfo.part_info_list.length; i++) { + let part = uploadinfo.part_info_list[i]; + const partstart = (part.part_number - 1) * 10485760; + const partend = partstart + 10485760; + const part_size = partend > filesize ? filesize - partstart : 10485760; + + if (part.isupload) { + filelist.set(file.UploadID, partstart + part_size); + } else { + + const url = part.upload_url; + let expires = url.substr(url.indexOf('x-oss-expires=') + 'x-oss-expires='.length); + expires = expires.substr(0, expires.indexOf('&')); + const lasttime = parseInt(expires) - Date.now() / 1000; + + if (lasttime < 5 * 60) { + await AliUpload.UploadFilePartUrl(user_id, file.Info.drive_id, file.Upload.file_id, file.Upload.upload_id, file.Info.size, uploadinfo); + part = uploadinfo.part_info_list[i]; + } + let isok = ''; + for (let j = 0; j < 3; j++) { + isok = await AliUpload.UploadOneFilePart(user_id, file.UploadID, filehandle, partstart, part_size, part.upload_url); + if (isok == 'success') { + part.isupload = true; + break; + } + if (file.Upload.DownState != '解析中' && file.Upload.DownState.indexOf('%') < 0) break; + } + if (file.Upload.DownState != '解析中' && file.Upload.DownState.indexOf('%') < 0) break; + if (!part.isupload) { + await filehandle?.close(); + filelist.delete(file.UploadID); + return isok; + } + } + } + await filehandle?.close(); + filelist.delete(file.UploadID); + if (file.Upload.DownState != '解析中' && file.Upload.DownState.indexOf('%') < 0) return ''; + + for (let i = 0; i < uploadinfo.part_info_list.length; i++) { + if (!uploadinfo.part_info_list[i].isupload) { + return '有分片上传失败,请重试'; + } + } + return AliUpload.UploadFileComplete(user_id, file.Info.drive_id, file.Upload.file_id, file.Upload.upload_id, file.Info.size) + .then((issuccess) => { + if (issuccess) return 'success'; + else return '合并文件时出错,请重试'; + }) + .catch(() => { + return '合并文件时出错,请重试'; + }); + } + + /** + * 上传一个文件部分 + * @param user_id + * @param UploadID + * @param filehandle + * @param partstart + * @param partsize + * @param upload_url + */ + static UploadOneFilePart(user_id: string, UploadID: string, filehandle: FileHandle, partstart: number, partsize: number, upload_url: string) { + const buff = Buffer.alloc(partsize); + let token = UserDAL.GetUserToken(user_id) + return filehandle + .read(buff, 0, buff.length, partstart) + .then((len: any) => { + if (len && len.bytesRead == partsize) { + return axios + .put(upload_url, buff, { + responseType: 'text', + headers: { + //timeout: 60000, + 'Content-Type': '', + Authorization: token.token_type + ' ' + token.access_token, + }, + onUploadProgress: function (progressEvent: ProgressEvent) { + filelist.set(UploadID, partstart + progressEvent.loaded); + }, + }) + .then(() => { + return 'success'; + }) + .catch(function (error) { + if (error.response?.status == 409 && error.response?.data && error.response?.data.indexOf('PartAlreadyExist') > 0) { + return 'success'; + } + return '网络错误 ' + error.toString() + ',请重试'; + }); + } else { + return '读取文件数据失败,请重试'; + } + }) + .catch(() => { + return '读取文件数据失败,请重试'; + }); + } + + +} diff --git a/packages/renderer/src/aliapi/uploadhash.ts b/packages/renderer/src/aliapi/uploadhash.ts new file mode 100644 index 0000000..ed4858d --- /dev/null +++ b/packages/renderer/src/aliapi/uploadhash.ts @@ -0,0 +1,238 @@ +import { Sleep } from '@/utils/format' +import { IStateUploadFile } from './models' +import DebugLog from '@/utils/debuglog' +import fsPromises from 'fs/promises' +import crypto from 'crypto' + +const sha1posMap = new Map() + +export default class AliUploadHash { + + static async GetBuffHashProof(access_token: string, buff: Buffer) { + if (buff.length == 0) return { sha1: 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709', proof_code: '' } + let hash = crypto.createHash('sha1').update(buff).digest('hex') + hash = hash.toUpperCase() + const m = unescape(encodeURIComponent(access_token)) + const buffa = Buffer.from(m) + const md5a = crypto.createHash('md5').update(buffa).digest('hex') + const start = Number(BigInt('0x' + md5a.substr(0, 16)) % BigInt(buff.length)) + const end = Math.min(start + 8, buff.length) + const buffb = buff.slice(start, end) + const proof_code = buffb.toString('base64') + + return { sha1: hash, proof_code } + } + + + /** + * 取得文件的预哈希 + * @param filepath 文件路径 + */ + static async GetFilePreHash(filepath: string): Promise { + let hash = '' + const fileHandle = await fsPromises.open(filepath, 'r').catch((e: any) => { + if (e.code && e.code === 'EPERM') e = '文件没有读取权限' + if (e.code && e.code === 'EBUSY') e = '文件被占用或锁定中' + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) e = '文件没有读取权限' + DebugLog.mSaveLog('danger', 'PreHash上传文件失败:' + filepath + ' ' + (e || '')) + return typeof e == 'string' && e.startsWith('文件') ? e : '读取文件失败' + }) + if (fileHandle && typeof fileHandle == 'string') return 'error' + fileHandle + + if (fileHandle) { + const fileHandles = fileHandle as fsPromises.FileHandle + const buff = Buffer.alloc(1024) + await fileHandles.read(buff, 0, buff.length, null) + hash = crypto.createHash('sha1').update(buff).digest('hex') + hash = hash.toUpperCase() + await fileHandles?.close() + } else { + hash = 'error读取文件失败' + } + return hash + } + + /** + * 获取文件哈希证明 + * @param access_token + * @param file + */ + static async GetFileHashProof(access_token: string, file: IStateUploadFile) { + let hash = '' + let proof_code = '' + const size = file.Info.size + if (size == 0) return { sha1: 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709', proof_code: '' } + + if (size > 1024 * 1024 * 1) { + + if (size > 1024 * 1024 * 300) return this.GetFileHashProofBigSleep(access_token, file) + return this.GetFileHashProofBig(access_token, file) + } + + file.Upload.FailedMessage = '计算sha1' + + const sha1 = crypto.createHash('sha1') + const fileHandle = await fsPromises.open(file.Info.localFilePath, 'r').catch((e: any) => { + if (e.code && e.code === 'EPERM') e = '文件没有读取权限' + if (e.code && e.code === 'EBUSY') e = '文件被占用或锁定中' + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) e = '文件没有读取权限' + DebugLog.mSaveLog('danger', 'HashProof上传文件失败:' + file.Info.localFilePath + ' ' + (e || '')) + return typeof e == 'string' && e.startsWith('文件') ? e : '读取文件失败' + }) + if (fileHandle && typeof fileHandle == 'string') { + file.Upload.FailedMessage = '' + return { sha1: 'error', proof_code: fileHandle } + } + + if (fileHandle) { + const fileHandles = fileHandle as fsPromises.FileHandle + const buff = Buffer.alloc(1024 * 1024) + let readlen = 0 + while (true) { + if (file.Upload.DownState !== '解析中') break + const len = await fileHandles.read(buff, 0, buff.length, null) + if (len.bytesRead > 0 && len.bytesRead == buff.length) { + sha1.update(buff) + } else if (len.bytesRead > 0) { + sha1.update(buff.slice(0, len.bytesRead)) + } + readlen += len.bytesRead + file.Upload.FailedMessage = '计算sha1(' + Math.floor((readlen * 100) / size).toString() + '%)' + if (len.bytesRead <= 0) break + } + if (file.Upload.DownState == '解析中') { + hash = sha1.digest('hex') + hash = hash.toUpperCase() + const m = unescape(encodeURIComponent(access_token)) + const buffa = Buffer.from(m) + const md5a = crypto.createHash('md5').update(buffa).digest('hex') + const start = Number(BigInt('0x' + md5a.substr(0, 16)) % BigInt(size)) + const end = Math.min(start + 8, size) + const buffb = Buffer.alloc(end - start) + await fileHandles.read(buffb, 0, buffb.length, start) + proof_code = buffb.toString('base64') + } else { + hash = 'error' + proof_code = '' + } + await fileHandles?.close() + file.Upload.FailedMessage = '' + return { sha1: hash, proof_code } + } else { + file.Upload.FailedMessage = '' + return { sha1: 'error', proof_code: '读取文件失败' } + } + } + + + static async GetFileHashProofBigSleep(access_token: string, file: IStateUploadFile) { + let hash = '' + let proof_code = '' + const size = file.Info.size + if (size == 0) return { sha1: 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709', proof_code: '' } + file.Upload.FailedMessage = '等待计算sha1' + while (sha1posMap.size > 3) { + await Sleep(100) + } + file.Upload.FailedMessage = '计算sha1' + sha1posMap.set(file.UploadID, 0) + file.Upload.DownSize = 0 + await new Promise((resolve) => { + const worker: any = new Worker('./nodework.js') + worker.addEventListener('message', (event: any) => { + if (event.data.hash == 'sha1') { + if (event.data.readlen) { + if (file.Upload.DownState !== '解析中') worker.postMessage({ stop: true }) + if (sha1posMap.has(file.UploadID)) sha1posMap.set(file.UploadID, event.data.readlen as number) + file.Upload.FailedMessage = event.data.message + //file.Info.size = event.data.size as number // TODO 报错 + } + if (event.data.sha1) { + sha1posMap.delete(file.UploadID) + hash = event.data.sha1 + proof_code = event.data.proof_code + resolve(null) + } + } + }) + worker.addEventListener('error', function (event: any) { + sha1posMap.delete(file.UploadID) + hash = event.data.sha1 + proof_code = event.data.proof_code + resolve(null) + }) + worker.postMessage({ hash: 'sha1', localFilePath: file.Info.localFilePath, access_token }) + }) + .catch(() => {}) + .then(() => { + sha1posMap.delete(file.UploadID) + }) + + file.Upload.DownSize = 0 + file.Upload.FailedMessage = '' + if (file.Upload.DownState !== '解析中') return { sha1: 'error', proof_code: '' } + + if (hash == 'error') { + proof_code = '' + } + return { sha1: hash, proof_code } + } + + + static async GetFileHashProofBig(access_token: string, file: IStateUploadFile) { + let hash = '' + let proof_code = '' + const size = file.Info.size + if (size == 0) return { sha1: 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709', proof_code: '' } + file.Upload.FailedMessage = '计算sha1' + sha1posMap.set(file.UploadID, 0) + file.Upload.DownSize = 0 + await new Promise((resolve) => { + const worker: any = new Worker('./nodework.js') + worker.addEventListener('message', (event: any) => { + if (event.data.hash == 'sha1') { + if (event.data.readlen) { + + if (file.Upload.DownState !== '解析中') worker.postMessage({ stop: true }) + if (sha1posMap.has(file.UploadID)) sha1posMap.set(file.UploadID, event.data.readlen as number) + file.Upload.FailedMessage = event.data.message + // file.Info.size = event.data.size as number // TODO 报错 + } + if (event.data.sha1) { + + sha1posMap.delete(file.UploadID) + hash = event.data.sha1 + proof_code = event.data.proof_code + resolve(null) + } + } + }) + worker.addEventListener('error', function (event: any) { + sha1posMap.delete(file.UploadID) + hash = event.data.sha1 + proof_code = event.data.proof_code + resolve(null) + }) + worker.postMessage({ hash: 'sha1', localFilePath: file.Info.localFilePath, access_token }) + }) + .catch(() => {}) + .then(() => { + sha1posMap.delete(file.UploadID) + }) + + file.Upload.DownSize = 0 + file.Upload.FailedMessage = '' + if (file.Upload.DownState !== '解析中') return { sha1: 'error', proof_code: '' } + return { sha1: hash, proof_code } + } + + /** + * 获得文件哈希证明的计算速度 + * @param UploadID + */ + static GetFileHashProofSpeed(UploadID: string) { + return sha1posMap.get(UploadID) || 0 + } +} diff --git a/packages/renderer/src/aliapi/uploadmem.ts b/packages/renderer/src/aliapi/uploadmem.ts new file mode 100644 index 0000000..fc0baec --- /dev/null +++ b/packages/renderer/src/aliapi/uploadmem.ts @@ -0,0 +1,47 @@ +import UserDAL from '@/user/userdal' +import DebugLog from '@/utils/debuglog' +import axios from 'axios' +import AliUpload from './upload' +import AliUploadHash from './uploadhash' + +export default class AliUploadMem { + + static async UploadMem(user_id: string, drive_id: string, parentid: string, filename: string, context: string) { + let token = UserDAL.GetUserToken(user_id) + if (!token || !token.access_token) return '账号失效,操作取消' + let hash = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709' + let proof = '' + let buff = Buffer.from([]) + if (context.length > 0) { + buff = Buffer.from(context, 'utf-8') + const dd = await AliUploadHash.GetBuffHashProof(token!.access_token, buff) + hash = dd.sha1 + proof = dd.proof_code + } + const size = buff.length + + const upinfo = await AliUpload.UploadCreatFileWithFolders(user_id, drive_id, parentid, filename, size, hash, proof, '', true) + if (upinfo.errormsg != '') { + return upinfo.errormsg + } + if (upinfo.isexist) return '网盘中已存在同名文件' + if (upinfo.israpid) return 'success' + + await axios + .put(upinfo.part_info_list[0].upload_url, buff, { + responseType: 'text', + timeout: 30000, + headers: { + + 'Content-Type': '', + Authorization: token!.token_type + ' ' + token!.access_token + } + }) + .catch(function (e: any) { + DebugLog.mSaveLog('danger', 'UploadMemError ' + (e.message || '')) + }) + const result = await AliUpload.UploadFileComplete(user_id, drive_id, upinfo.file_id, upinfo.upload_id, size) + if (result) return 'success' + else return '合并文件失败' + } +} diff --git a/packages/renderer/src/aliapi/user.ts b/packages/renderer/src/aliapi/user.ts new file mode 100644 index 0000000..6914f77 --- /dev/null +++ b/packages/renderer/src/aliapi/user.ts @@ -0,0 +1,136 @@ +import UserDAL from '@/user/userdal' +import { humanSize, Sleep } from '@/utils/format' +import { ITokenInfo } from '@/user/userstore' +import AliHttp from './alihttp' +import message from '@/utils/message' + + +export const TokenReTimeMap = new Map() +export const TokenLockMap = new Map() +export default class AliUser { + + static async _ApiTokenRefresh(token: ITokenInfo, showMessage: boolean): Promise { + while (true) { + const lock = TokenLockMap.has(token.user_id) + if (lock) await Sleep(1000) + else break + } + TokenLockMap.set(token.user_id, Date.now()) + const time = TokenReTimeMap.get(token.user_id) || 0 + if (Date.now() - time < 1000 * 60 * 5) return true + + const url = 'token/refresh' + + + const postdata = { refresh_token: token.refresh_token } + const resp = await AliHttp.Post(url, postdata, '', '') + TokenLockMap.delete(token.user_id) + if (AliHttp.IsSuccess(resp.code)) { + TokenReTimeMap.set(resp.body.user_id, Date.now()) + token.tokenfrom = 'token' + token.access_token = resp.body.access_token + token.refresh_token = resp.body.refresh_token + token.expires_in = resp.body.expires_in + token.token_type = resp.body.token_type + token.user_id = resp.body.user_id + token.user_name = resp.body.user_name + token.avatar = resp.body.avatar + token.nick_name = resp.body.nick_name + token.default_drive_id = resp.body.default_drive_id + token.default_sbox_drive_id = resp.body.default_sbox_drive_id + token.role = resp.body.role + token.status = resp.body.status + token.expire_time = resp.body.expire_time + token.state = resp.body.state + token.pin_setup = resp.body.pin_setup + token.is_first_login = resp.body.is_first_login + token.need_rp_verify = resp.body.need_rp_verify + window.WebUserToken({ user_id: token.user_id, name: token.user_name, access_token: token.access_token, refresh: true }) + UserDAL.SaveUserToken(token) + return true + } else if (showMessage) { + message.error('刷新账号[' + token.user_name + '] token 失败,需要重新登录') + UserDAL.UserLogOff(token.user_id) + } + return false + } + + + static async ApiTokenRefreshAccount(token: ITokenInfo, showMessage: boolean): Promise { + while (true) { + const lock = TokenLockMap.has(token.user_id) + if (lock) await Sleep(1000) + else break + } + TokenLockMap.set(token.user_id, Date.now()) + const time = TokenReTimeMap.get(token.user_id) || 0 + if (Date.now() - time < 1000 * 60 * 5) return true + + const url = 'https://auth.aliyundrive.com/v2/account/token' + + const postdata = { refresh_token: token.refresh_token, grant_type: 'refresh_token' } + const resp = await AliHttp.Post(url, postdata, '', '') + TokenLockMap.delete(token.user_id) + if (AliHttp.IsSuccess(resp.code)) { + TokenReTimeMap.set(resp.body.user_id, Date.now()) + token.tokenfrom = 'account' + token.access_token = resp.body.access_token + token.refresh_token = resp.body.refresh_token + token.expires_in = resp.body.expires_in + token.token_type = resp.body.token_type + token.user_id = resp.body.user_id + token.user_name = resp.body.user_name + token.avatar = resp.body.avatar + token.nick_name = resp.body.nick_name + token.default_drive_id = resp.body.default_drive_id + token.default_sbox_drive_id = resp.body.default_sbox_drive_id + token.role = resp.body.role + token.status = resp.body.status + token.expire_time = resp.body.expire_time + token.state = resp.body.state + token.pin_setup = resp.body.pin_setup + token.is_first_login = resp.body.is_first_login + token.need_rp_verify = resp.body.need_rp_verify + window.WebUserToken({ user_id: token.user_id, name: token.user_name, access_token: token.access_token, refresh: true }) + UserDAL.SaveUserToken(token) + return true + } else if (showMessage) { + message.error('刷新账号[' + token.user_name + '] token 失败,需要重新登录') + UserDAL.UserLogOff(token.user_id) + } + return false + } + + + static async ApiUserInfo(token: ITokenInfo): Promise { + const url = 'v2/databox/get_personal_info' + const postdata = '' + const resp = await AliHttp.Post(url, postdata, token.user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + token.used_size = resp.body.personal_space_info.used_size + token.total_size = resp.body.personal_space_info.total_size + token.spu_id = resp.body.personal_rights_info.spu_id + token.is_expires = resp.body.personal_rights_info.is_expires + token.name = resp.body.personal_rights_info.name + token.spaceinfo = humanSize(token.used_size) + ' / ' + humanSize(token.total_size) + return true + } + return false + } + + + + + static async ApiUserPic(token: ITokenInfo): Promise { + const url = 'adrive/v1/user/albums_info' + + + const postdata = {} + const resp = await AliHttp.Post(url, postdata, token.user_id, '') + if (AliHttp.IsSuccess(resp.code)) { + token.pic_drive_id = resp.body.data.driveId + return true + } + return false + } +} diff --git a/packages/renderer/src/aliapi/utils.ts b/packages/renderer/src/aliapi/utils.ts new file mode 100644 index 0000000..97aae0e --- /dev/null +++ b/packages/renderer/src/aliapi/utils.ts @@ -0,0 +1,204 @@ +import { ITokenInfo, useFootStore } from '@/store' +import UserDAL from '@/user/userdal' +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import AliHttp from './alihttp' +import AliFile from './file' +import { IAliBatchResult } from './models' + +export function IsSuccess(code: number) { + return code >= 200 && code <= 300 +} + + +export function GetDriveID(user_id: string, drive: Drive) { + let token = UserDAL.GetUserToken(user_id) + if (token) { + switch (drive) { + case 'pan': + return token.default_drive_id + case 'pic': + return token.pic_drive_id + case 'safe': + return token.default_sbox_drive_id + } + } + return '' +} + + +export function GetDriveID2(token: ITokenInfo, drive: string) { + if (token) { + switch (drive) { + case 'pan': + return token.default_drive_id + case 'pic': + return token.pic_drive_id + case 'safe': + return token.default_sbox_drive_id + } + } + return drive +} + +async function _ApiBatch(postdata: string, user_id: string, share_token: string, result: IAliBatchResult) { + const url = 'v2/batch' + const resp = await AliHttp.Post(url, postdata, user_id, share_token) + if (IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let i = 0, maxi = responses.length; i < maxi; i++) { + const status = responses[i].status as number + if (status >= 200 && status <= 205) { + result.count++ + const respi = responses[i] + if (respi.body && respi.body.async_task_id) { + + + result.async_task.push({ drive_id: respi.body.drive_id || '', file_id: respi.id, task_id: respi.body.async_task_id, newdrive_id: respi.body.drive_id || '', newfile_id: respi.body.file_id || '' }) + } else if (respi.body && respi.body.share_id && respi.body.share_msg) { + + result.reslut.push({ id: respi.id, share_id: respi.body.share_id, share_pwd: respi.body.share_pwd || '', expiration: respi.body.expiration || '', share_name: respi.body.share_name || '' }) + } else if (respi.body) { + result.reslut.push({ id: respi.id, file_id: respi.body.file_id, name: respi.body.name || '' }) + } else if (respi.id) { + result.reslut.push({ id: respi.id, file_id: respi.id }) + } + } else { + const respi = responses[i] + DebugLog.mSaveLog('danger', respi.body.message || respi.body.code) + if (respi.body && respi.body.code) result.error.push({ id: respi.body.id || respi.id, code: respi.body.code, message: respi.body.message }) + } + } + } +} +export async function ApiBatch(title: string, batchlist: string[], user_id: string, share_token: string) { + let loadingkey = 'filebatch' + Date.now().toString() + if (title != '') message.loading(title + ' 执行中...', 60, loadingkey) + + const result: IAliBatchResult = { count: 0, async_task: [], reslut: [], error: [] } + let add = 0 + let postdata = '{"requests":[' + let alltask: Promise[] = [] + for (let i = 0, maxi = batchlist.length; i < maxi; i++) { + if (add > 0) postdata = postdata + ',' + add++ + postdata = postdata + batchlist[i] + if (add > 99) { + postdata += '],"resource":"file"}' + alltask.push(_ApiBatch(postdata, user_id, share_token, result)) + postdata = '{"requests":[' + add = 0 + } + + if (alltask.length >= 3) { + + await Promise.all(alltask).catch(() => {}) + alltask = [] + if (title != '') message.loading(title + ' 执行中...(' + result.count.toString() + ')', 60, loadingkey) + } + } + if (add > 0) { + postdata += '],"resource":"file"}' + alltask.push(_ApiBatch(postdata, user_id, share_token, result)) + } + if (alltask.length > 0) await Promise.all(alltask).catch(() => {}) + if (title != '' || share_token != '') { + if (result.error.length == 0) { + if (result.async_task.length > 0) { + message.warning(title + ' 异步执行中(' + result.async_task.length + ')', 2, loadingkey) + + let type = '异步' + if (title == '放入回收站') type = '放入回收站' + if (title == '从回收站还原') type = '从回收站还原' + + if (title == '彻底删除') type = '彻底删除' + if (title == '批量复制') type = '复制' + if (title == '复制') type = '复制' + if (title == '' && share_token) type = '导入分享' + + const footStore = useFootStore() + for (let i = 0, maxi = result.async_task.length; i < maxi; i++) { + let task = result.async_task[i] + + if (type == '放入回收站' || type == '彻底删除') { + + result.reslut.push({ id: task.file_id, file_id: task.newfile_id }) + } + + if (task.newdrive_id && task.newfile_id) { + let fileinfo = await AliFile.ApiGetFile(user_id, task.newdrive_id, task.newfile_id) + if (fileinfo) { + footStore.mAddTask(user_id, task.task_id, type, fileinfo.name, task.newdrive_id, task.newfile_id) + continue + } + } + footStore.mAddTask(user_id, task.task_id, type, task.task_id, '', '') + } + } else { + message.success(title + ' 成功', 3, loadingkey) + } + } else { + message.error(title + ' 成功(' + result.count.toString() + ')个 失败 (' + result.error.length.toString() + ')个', 3, loadingkey) + } + } + return result +} + +export function ApiBatchMaker(url: string, idlist: string[], bodymake: (file_id: string) => any) { + if (!idlist || idlist.length == 0) return [] + const batchlist: string[] = [] + for (let i = 0, maxi = idlist.length; i < maxi; i++) { + batchlist.push(JSON.stringify({ body: bodymake(idlist[i]), headers: { 'Content-Type': 'application/json' }, id: idlist[i], method: 'POST', url })) + } + return batchlist +} +export function ApiBatchMaker2(url: string, idlist: string[], namelist: string[], bodymake: (file_id: string, name: string) => any) { + if (!idlist || idlist.length == 0) return [] + const batchlist: string[] = [] + for (let i = 0, maxi = idlist.length; i < maxi; i++) { + batchlist.push(JSON.stringify({ body: bodymake(idlist[i], namelist[i]), headers: { 'Content-Type': 'application/json' }, id: idlist[i], method: 'POST', url })) + } + return batchlist +} + +export async function ApiBatchSuccess(title: string, batchlist: string[], user_id: string, share_token: string) { + if (batchlist.length == 0) return Promise.resolve(batchlist) + let successlist: string[] = [] + const result = await ApiBatch(title, batchlist, user_id, share_token) + result.reslut.map((t) => successlist.push(t.id)) + return successlist +} + +export async function ApiWaitAsyncTask(title: string, user_id: string, tasklist: IAliBatchResult['async_task']) { + for (let i = 0, maxi = tasklist.length; i < maxi; i++) { + let async_task_id = tasklist[i].task_id + for (let j = 0; j < 100; j++) { + const url = 'v2/async_task/get' + const postdata = { async_task_id } + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (IsSuccess(resp.code)) { + if (resp.body.state == 'Succeed' || resp.body.state == 'succeed') break + if (resp.body.state == 'done' || resp.body.state == 'done') break + if (resp.body.state == 'Failed' || resp.body.state == 'failed') break + if (resp.body.state == 'Running' || resp.body.state == 'running') continue + } + } + } +} + +export async function ApiGetAsyncTask(user_id: string, async_task_id: string) { + const url = 'v2/async_task/get' + const postdata = { async_task_id } + const resp = await AliHttp.Post(url, postdata, user_id, '') + if (IsSuccess(resp.code)) { + if (resp.body.state == 'Succeed' || resp.body.state == 'succeed') return 'success' + if (resp.body.state == 'done' || resp.body.state == 'done') return 'success' + if (resp.body.state == 'Failed' || resp.body.state == 'failed') return 'error' + if (resp.body.state == 'Running' || resp.body.state == 'running') return 'running' + if (resp.body.state == 'PartialSucceed') { + message.warning('操作部分成功 ' + resp.body.message?.replace('ErrQuotaExhausted', '网盘空间已满') || '', 5) + return 'error' + } + } + return 'error' +} diff --git a/packages/renderer/src/assets/antd.css b/packages/renderer/src/assets/antd.css new file mode 100644 index 0000000..b3b3790 --- /dev/null +++ b/packages/renderer/src/assets/antd.css @@ -0,0 +1,186 @@ +.ant-tree, +.ant-tree-switcher, +.ant-tree-show-line .ant-tree-switcher { + background: transparent !important; +} + +.ant-tree-checkbox { + margin-right: 4px !important; +} +.ant-tree .ant-tree-node-content-wrapper { + padding-left: 2px !important; +} +.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected { + background: rgba(var(--primary-6), 0.15) !important; +} +body[arco-theme='dark'] .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected { + background: rgba(var(--primary-6), 0.5) !important; +} +.ant-tree .ant-tree-node-content-wrapper:hover { + background-color: var(--color-fill-2); +} + +.ant-checkbox-checked .ant-checkbox-inner, +.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background-color: rgb(var(--primary-6)); + border-color: rgb(var(--primary-6)); +} + +.ant-tree, +.ant-checkbox-wrapper { + color: var(--color-text-2); +} + +.ant-checkbox-disabled + span { + color: var(--color-text-4); +} + +.ant-tree-show-line .ant-tree-indent-unit::before { + border-right: 1px solid var(--color-neutral-5); +} +.ant-tree-switcher-leaf-line::after { + border-bottom: 1px solid var(--color-neutral-5); +} +.ant-tree-switcher-leaf-line::before { + border-right: 1px solid var(--color-neutral-5); +} + +.ant-tree-switcher_open .ant-tree-switcher-icon.iconfont.Arrow:before { + content: '\e740'; + font-size: 20px; +} +.ant-tree-switcher_close .ant-tree-switcher-icon.iconfont.Arrow:before { + content: '\e742'; + font-size: 18px; +} + +.ant-tree-switcher_close .ant-tree-switcher-icon { + color: rgba(0, 0, 0, 0.4); + height: 24px; + width: 24px; + display: inline-block; +} +.ant-tree-treenode { + min-height: 30px; +} + +.ant-tree-treenode:hover .ant-tree-switcher_close .ant-tree-switcher-icon { + color: rgba(0, 0, 0, 0.6); +} +.ant-tree-switcher_open .ant-tree-switcher-icon { + color: rgba(0, 0, 0, 0.6); + height: 24px; + width: 24px; + display: inline-block; +} + +/*tree*/ +.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before, +.ant-tree.ant-tree-directory .ant-tree-treenode-selected::before { + background: rgb(var(--primary-6)); +} + +.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner { + border-color: rgb(var(--primary-6)); +} +.ant-tree-checkbox-checked::after { + border: 1px solid rgb(var(--primary-6)); +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background-color: rgb(var(--primary-6)); + border-color: rgb(var(--primary-6)); +} +.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after { + background-color: rgb(var(--primary-6)); +} +.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging::after { + border: 1px solid rgb(var(--primary-6)); +} +.ant-tree-switcher-loading-icon { + color: rgb(var(--primary-6)); +} +.ant-tree-node-content-wrapper .ant-tree-drop-indicator { + background-color: rgb(var(--primary-6)); +} +.ant-tree-node-content-wrapper .ant-tree-drop-indicator::after { + border: 2px solid rgb(var(--primary-6)); +} +.ant-tree .ant-tree-treenode.drop-container > [draggable] { + box-shadow: 0 0 0 2px rgb(var(--primary-6)); +} + +body[arco-theme='dark'] .ant-tree-switcher_close .ant-tree-switcher-icon { + color: rgba(255, 255, 255, 0.4); +} + +body[arco-theme='dark'] .ant-tree-treenode:hover .ant-tree-switcher_close .ant-tree-switcher-icon { + color: rgba(255, 255, 255, 0.6); +} + +body[arco-theme='dark'] .ant-tree-switcher_open .ant-tree-switcher-icon { + color: rgba(255, 255, 255, 0.6); +} + +.ant-tree-list-scrollbar[style] { + width: 10px !important; +} +.ant-tree-list-scrollbar-thumb[style], +body[arco-theme='dark'] .ant-tree-list-scrollbar-thumb[style] { + background: rgb(201, 201, 202) !important; +} +.ant-tree-list-scrollbar-thumb:hover[style], +body[arco-theme='dark'] .ant-tree-list-scrollbar-thumb:hover[style] { + background: rgb(162, 162, 163) !important; +} + +.ant-tree-checkbox-inner::after, +.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after, +.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after { + transition: none !important; +} + +.ant-tree-title { + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; +} + +.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle{ + flex-shrink: 0; +} + +/*checkbox*/ +.ant-checkbox-wrapper:hover .ant-checkbox-inner, +.ant-checkbox:hover .ant-checkbox-inner, +.ant-checkbox-input:focus + .ant-checkbox-inner { + border-color: rgb(var(--primary-6)); +} +.ant-checkbox-checked::after { + border: 1px solid rgb(var(--primary-6)); +} +.ant-checkbox-checked .ant-checkbox-inner { + background-color: rgb(var(--primary-6)); + border-color: rgb(var(--primary-6)); +} +.ant-checkbox-indeterminate .ant-checkbox-inner::after { + background-color: rgb(var(--primary-6)); +} + +.ant-checkbox-wrapper { + flex-shrink: 0; + flex-grow: 0; +} + +/*tooltip*/ +.ant-tooltip .ant-tooltip-inner { + padding: 2px 4px !important; + min-height: 24px !important; + font-size: 12px; +} + + +.ant-tabs{ + color: var(--color-text-2); +} \ No newline at end of file diff --git a/packages/renderer/src/assets/fileitem.css b/packages/renderer/src/assets/fileitem.css new file mode 100644 index 0000000..b6a5406 --- /dev/null +++ b/packages/renderer/src/assets/fileitem.css @@ -0,0 +1,603 @@ +.fileitem { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + height: 50px; + overflow: hidden; + word-break: break-all; + word-wrap: break-word; + text-overflow: ellipsis; + border: 1px dotted transparent; + border-radius: 2px; + border-bottom: 1px solid #e5e8ed99; + margin-right: 2px; + -webkit-user-drag: element; +} +body[arco-theme='dark'] .fileitem { + border-bottom: 1px solid #e5e8ed22; +} +.fileitem.grid { + width: 200px; +} + +.fileitem:hover { + background-color: var(--listhoverbg); +} +.fileitem.focus, +.griditem.focus { + border: rgba(var(--primary-6), 0.6) dotted 1px; +} +body[arco-theme='dark'] .fileitem.focus { + border: rgba(var(--primary-6), 0.9) dotted 1px; + border-bottom: rgba(var(--primary-6), 0.9) dotted 1px; +} +.fileitem.selected { + background-color: var(--listselectbg); +} + +.fileicon { + width: 26px; + padding-right: 4px; +} +.fileicon i { + color: #525359; + font-size: 22px; + position: relative; +} +.fileicon .iconfolder { + color: #ffb74d !important; +} + +.iconfile_video, +.iconfile-video, +.iconfile-mkv, +.iconfile-avi, +.iconfile-flv, +.iconfile-mp4, +.iconfile-mov, +.iconfile-asf, +.iconfile-wmv, +.iconfile-ts, +.iconfile-rmvb { + color: #3482f0 !important; +} +.iconfile-audio, +.iconfile-flac, +.iconfile-ape, +.iconfile-wav, +.iconfile-cue, +.iconfile-ogg, +.iconfile-mp3 { + color: #565bf5 !important; +} +.iconfile-image { + color: #b6aea0 !important; +} +.iconfile-img, +.iconfile-ai, +.iconfile-bmp, +.iconfile-eps, +.iconfile-gif, +.iconfile-png, +.iconfile-jpg, +.iconfile-psd, +.iconfile-svg, +.iconfile-tif { + color: #fa8d11 !important; +} + +.iconfile_txt2, +.iconfile-txt, +.iconfile-pdf, +.iconfile-wps { + color: #8bc755 !important; +} + +.iconfile-doc { + color: #282698 !important; +} +.iconfile-xsl { + color: #269840 !important; +} +.iconfile-ppt { + color: #d84a25 !important; +} + +.iconfile-rar, +.iconfile-zip, +.iconfile-tar { + color: #7c5bf3 !important; +} + +.iconweifa { + color: #d81e06 !important; +} +.ant-layout-content .iconweixiang { + color: #d81e06 !important; +} + +.iconnoshareaf::after { + display: inline-block; + width: 22px; + height: 16px; + content: '\e670'; + position: absolute; + left: 0px; + top: 2px; + color: #d81e06 !important; + font-size: 12px; + text-align: center; +} + +.iconwenjian, +.iconfile-apk, +.iconfile-exe, +.iconfile-xci, +.iconfile-nsp, +.iconfile-bin, +.iconfile-dmg, +.iconfile-vmdk, +.iconfile-iso, +.iconfile-gho, +.iconfile-mds, +.iconfile-vhd, +.iconfile-god, +.iconfile-7z, +.iconfile-swf, +.iconfile-ssa, +.iconfile-ass, +.iconfile-srt, +.iconfile-stl, +.iconfile-scc, +.iconfile-html, +.iconfile-bt { + color: #999999 !important; +} + +.filename { + display: block; + flex-grow: 1; + max-width: 100%; + max-height: 36px; + min-width: 240px; + overflow: hidden; + color: var(--color-text-1); + font-size: 14px; +} +.filename > div { + display: -webkit-box; + width: fit-content; + min-width: 50px; + max-height: 36px; + overflow: hidden; + line-height: 18px; + letter-spacing: 0.4px; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.filename > div { + cursor: pointer; +} +.filename > div:hover { + color: rgb(var(--primary-6)); +} +.filebtn { + flex-grow: 0; + flex-shrink: 0; + width: 14px; + height: 28px; +} +.filetime, +.filesize { + flex-grow: 0; + flex-shrink: 0; + color: var(--color-text-3); + word-wrap: break-word; + word-break: keep-all; +} +.filesize { + width: 70px; + font-size: 14px; + text-align: right; +} +.filetime { + width: 80px; + padding-right: 2px; + font-size: 12px; + line-height: 14px; + text-align: right; +} + +.filesizetime { + flex-grow: 0; + flex-shrink: 0; + color: var(--color-text-3); + width: 120px; + padding-right: 2px; + font-size: 12px; + line-height: 14px; + text-align: right; +} +.filesizetime .fsize { + font-size: 14px; + padding-bottom: 6px; +} + +.gengduo { + display: none; + width: 12px; + height: 28px; + min-height: 28px; + margin: 0; + padding: 2px 0; + background: transparent; + border-color: transparent; + border-radius: 4px; +} +.gengduo:hover { + color: rgb(var(--primary-6)); + background: rgba(var(--primary-6), 0.1); +} + +.fileitem:hover .gengduo { + display: block; +} +.gengduo .iconfont { + width: 12px; + height: 24px; +} + +.gengduo .iconfont::before { + display: inline-block; + width: 12px; + height: 24px; + margin-top: -6px; + margin-left: -12px; + font-size: 24px; +} +.preimgp .ant-tooltip-inner { + padding: 2px !important; + background: transparent !important; + box-shadow: none !important; +} +.preimg { + display: table-cell; + max-width: 240px; + max-height: 220px; +} +.preimg img { + display: block; + min-width: 50%; + max-width: 240px; + max-height: 220px; + width: auto; + height: auto; + margin: auto; + border: 1px solid rgb(0 0 0 / 12%); + border-radius: 5px; + box-shadow: 0 3px 6px -4px rgb(0 0 0 / 12%), 0 6px 16px 0 rgb(0 0 0 / 8%), 0 9px 28px 8px rgb(0 0 0 / 5%); + background: #ffffff; +} + +.cdf5659 { + color: #df5659; +} +.c9c27b0 { + color: #9c27b0; +} +.c3f51b5 { + color: #3f51b5; +} +.c42a5f5 { + color: #42a5f5; +} +.c00bc99 { + color: #00bc99; +} +.c4caf50 { + color: #4caf50; +} +.cff9800 { + color: #ff9800; +} +.cff5722 { + color: #ff5722; +} +.c5b89b8 { + color: #5b89b8; +} +.cvideo { + color: #5b89b8; +} + +.griditemparent { + padding: 6px 12px; +} + +.gridrow { + display: grid; + justify-content: space-between; + align-content: flex-start; + padding: 4px 3px 16px 3px; + overflow: hidden; +} + +.griditem.image { + width: 150px; + height: 180px; + flex-shrink: 0; + flex-grow: 0; +} +.griditem.bigimage { + width: 200px; + height: 240px; + flex-shrink: 0; + flex-grow: 0; +} + +.griditem { + border-radius: 8px; + position: relative; + height: 100%; + border: 1px dotted transparent; + border-bottom: 1px solid #e5e8edaa; + -webkit-user-drag: element; +} +.griditem:hover { + background: #f7f8fadd; +} +.griditem.selected { + background: rgba(99, 125, 255, 0.12) !important; +} +.griditem .select { + left: 5px; + position: absolute; + top: 4px; + color: #bcb3b366 !important; + background: #ffffffcc; +} +.griditem .select:hover { + background: #fff !important; + color: #637dff !important; +} + +.griditem.selected .select i { + color: #637dff !important; +} + +.griditem .select, +.griditem .select > button { + width: 24px !important; + min-width: 24px !important; + height: 24px !important; + min-height: 24px !important; + padding: 0px !important; + font-size: 14px; + line-height: 24px !important; + border: none !important; +} +.griditem .select .iconfont { + line-height: 24px !important; +} + +.griditem .gengduo { + display: inline-block; + right: 12px; + position: absolute; + top: 4px; +} +.gridicon { + left: 6px; + right: 6px; + top: 10px; + position: absolute; + text-align: center; + height: 62%; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + flex-grow: 0; +} +.gridicon i { + font-size: 56px; + opacity: 0.75; +} +.gridicon .iconfolder { + color: #ffb74d !important; +} + +.gridicon img { + display: block; + max-width: 100%; + max-height: 100%; + border-radius: 5px; + position: relative; + border: 1px solid rgba(132, 133, 141, 0.16); +} +.gridicon .playicon { + cursor: pointer; + font-size: 20px; + height: 28px; + width: 28px; + background: rgba(37, 38, 43, 0.36); + backdrop-filter: blur(10px); + border-radius: 50%; + color: rgb(255, 255, 255); +} +.gridicon .playicon svg { + width: 1em; + height: 1em; + fill: currentColor; + overflow: hidden; +} + +.gridname { + width: 100%; + text-align: center; + font-size: 14px; + line-height: 18px; + max-width: 100%; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow-wrap: break-word; + margin-bottom: 2px; + color: #323339; + padding: 0 8px; + position: absolute; + bottom: 26px; +} +.gridname > div { + cursor: pointer; + text-align: center; + word-break: break-all; +} +.gridname > div:hover { + color: #3482f0; +} + +.gridinfo { + width: 100%; + text-align: center; + font-size: 12px; + color: rgba(37, 38, 43, 0.36); + position: absolute; + bottom: 10px; +} + +.griditem .rangselect { + height: 100% !important; + margin: 0 !important; + padding: 0 !important; +} + +.griditem .rangselect.rang { + background: rgba(25, 118, 210, 0.1); + border: 1px dashed #637dff; + + margin: 0 !important; + padding: 0 !important; + border-radius: 8px !important; +} +.griditem .rangselect.rangstart { + background: rgba(99, 125, 255, 0.1); + border: 1px dashed #637dff; + margin: 0 !important; + padding: 0 !important; + border-radius: 8px !important; +} +.griditem .rangselect.rangend { + background: rgba(99, 125, 255, 0.1); + border: 1px dashed #637dff; + margin: 0 !important; + padding: 0 !important; + border-radius: 8px !important; +} + + +.rangselect { + height: 49px; + margin: 2px 2px 2px 1px; + padding-top: 7px; + border: 1px dashed transparent; +} +.rangselect.rang { + background: rgba(25, 118, 210, 0.1); + border-right: 1px dashed #637dff; + border-left: 1px dashed #637dff; +} +.fileitem .rangselect.rangstart { + height: 42px !important; + margin-top: 9px !important; + padding-top: 0px !important; + background: rgba(99, 125, 255, 0.1); + + border-top: 1px dashed #637dff; + border-right: 1px dashed #637dff; + border-left: 1px dashed #637dff; + border-top-left-radius: 28px; + border-top-right-radius: 28px; +} +.fileitem .rangselect.rangend { + height: 42px !important; + + margin-bottom: 9px !important; + background: rgba(99, 125, 255, 0.1); + border-right: 1px dashed #637dff; + + border-bottom: 1px dashed #637dff; + border-left: 1px dashed #637dff; + border-bottom-right-radius: 28px; + border-bottom-left-radius: 28px; +} + +.rangselect.rang, +.rangselect.rangstart, +.rangselect.rangend { + background: transparent; +} +.rangselect.rang i, +.rangselect.rangstart i, +.rangselect.rangend i { + color: #637dff; +} + + +.toppanarea .qujian { + height: 28px !important; + min-height: 28px !important; + padding: 0px 6px !important; + color: #637dff !important; + font-size: 14px; + line-height: 28px !important; + border: none !important; +} +.toppanarea .qujian:hover { + background: rgba(99, 125, 255, 0.1) !important; +} +.toppanarea .qujian.arco-btn-status-danger { + color: #ffffff !important; + background: #ff4d4f !important; +} +.toppanarea .qujian.arco-btn-status-danger:hover { + color: #ffffff !important; + background: #ff4d4f !important; +} + + +.dragrowitem { + padding: 10px 8px 10px 2px; + color: rgba(255, 255, 255); + border: 1px solid rgba(99, 125, 255, 0.8); + outline-offset: -1px; + background-color: rgb(187, 197, 248); + min-width: 260px; + max-width: 300px; + width: fit-content; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap !important; + word-break: keep-all !important; + border-radius: 4px; + position: fixed; +} + +.dragrowitem > a { + margin: 0 8px; + color: #637dff; + font-weight: bold; +} + +.dark .dragrowitem { + color: rgba(0, 0, 0); + background-color: rgb(214, 219, 247); +} \ No newline at end of file diff --git a/packages/renderer/src/assets/global.css b/packages/renderer/src/assets/global.css new file mode 100644 index 0000000..7554f85 --- /dev/null +++ b/packages/renderer/src/assets/global.css @@ -0,0 +1,632 @@ +html { + min-width: 100vw; + min-height: 100vh; + overflow: hidden; +} +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft YaHei', sans-serif; + min-width: 100vw; + min-height: 100vh; + overflow: hidden; + background-color: transparent !important; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +::-webkit-scrollbar { + width: 10px; + height: 10px; + cursor: pointer; +} + +::-webkit-scrollbar-thumb { + background: rgb(201, 201, 202); + border-radius: 5px; + cursor: default; +} +::-webkit-scrollbar-thumb:vertical { + width: 9px; +} +::-webkit-scrollbar-thumb:horizontal { + height: 9px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgb(162, 162, 163); +} + +::-webkit-scrollbar-track { + background-color: transparent; +} + +::-webkit-scrollbar-corner { + background: transparent !important; +} + +::-webkit-resizer { + background: transparent !important; +} + +::-webkit-scrollbar-button { + display: none; +} +.flex { + display: flex; + flex: 100% 1 1; + flex-direction: row; +} +.flexauto { + flex-grow: 1 !important; +} +.flexnoauto { + flex-grow: 0 !important; + flex-shrink: 0 !important; + flex-basis: unset !important; +} +.q-electron-drag { + user-select: none; + -webkit-app-region: drag; +} +.q-electron-drag--exception, +.q-electron-drag button, +.q-electron-drag ul, +.q-electron-drag li, +.q-electron-drag .arco-menu-item, +.q-electron-drag .arco-avatar { + -webkit-app-region: no-drag; +} +* { + user-select: none; + -webkit-user-drag: none; + box-sizing: border-box; + letter-spacing: 0.1px; + -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + font-feature-settings: 'tnum', 'zero', 'liga' 0; +} +#app { + height: 100vh; +} +body { + --arcoblue-1: 232, 240, 255 !important; + --arcoblue-2: 205, 220, 255 !important; + --arcoblue-3: 179, 199, 255 !important; + --arcoblue-4: 152, 176, 255 !important; + --arcoblue-5: 126, 151, 255 !important; + --arcoblue-6: 99, 125, 255 !important; + --arcoblue-7: 61, 81, 210 !important; + --arcoblue-8: 32, 46, 166 !important; + --arcoblue-9: 12, 19, 121 !important; + --arcoblue-10: 0, 3, 77 !important; + + --foot-bg: #3c86f5; + --foot-txt: rgb(245, 245, 246); + --topshadow: rgba(0, 0, 0, 0.1); + --leftshadow: rgba(29, 35, 41, 0.05); + --rightbg2: #f2f3f5; + --listhoverbg: rgba(247, 248, 250, 0.6); + --listselectbg: rgb(240, 245, 255); +} +body[arco-theme='dark'] { + color-scheme: dark; + caret-color: rgba(255, 255, 255, 0.65); + background: #23232e !important; + + --color-text-2: rgba(255, 255, 255, 0.8) !important; + color: var(--color-text-2) !important; + --color-menu-light-bg: #30303d !important; + --color-bg-1: #23232e !important; + --color-bg-popup: #2d2d3b !important; + --color-spin-layer-bg: rgba(51, 51, 51, 0.3) !important; + + --foot-bg: #17171f; + --foot-txt: rgb(210, 210, 211); + --topshadow: rgba(0, 0, 0, 0.5); + --leftshadow: rgba(0, 0, 0, 0.2); + --rightbg2: rgba(255, 255, 255, 0.05); + --listhoverbg: rgba(76, 77, 97, 0.3); + --listselectbg: rgba(85, 86, 109, 0.7); +} + +.arco-layout-sider .arco-menu-light .arco-menu-item.arco-menu-selected { + background: #f0f5ff; + color: var(--color-text-2); +} +.arco-layout-sider .arco-menu-light .arco-menu-item .arco-menu-icon, +.arco-layout-sider .arco-menu-light .arco-menu-item:hover .arco-menu-icon, +.arco-layout-sider .arco-menu-light .arco-menu-item.arco-menu-selected .arco-menu-icon { + color: var(--color-text-2); +} + +body[arco-theme='dark'] .arco-layout-sider, +body[arco-theme='dark'] .arco-layout-sider-light, +body[arco-theme='dark'] .arco-layout-sider .arco-menu-light, +body[arco-theme='dark'] .arco-layout-sider .arco-menu-light .arco-menu-item, +body[arco-theme='dark'] .arco-card { + background: #23232e; +} +body[arco-theme='dark'] .arco-layout-sider .arco-menu-light .arco-menu-item:hover { + background: var(--color-fill-2); +} +body[arco-theme='dark'] .arco-layout-sider .arco-menu-light .arco-menu-item.arco-menu-selected { + background: #444457; +} + +.arco-alert-error { + background-color: rgb(253, 237, 237) !important; +} +.arco-alert-error .arco-alert-icon svg { + color: rgb(239, 83, 80) !important; +} +.arco-alert-error .arco-alert-content { + color: rgb(112, 40, 39) !important; +} + +.arco-alert-warning { + background-color: rgb(255, 244, 229) !important; +} +.arco-alert-warning .arco-alert-icon svg { + color: rgb(255, 152, 0) !important; +} +.arco-alert-warning .arco-alert-content { + color: rgb(117, 69, 1) !important; +} + +.arco-alert-success { + background-color: rgb(237, 247, 237) !important; +} +.arco-alert-success .arco-alert-icon svg { + color: rgb(76, 175, 80) !important; +} +.arco-alert-success .arco-alert-content { + color: rgb(38, 87, 40) !important; +} + +.arco-alert-info .arco-alert-content { + color: rgb(14, 22, 136) !important; +} + +body[arco-theme='dark'] .arco-alert-error { + background-color: rgb(63, 32, 32) !important; +} +body[arco-theme='dark'] .arco-alert-error .arco-alert-icon svg { + color: rgb(244, 67, 54) !important; +} +body[arco-theme='dark'] .arco-alert-error .arco-alert-content { + color: rgb(244, 199, 199) !important; +} + +body[arco-theme='dark'] .arco-alert-warning { + background-color: rgb(66, 49, 20) !important; +} +body[arco-theme='dark'] .arco-alert-warning .arco-alert-icon svg { + color: rgb(255, 167, 38) !important; +} +body[arco-theme='dark'] .arco-alert-warning .arco-alert-content { + color: rgb(255, 226, 183) !important; +} + +body[arco-theme='dark'] .arco-alert-success { + background-color: rgb(39, 61, 42) !important; +} +body[arco-theme='dark'] .arco-alert-success .arco-alert-icon svg { + color: rgb(102, 187, 106) !important; +} +body[arco-theme='dark'] .arco-alert-success .arco-alert-content { + color: rgb(204, 232, 205) !important; +} + +body[arco-theme='dark'] .arco-alert-info .arco-alert-content { + color: rgb(205, 220, 255) !important; +} + +.arco-select, +.arco-menu, +.arco-radio-group-button { + user-select: none; + -webkit-user-drag: none; +} + +.arco-spin:focus, +.arco-list:focus { + outline: none; +} + +button1.arco-btn:focus, +button1:focus { + outline-style: dotted !important; + outline-width: 1px !important; + outline-color: rgb(var(--primary-6)) !important; + outline-offset: 2px !important; +} + +.arco-modal { + width: auto !important; +} +.arco-modal-fullscreen { + width: 100vw !important; + height: 100vh !important; +} +.arco-modal-wrapper { + overflow: hidden !important; +} + +body[arco-theme='dark'] .arco-modal { + background: #2d2d3b !important; + box-shadow: 0 2px 20px 0 rgb(0 0 0 / 45%) !important; +} +body[arco-theme='dark'] .arco-dropdown, +body[arco-theme='dark'] .arco-select-dropdown, +body[arco-theme='dark'] .arco-popover-popup-content { + box-shadow: 0 4px 20px rgb(0 0 0 / 45%) !important; + border: 0 !important; +} + +.arco-radio-button.arco-radio-checked { + background-color: rgb(var(--primary-6)) !important; + color: var(--color-white) !important; +} + +.arco-dropdown-option { + line-height: 32px !important; + width: calc(100% - 8px) !important; + margin: 0 4px !important; + border-radius: 3px !important; +} +.arco-dropdown-option.danger { + color: rgb(255, 77, 79) !important; +} +.arco-dropdown-option.danger:hover, +.arco-dropdown-option.danger:active { + color: #fff !important; + background: rgba(255, 77, 79, 0.85) !important; +} + +.toppanbtn .arco-btn.danger:hover, +.toppanbtn .arco-btn.danger:active, +body[arco-theme='dark'] .toppanbtn .arco-btn.danger:hover, +body[arco-theme='dark'] .toppanbtn .arco-btn.danger:active { + color: #fff !important; + background: rgba(255, 77, 79, 0.85) !important; + border-color: rgba(255, 77, 79, 0.2) !important; +} + +.arco-dropdown-option-suffix { + color: var(--color-text-3); + font-size: 12px; + user-select: none; +} + +.arco-list .arco-empty { + margin-top: 15%; +} + +.arco-modal { + z-index: 1001; +} +.arco-modal-close-btn { + -webkit-app-region: no-drag; + position: absolute; + right: 20px; +} + +.arco-modal-close-btn .arco-icon-hover { + width: 24px; + height: 24px; + line-height: 24px; + border-radius: 50%; +} +.arco-modal-close-btn .arco-icon-hover .arco-icon { + left: 6px; +} +.arco-modal-close-btn .arco-icon-hover::before { + display: none; +} +.arco-modal-close-btn .arco-icon-hover:hover { + background-color: var(--color-fill-2); +} + +.toppanbtns { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + padding: 0; + max-width: 100%; + min-width: 440px; + user-select: none; +} +.toppanbtn { + display: flex; + flex-direction: row; + flex-grow: 0; + flex-shrink: 0; + flex-wrap: nowrap; + border-radius: 4px; + margin-right: 12px; + user-select: none; +} +.toppanbtn:last-child { + margin-right: 0; +} + +.toppanbtn .arco-btn { + display: inline-flex; + align-items: center; + height: 26px !important; + min-height: 26px !important; + padding: 0px 6px !important; + + font-size: 14px !important; + line-height: 18px !important; + white-space: nowrap !important; + word-break: keep-all !important; + color: rgb(var(--primary-6)); + border-color: rgba(var(--primary-6), 0.6) !important; + border-radius: 4px !important; +} + +.toppanbtn .arco-btn:hover, +.toppanbtn .arco-btn:active { + background: rgba(var(--primary-6), 0.1) !important; +} + +.toppanbtn .searchpan { + border: 1px solid rgb(var(--primary-6)) !important; + border-right: none !important; + border-radius: 4px !important; +} +.toppanbtn .searchpan .arco-btn.arco-input-search-btn { + border-radius: 4px !important; +} +.toppanbtn .arco-input-search .arco-input-wrapper { + background: var(--color-bg-2); + border: none !important; +} +.toppanbtn .arco-btn.arco-btn-primary { + border-radius: 0 !important; +} +.toppanbtn .arco-btn.arco-btn-primary:hover { + background: rgb(var(--primary-5)) !important; +} +.toppanbtn .arco-btn.arco-btn-primary:active { + background: rgb(var(--primary-7)) !important; +} + +.toppanbtn > .arco-btn + .arco-btn { + border-left: 0 !important; +} +.toppanbtn > .arco-btn:not(:last-child) { + border-right: 0 !important; +} + +.toppanbtn > .arco-btn:not(:first-child) { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.toppanbtn > .arco-btn:not(:last-child) { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.toppanbtn .iconfont { + font-size: 18px; + line-height: 24px; +} + +.toppanbtn .arco-btn > span { + line-height: 24px; +} + +.toppanbtn .arco-btn > .arco-btn-icon { + min-width: 18px; + margin-right: 0 !important; +} + +.toppanbtn .arco-btn.arco-btn-dangerous:hover, +.toppanbtn .arco-btn.arco-btn-dangerous:focus { + color: #fff !important; + border-color: rgb(255, 77, 79) !important; + background: rgb(255, 77, 79) !important; +} + +.toppanbtn .arco-input-search { + width: 130px; + transition: width 0.3s; +} +@media only screen and (max-width: 859px) { + .arco-input-wrapper { + padding-right: 6px !important; + padding-left: 6px !important; + } +} +@media only screen and (min-width: 820px) { + .toppanbtn .arco-input-search { + width: 140px; + } +} +@media only screen and (min-width: 860px) { + .toppanbtn .arco-input-search { + width: 160px; + } +} +@media only screen and (min-width: 960px) { + .toppanbtn .arco-input-search { + width: 180px; + } + .toppanbtn .arco-input-search.arco-input-focus { + width: 200px; + } +} +@media only screen and (min-width: 1000px) { + .toppanbtn .arco-input-search.arco-input-focus { + width: 220px; + } +} +@media only screen and (min-width: 1200px) { + .toppanbtn .arco-input-search { + width: 200px; + } + .toppanbtn .arco-input-search.arco-input-focus { + width: 240px; + } +} + +body[arco-theme='dark'] .toppanbtn .arco-btn { + background: none !important; +} +body[arco-theme='dark'] .toppanbtn .arco-btn:hover, +body[arco-theme='dark'] .toppanbtn .arco-btn:active { + background: #4c4c61 !important; +} +body[arco-theme='dark'] .toppanbtn .arco-btn { + color: #ffffffd9; + background: #353544; + border: 1px solid #444457; + border-color: #444457 !important; + box-shadow: 0 1px 5px rgb(0 0 0 / 20%), 0 2px 2px rgb(0 0 0 / 14%), 0 3px 1px -2px rgb(0 0 0 / 12%) !important; +} +.toppanarea { + box-sizing: border-box; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + height: 40px; + color: var(--color-text-3); + line-height: 38px; + border-top: 1px solid #e5e8ed99; + border-bottom: 1px solid #e5e8ed99; +} +body[arco-theme='dark'] .toppanarea { + border-top: 1px solid #e5e8ed22; + border-bottom: 1px solid #e5e8ed22; +} + +.toppanarea > div { + display: flex; + align-items: center; + height: 38px; +} +.toppanarea .selectInfo { + height: 38px; + line-height: 38px; + font-size: 14px; + overflow: hidden; + white-space: nowrap; + word-break: keep-all; +} +.toppanarea .cell { + font-size: 12px; +} +.toppanarea .cell.active, +.toppanarea .cell.active .iconxia { + color: rgb(var(--primary-6)); +} + +.select, +.select > button { + min-width: 34px !important; + height: 34px !important; + min-height: 34px !important; + padding: 0px !important; + color: rgb(var(--primary-6)) !important; + font-size: 14px; + line-height: 34px !important; + border: none !important; +} +.select:hover, +.select:active { + background: rgba(99, 125, 255, 0.1) !important; + color: rgb(var(--primary-6)) !important; +} +.select .iconfont { + font-size: 24px; + line-height: 34px; +} +.select .iconfont.iconrpic { + opacity: 0.8; +} +.vermodalhead { + display: flex; + align-items: center; + line-height: 48px; +} +.verupdate { + width: 48px; + height: 48px; + display: inline-block; + background-size: contain; + background-image: url(data:image/png;base64,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MSJbtyrnpukiR4/anoPIQkBghz7rEmnYUJSzT2T5cttzwpZypol06iQiBATljktYAAAjBAQAYISAAACM8BwIgJAR/Kt+PFh70SKnr+Q4B95555IfWF8GB1sWF8trto8gshAQACEjWOejvLu2rlgRFGkoW22vwX/DJSwAgBECAgAwQkAAAEYICADACAEBABghIAAAIwQEAGCEgAAAjBAQAIARAgIAMEJAAABGCAgAwAgBAQAYISAAACMEBABghIAAAIwQEACAEQICADDCLW1hiT4nUlAgIj6Rt96yvSZs6WAbkfx82zMQmQgIrFDOzSNFvv76wkc9e9reE8b+YnsAIheXsAAARggIAMAIAQEAGCEgAAAjBAQAYISAAACMEBAAgBECAgAwQkAAAEYICADACAEBABghIAAAIwQEAGCEgAAAjBAQAIARAgIAMEJAAABG/h+9SX6edMAaRQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wMi0xNlQxODo0ODozOCswODowMJ6ZayIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDItMTZUMTg6NDg6MzgrMDg6MDDvxNOeAAAASnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl94bjhrYnQ4OHZkai9jcy1zai0xLnN2Z7EpmJkAAAAASUVORK5CYII=); +} +.vertip { + padding-left: 12px; + color: rgb(40, 104, 240); + flex-grow: 1; +} + +.arco-tree-node-custom-icon { + margin-right: 4px !important; +} + +.xbyleft { + box-shadow: 2px 0 8px 0 var(--leftshadow) !important; +} +.xbyright { + padding-left: 16px; +} +.headdesc { + box-sizing: border-box; + height: 40px; + padding: 0 0 0 12px; + color: #8a9ca5; + line-height: 40px; + user-select: none; + -webkit-user-drag: none; + white-space: nowrap; + word-break: keep-all; + overflow: hidden; +} + +.xbyleftmenu.arco-menu .arco-menu-inner { + padding: 0 2px 0 0 !important; +} +.xbyleftmenu.arco-menu .arco-menu-item { + padding: 0 8px; + margin-bottom: 2px; + line-height: 40px; + height: 40px; +} + +.xbyleftmenu.arco-menu .arco-menu-item::after { + position: absolute; + top: 0; + left: 0; + bottom: 0; + transform: scaleY(0.0001); + opacity: 0; + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); + content: ''; +} +.xbyleftmenu.arco-menu .arco-menu-item.arco-menu-selected::after { + transform: scaleY(1); + opacity: 1; + transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + border-right: 2px solid #637dff; +} +.xbyleftmenu.arco-menu .arco-menu-item .arco-menu-icon { + width: 30px; + text-align: left; + margin-right: 0; + padding-left: 2px; + display: inline-block; + flex-shrink: 0; + flex-grow: 0; +} +.xbyleftmenu.arco-menu .arco-menu-item .arco-menu-icon .iconfont { + font-size: 20px; +} + +.arco-select-dropdown .arco-select-option, +.arco-autocomplete-popup .arco-select-popup .arco-select-option { + line-height: 28px !important; + height: 28px !important; +} diff --git a/packages/renderer/src/down/DownDowned.vue b/packages/renderer/src/down/DownDowned.vue new file mode 100644 index 0000000..fa3c1d2 --- /dev/null +++ b/packages/renderer/src/down/DownDowned.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/packages/renderer/src/down/DownDowning.vue b/packages/renderer/src/down/DownDowning.vue new file mode 100644 index 0000000..af7aa53 --- /dev/null +++ b/packages/renderer/src/down/DownDowning.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/packages/renderer/src/down/DownM3U8.vue b/packages/renderer/src/down/DownM3U8.vue new file mode 100644 index 0000000..d07f1f3 --- /dev/null +++ b/packages/renderer/src/down/DownM3U8.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/packages/renderer/src/down/DownSync.vue b/packages/renderer/src/down/DownSync.vue new file mode 100644 index 0000000..76db593 --- /dev/null +++ b/packages/renderer/src/down/DownSync.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/packages/renderer/src/down/DownUploaded.vue b/packages/renderer/src/down/DownUploaded.vue new file mode 100644 index 0000000..f621662 --- /dev/null +++ b/packages/renderer/src/down/DownUploaded.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/packages/renderer/src/down/DownUploading.vue b/packages/renderer/src/down/DownUploading.vue new file mode 100644 index 0000000..c887f6b --- /dev/null +++ b/packages/renderer/src/down/DownUploading.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/packages/renderer/src/down/downdal.ts b/packages/renderer/src/down/downdal.ts new file mode 100644 index 0000000..9682a08 --- /dev/null +++ b/packages/renderer/src/down/downdal.ts @@ -0,0 +1,103 @@ +import { IAliGetFileModel } from '@/aliapi/alimodels' + +export interface IStateDownFile { + DownID: string + Info: IStateDownInfo + + Down: { + + DownState: string + DownTime: number + DownSize: number + DownSpeed: number + DownSpeedStr: string + DownProcess: number + IsStop: boolean + IsDowning: boolean + IsCompleted: boolean + IsFailed: boolean + FailedCode: number + FailedMessage: string + + AutoTry: number + + DownUrl: string + } +} +export interface IStateDownInfo { + + GID: string + user_id: string + + DownSavePath: string + ariaRemote: boolean + + file_id: string + drive_id: string + + name: string + + size: number + sizestr: string + icon: string + isDir: boolean + + sha1: string + + crc64: string +} + + +export interface IAriaDownProgress { + gid: string + status: string + totalLength: string + completedLength: string + downloadSpeed: string + errorCode: string + errorMessage: string +} + +export let DowningList = new Map() +export let DownedList: IStateDownFile[] = [] +export default class DownDAL { + + /** + * 从DB中加载数据 + */ + static async aLoadFromDB() {} + + /** + * 添加到下载动作 + * @param filelist + * @param savepath + * @param needPanPath + * @param tip + */ + static aAddDownload(filelist: IAliGetFileModel[], savepath: string, needPanPath: boolean, tip: boolean) {} + + /** + * 速度事件动作 + */ + static async aSpeedEvent() { + } + + /** + * 速度事件方法 + */ + static mSpeedEvent(list: IAriaDownProgress[]) {} + + /** + * 查询是否下载中 + */ + static QueryIsDowning() { + return false + } + + /** + * ?查询选择的是否下载中? + */ + static QuerySelectedIsDowning() { + return false + } +} diff --git a/packages/renderer/src/down/downstore.ts b/packages/renderer/src/down/downstore.ts new file mode 100644 index 0000000..5eb5fc9 --- /dev/null +++ b/packages/renderer/src/down/downstore.ts @@ -0,0 +1,22 @@ +import { defineStore } from 'pinia' +import { IAliGetFileModel } from '@/aliapi/alimodels' + +export interface DownState { + logTime: number +} + +const useDownStore = defineStore('down', { + state: (): DownState => ({ + logTime: Date.now() + }), + + getters: {}, + + actions: { + logRefresh(time: number) { + this.logTime = time + } + } +}) + +export default useDownStore diff --git a/packages/renderer/src/down/index.vue b/packages/renderer/src/down/index.vue new file mode 100644 index 0000000..f92ce51 --- /dev/null +++ b/packages/renderer/src/down/index.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/packages/renderer/src/down/uploaddal.ts b/packages/renderer/src/down/uploaddal.ts new file mode 100644 index 0000000..dfd60dc --- /dev/null +++ b/packages/renderer/src/down/uploaddal.ts @@ -0,0 +1,368 @@ +import type { IAriaDownProgress } from "./downdal" +import path from 'path' +import { GetKeyHashNumber, humanSize } from '@/utils/format' +import message from '@/utils/message' +import type { IStateUploadFile } from '@/aliapi/models' +import useUploadStore from '@/down/uploadstore' +import useUploadingStore from '@/down/uploadingstore' +import DB from '@/utils/db' +import useSettingStore from '@/setting/settingstore' +import { UploadAdd, UploadCmd } from '@/down/uploadservice' +import fsPromises from 'fs/promises' + +// const UploadStore = useUploadStore(); + +export let UploadingList = new Map() +export let UploadedList: IStateUploadFile[] = [] +export default class UploadDAL { + + /** + * 从DB中加载数据 + */ + static async aLoadFromDB() { + const uploadingStore = useUploadingStore() + uploadingStore.ListLoading = true + uploadingStore.ListDataRaw = await DB.getUploadingAll() + uploadingStore.mRefreshListDataShow(true) + uploadingStore.ListLoading = false + } + + /** + * 上传事件动作
+ * 在上传列表中,计算要上传的文件
+ * 并调用 @/down/uploadservice -> UploadAdd + * @param list + */ + static aUploadEvent(list: IAriaDownProgress[]) { + const uploadingStore = useUploadingStore(); + const UploadingList = uploadingStore.ListDataRaw + if (list == undefined) list = []; + UploadDAL.mUploadEvent(list) + + let downingCount = 0 + let downingCountMC = 0 + + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].Upload.IsDowning) { + if (UploadingList[j].Info.isMiaoChuan) downingCountMC++ + else downingCount++ + } + if (UploadingList[j].Upload.IsCompleted && UploadingList[j].Upload.DownState === '已完成') { + UploadDAL.mSaveToUploaded(UploadingList[j].UploadID) + j-- + } + } + const time = Date.now() - 60 * 1000 + const addlist: IStateUploadFile[] = []; + const uploadFileMax = useSettingStore().uploadFileMax + for (let j = 0; j < UploadingList.length; j++) { + if (downingCount >= uploadFileMax) break + const down = UploadingList[j].Upload + if (down.IsCompleted == false && down.IsDowning == false && down.IsStop == false) { + if ((down.IsFailed == false || time > down.AutoTry) && UploadingList[j].Info.isMiaoChuan == false) { + downingCount++ + UploadDAL.mUpdateUploadingState({ UploadID: UploadingList[j].UploadID, IsDowning: true, DownSpeedStr: '', DownState: '解析中', DownTime: Date.now(), FailedCode: 0, FailedMessage: '' }) + addlist.push(UploadingList[j]) + } + } + } + const downFileMaxMC = 40 - downingCount + for (let j = 0; j < UploadingList.length; j++) { + if (downingCountMC >= downFileMaxMC) break + const down = UploadingList[j].Upload + if (down.IsCompleted == false && down.IsDowning == false && down.IsStop == false) { + if ((down.IsFailed == false || time > down.AutoTry) && UploadingList[j].Info.isMiaoChuan) { + downingCountMC++ + UploadDAL.mUpdateUploadingState({ UploadID: UploadingList[j].UploadID, IsDowning: true, DownSpeedStr: '', DownState: '解析中', DownTime: Date.now(), FailedCode: 0, FailedMessage: '' }); + addlist.push(UploadingList[j]) + } + } + } + + //if (addlist.length > 0 && window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadAdd', addlist }); + if (addlist.length > 0) UploadAdd(addlist) + uploadingStore.mRefreshListDataShow(true) + + } + + /** + * 上传事件方法
+ * 计算状态的变化 + * @param list + */ + static mUploadEvent(list: IAriaDownProgress[]) { + const uploadingStore = useUploadingStore(); + const UploadingList = uploadingStore.ListDataRaw + if (list == undefined) list = []; + const dellist: string[] = []; + + // TODO 这里是不是可以做优化,没有必要每秒对UploadingList做循环,只对执行中的列表循环即可 + for (let n = 0; n < UploadingList.length; n++) { + if (UploadingList[n].Upload.DownSpeedStr != '') { + const UploadID = UploadingList[n].UploadID; + let isFind = false; + for (let m = 0; m < list.length; m++) { + if (list[m].gid != UploadID) continue + if (list[m].status == '解析中' || list[m].status.indexOf('%') > -1) { + isFind = true; + break; + } + } + if (!isFind) { + if (UploadingList[n].Upload.DownState != '已暂停') UploadingList[n].Upload.DownState = '队列中' + UploadingList[n].Upload.DownSpeed = 0 + UploadingList[n].Upload.DownSpeedStr = '' + } + } + } + + const savelist: IStateUploadFile[] = []; + for (let i = 0; i < list.length; i++) { + try { + const UploadID = list[i].gid; + + const isComplete = list[i].status === '已完成'; + const isDowning = list[i].status === '上传中' || list[i].status.indexOf('%') > -1; + const isStop = list[i].status === '已暂停' || list[i].status === '待删除'; + const isError = !isComplete && list[i].status === '已出错'; + + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + + const downitem = UploadingList[j]; + const down = downitem.Upload; + const totalLength = parseInt(list[i].totalLength) || 0; + down.DownSize = parseInt(list[i].completedLength) || 0; + down.DownSpeed = parseInt(list[i].downloadSpeed) || 0; + down.DownSpeedStr = humanSize(down.DownSpeed) + '/s'; + down.DownProcess = Math.floor((down.DownSize * 100) / (totalLength + 1)) % 100; + + + down.IsCompleted = isComplete; + down.IsDowning = isDowning; + down.IsFailed = isError; + down.IsStop = isStop; + + if (list[i].errorCode && list[i].errorCode != '0') { + down.FailedCode = parseInt(list[i].errorCode) || 0; + down.FailedMessage = list[i].errorMessage; + } + + if (isComplete) { + down.DownState = '已完成'; + down.DownSize = downitem.Info.size; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.DownProcess = 100; + down.FailedCode = 0; + down.FailedMessage = ''; + down.AutoTry = 0; + down.IsDowning = false + down.IsStop = true + } else if (isStop) { + down.DownState = '已暂停'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.FailedCode = 0; + down.FailedMessage = ''; + down.IsDowning = false + } else if (isError) { + down.DownState = '待重试'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.AutoTry = Date.now(); + if (down.FailedMessage == '') down.FailedMessage = '上传失败'; + down.IsDowning = false + } else if (isDowning) { + down.FailedMessage = list[i].errorMessage; + let lasttime = ((totalLength - down.DownSize) / (down.DownSpeed + 1)) % 356400; + if (lasttime < 1) lasttime = 1; + down.DownState = + down.DownProcess.toString() + + '% ' + + (lasttime / 3600).toFixed(0).padStart(2, '0') + + ':' + + ((lasttime % 3600) / 60).toFixed(0).padStart(2, '0') + + ':' + + (lasttime % 60).toFixed(0).padStart(2, '0') + DB.saveUploading(downitem.UploadID, JSON.parse(JSON.stringify(downitem))) + } else { + //console.log('update', UploadingList[j]); + } + if (isStop || isError) { + dellist.push(UploadID); + } + uploadingStore.mRefreshListDataShow(true) + break; + } + } + } catch {} + } + if (dellist.length > 0) { + UploadCmd(false,'delete', dellist) + // if (window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadCmd', uploadCmd: 'delete', uploadAll: false, uploadIDList: dellist }); + } + } + + static mUpdateUploadingState(data: any) { + const uploadingStore = useUploadingStore(); + const UploadingList = uploadingStore.ListDataRaw + const UploadID = data.UploadID; + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + UploadingList[j].Upload = { ...UploadingList[j].Upload, ...data }; + break; + } + } + uploadingStore.mRefreshListDataShow(true) + } + + /** + * 将上传完成的删除并保存到上传历史中 + * @param UploadID + */ + static mSaveToUploaded(UploadID: string) { + const uploadingStore = useUploadingStore() + const UploadingList = uploadingStore.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID && UploadingList[j].Upload.DownState === '已完成') { + const item = UploadingList[j] + UploadingList.splice(j, 1) + DB.deleteUploading(item.UploadID) + item.Upload.DownTime = Date.now() + item.UploadID = item.UploadID + '_' + item.Upload.DownTime.toString() + UploadedList.splice(0, 0, item) + DB.saveUploaded(item.UploadID, JSON.parse(JSON.stringify(item))) + break + } + } + if (uploadingStore.ListSelected.has(UploadID)) uploadingStore.ListSelected.delete(UploadID) + } + + /** + * 上传目录 + * @param user_id + * @param drive_id + * @param parentid + * @param localDirPath + */ + static UploadLocalDir(user_id: string, drive_id: string, parentid: string, localDirPath: string) {} + + /** + * 上传多个本地文件 + * @param user_id + * @param drive_id + * @param parentid + * @param files + * @param tip + */ + static async UploadLocalFiles(user_id: string, drive_id: string, parentid: string, files: string[], tip: boolean) { + if (files == undefined || files.length == 0) return 0; + const uploadinglist: IStateUploadFile[] = []; + let subpath = path.dirname(files[0]); + if (subpath.endsWith('/') || subpath.endsWith('\\')) subpath = subpath.substr(0, subpath.length - 1); + const sublen = subpath.length + 1; + const PIDHex = GetKeyHashNumber(user_id + '_' + drive_id).toString(16) + '_' + GetKeyHashNumber(parentid).toString(16); + const plist: Promise[] = []; + let dtime = Date.now(); + for (let i = 0; i < files.length; i++) { + let filepath = files[i]; + if (filepath.endsWith('$RECYCLE.BIN')) continue; + if (filepath.endsWith('System Volume Information')) continue; + if (filepath.endsWith('Thumbs.db')) continue; + if (filepath.endsWith('desktop.ini')) continue; + if (filepath.endsWith('.DS_Store')) continue; + plist.push( + fsPromises + .lstat(filepath) + .then((stat: any) => { + let isdir = false; + if (stat.isDirectory()) { + isdir = true; + if (filepath.endsWith('/')) filepath = filepath.substr(0, filepath.length - 1); + else if (filepath.endsWith('\\')) filepath = filepath.substr(0, filepath.length - 1); + } + + const UploadID = PIDHex + GetKeyHashNumber(filepath).toString(16) + '_' + stat.size.toString(16); + uploadinglist.push({ + UploadID: UploadID, + Info: { + user_id: user_id, + localFilePath: isdir ? filepath + path.sep : filepath, + path: '', + parent_id: parentid, + drive_id: drive_id, + name: filepath.substr(sublen), + size: stat.size, + sizestr: humanSize(stat.size), + icon: isdir ? 'iconfont iconfolder' : 'iconfont iconwenjian', + isDir: isdir, + isMiaoChuan: false, + sha1: '', + crc64: '', + }, + Upload: { + DownState: '', + DownTime: dtime++, + DownSize: 0, + DownSpeed: 0, + DownSpeedStr: '', + DownProcess: 0, + IsStop: false, + IsDowning: false, + IsCompleted: false, + IsFailed: false, + FailedCode: 0, + FailedMessage: '', + AutoTry: 0, + upload_id: '', + file_id: '', + IsBreakExist: false + }, + }); + }) + .catch((e: any) => { + message.info(JSON.stringify(e)); + console.log(filepath, e); + }) + ); + } + await Promise.all(plist); + useUploadingStore().mAddUploading({ uploadinglist, tip }); + return uploadinglist.length; + } + + /** + * 保存到下载中 + * @param UploadID + * @param file_id + * @param upload_id + */ + static mSaveToUploading(UploadID: string, file_id: string, upload_id: string) { + const uploadingStore = useUploadingStore() + const UploadingList = uploadingStore.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + UploadingList[j].Upload.file_id = file_id + UploadingList[j].Upload.upload_id = upload_id + DB.saveUploading(UploadingList[j].UploadID, JSON.parse(JSON.stringify(UploadingList[j]))) + break; + } + } + } + + /** + * 查询是否上传中 + */ + static QueryIsUploading() { + return false + } + + /** + * 查询选择的是否上传中 + */ + static QuerySelectedIsUploading() { + return false + } + +} diff --git a/packages/renderer/src/down/uploadingstore.ts b/packages/renderer/src/down/uploadingstore.ts new file mode 100644 index 0000000..04ad7f8 --- /dev/null +++ b/packages/renderer/src/down/uploadingstore.ts @@ -0,0 +1,456 @@ +import fuzzysort from 'fuzzysort' +import { defineStore } from 'pinia' +import { IStateUploadFile } from '@/aliapi/models' +import { GetSelectedList, GetFocusNext, SelectAll, MouseSelectOne, KeyboardSelectOne } from '@/utils/selecthelper' +import { humanSize } from '@/utils/format' +import message from '@/utils/message' +import DB from '@/utils/db' +import { UploadCmd } from '@/down/uploadservice' + +type Item = IStateUploadFile +type State = UploadingState +const KEY = 'UploadID' + +export interface UploadingState { + + ListLoading: boolean + + ListDataRaw: Item[] + + ListDataShow: Item[] + + ListSelected: Set + + ListOrderKey: string + + ListFocusKey: string + + ListSelectKey: string + + ListSearchKey: string +} + +const useUploadingStore = defineStore('uploading', { + state: (): State => ({ + ListLoading: false, + ListDataRaw: [], + ListDataShow: [], + ListSelected: new Set(), + ListOrderKey: 'UploadID', + ListFocusKey: '', + ListSelectKey: '', + ListSearchKey: '' + }), + + getters: { + ListDataCount(state: State): number { + return state.ListDataShow.length + }, + + IsListSelected(state: State): boolean { + return state.ListSelected.size > 0 + }, + + ListSelectedCount(state: State): number { + return state.ListSelected.size + }, + + ListDataSelectCountInfo(state: State): string { + return '已选中 ' + state.ListSelected.size + ' / ' + state.ListDataShow.length + ' 个' + }, + + IsListSelectedAll(state: State): boolean { + return state.ListSelected.size > 0 && state.ListSelected.size == state.ListDataShow.length + }, + + ListStats(state: State) { + let stats = { count: 0, runningCount: 0, totalSize: 0, totalSizeStr: '' } + let list = state.ListDataShow + let item: Item + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + stats.count++ + stats.totalSize += item.Info.size + if (item.Upload.IsDowning) stats.runningCount++ + } + stats.totalSizeStr = humanSize(stats.totalSize) + return stats + } + }, + + actions: { + + aLoadListData(list: Item[]) { + + let item: Item + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + } + this.ListDataRaw = this.mGetOrder(this.ListOrderKey, list) + + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = list[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + + this.$patch({ ListSelected: newSelected, ListFocusKey: '', ListSelectKey: '', ListSearchKey: '' }) + this.mRefreshListDataShow(true) + }, + + mSearchListData(value: string) { + this.$patch({ ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '', ListSearchKey: value }) + this.mRefreshListDataShow(true) + }, + + mOrderListData(value: string) { + this.$patch({ ListOrderKey: value, ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '' }) + this.ListDataRaw = this.mGetOrder(value, this.ListDataRaw) + this.mRefreshListDataShow(true) + }, + + mGetOrder(order: string, list: Item[]) { + return list + }, + + /** + * 刷新显示的列表数据 + * @param refreshRaw 是否从原始数据中刷新显示 + */ + mRefreshListDataShow(refreshRaw: boolean) { + if (!refreshRaw) { + let ListDataShow = this.ListDataShow.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + return + } + if (this.ListSearchKey) { + + let searchlist: Item[] = [] + let results = fuzzysort.go(this.ListSearchKey, this.ListDataRaw, { + threshold: -200000, + keys: ['Info.name'], + scoreFn: (a) => Math.max(a[0] ? a[0].score : -200000, a[1] ? a[1].score : -200000) + }) + for (let i = 0, maxi = results.length; i < maxi; i++) { + if (results[i].score > -200000) searchlist.push(results[i].obj as Item) + } + Object.freeze(searchlist) + this.ListDataShow = searchlist + } else { + + let ListDataShow = this.ListDataRaw.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + } + + let freezelist = this.ListDataShow + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = freezelist.length; i < maxi; i++) { + key = freezelist[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + this.ListSelected = newSelected + }, + + mSelectAll() { + this.$patch({ ListSelected: SelectAll(this.ListDataShow, KEY, this.ListSelected), ListFocusKey: '', ListSelectKey: '' }) + this.mRefreshListDataShow(false) + }, + + mMouseSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = MouseSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + mKeyboardSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = KeyboardSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + GetSelected() { + return GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedFirst() { + let list = GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + if (list.length > 0) return list[0] + return undefined + }, + + mSetFocus(key: string) { + this.ListFocusKey = key + this.mRefreshListDataShow(false) + }, + + mGetFocus() { + if (this.ListFocusKey == '' && this.ListDataShow.length > 0) return this.ListDataShow[0][KEY] + return this.ListFocusKey + }, + + mGetFocusNext(position: string) { + return GetFocusNext(this.ListDataShow, KEY, this.ListFocusKey, position) + }, + + mDeleteFiles(shareidlist: string[]) { + let filemap = new Set(shareidlist) + let ListDataRaw = this.ListDataRaw + let NewDataList: Item[] = [] + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (!filemap.has(item[KEY])) { + NewDataList.push(item) + } + } + if (this.ListDataRaw.length != NewDataList.length) { + this.ListDataRaw = NewDataList + this.mRefreshListDataShow(true) + } + }, + + mAddUploading({ uploadinglist, tip }: { uploadinglist: IStateUploadFile[]; tip: boolean }) { + const savelist = []; + const haslist = new Map(); + for (let i = 0; i < this.ListDataRaw.length; i++) { + haslist.set(this.ListDataRaw[i].UploadID, true); + } + for (let d = 0; d < uploadinglist.length; d++) { + const downitem = uploadinglist[d]; + if (!haslist.has(downitem.UploadID)) { + Object.freeze(downitem.Info); + savelist.push(downitem); + DB.saveUploading(downitem.UploadID, downitem); + } + } + this.ListDataRaw.push(...savelist); + this.mRefreshListDataShow(true) + if (tip) { + message.success('成功创建 ' + savelist.length.toString() + '个上传任务'); + } + }, + + /** + * 开始上传,只改变状态,待定时任务处理 + */ + mStartUploading() { + const UploadingList = this.ListDataRaw + for (const UploadID of this.ListSelected) { + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + const down = UploadingList[j].Upload; + if (down.IsDowning || down.IsCompleted) continue; + down.IsStop = false; + down.DownState = '队列中'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.IsFailed = false; + down.FailedCode = 0; + down.FailedMessage = ''; + down.AutoTry = 0; + break; + } + } + } + }, + + /** + * 开始全部 + */ + mStartAllUploading() { + const UploadingList = this.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + const down = UploadingList[j].Upload; + if (down.IsDowning || down.IsCompleted) continue; + down.IsStop = false; + down.DownState = '队列中'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.IsFailed = false; + down.FailedCode = 0; + down.FailedMessage = ''; + down.AutoTry = 0; + } + }, + + /** + * 暂停上传,只改变状态,待定时任务处理 + */ + mStopUploading() { + const uploadIDList: string[] = []; + const UploadingList = this.ListDataRaw + for (const UploadID of this.ListSelected) { + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + const down = UploadingList[j].Upload; + if (down.IsCompleted) continue; + uploadIDList.push(UploadingList[j].UploadID); + down.IsDowning = false; + down.IsCompleted = false; + down.IsStop = true; + down.DownState = '已暂停'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.IsFailed = false; + down.FailedCode = 0; + down.FailedMessage = ''; + down.AutoTry = 0; + break; + } + } + } + UploadCmd(false, 'stop', uploadIDList) + // if (window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadCmd', uploadCmd: 'stop', uploadAll: false, uploadIDList }); + this.mRefreshListDataShow(true) + }, + + /** + * 暂停全部 + */ + mStopAllUploading() { + const uploadIDList: string[] = []; + const UploadingList = this.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + const down = UploadingList[j].Upload; + if (down.IsCompleted) continue; + uploadIDList.push(UploadingList[j].UploadID); + down.IsDowning = false; + down.IsStop = true; + down.DownState = '已暂停'; + down.DownSpeed = 0; + down.DownSpeedStr = ''; + down.IsFailed = false; + down.FailedCode = 0; + down.FailedMessage = ''; + down.AutoTry = 0; + } + UploadCmd(false, 'stop', uploadIDList) + // if (window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadCmd', uploadCmd: 'stop', uploadAll: true, uploadIDList }); + this.mRefreshListDataShow(true) + }, + + /** + * 删除上传,修改为“待删除”状态,并从列表中删除
+ * 注:上传服务中的执行列表,请根据状态做进一步处理 + * @param uploadIDList + */ + mDeleteUploading(uploadIDList: string[]) { + const UploadingList = this.ListDataRaw + const newListSelected = new Set(this.ListSelected); + const newList: IStateUploadFile[] = []; + for (let j = 0; j < UploadingList.length; j++) { + const UploadID = UploadingList[j].UploadID; + if (uploadIDList.includes(UploadID)) { + UploadingList[j].Upload.DownState = '待删除' + if (newListSelected.has(UploadID)) newListSelected.delete(UploadID); + } else { + newList.push(UploadingList[j]); + } + } + this.ListDataRaw = newList; + this.ListSelected = newListSelected; + DB.deleteUploadings(uploadIDList) + this.mRefreshListDataShow(true) + UploadCmd(false, 'delete', uploadIDList) + // if (window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadCmd', uploadCmd: 'delete', uploadAll: false, uploadIDList }); + }, + + /** + * 删除全部,修改为“待删除”状态,并从列表中删除
+ * 注:上传服务中的执行列表,请根据状态做进一步处理 + */ + mDeleteAllUploading() { + const UploadingList = this.ListDataRaw + this.ListSelected = new Set() + const uploadIDList: string[] = [] + for (let j = 0; j < UploadingList.length; j++) { + const UploadID = UploadingList[j].UploadID + uploadIDList.push(UploadID) + } + UploadingList.splice(0, UploadingList.length) + DB.deleteUploadingAll() + this.mRefreshListDataShow(true) + UploadCmd(false, 'delete', uploadIDList) + // if (window.WinMsgToUI) window.WinMsgToUI({ cmd: 'UploadCmd', uploadCmd: 'delete', uploadAll: true, uploadIDList }); + }, + + /** + * 排序 + * @param uploadIDList 要放在前面的上传ID + */ + mOrderUploading(uploadIDList: string[]) { + const UploadingList = this.ListDataRaw + const newlist: IStateUploadFile[] = []; + const lastlist: IStateUploadFile[] = []; + + for (let j = 0; j < UploadingList.length; j++) { + const UploadID = UploadingList[j].UploadID; + let find = false; + for (let i = 0; i < uploadIDList.length; i++) { + if (uploadIDList[i] == UploadID) { + newlist.push(UploadingList[j]); + find = true; + break; + } + } + if (!find) { + lastlist.push(UploadingList[j]); + } + } + UploadingList.splice(0, UploadingList.length, ...newlist, ...lastlist); + this.mRefreshListDataShow(true) + }, + + /** + * 保存到历史中,并从列表中删除 + * @param UploadID + */ + mSaveToUploaded(UploadID: string) { + const UploadingList = this.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID && UploadingList[j].Upload.DownState === '已完成') { + const item = UploadingList[j]; + + UploadingList.splice(j, 1); + DB.deleteUploading(UploadID) + + item.Upload.DownTime = Date.now(); + item.UploadID = item.UploadID + '_' + item.Upload.DownTime.toString(); + // UploadedList.splice(0, 0, item); // TODO 更新页面中的历史记录 + DB.saveUploaded(item.UploadID, item) + + break; + } + } + if (this.ListSelected.has(UploadID)) this.ListSelected.delete(UploadID) + }, + + /** + * 保存 + * @param UploadID + * @param file_id + * @param upload_id + */ + mSaveToUploading({ UploadID, file_id, upload_id }: { UploadID: string; file_id: string; upload_id: string }) { + const UploadingList = this.ListDataRaw + for (let j = 0; j < UploadingList.length; j++) { + if (UploadingList[j].UploadID == UploadID) { + UploadingList[j].Upload.file_id = file_id; + UploadingList[j].Upload.upload_id = upload_id; + DB.saveUploading(UploadingList[j].UploadID, UploadingList[j]) + break; + } + } + }, + + } +}) + +export default useUploadingStore diff --git a/packages/renderer/src/down/uploadservice.ts b/packages/renderer/src/down/uploadservice.ts new file mode 100644 index 0000000..935f23f --- /dev/null +++ b/packages/renderer/src/down/uploadservice.ts @@ -0,0 +1,306 @@ +import { humanSize, guid } from '@/utils/format' +import AliFile from '@/aliapi/file' +import { IUploadCreat } from '@/aliapi/models' +import AliUpload from '@/aliapi/upload' +import AliUploadHash from '@/aliapi/uploadhash' +import DB from '@/utils/db' +import { IAriaDownProgress } from '@/down/downdal' +import { IStateUploadFile } from '@/aliapi/models' +import { ITokenInfo } from '@/user/userstore' +import AliFileCmd from '@/aliapi/filecmd' +import UploadDAL from '@/down/uploaddal' +import fsPromises from 'fs/promises' + +const UploadList: IStateUploadFile[] = []; + +/** + * 上传事件 + */ +export async function UploadEvent() { + const list: IAriaDownProgress[] = []; + for (let j = 0; j < UploadList.length; j++) { + const item = UploadList[j]; + try { + if (item.Upload.FailedMessage.startsWith('计算sha1(')) { + const posnow = AliUploadHash.GetFileHashProofSpeed(item.UploadID); + let speed = posnow - item.Upload.DownSize; + item.Upload.DownSize = posnow; + if (speed < 0) speed = 0; + list.push({ + gid: item.UploadID, + status: item.Upload.DownState, + totalLength: item.Info.size.toString(), + completedLength: '0', + downloadSpeed: '0', + errorCode: item.Upload.FailedCode.toString(), + errorMessage: item.Upload.FailedMessage + ' ' + humanSize(speed) + '/s', + }); + } else if (item.Upload.DownState == '已暂停' || item.Upload.DownState == '待删除') { + UploadList.splice(j, 1) + j--; + } else { + const posnow = AliUpload.GetFileUploadProofSpeed(item.UploadID); + let speed = posnow - item.Upload.DownSize; + item.Upload.DownSize = posnow; + if (speed < 0) speed = 0; + list.push({ + gid: item.UploadID, + status: item.Upload.DownState, + totalLength: item.Info.size.toString(), + completedLength: item.Upload.DownSize.toString(), + downloadSpeed: speed.toString(), + errorCode: item.Upload.FailedCode.toString(), + errorMessage: item.Upload.FailedMessage, + }); + } + } catch {} + } + + UploadDAL.aUploadEvent(list) + //if (window.WinMsgToMain) window.WinMsgToMain({ cmd: 'MainUploadEvent', list }); // 发送到主进程执行上传 +} + +/** + * 添加到上传 + * @param uploadList + * @constructor + */ +export function UploadAdd(uploadList: IStateUploadFile[]) { + + for (let i = 0; i < uploadList.length; i++) { + const item = uploadList[i]; + let find = false; + for (let j = 0; j < UploadList.length; j++) { + if (item.UploadID == UploadList[j].UploadID) { + find = true; + /* TODO PingKu:已经正在执行上传中的就 **不要外部更改上传状态** 了,除非要重新执行上传处理, + 但我认为更合理的处理方法是内部做重试,或者从执行列表中移除再添加 + 再或者是使用 ReStartUpload 方法做单独处理,防止重复的执行上传处理 + */ + if (item.Upload.DownState != '解析中' && item.Upload.DownState.indexOf('%') < 0) { + item.Upload.DownState = '解析中'; + StartUpload(item); + } + break; + } + } + if (!find) { + item.Upload.DownState = '解析中' + UploadList.push(item); + StartUpload(item); + } + } +} + +export function UploadCmd(uploadAll: boolean, uploadCmd: string, uploadIDList: string[]) { + for (let j = 0; j < UploadList.length; j++) { + const UploadID = UploadList[j].UploadID; + if (uploadAll || uploadIDList.includes(UploadID)) { + if (uploadCmd == 'stop') { + // TODO if 和 else 有区别吗? + if (UploadList[j].Upload.DownState == '解析中' || UploadList[j].Upload.DownState.indexOf('%') > -1) + StopUpload(UploadList[j], false); + else + UploadList[j].Upload.DownState = '已暂停'; + } else if (uploadCmd == 'delete') { + if (UploadList[j].Upload.DownState == '解析中' || UploadList[j].Upload.DownState.indexOf('%') > -1) + StopUpload(UploadList[j], true); + else + UploadList[j].Upload.DownState = '待删除'; + } + } + } +} + +function StopUpload(item: IStateUploadFile, isDelete: boolean) { + item.Upload.DownState = '已暂停' + if (isDelete) item.Upload.DownState = '待删除' +} + +/** + * 重新上传Url + * @param uploadinfo + * @param item + * @param token TODO PingKu:后面要改成只传 user_id + */ +async function reloadUploadUrl(uploadinfo: IUploadCreat, item: IStateUploadFile, token: ITokenInfo) { + uploadinfo.file_id = item.Upload.file_id; + uploadinfo.upload_id = item.Upload.upload_id; + uploadinfo.part_info_list = []; + await AliUpload.UploadFilePartUrl(token.user_id, item.Info.drive_id, item.Upload.file_id, item.Upload.upload_id, item.Info.size, uploadinfo); + if (uploadinfo.part_info_list.length > 0) { + await AliUpload.UploadFileListUploadedParts(token.user_id, item.Info.drive_id, item.Upload.file_id, item.Upload.upload_id, 0, uploadinfo); + let isupload = true; + for (let i = 0; i < uploadinfo.part_info_list.length; i++) { + if (isupload && uploadinfo.part_info_list[i].isupload == false) { + isupload = false; + } + if (isupload === false && uploadinfo.part_info_list[i].isupload == true) uploadinfo.part_info_list[i].isupload = false; + } + } else { + uploadinfo.upload_id = ''; + uploadinfo.file_id = ''; + } +} + +/** + * 检查 PreHash 和取得 Partlist + * @param uploadinfo + * @param item + * @param token TODO PingKu:后面要改成只传 user_id + */ +async function checkPreHashAndGetPartlist(uploadinfo: IUploadCreat, item: IStateUploadFile, token: ITokenInfo) { + let PreHashMatched = true; + if (item.Info.size >= 1024000) { + const prehash = await AliUploadHash.GetFilePreHash(item.Info.localFilePath); + const Matched = await AliUpload.UploadCreatFileWithFolders(token.user_id, item.Info.drive_id, item.Info.parent_id, + item.Info.name, item.Info.size, '', '', prehash, item.Upload.IsBreakExist); + PreHashMatched = Matched.errormsg == 'PreHashMatched'; + if (Matched.errormsg == '') { + item.Upload.upload_id = Matched.upload_id; + item.Upload.file_id = Matched.file_id; + uploadinfo.file_id = Matched.file_id; + uploadinfo.upload_id = Matched.upload_id; + uploadinfo.part_info_list = Matched.part_info_list; + uploadinfo.errormsg = ''; + uploadinfo.israpid = false; + } + } + if (PreHashMatched) { // PreHash 匹配成功再使用 HashProof 匹配一次 + const proof = await AliUploadHash.GetFileHashProof(token.access_token, item); + if (item.Upload.DownState !== '解析中') { + item.Upload.FailedCode = 0; + item.Upload.FailedMessage = ''; + return true; + } + if (proof.sha1 == 'error') { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 503; + item.Upload.FailedMessage = '计算sha1出错可能文件拒绝访问'; + return true; + } else { + item.Upload.DownState = '上传中' + const MiaoChuan = await AliUpload.UploadCreatFileWithFolders(token.user_id, item.Info.drive_id, item.Info.parent_id, + item.Info.name, item.Info.size, proof.sha1, proof.proof_code, '', item.Upload.IsBreakExist); + if (MiaoChuan.israpid) { + item.Upload.IsCompleted = true + item.Upload.DownState = '已完成' + return true; + } else if (MiaoChuan.errormsg != '') { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 504; + item.Upload.FailedMessage = MiaoChuan.errormsg; + return true; + } else { + item.Upload.upload_id = MiaoChuan.upload_id; + item.Upload.file_id = MiaoChuan.file_id; + uploadinfo.file_id = MiaoChuan.file_id; + uploadinfo.upload_id = MiaoChuan.upload_id; + uploadinfo.part_info_list = MiaoChuan.part_info_list; + uploadinfo.errormsg = ''; + uploadinfo.israpid = false; + return false; + } + } + } +} + +/** + * 启动一个上传任务 + * @param item + * @constructor + */ +async function StartUpload(item: IStateUploadFile) { + const token = await DB.getUser(item.Info.user_id); + if (token == undefined || token.user_id !== item.Info.user_id) { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 401; + item.Upload.FailedMessage = '找不到账号,无法继续'; + return; + } + const name = item.Info.path == '' ? item.Info.name : item.Info.path + '/' + item.Info.name; + if (item.Info.isDir) { + const result = await AliFileCmd.ApiCreatNewForder(item.Info.user_id, item.Info.drive_id, item.Info.parent_id, name); + if (result != undefined && result != 'QuotaExhausted.Drive') { + //if (item.Info.isMiaoChuan == false && window.WinMsgToMain) window.WinMsgToMain({ cmd: 'MainUploadDir', Info: item.Info, parentid: result }); + const parentid = result as string + const Info = item.Info + UploadDAL.UploadLocalDir(Info.user_id, Info.drive_id, parentid, Info.localFilePath) + item.Upload.DownState = '已完成'; + } else { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 402; + item.Upload.FailedMessage = '创建文件夹失败:' + name; + if (result == 'QuotaExhausted.Drive') item.Upload.FailedMessage = '创建文件夹失败:网盘空间已满'; + } + return; + } + + if (item.Info.isMiaoChuan) { + const result = await AliUpload.UploadCreatFile(token.user_id, item.Info.drive_id, item.Info.parent_id, name, + item.Info.size, item.Info.sha1, ''); + if (result.israpid) { + item.Upload.DownState = '已完成'; + } else { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 402; + item.Upload.FailedMessage = '秒传失败,' + (result.errormsg == '' ? '云盘中不存在此sha1的相同文件' : result.errormsg); + } + return; + } + + const stat = await fsPromises.lstat(item.Info.localFilePath).catch(() => { + return undefined; + }); + if (!stat) { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 402; + item.Upload.FailedMessage = '读取文件大小失败可能已删除'; + return; + } + + if (item.Info.size != stat.size) { + item.Info.size = stat.size; + item.Info.sizestr = humanSize(stat.size); + item.Info.sha1 = ''; + item.Upload.upload_id = ''; + } + + const uploadinfo: IUploadCreat = { + user_id: '', + drive_id: '', + file_id: '', + israpid: false, + isexist: false, + upload_id: '', + part_info_list: [], + errormsg: '' + }; + if (item.Upload.upload_id != '' && item.Upload.file_id != '') { + await reloadUploadUrl(uploadinfo, item, token); + } + if (uploadinfo.upload_id == '') { + const PreHashMatched = await checkPreHashAndGetPartlist(uploadinfo, item, token); + if (PreHashMatched) return; + } + if (uploadinfo.part_info_list.length == 0) { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 505; + item.Upload.FailedMessage = '获取上传地址失败1'; + return; + } + if (uploadinfo.part_info_list.length > 1) + UploadDAL.mSaveToUploading(item.UploadID, uploadinfo.file_id, uploadinfo.upload_id) + //if (uploadinfo.part_info_list.length > 1 && window.WinMsgToMain) window.WinMsgToMain({ cmd: 'MainUploadID', UploadID: item.UploadID, file_id: uploadinfo.file_id, upload_id: uploadinfo.upload_id }); + + + item.Upload.DownState = '上传中'; + const UpResult = await AliUpload.UploadOneFile(token.user_id, uploadinfo, item); + + if (UpResult == 'success') item.Upload.DownState = '已完成'; + else if (item.Upload.DownState == '解析中') { + item.Upload.DownState = '已出错'; + item.Upload.FailedCode = 505; + item.Upload.FailedMessage = UpResult; + } +} diff --git a/packages/renderer/src/down/uploadstore.ts b/packages/renderer/src/down/uploadstore.ts new file mode 100644 index 0000000..b1b9bd8 --- /dev/null +++ b/packages/renderer/src/down/uploadstore.ts @@ -0,0 +1,73 @@ +import { defineStore } from 'pinia' +import { IStateUploadFile } from '@/aliapi/models' +import { IAriaDownProgress } from './downdal' +//import sql from '@/store/sql' +import message from '@/utils/message' +import DB from '@/utils/db' + +type Item = IStateUploadFile +type State = UploadState +const KEY = 'UploadID' + +export interface UploadState { + selectedFiles: Map + selectedFileLast: string + changUploadingTime: object + changUploadedTime: object +} + +let SaveTime = 0; +let ChangUploadingTime = 0; +let ChangUploadedTime = 0; +export let UploadingList: IStateUploadFile[] = []; +export let UploadedList: IStateUploadFile[] = []; + +const useUploadStore = defineStore('upload', { + state: (): State => ({ + changUploadingTime: {}, + changUploadedTime: {}, + selectedFileLast: '', + selectedFiles: new Map() + }), + + getters: { + selectedUploadingCount: (state) => state.selectedFiles.size, + uploadingCount: () => UploadingList.length, + uploadedCount: () => UploadedList.length, + selectedUploadingKey: (state) => [...state.selectedFiles.keys()], + uploadingList: () => UploadingList, + uploadedList: () => UploadedList + }, + + actions: { + addUploading({ uploadinglist, tip }: { uploadinglist: IStateUploadFile[]; tip: boolean }) { + const savelist = []; + const haslist = new Map(); + for (let i = 0; i < UploadingList.length; i++) { + haslist.set(UploadingList[i].UploadID, true); + } + for (let d = 0; d < uploadinglist.length; d++) { + let downitem = uploadinglist[d]; + if (haslist.has(downitem.UploadID) == false) { + Object.freeze(downitem.Info); + savelist.push(downitem); + } + } + //sql.SaveUploadings(savelist); + UploadingList.push(...savelist); + ChangUploadingTime++; + this.refreshUploadingList(); + if (tip) { + message.success('成功创建 ' + savelist.length.toString() + '个上传任务'); + } + }, + refreshUploadingList() { + if (ChangUploadingTime == 0) return; + this.changUploadingTime = { ts: Date.now() }; + ChangUploadingTime = 0; + } + + } +}) + +export default useUploadStore diff --git a/packages/renderer/src/env.d.ts b/packages/renderer/src/env.d.ts new file mode 100644 index 0000000..71fe881 --- /dev/null +++ b/packages/renderer/src/env.d.ts @@ -0,0 +1,20 @@ +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} + +declare type Drive = 'pan' | 'pic' | 'safe' +declare type LogLeve = 'secondary' | 'success' | 'warning' | 'danger' +declare module 'dom-to-image' +declare module 'jschardet' +declare function pinyinlite(text: string, config: any): any +declare function videojs(ref: any, options: any, cb: any): any + +declare module 'aria2/index.js' +declare module '@arco-design/web-vue/lib/modal/modal' +declare module 'video.js' +// declare module 'dlnacasts2' // TODO 没有安装? diff --git a/packages/renderer/src/global.d.ts b/packages/renderer/src/global.d.ts new file mode 100644 index 0000000..d492ba3 --- /dev/null +++ b/packages/renderer/src/global.d.ts @@ -0,0 +1,26 @@ +export {} + +declare global { + interface Window { + require:any, + Electron: any + openDatabase: any + WebRelaunchAria: any + platform: string + WinMsg: any + WinMsgToMain: any + WinMsgToUI: any + postdataFunc: any + Prism: any + WebUserToken: any + WebToElectron: any + WebClearCache: any + WebRelaunch: any + WebClearCookies: any + WebShutDown: any + WebOpenWindow: any + WebOpenUrl: any + WebShowOpenDialogSync: any + WebExecSync:any + } +} diff --git a/packages/renderer/src/layout/MyLoading.vue b/packages/renderer/src/layout/MyLoading.vue new file mode 100644 index 0000000..54abaf7 --- /dev/null +++ b/packages/renderer/src/layout/MyLoading.vue @@ -0,0 +1,9 @@ + diff --git a/packages/renderer/src/layout/MyModal.vue b/packages/renderer/src/layout/MyModal.vue new file mode 100644 index 0000000..69d6813 --- /dev/null +++ b/packages/renderer/src/layout/MyModal.vue @@ -0,0 +1,99 @@ + + + + diff --git a/packages/renderer/src/layout/MySplit.vue b/packages/renderer/src/layout/MySplit.vue new file mode 100644 index 0000000..fd5dbcc --- /dev/null +++ b/packages/renderer/src/layout/MySplit.vue @@ -0,0 +1,75 @@ + + + + diff --git a/packages/renderer/src/layout/MySwitch.vue b/packages/renderer/src/layout/MySwitch.vue new file mode 100644 index 0000000..58b2be5 --- /dev/null +++ b/packages/renderer/src/layout/MySwitch.vue @@ -0,0 +1,64 @@ + + + + diff --git a/packages/renderer/src/layout/MySwitchTab.vue b/packages/renderer/src/layout/MySwitchTab.vue new file mode 100644 index 0000000..5f9554d --- /dev/null +++ b/packages/renderer/src/layout/MySwitchTab.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/packages/renderer/src/layout/MyTags.vue b/packages/renderer/src/layout/MyTags.vue new file mode 100644 index 0000000..13171fb --- /dev/null +++ b/packages/renderer/src/layout/MyTags.vue @@ -0,0 +1,77 @@ + + + + diff --git a/packages/renderer/src/layout/PageCode.vue b/packages/renderer/src/layout/PageCode.vue new file mode 100644 index 0000000..59dad67 --- /dev/null +++ b/packages/renderer/src/layout/PageCode.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/packages/renderer/src/layout/PageHelp.vue b/packages/renderer/src/layout/PageHelp.vue new file mode 100644 index 0000000..9931cb8 --- /dev/null +++ b/packages/renderer/src/layout/PageHelp.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/packages/renderer/src/layout/PageImage.vue b/packages/renderer/src/layout/PageImage.vue new file mode 100644 index 0000000..d38c214 --- /dev/null +++ b/packages/renderer/src/layout/PageImage.vue @@ -0,0 +1,358 @@ + + + + + diff --git a/packages/renderer/src/layout/PageLoading.vue b/packages/renderer/src/layout/PageLoading.vue new file mode 100644 index 0000000..53450a5 --- /dev/null +++ b/packages/renderer/src/layout/PageLoading.vue @@ -0,0 +1,45 @@ + + + diff --git a/packages/renderer/src/layout/PageMain.vue b/packages/renderer/src/layout/PageMain.vue new file mode 100644 index 0000000..d9d61b0 --- /dev/null +++ b/packages/renderer/src/layout/PageMain.vue @@ -0,0 +1,544 @@ + + + + + + diff --git a/packages/renderer/src/layout/PageOffice.vue b/packages/renderer/src/layout/PageOffice.vue new file mode 100644 index 0000000..7b7c905 --- /dev/null +++ b/packages/renderer/src/layout/PageOffice.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/packages/renderer/src/layout/PageVideo.vue b/packages/renderer/src/layout/PageVideo.vue new file mode 100644 index 0000000..4bd82ff --- /dev/null +++ b/packages/renderer/src/layout/PageVideo.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/packages/renderer/src/layout/PageVideoXBT.vue b/packages/renderer/src/layout/PageVideoXBT.vue new file mode 100644 index 0000000..244585e --- /dev/null +++ b/packages/renderer/src/layout/PageVideoXBT.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/packages/renderer/src/layout/pagemain.ts b/packages/renderer/src/layout/pagemain.ts new file mode 100644 index 0000000..70a90e1 --- /dev/null +++ b/packages/renderer/src/layout/pagemain.ts @@ -0,0 +1,118 @@ +import ServerHttp from '@/aliapi/server' +import { useAppStore, useFootStore, useSettingStore } from '@/store' +import AppCache from '@/utils/appcache' +import DownDAL from '@/down/downdal' +import UploadDAL from '@/down/uploaddal' +import ShareDAL from '@/share/share/ShareDAL' +import { UploadEvent } from '@/down/uploadservice' +import UserDAL from '@/user/userdal' +import DebugLog from '@/utils/debuglog' + +export function PageMain() { + if (window.WinMsg !== undefined) return + window.WinMsg = WinMsg + useSettingStore() + Promise.resolve() + .then(async () => { + DebugLog.mSaveLog('success', '小白羊启动') + await ShareDAL.aLoadFromDB().catch((e: any) => { + DebugLog.mSaveLog('danger', 'ShareDALLDB' + e.message) + }) + await UserDAL.aLoadFromDB().catch((e: any) => { + DebugLog.mSaveLog('danger', 'UserDALLDB' + e.message) + }) + }) + .then(async () => { + //await SQL.ClearOldLogs(useSettingStore().debugDownedListMax).catch(() => {}) + await DownDAL.aLoadFromDB().catch((e: any) => { + DebugLog.mSaveLog('danger', 'DownDALLDB' + e.message) + }) + await UploadDAL.aLoadFromDB().catch((e: any) => { + DebugLog.mSaveLog('danger', 'UploadDALLDB' + e.message) + }) + + + await AppCache.aLoadCacheSize().catch((e: any) => { + DebugLog.mSaveLog('danger', 'AppCacheDALLDB' + e.message) + }) + + setTimeout(timeEvent, 1000) + }) + .catch((e: any) => { + DebugLog.mSaveLog('danger', 'LoadSettingFromDB' + e.message) + }) +} + +export const WinMsg = function (arg: any) { + if (arg.cmd == 'MainUploadEvent') { + UploadDAL.aUploadEvent(arg.list || []) + } else if (arg.cmd == 'MainUploadDir') { + const parentid = arg.parentid as string + const Info = arg.Info + UploadDAL.UploadLocalDir(Info.userid, Info.drive_id, parentid, Info.localFilePath) + } else if (arg.cmd == 'MainUploadID') { + UploadDAL.mSaveToUploading(arg.UploadID, arg.file_id, arg.upload_id) + } +} + +let runTime = 0 + +/** + * 时间事件,一但被调用每秒执行一次
+ * 可以理解为定时任务,根据不同的时间节点执行不同的任务 + */ +function timeEvent() { + const settingStore = useSettingStore() + + runTime++ + + // 一天后进入 + if (runTime > 60 * 60 * 24) runTime = 0 + + // 5分钟后进入,?或者在每次近8小时的时候进入? + if (runTime == 300 || runTime % 14400 == 14300) { + ServerHttp.CheckUpgrade(false) + } + + // 6秒后每2秒进入(计秒为双数) + if (runTime > 6 && runTime % 2 == 0) { + /* + PanDAL.UpdateDirSize().catch((e: any) => { + DebugLog.mSaveLog('danger', 'UpdateDirSize' + e.message) + }) + */ + } + + // 6秒后每20秒进入 + if (runTime > 6 && runTime % 20 == 0) { + //SQL.ClearOldLogs(settingStore.debugDownedListMax) + } + + // 6秒后每1小时进入 + if (runTime > 6 && runTime % 600 == 0) { + UserDAL.aRefreshAllUserToken() + } + + // 6秒后计秒为单数进入(每2秒进入) + if(runTime > 6 && runTime % 2 == 1){ + useFootStore().aUpdateTask() + } + + DownDAL.aSpeedEvent().catch((e: any) => { + DebugLog.mSaveLog('danger', 'aSpeedEvent' + e.message) + }) + + UploadEvent().catch((e: any) => { + DebugLog.mSaveLog('danger', 'UploadEvent' + e.message) + }) + + // 没有下载和上传时触发自动关闭 + if (settingStore.downAutoShutDown == 2) { + if (!DownDAL.QueryIsDowning() && !UploadDAL.QueryIsUploading()) { + settingStore.downAutoShutDown = 0 + useAppStore().appShutDown = true + } + } + + setTimeout(timeEvent, 1000) +} diff --git a/packages/renderer/src/main.ts b/packages/renderer/src/main.ts new file mode 100644 index 0000000..cd7b84b --- /dev/null +++ b/packages/renderer/src/main.ts @@ -0,0 +1,115 @@ +import { createApp } from 'vue' +import App from './App.vue' +import ArcoVue from '@arco-design/web-vue' +import store, { useAppStore, useSettingStore } from '@/store' +import '@arco-design/web-vue/dist/arco.css' +import message from '@/utils/message' +import DebugLog from '@/utils/debuglog' +import { PageMain } from './layout/pagemain' + +window.onerror = function (errorMessage, scriptURI, lineNo, columnNo, error) { + try { + if (errorMessage && typeof errorMessage === 'string' && errorMessage.indexOf('ResizeObserver loop limit exceeded') >= 0) return true + DebugLog.mSaveLog('danger', 'onerror') + if (typeof errorMessage === 'string') { + DebugLog.mSaveLog('danger', errorMessage) + message.error('onerror ' + errorMessage, 8) + } + if (error) { + DebugLog.mSaveLog('danger', error.message) + message.error('onerror ' + error.message, 8) + if (error.stack) DebugLog.mSaveLog('danger', error.stack) + } + } catch {} + return true +} + +window.addEventListener('unhandledrejection', function (event) { + try { + if (event.reason && event.reason.message && event.reason.message.indexOf('oauth/authorize?') > 0) { + event.stopPropagation() + event.preventDefault() + return + } + + DebugLog.mSaveLog('danger', 'unhandledrejection') + const reason = event.reason + if (reason && reason.message) { + DebugLog.mSaveLog('danger', reason.message) + message.error('rejection ' + reason.message, 8) + } + if (reason && reason.stack) DebugLog.mSaveLog('danger', reason.stack) + if (!reason) DebugLog.mSaveLog('danger', JSON.stringify(event)) + } catch {} + event.stopPropagation() + event.preventDefault() +}) + +const app = createApp(App) +app.config.errorHandler = function (err: any, vm, info) { + try { + DebugLog.mSaveLog('danger', 'errorHandler') + if (typeof err === 'string') { + DebugLog.mSaveLog('danger', err) + message.error('errorHandler ' + err, 8) + } + if (err && err.message) { + DebugLog.mSaveLog('danger', err.message) + message.error('errorHandler ' + err.message, 8) + if (err.stack) DebugLog.mSaveLog('danger', err.stack) + } + } catch {} + return true +} +app.config.compilerOptions.isCustomElement = (tag: string) => tag == 'webview' +app.config.performance = true +app.use(ArcoVue, {}) +app.use(store) +app.mount('#app') + +window.Electron.ipcRenderer.on('setPage', (_event: any, args: any) => { + const appStore = useAppStore() + const settingStore = useSettingStore() + if (args.theme && settingStore) appStore.toggleTheme(args.theme) + + if (args.page == 'PageMain') { + PageMain() + } else if (args.page == 'PageWorker') { + //WorkerPage() + } else if (args.page == 'PageCode') { + appStore.pageCode = args.data + } else if (args.page == 'PageOffice') { + appStore.pageOffice = args.data + } else if (args.page == 'PageImage') { + appStore.pageImage = args.data + } else if (args.page == 'PageVideoXBT') { + appStore.pageVideoXBT = args.data + } else if (args.page == 'PageVideo') { + appStore.pageVideo = args.data + } + if (args.page) appStore.togglePage(args.page) +}) + +window.Electron.ipcRenderer.on('setTheme', (_event: any, args: any) => { + const appStore = useAppStore() + appStore.toggleDark(args.dark) +}) + + + + + + +/* +setTimeout(() => { + let list = document.getElementsByTagName('input') + for (let i = 0; i < list.length; i++) { + list[i].setAttribute('tabindex', '-1') + } + let list2 = document.getElementsByTagName('button') + for (let i = 0; i < list2.length; i++) { + list2[i].setAttribute('tabindex', '-1') + } +}, 2000) +*/ + diff --git a/packages/renderer/src/pan/PanLeft.vue b/packages/renderer/src/pan/PanLeft.vue new file mode 100644 index 0000000..ada54ae --- /dev/null +++ b/packages/renderer/src/pan/PanLeft.vue @@ -0,0 +1,472 @@ + + + + + + diff --git a/packages/renderer/src/pan/PanRight.vue b/packages/renderer/src/pan/PanRight.vue new file mode 100644 index 0000000..4d8087c --- /dev/null +++ b/packages/renderer/src/pan/PanRight.vue @@ -0,0 +1,995 @@ + + + + + diff --git a/packages/renderer/src/pan/index.vue b/packages/renderer/src/pan/index.vue new file mode 100644 index 0000000..2b1d68d --- /dev/null +++ b/packages/renderer/src/pan/index.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/packages/renderer/src/pan/menus/DirLeftMenu.vue b/packages/renderer/src/pan/menus/DirLeftMenu.vue new file mode 100644 index 0000000..3e7f032 --- /dev/null +++ b/packages/renderer/src/pan/menus/DirLeftMenu.vue @@ -0,0 +1,87 @@ + + + + diff --git a/packages/renderer/src/pan/menus/DirTopPath.vue b/packages/renderer/src/pan/menus/DirTopPath.vue new file mode 100644 index 0000000..2df6a48 --- /dev/null +++ b/packages/renderer/src/pan/menus/DirTopPath.vue @@ -0,0 +1,110 @@ + + + + diff --git a/packages/renderer/src/pan/menus/FileRightMenu.vue b/packages/renderer/src/pan/menus/FileRightMenu.vue new file mode 100644 index 0000000..830aea6 --- /dev/null +++ b/packages/renderer/src/pan/menus/FileRightMenu.vue @@ -0,0 +1,144 @@ + + + + diff --git a/packages/renderer/src/pan/menus/FileTopbtn.vue b/packages/renderer/src/pan/menus/FileTopbtn.vue new file mode 100644 index 0000000..354aa38 --- /dev/null +++ b/packages/renderer/src/pan/menus/FileTopbtn.vue @@ -0,0 +1,103 @@ + + + + diff --git a/packages/renderer/src/pan/menus/PanTopbtn.vue b/packages/renderer/src/pan/menus/PanTopbtn.vue new file mode 100644 index 0000000..2dd651e --- /dev/null +++ b/packages/renderer/src/pan/menus/PanTopbtn.vue @@ -0,0 +1,59 @@ + + + + diff --git a/packages/renderer/src/pan/menus/TrashRightMenu.vue b/packages/renderer/src/pan/menus/TrashRightMenu.vue new file mode 100644 index 0000000..a7b5df9 --- /dev/null +++ b/packages/renderer/src/pan/menus/TrashRightMenu.vue @@ -0,0 +1,36 @@ + + + + diff --git a/packages/renderer/src/pan/menus/TrashTopbtn.vue b/packages/renderer/src/pan/menus/TrashTopbtn.vue new file mode 100644 index 0000000..d9eb07c --- /dev/null +++ b/packages/renderer/src/pan/menus/TrashTopbtn.vue @@ -0,0 +1,34 @@ + + + + diff --git a/packages/renderer/src/pan/pandal.ts b/packages/renderer/src/pan/pandal.ts new file mode 100644 index 0000000..0ed82a5 --- /dev/null +++ b/packages/renderer/src/pan/pandal.ts @@ -0,0 +1,248 @@ +import { IAliGetDirModel } from '@/aliapi/alimodels' +import AliDirList from '@/aliapi/dirlist' +import AliFile from '@/aliapi/file' +import AliDirFileList, { IAliFileResp } from '@/aliapi/dirfilelist' +import { usePanFileStore } from '@/store' +import TreeStore from '@/store/treestore' +import DB from '@/utils/db' +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import usePanTreeStore from './pantreestore' +import { FootLoading } from '@/utils/foot' + +export interface PanSelectedData { + iserror: boolean + iserrorselected: boolean + user_id: string + drive_id: string + dir_id: string + parent_dir_id: string + select_keys: string[] +} + +export default class PanDAL { + + static async aReLoadDrive(user_id: string, drive_id: string) { + const pantreeStore = usePanTreeStore() + pantreeStore.mSaveUser(user_id, drive_id) + if (!user_id || !drive_id) return + + + let cache = await DB.getValueObject('AllDir_' + drive_id) + if (cache) { + await TreeStore.SaveAllDir(drive_id, cache as IAliGetDirModel[], false) + } + + await PanDAL.aShowDir(drive_id, 'root', true) + + console.time('aReLoadDrive') + if (cache) { + let dt = await DB.getValueNumber('AllDir_' + drive_id) + // let expiresTime = 1000 * 60 * 60 // 1小时,全部文件夹DB缓存的过期时间 + let expiresTime = 1000 * 60 * 60 * 24 // 1天,全部文件夹DB缓存的过期时间 TODO 测试的时候用,之后做成配置是否为测试环境 + if (Date.now() - dt < expiresTime) { + return + } + } + + FootLoading('加载全部文件夹...', 'loaddir' + drive_id) + AliDirList.ApiFastAllDirList(user_id, drive_id) + .then((data) => { + if (!data.next_marker) { + TreeStore.SaveAllDir(drive_id, data.items, true).then(() => { + console.timeEnd('aReLoadDrive') + }) + } else { + DebugLog.mSaveLog('warning', '列出文件夹失败file_id=all' + ' next_marker=' + data.next_marker) + message.error('列出全盘文件夹失败' + data.next_marker) + } + }) + .catch((err) => { + DebugLog.mSaveLog('warning', '列出文件夹失败file_id=all' + ' err=' + (err.message || '')) + message.error('列出全盘文件夹失败' + err.message) + }) + .then(() => { + FootLoading('', 'loaddir' + drive_id) + }) + } + + + static async aShowDir(drive_id: string, file_id: string, selfExpand: boolean) { + + + + + const pantreeStore = usePanTreeStore() + if (!drive_id) drive_id = pantreeStore.drive_id + if (!drive_id) return + + if (file_id == 'refresh') file_id = pantreeStore.selectDir.file_id + let isBack = file_id == 'back' + if (isBack) { + + if (pantreeStore.History.length > 0) { + pantreeStore.History.splice(0, 1) + if (pantreeStore.History.length > 0) { + drive_id = pantreeStore.History[0].drive_id + file_id = pantreeStore.History[0].file_id + } + } + if (file_id == 'back') { + + pantreeStore.History = [] + file_id = 'root' + } + } + + + let dir = TreeStore.GetDir(drive_id, file_id) + let dirPath = TreeStore.GetDirPath(drive_id, file_id) + + if (!dir || (dirPath.length == 0 && file_id != 'root')) { + + let findpath = await AliFile.ApiFileGetPath(pantreeStore.user_id, drive_id, file_id) + if (findpath.length > 0) { + dirPath = TreeStore.GetDirPath(drive_id, 'root') + dirPath = dirPath.concat(findpath) + dir = { ...dirPath[dirPath.length - 1] } + } + } + + if (!dir || (dirPath.length == 0 && file_id != 'root')) { + message.error('出错,找不到指定的文件夹 ' + file_id) + return false + } + + + if (!isBack && pantreeStore.selectDir.file_id != dir.file_id) { + + let history: IAliGetDirModel[] = [dir] + for (let i = 0, maxi = pantreeStore.History.length; i < maxi; i++) { + const his = pantreeStore.History[i] + history.push(his) + if (history.length >= 50) break + } + pantreeStore.History = history + } + + let treeExpandedKeys = new Set(pantreeStore.treeExpandedKeys) + treeExpandedKeys.add('root') + for (let i = 0, maxi = dirPath.length - 1; i < maxi; i++) { + + treeExpandedKeys.add(dirPath[i].file_id) + } + if (selfExpand) treeExpandedKeys.add(dir.file_id) + + pantreeStore.mShowDir(dir, dirPath, [file_id], Array.from(treeExpandedKeys)) + usePanFileStore().mSaveDirFileLoading(drive_id, dir.file_id, dir.name) + return PanDAL.GetDirFileList(pantreeStore.user_id, dir.drive_id, dir.file_id, dir.name) + } + + + static GetDirFileList(user_id: string, drive_id: string, dir_id: string, dir_name: string) { + return new Promise((resolve) => { + + if (dir_id == 'search') { + usePanFileStore().mSaveDirFileLoadingFinish(drive_id, dir_id, []) + resolve(true) + return + } + + + let order = TreeStore.GetDirOrder(drive_id, dir_id).replace('ext ', 'updated_at ') + AliDirFileList.ApiDirFileList(user_id, drive_id, dir_id, dir_name, order) + .then((dir) => { + if (!dir.next_marker) { + TreeStore.SaveOneDirFileList(dir).then(() => { + /** 成功加载一个文件夹的文件列表 1.更新panfilestore 2.更新pantreestore */ + usePanFileStore().mSaveDirFileLoadingFinish(drive_id, dir_id, dir!.items) + resolve(true) + }) + } else if (dir.next_marker != 'cancel') { + message.warning('列出文件夹失败 ' + dir.next_marker) + usePanFileStore().mSaveDirFileLoadingFinish(drive_id, dir_id, []) + resolve(false) + } + }) + .catch((err) => { + usePanFileStore().mSaveDirFileLoadingFinish(drive_id, dir_id, []) + message.warning('列出文件夹失败 ' + (err.message || '')) + DebugLog.mSaveLog('warning', '列出文件夹失败file_id=' + dir_id + ' err=' + (err.message || '')) + resolve(false) + }) + }) + + + + } + + static ExpandDirAll(isExpaned: boolean) { + const pantreeStore = usePanTreeStore() + let drive_id = pantreeStore.drive_id + let dir_id = pantreeStore.selectDir.file_id + let diridlist = TreeStore.ReGetDirAllChildDirID(drive_id, dir_id) + usePanTreeStore().mTreeExpandAll(diridlist, isExpaned) + } + + static GetPanSelectedData(istree: boolean): PanSelectedData { + const pantreeStore = usePanTreeStore() + + let data: PanSelectedData = { + iserror: false, + + iserrorselected: false, + user_id: pantreeStore.user_id, + drive_id: pantreeStore.drive_id, + dir_id: pantreeStore.selectDir.file_id, + parent_dir_id: pantreeStore.selectDir.parent_file_id, + select_keys: istree ? [pantreeStore.selectDir.file_id] : usePanFileStore().GetSelectedID() + } + + data.iserror = !data.user_id || !data.drive_id || !data.dir_id + data.iserrorselected = data.select_keys.length == 0 + return data + } + + static updateQuickFile(list: { key: string; title: string }[]) { + if (list.length == 0) return + const pantreeStore = usePanTreeStore() + let jsonstr = localStorage.getItem('FileQuick-' + pantreeStore.user_id) + let arr = jsonstr ? JSON.parse(jsonstr) : [] + list.map((t) => { + let find = false + for (let i = 0; i < arr.length; i++) { + if (arr[i].key == t.key) { + arr[i].title = t.title + find = true + } + } + if (find == false) arr.push({ key: t.key, title: t.title }) + }) + localStorage.setItem('FileQuick-' + pantreeStore.user_id, JSON.stringify(arr)) + pantreeStore.mSaveQuick(arr) + } + static deleteQuickFile(key: string) { + if (!key) return + const pantreeStore = usePanTreeStore() + let jsonstr = localStorage.getItem('FileQuick-' + pantreeStore.user_id) + let arr = jsonstr ? JSON.parse(jsonstr) : [] + let newarry: { key: string; title: string }[] = [] + for (let i = 0; i < arr.length; i++) { + if (arr[i].key != key) newarry.push(arr[i]) + } + localStorage.setItem('FileQuick-' + pantreeStore.user_id, JSON.stringify(newarry)) + pantreeStore.mSaveQuick(newarry) + } + + static getQuickFileList() { + const pantreeStore = usePanTreeStore() + let jsonstr = localStorage.getItem('FileQuick-' + pantreeStore.user_id) + let arr = jsonstr ? JSON.parse(jsonstr) : [] + return arr + } + static aReLoadQuickFile(user_id: string) { + let jsonstr = localStorage.getItem('FileQuick-' + user_id) + let arr = jsonstr ? JSON.parse(jsonstr) : [] + usePanTreeStore().mSaveQuick(arr) + } +} diff --git a/packages/renderer/src/pan/panfilestore.ts b/packages/renderer/src/pan/panfilestore.ts new file mode 100644 index 0000000..29e224e --- /dev/null +++ b/packages/renderer/src/pan/panfilestore.ts @@ -0,0 +1,376 @@ +import { defineStore } from 'pinia' +import { IAliGetFileModel } from '@/aliapi/alimodels' +import { ArrayToMap, HanToPin } from '@/utils/utils' +import fuzzysort from 'fuzzysort' +import { GetFocusNext, GetSelectedList, GetSelectedListID, KeyboardSelectOne, MouseSelectOne, SelectAll } from '@/utils/selecthelper' +import { IAliFileResp } from '@/aliapi/dirfilelist' +import PanDAL from './pandal' +import TreeStore from '@/store/treestore' + +type Item = IAliGetFileModel +type State = PanFileState +const KEY = 'file_id' + +export interface GridItem { + file_id: string + files: IAliGetFileModel[] +} + +export interface PanFileState { + DriveID: string + DirID: string + DirName: string + + ListLoading: boolean + ListLoadingIndex: number + + ListDataRaw: Item[] + + ListDataShow: Item[] + ListDataGrid: GridItem[] + + + ListSelected: Set + + ListOrderKey: string + + ListFocusKey: string + + ListSelectKey: string + + ListSearchKey: string + + ListShowMode: string + ListShowColumn: number +} + +const usePanFileStore = defineStore('panfile', { + state: (): State => ({ + DriveID: '', + DirID: '', + DirName: '', + + ListLoading: false, + ListLoadingIndex: 0, + ListDataRaw: [], + ListDataShow: [], + ListDataGrid: [], + ListSelected: new Set(), + ListOrderKey: 'name desc', + ListFocusKey: '', + ListSelectKey: '', + ListSearchKey: '', + ListShowMode: 'list', + ListShowColumn: 1 + }), + + getters: { + ListDataCount(state: State): number { + return state.ListDataShow.length + }, + + IsListSelected(state: State): boolean { + return state.ListSelected.size > 0 + }, + + IsListSelectedMulti(state: State): boolean { + return state.ListSelected.size > 1 + }, + ListSelectedCount(state: State): number { + return state.ListSelected.size + }, + ListDataSelectCountInfo(state: State): string { + return '已选中 ' + state.ListSelected.size + ' / ' + state.ListDataShow.length + ' 个' + }, + + IsListSelectedAll(state: State): boolean { + return state.ListSelected.size > 0 && state.ListSelected.size == state.ListDataShow.length + }, + + IsListSelectedFavAll(state: State): boolean { + let list = state.ListDataShow + let len = list.length + let isAllFav = true + + for (let i = 0, maxi = len; i < maxi; i++) { + if (state.ListSelected.has(list[i].file_id)) { + if (!list[i].starred) { + isAllFav = false + break + } + } + } + + return isAllFav + }, + SelectDirType(state: State): string { + let file_id = state.DirID + if (file_id == 'recover') return 'recover' + if (file_id == 'trash') return 'trash' + if (file_id == 'favorite') return 'favorite' + if (file_id.startsWith('search')) return 'search' + if (file_id.startsWith('color')) return 'color' + if (file_id.startsWith('video')) return 'video' + return 'pan' + }, + FileOrderDesc(state: State): string { + switch (state.ListOrderKey) { + case 'name desc': + return '名称 · 降' + case 'name asc': + return '名称 · 升' + case 'updated_at desc': + return '时间 · 降' + case 'updated_at asc': + return '时间 · 升' + case 'size desc': + return '大小 · 降' + case 'size asc': + return '大小 · 升' + } + return '选择文件排序' + } + }, + + actions: { + + mSaveDirFileLoading(drive_id: string, dir_id: string, dir_name: string) { + let order = TreeStore.GetDirOrder(drive_id, dir_id) + if (this.DirID != dir_id || this.DriveID != drive_id) { + this.$patch({ DriveID: drive_id, DirID: dir_id, DirName: dir_name, ListOrderKey: order, ListLoading: true, ListLoadingIndex: 0, ListSearchKey: '', ListDataRaw: [], ListDataShow: [], ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '' }) + } else { + + this.$patch({ DriveID: drive_id, DirID: dir_id, DirName: dir_name, ListOrderKey: order, ListLoading: true, ListLoadingIndex: 0, ListSearchKey: '', ListDataRaw: [], ListDataShow: [] }) + } + }, + + mSaveDirFileLoadingPart(pageindex: number, partdir: IAliFileResp) { + if (pageindex != this.ListLoadingIndex || partdir.m_drive_id != this.DriveID || partdir.m_dir_id != this.DirID) { + + partdir.next_marker = 'cancel' + } else { + this.ListLoadingIndex++ + this.ListDataRaw = this.ListDataRaw.concat(partdir.items) + this.mRefreshListDataShow(true) + } + }, + + mSaveDirFileLoadingFinish(drive_id: string, dir_id: string, list: Item[]) { + if (this.DirID && (drive_id != this.DriveID || dir_id != this.DirID)) return + + if (list.length == 0) { + + this.ListDataRaw = [] + this.mRefreshListDataShow(true) + } + + //todo:: 自定义排序 + //this.ListDataRaw = this.mGetOrder(this.ListOrderKey, freezelist) + + this.$patch({ ListLoading: false, ListLoadingIndex: 0 }) + this.mRefreshListDataShow(true) + }, + + mSearchListData(value: string) { + + this.$patch({ ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '', ListSearchKey: value }) + this.mRefreshListDataShow(true) + }, + + mOrderListData(value: string) { + if (!value || value == this.ListOrderKey) return + TreeStore.SaveDirOrder(this.DriveID, this.DirID, value) + + this.$patch({ ListOrderKey: value, ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '' }) + PanDAL.aShowDir('', 'refresh', false) + }, + mGetOrder(order: string, list: Item[]) { + //todo:: 其他排序方式 + if (order == 'size') list.sort((a, b) => b.size - a.size) + if (order == 'time') list.sort((a, b) => b.time - a.time) + return list + }, + + mGridListData(value: string, column: number) { + if (this.ListShowMode == value && this.ListShowColumn == column) return + this.$patch({ ListShowMode: value == 'list' ? 'list' : 'grid', ListShowColumn: value == 'list' ? 1 : column }) + this.mRefreshListDataShow(true) + }, + + + mRefreshListDataShow(refreshRaw: boolean) { + if (!refreshRaw) { + let ListDataShow = this.ListDataShow.concat() + Object.freeze(ListDataShow) + let ListDataGrid = this.ListDataGrid.concat() + Object.freeze(ListDataGrid) + this.$patch({ ListDataShow: ListDataShow, ListDataGrid: ListDataGrid }) + return + } + let showlist: Item[] = [] + + if (this.ListSearchKey) { + + let results = fuzzysort.go(this.ListSearchKey, this.ListDataRaw, { + threshold: -200000, + keys: ['name', 'namesearch'], + scoreFn: (a) => Math.max(a[0] ? a[0].score : -200000, a[1] ? a[1].score : -200000) + }) + for (let i = 0, maxi = results.length; i < maxi; i++) { + if (results[i].score > -200000) showlist.push(results[i].obj) + } + } else { + + showlist = this.ListDataRaw.concat() + } + + Object.freeze(showlist) + + let gridlist: GridItem[] = [] + let column = this.ListShowColumn + for (let i = 0, maxi = showlist.length; i < maxi; i += column) { + let grid: GridItem = { + file_id: showlist[i].file_id, + files: [showlist[i]] + } + for (let j = 1; j < column && i + j < maxi; j++) { + grid.files.push(showlist[i + j]) + } + gridlist.push(grid) + } + Object.freeze(gridlist) + + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = showlist.length; i < maxi; i++) { + key = showlist[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + this.$patch({ ListDataShow: showlist, ListDataGrid: gridlist, ListSelected: newSelected }) + }, + + + mSelectAll() { + this.$patch({ ListSelected: SelectAll(this.ListDataShow, KEY, this.ListSelected), ListFocusKey: '', ListSelectKey: '' }) + this.mRefreshListDataShow(false) + }, + + mMouseSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = MouseSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + mKeyboardSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = KeyboardSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + mRangSelect(lastkey: string, fileidlist: string[]) { + if (this.ListDataShow.length == 0) return + let selectedNew = new Set(this.ListSelected) + for (let i = 0, maxi = fileidlist.length; i < maxi; i++) { + selectedNew.add(fileidlist[i]) + } + this.$patch({ ListSelected: selectedNew, ListFocusKey: lastkey, ListSelectKey: lastkey }) + this.mRefreshListDataShow(false) + }, + + GetSelected() { + return GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedID() { + return GetSelectedListID(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedFirst(): Item | undefined { + let list = GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + if (list.length > 0) return list[0] + return undefined + }, + mSetFocus(key: string) { + this.ListFocusKey = key + this.mRefreshListDataShow(false) + }, + + mGetFocus() { + if (this.ListFocusKey == '' && this.ListDataShow.length > 0) return this.ListDataShow[0][KEY] + return this.ListFocusKey + }, + + mGetFocusNext(position: string) { + return GetFocusNext(this.ListDataShow, KEY, this.ListFocusKey, position) + }, + + mDeleteFiles(dir_id: string, fileidlist: string[]) { + if (this.DirID == dir_id || dir_id == 'any') { + let filemap = new Set(fileidlist) + let ListDataRaw = this.ListDataRaw + let NewDataList: Item[] = [] + let diridlist: string[] = [] + let deleteCount = 0 + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (filemap.has(item.file_id)) { + /** NewDataList丢掉被删除的 */ + deleteCount++ + if (item.isdir) diridlist.push(item.file_id) + } else { + NewDataList.push(item) + } + } + if (deleteCount > 0) { + this.ListDataRaw = NewDataList + this.mRefreshListDataShow(true) + } + //todo:: 删除文件夹 + } + }, + mFavorFiles(isfavor: boolean, fileidlist: string[]) { + let ListDataRaw = this.ListDataRaw + let isChange = false + let filemap = new Set(fileidlist) + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (filemap.has(item.file_id)) { + item.starred = isfavor + isChange = true + } + } + if (isChange) this.mRefreshListDataShow(false) + }, + mColorFiles(color: string, fileidlist: string[]) { + let ListDataRaw = this.ListDataRaw + let isChange = false + let filemap = new Set(fileidlist) + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (filemap.has(item.file_id)) { + item.description = color + isChange = true + } + } + if (isChange) this.mRefreshListDataShow(false) + }, + mRenameFiles(filelist: { file_id: string; parent_file_id: string; name: string; isdir: boolean }[]) { + let ListDataRaw = this.ListDataRaw + let isChange = false + let filemap = ArrayToMap('file_id', filelist) + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + let newfile = filemap.get(item.file_id) + if (newfile) { + item.name = newfile.name + isChange = true + } + } + if (isChange) this.mRefreshListDataShow(false) + } + } +}) + +export default usePanFileStore diff --git a/packages/renderer/src/pan/pantreestore.ts b/packages/renderer/src/pan/pantreestore.ts new file mode 100644 index 0000000..30c8bde --- /dev/null +++ b/packages/renderer/src/pan/pantreestore.ts @@ -0,0 +1,177 @@ +import { defineStore } from 'pinia' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import { h } from 'vue' +import PanDAL from './pandal' +import { ArrayToMap } from '@/utils/utils' +import { TreeNodeData } from '@/store/treestore' + +export interface PanTreeState { + user_id: string + drive_id: string + + History: IAliGetDirModel[] + + selectDir: IAliGetDirModel + + selectDirPath: IAliGetDirModel[] + + treeData: TreeNodeData[] + + treeExpandedKeys: string[] + + treeSelectedKeys: string[] + + quickData: TreeNodeData[] +} +let treeDataMap = new Map() +type State = PanTreeState + +const fileiconfn = (icon: string) => h('i', { class: 'iconfont ' + icon }) + +const usePanTreeStore = defineStore('pantree', { + state: (): State => ({ + user_id: '', + drive_id: '', + History: [], + selectDir: { + __v_skip: true, + drive_id: '', + file_id: '', + parent_file_id: '', + name: '', + namesearch: '', + size: 0, + time: 0, + description: '' + }, + selectDirPath: [], + treeData: [ + { __v_skip: true, title: '恢复文件', namesearch: '', key: 'recover', icon: () => fileiconfn('iconrecover'), isLeaf: true, children: [] }, + { __v_skip: true, title: '回收站', namesearch: '', key: 'trash', icon: () => fileiconfn('icondelete'), isLeaf: true, children: [] }, + { __v_skip: true, title: '收藏夹', namesearch: '', key: 'favorite', icon: () => fileiconfn('iconcrown'), isLeaf: true, children: [] }, + { __v_skip: true, title: '放映室', namesearch: '', key: 'video', icon: () => fileiconfn('iconrss_video'), isLeaf: true, children: [] }, + { __v_skip: true, title: '全盘搜索', namesearch: '', key: 'search', icon: () => fileiconfn('iconsearch'), isLeaf: true, children: [] }, + { __v_skip: true, title: '根目录', namesearch: '', key: 'root', children: [] } + ], + treeExpandedKeys: ['root'], + treeSelectedKeys: [], + quickData: [] + }), + + getters: {}, + + actions: { + mTreeSelected(key: string) { + PanDAL.aShowDir('', key, true) + }, + mTreeExpand(key: string) { + let arr = this.treeExpandedKeys + if (arr.includes(key)) { + this.treeExpandedKeys = arr.filter((t) => t != key) + if (this.selectDir.file_id != key) PanDAL.aShowDir('', key, false) + } else { + this.treeExpandedKeys = arr.concat([key]) + } + }, + mTreeExpandAll(keylist: string[], isExpaned: boolean) { + let arr = new Set(this.treeExpandedKeys) + let t = '' + if (isExpaned) { + for (let i = 0, maxi = keylist.length; i < maxi; i++) { + arr.add(keylist[i]) + } + } else { + for (let i = 0, maxi = keylist.length; i < maxi; i++) { + arr.delete(keylist[i]) + } + } + this.treeExpandedKeys = Array.from(arr) + }, + + mSaveUser(user_id: string, drive_id: string) { + this.$reset() + this.$patch({ user_id, drive_id }) + }, + + mShowDir(dir: IAliGetDirModel, dirPath: IAliGetDirModel[], treeSelectedKeys: string[], treeExpandedKeys: string[]) { + this.$patch({ selectDir: dir, selectDirPath: dirPath, treeSelectedKeys: treeSelectedKeys, treeExpandedKeys: treeExpandedKeys }) + }, + + mSaveTreeAllNode(drive_id: string, root: TreeNodeData, rootmap: Map) { + if (this.drive_id !== drive_id) return + + let list: TreeNodeData[] = [] + for (let i = 0, maxi = this.treeData.length; i < maxi; i++) { + if (this.treeData[i].key == root.key) { + list.push(root) + } else list.push(this.treeData[i]) + } + + this.treeData = list + treeDataMap = rootmap + }, + + mSaveTreeOneDirNode(drive_id: string, dir_id: string, dirnode: TreeNodeData, dirmap: Map) { + console.log('刷新Tree', dirnode) + if (this.drive_id !== drive_id) return + + + const finddir = treeDataMap.get(dir_id) + if (finddir) { + finddir.children = dirnode.children + let keys = dirmap.entries() + for (let i = 0, maxi = dirmap.size; i < maxi; i++) { + let key = keys.next().value + treeDataMap.set(key[0], key[1]) + } + this.treeData = this.treeData.concat() + } + }, + + mRenameFiles(filelist: { file_id: string; parent_file_id: string; name: string; isdir: boolean }[]) { + let isChange = false + let isPath = false + + for (let i = 0, maxi = filelist.length; i < maxi; i++) { + let item = filelist[i] + if (!item.isdir) continue + let findnode = treeDataMap.get(item.file_id) + if (findnode) { + findnode.title = item.name + isChange = true + } + if (this.selectDir.file_id == item.file_id) { + this.selectDir = Object.assign({}, this.selectDir, { name: item.name }) + isChange = true + } + + this.selectDirPath.map((t) => { + if (t.file_id == item.file_id) { + t.name = item.name + isPath = true + } + }) + } + + if (isChange) this.treeData = this.treeData.concat() + if (isPath) this.selectDirPath = this.selectDirPath.concat() + }, + mSaveQuick(list: { key: string; title: string }[]) { + let nodelist: TreeNodeData[] = [] + for (let i = 0; i < list.length; i++) { + nodelist.push({ + __v_skip: true, + key: list[i].key, + title: list[i].title || list[i].key, + namesearch: i < 9 ? '快捷键 Ctrl+' + (i + 1) : '', + children: [], + isLeaf: true + }) + } + Object.freeze(nodelist) + this.quickData = nodelist + } + } +}) + +export default usePanTreeStore diff --git a/packages/renderer/src/pan/topbtns/AlphaModal.vue b/packages/renderer/src/pan/topbtns/AlphaModal.vue new file mode 100644 index 0000000..39c23a0 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/AlphaModal.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/CreatNewDirModal.vue b/packages/renderer/src/pan/topbtns/CreatNewDirModal.vue new file mode 100644 index 0000000..deb855f --- /dev/null +++ b/packages/renderer/src/pan/topbtns/CreatNewDirModal.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/CreatNewDirMultiModal.vue b/packages/renderer/src/pan/topbtns/CreatNewDirMultiModal.vue new file mode 100644 index 0000000..a197952 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/CreatNewDirMultiModal.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/CreatNewFileModal.vue b/packages/renderer/src/pan/topbtns/CreatNewFileModal.vue new file mode 100644 index 0000000..ad1da58 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/CreatNewFileModal.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/CreatNewShareLinkModal.vue b/packages/renderer/src/pan/topbtns/CreatNewShareLinkModal.vue new file mode 100644 index 0000000..d534efb --- /dev/null +++ b/packages/renderer/src/pan/topbtns/CreatNewShareLinkModal.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/DLNAPlayerModal.vue b/packages/renderer/src/pan/topbtns/DLNAPlayerModal.vue new file mode 100644 index 0000000..cfee035 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/DLNAPlayerModal.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/DaoRuShareLinkModal.vue b/packages/renderer/src/pan/topbtns/DaoRuShareLinkModal.vue new file mode 100644 index 0000000..024593c --- /dev/null +++ b/packages/renderer/src/pan/topbtns/DaoRuShareLinkModal.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/DaoRuShareLinkMultiModal.vue b/packages/renderer/src/pan/topbtns/DaoRuShareLinkMultiModal.vue new file mode 100644 index 0000000..998af71 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/DaoRuShareLinkMultiModal.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/M3U8DownloadModal.vue b/packages/renderer/src/pan/topbtns/M3U8DownloadModal.vue new file mode 100644 index 0000000..d79fb17 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/M3U8DownloadModal.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/RenameModal.vue b/packages/renderer/src/pan/topbtns/RenameModal.vue new file mode 100644 index 0000000..ce979fe --- /dev/null +++ b/packages/renderer/src/pan/topbtns/RenameModal.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/RenameMultiModal.vue b/packages/renderer/src/pan/topbtns/RenameMultiModal.vue new file mode 100644 index 0000000..d927164 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/RenameMultiModal.vue @@ -0,0 +1,952 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/SearchPanModal.vue b/packages/renderer/src/pan/topbtns/SearchPanModal.vue new file mode 100644 index 0000000..9ced365 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/SearchPanModal.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/SelectPanDirModal.vue b/packages/renderer/src/pan/topbtns/SelectPanDirModal.vue new file mode 100644 index 0000000..e5d0d69 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/SelectPanDirModal.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/ShuXingModal.vue b/packages/renderer/src/pan/topbtns/ShuXingModal.vue new file mode 100644 index 0000000..897d4d5 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/ShuXingModal.vue @@ -0,0 +1,349 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/ShuXingMultiModal.vue b/packages/renderer/src/pan/topbtns/ShuXingMultiModal.vue new file mode 100644 index 0000000..42c6aaf --- /dev/null +++ b/packages/renderer/src/pan/topbtns/ShuXingMultiModal.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/packages/renderer/src/pan/topbtns/renamemulti.ts b/packages/renderer/src/pan/topbtns/renamemulti.ts new file mode 100644 index 0000000..19dae8e --- /dev/null +++ b/packages/renderer/src/pan/topbtns/renamemulti.ts @@ -0,0 +1,407 @@ +export interface TreeNodeData { + key: string + title: string + rawtitle: string + newtitle: string + isLeaf: boolean + children: TreeNodeData[] + icon: any + isdir: boolean + ismatch: boolean +} + +export function NewRenameConfigData() { + return { + show: false, + replace: { enable: true, search: '', newword: '', chkCase: true, chkAll: true, chkReg: false, applyto: 'full' }, + delete: { enable: false, type: 'search', search: '', chkCase: true, chkAll: true, chkReg: false, beginlen: 0, endlen: 0, beginword: '', endword: '' }, + add: { enable: false, type: 'position', search: '', before: '', after: '', beginword: '', endword: '' }, + index: { enable: false, type: 'begin', format: '', minlen: 1, beginindex: 1, minnum: 1 }, + others: { enable: false, nameformat: '', extformat: '', randomformat: '', randomlen: 4 } + } +} + +export function RunAllNode(nodelist: TreeNodeData[], func: (node: TreeNodeData) => void) { + for (let i = 0, maxi = nodelist.length; i < maxi; i++) { + let node = nodelist[i] + func(node) + + if (node.children && node.children.length > 0) RunAllNode(node.children, func) + } +} + +function Split(text: string, search: string) { + let textlow = text.toLowerCase() + search = search.toLowerCase() + let listlow = textlow.split(search) + let slen = search.length + let pos = 0 + let list: string[] = [] + for (let i = 0, maxi = listlow.length; i < maxi; i++) { + let low = listlow[i] + if (low == '') { + list.push('') + pos = pos + slen + } else { + list.push(text.substring(pos, pos + low.length)) + pos = pos + slen + low.length + } + } + return list +} + +function Replace(text: string, search: string, newtext: string) { + let textlow = text.toLowerCase() + search = search.toLowerCase() + let index = textlow.indexOf(search) + if (index >= 0) { + return text.substring(0, index) + newtext + text.substring(index + search.length) + } else return text +} + +export function RunReplace(isdir: boolean, title: string, config: any) { + let search = config.search as string + if (!search || !config.newword) return [title, title] + + let name = title + let ext = '' + let exti = name.lastIndexOf('.') + if (!isdir && exti >= 0) { + ext = name.substring(exti) + name = name.substring(0, exti) + } + + if (config.chkReg) { + + let reg = RegExp(search) + if (config.chkCase) reg = RegExp(search, 'i') + if (config.chkAll) reg = RegExp(search, 'g') + if (config.chkCase && config.chkAll) reg = RegExp(search, 'ig') + if (config.applyto == 'full') { + + return [title.replace(reg, config.newword), title.replace(reg, '' + config.newword + '')] + } + if (config.applyto == 'name') { + return [name.replace(reg, config.newword) + ext, name.replace(reg, '' + config.newword + '') + ext] + } else { + return [name + ext.replace(reg, config.newword), name + ext.replace(reg, '' + config.newword + '')] + } + } else if (config.chkCase) { + + if (config.chkAll) { + if (config.applyto == 'full') { + let slist = Split(title, search) + return [slist.join(config.newword), slist.join('' + config.newword + '')] + } + if (config.applyto == 'name') { + let slist = Split(name, search) + return [slist.join(config.newword) + ext, slist.join('' + config.newword + '') + ext] + } else { + let slist = Split(ext, search) + return [name + slist.join(config.newword), name + slist.join('' + config.newword + '')] + } + } else { + if (config.applyto == 'full') { + return [Replace(title, search, config.newword), Replace(title, search, '' + config.newword + '')] + } + if (config.applyto == 'name') { + return [Replace(name, search, config.newword) + ext, Replace(name, search, '' + config.newword + '') + ext] + } else { + return [name + Replace(ext, search, config.newword), name + Replace(ext, search, '' + config.newword + '')] + } + } + } else { + + if (config.chkAll) { + if (config.applyto == 'full') { + return [title.replaceAll(search, config.newword), title.replaceAll(search, '' + config.newword + '')] + } + if (config.applyto == 'name') { + return [name.replaceAll(search, config.newword) + ext, name.replaceAll(search, '' + config.newword + '') + ext] + } else { + return [name + ext.replaceAll(search, config.newword), name + ext.replaceAll(search, '' + config.newword + '')] + } + } else { + if (config.applyto == 'full') { + return [title.replace(search, config.newword), title.replace(search, '' + config.newword + '')] + } + if (config.applyto == 'name') { + return [name.replace(search, config.newword) + ext, name.replace(search, '' + config.newword + '') + ext] + } else { + return [name + ext.replace(search, config.newword), name + ext.replace(search, '' + config.newword + '')] + } + } + } +} +export function RunDelete(isdir: boolean, title: string, config: any) { + let name = title + let ext = '' + let exti = name.lastIndexOf('.') + if (!isdir && exti >= 0) { + ext = name.substring(exti) + name = name.substring(0, exti) + } + + if (config.type == 'search' && config.search) { + let search = config.search as string + if (config.chkReg) { + + let reg = RegExp(search) + if (config.chkCase) reg = RegExp(search, 'i') + if (config.chkAll) reg = RegExp(search, 'g') + if (config.chkCase && config.chkAll) reg = RegExp(search, 'ig') + if (config.applyto == 'full') { + + return [title.replace(reg, ''), title.replace(reg, '' + search + '')] + } + if (config.applyto == 'name') { + return [name.replace(reg, '') + ext, name.replace(reg, '' + search + '') + ext] + } else { + return [name + ext.replace(reg, ''), name + ext.replace(reg, '' + search + '')] + } + } else if (config.chkCase) { + + if (config.chkAll) { + let slist = Split(name, search) + return [slist.join('') + ext, slist.join('' + search + '') + ext] + } else { + return [Replace(name, search, '') + ext, Replace(name, search, '' + search + '') + ext] + } + } else { + + if (config.chkAll) { + return [name.replaceAll(search, '') + ext, name.replaceAll(search, '' + search + '') + ext] + } else { + return [name.replace(search, '') + ext, name.replace(search, '' + search + '') + ext] + } + } + } + + if (config.type == 'position' && config.beginlen >= 0 && config.endlen >= 0) { + let title1 = name + let title2 = name + if (config.beginlen > 0 && config.beginlen < title1.length) { + let del = title1.substring(0, config.beginlen) + let str = title1.substring(config.beginlen) + title1 = str + title2 = '' + del + '' + str + } + + if (config.beginlen < title1.length && config.endlen > 0 && config.endlen < title1.length) { + let str1 = title1.substring(0, title1.length - config.endlen) + let str2 = title2.substring(0, title2.length - config.endlen) + let del = title1.substring(title1.length - config.endlen) + title1 = str1 + title2 = str2 + '' + del + '' + } + return [title1 + ext, title2 + ext] + } + + if (config.type == 'range' && config.beginword && config.endword) { + let start = name.indexOf(config.beginword) + let end = name.indexOf(config.endword, start + 1) + if (start >= 0 && end >= 0 && start < end) { + let title1 = name.substring(0, start + 1) + name.substring(end) + let title2 = name.substring(0, start + 1) + '' + name.substring(start + 1, end) + '' + name.substring(end) + return [title1 + ext, title2 + ext] + } + } + + return [title, title] +} +export function RunAdd(isdir: boolean, title: string, config: any) { + let name = title + let ext = '' + let exti = name.lastIndexOf('.') + if (!isdir && exti >= 0) { + ext = name.substring(exti) + name = name.substring(0, exti) + } + + if (config.type == 'search' && config.search) { + let index = name.indexOf(config.search) + if (index >= 0) { + let start = name.substring(0, index) + let mid = name.substring(index, index + config.search.length) + let end = name.substring(index + config.search.length) + + let title1 = name + let title2 = name + if (config.before && config.after) { + title1 = start + config.before + mid + config.after + end + title2 = start + '' + config.before + '' + mid + '' + config.after + '' + end + } else if (config.before) { + title1 = start + config.before + mid + end + title2 = start + '' + config.before + '' + mid + end + } else if (config.after) { + title1 = start + mid + config.after + end + title2 = start + mid + '' + config.after + '' + end + } + + return [title1 + ext, title2 + ext] + } + } + + if (config.type == 'position') { + let title1 = name + let title2 = name + if (config.beginword) { + title1 = config.beginword + title1 + title2 = '' + config.beginword + '' + title2 + } + if (config.endword) { + title1 = title1 + config.endword + title2 = title2 + '' + config.endword + '' + } + return [title1 + ext, title2 + ext] + } + + return [title, title] +} +export function RunIndex(isdir: boolean, title: string, config: any, nodeindex: number) { + if (!config.format) return [title, title] + let name = title + let ext = '' + let exti = name.lastIndexOf('.') + if (!isdir && exti >= 0) { + ext = name.substring(exti) + name = name.substring(0, exti) + } + + let bianhao = config.beginindex + config.minnum * nodeindex + let formate = config.format.replace('#', bianhao.toString().padStart(config.minlen, '0')) + if (config.type == 'begin') { + let title1 = formate + name + let title2 = '' + formate + '' + name + return [title1 + ext, title2 + ext] + } else if (config.type == 'end') { + let title1 = name + formate + let title2 = name + '' + formate + '' + return [title1 + ext, title2 + ext] + } + + return [title, title] +} +export function RunOthers(isdir: boolean, title: string, config: any, sj1Base: string) { + let name = title + let ext = '' + let exti = name.lastIndexOf('.') + if (!isdir && exti >= 0) { + ext = name.substring(exti) + name = name.substring(0, exti) + } + + if (config.nameformat == 'AA') { + return [name.toUpperCase() + ext, name.toUpperCase() + ext] + } + if (config.nameformat == 'aa') { + return [name.toLowerCase() + ext, name.toLowerCase() + ext] + } + if (config.nameformat == 'Aa') { + name = name.toLowerCase() + let title1 = name.replace(/[a-z]+/, (L) => (L.length > 1 ? L.substring(0, 1).toUpperCase() + L.substring(1) : L.toUpperCase())) + let title2 = name.replace(/[a-z]+/, (L) => (L.length > 1 ? '' + L.substring(0, 1).toUpperCase() + '' + L.substring(1) : '' + L.toUpperCase() + '')) + return [title1 + ext, title2 + ext] + } + if (config.nameformat == 'Aa Aa') { + name = name.toLowerCase() + let title1 = name.replace(/[a-z]+/g, (L) => (L.length > 1 ? L.substring(0, 1).toUpperCase() + L.substring(1) : L.toUpperCase())) + let title2 = name.replace(/[a-z]+/g, (L) => (L.length > 1 ? '' + L.substring(0, 1).toUpperCase() + '' + L.substring(1) : '' + L.toUpperCase() + '')) + return [title1 + ext, title2 + ext] + } + + if (config.extformat == 'AA') { + return [name + ext.toUpperCase(), name + '' + ext.toUpperCase() + ''] + } + if (config.extformat == 'aa') { + return [name + ext.toLowerCase(), name + '' + ext.toLowerCase() + ''] + } + + let randomlen = config.randomlen + + if (sj1Base && randomlen > 0) { + let ranname = '' + let ran = Math.random().toString() + ran = ran + ran + ran + ran + ran + let pos = name.length + for (let i = 0; i < randomlen; i++) { + pos = (pos ^ ran.charCodeAt(i)) % 300 + ranname += sj1Base[pos] + } + return [ranname + ext, '' + ranname + '' + ext] + } + + return [title, title] +} + +export function RunReplaceName(renameconfig: any, TreeData: TreeNodeData[], checkedKeys: string[]) { + let show = renameconfig.show + let replace = renameconfig.replace + if (replace.enable) { + RunAllNode(TreeData, (node) => { + let title = RunReplace(node.isdir, node.rawtitle, replace) + node.newtitle = title[0] + node.title = show ? title[0] : title[1] + node.ismatch = node.newtitle != node.rawtitle + }) + return + } + let tdelete = renameconfig.delete + if (tdelete.enable) { + RunAllNode(TreeData, (node) => { + let title = RunDelete(node.isdir, node.rawtitle, tdelete) + node.newtitle = title[0] + node.title = show ? title[0] : title[1] + node.ismatch = node.newtitle != node.rawtitle + }) + return + } + let add = renameconfig.add + if (add.enable) { + RunAllNode(TreeData, (node) => { + let title = RunAdd(node.isdir, node.rawtitle, add) + node.newtitle = title[0] + node.title = show ? title[0] : title[1] + node.ismatch = node.newtitle != node.rawtitle + }) + return + } + let index = renameconfig.index + if (index.enable) { + let nodeindex = 0 + let checkmap = new Set(checkedKeys || []) + RunAllNode(TreeData, (node) => { + if (!checkmap.has(node.key)) { + node.newtitle = node.rawtitle + node.title = node.rawtitle + node.ismatch = false + } else { + let title = RunIndex(node.isdir, node.rawtitle, index, nodeindex) + node.newtitle = title[0] + node.title = show ? title[0] : title[1] + node.ismatch = node.newtitle != node.rawtitle + nodeindex++ + } + }) + return + } + let others = renameconfig.others + if (others.enable) { + let sj1Base = '' + if (others.randomformat == '0-9') sj1Base = '01234567899876543210012345678998765432100123456789987654321001' + if (others.randomformat == 'a-z') sj1Base = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij' + if (others.randomformat == 'A-Z') sj1Base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ' + if (others.randomformat == 'a-zA-Z') sj1Base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZtuvwxABCDE' + if (others.randomformat == '0-9a-z') sj1Base = '0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnop' + if (others.randomformat == '0-9A-Z') sj1Base = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOP' + if (others.randomformat == '0-9a-zA-Z') sj1Base = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + if (sj1Base) sj1Base = sj1Base + sj1Base + sj1Base + sj1Base + sj1Base + RunAllNode(TreeData, (node) => { + let title = RunOthers(node.isdir, node.rawtitle, others, sj1Base) + node.newtitle = title[0] + node.title = show ? title[0] : title[1] + node.ismatch = node.newtitle != node.rawtitle + }) + return + } +} diff --git a/packages/renderer/src/pan/topbtns/topbtn.ts b/packages/renderer/src/pan/topbtns/topbtn.ts new file mode 100644 index 0000000..5c83f50 --- /dev/null +++ b/packages/renderer/src/pan/topbtns/topbtn.ts @@ -0,0 +1,507 @@ +import { IAliGetFileModel } from '@/aliapi/alimodels' +import AliFile from '@/aliapi/file' +import AliFileCmd from '@/aliapi/filecmd' +import AliDirFileList, { IAliFileResp, NewIAliFileResp } from '@/aliapi/dirfilelist' +import AliTrash from '@/aliapi/trash' +import UploadDAL from '@/down/uploaddal' +import { IPageVideoXBT } from '@/store/appstore' +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import { modalCreatNewShareLink, modalDLNAPlayer, modalM3U8Download, modalSearchPan, modalSelectPanDir } from '@/utils/modal' +import { ArrayKeyList } from '@/utils/utils' +import PanDAL from '../pandal' +import usePanFileStore from '../panfilestore' +import usePanTreeStore from '../pantreestore' + +let topbtnLock = new Set() + + +export function handleUpload(uploadtype: string) { + const pantreeStore = usePanTreeStore() + if (!pantreeStore.user_id || !pantreeStore.drive_id || !pantreeStore.selectDir.file_id) { + message.error('上传操作失败 父文件夹错误') + return + } + + if (uploadtype == 'file') { + window.WebShowOpenDialogSync({ title: '选择多个文件上传到网盘', buttonLabel: '上传选中的文件', properties: ['openFile', 'multiSelections'] }, (files: string[] | undefined) => { + if (files && files.length > 0) { + UploadDAL.UploadLocalFiles(pantreeStore.user_id, pantreeStore.drive_id, pantreeStore.selectDir.file_id, files, true) + } + }) + } else { + window.WebShowOpenDialogSync({ title: '选择多个文件夹上传到网盘', buttonLabel: '上传文件夹', properties: ['openDirectory', 'multiSelections'] }, (files: string[] | undefined) => { + if (files && files.length > 0) { + UploadDAL.UploadLocalFiles(pantreeStore.user_id, pantreeStore.drive_id, pantreeStore.selectDir.file_id, files, true) + } + }) + } +} + + +export async function menuFavSelectFile(istree: boolean, isfavor: boolean) { + const selectedData = PanDAL.GetPanSelectedData(istree) + if (selectedData.iserror) { + message.error('收藏操作失败 父文件夹错误') + return + } + if (selectedData.iserrorselected) { + message.error('没有可以收藏的文件') + return + } + + if (topbtnLock.has('menuFavSelectFile')) return + topbtnLock.add('menuFavSelectFile') + try { + const successlist = await AliFileCmd.ApiFavorBatch(selectedData.user_id, selectedData.drive_id, isfavor, true, selectedData.select_keys) + if (isfavor) { + + if (usePanTreeStore().selectDir.file_id == 'favorite') { + PanDAL.aShowDir('', 'refresh', false) + } else { + usePanFileStore().mFavorFiles(isfavor, successlist) + } + } else { + /** 取消收藏:清除收藏夹缓存,当前在收藏夹?更新filelist删除:更新filelist状态 */ + if (usePanTreeStore().selectDir.file_id == 'favorite') { + usePanFileStore().mDeleteFiles('favorite', successlist) + } else { + usePanFileStore().mFavorFiles(isfavor, successlist) + } + } + } catch (e: any) { + message.error(e.message) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('menuFavSelectFile') +} + + +export async function menuTrashSelectFile(istree: boolean, isdelete: boolean) { + const selectedData = PanDAL.GetPanSelectedData(istree) + if (selectedData.iserror) { + message.error('删除操作失败 父文件夹错误') + return + } + if (selectedData.iserrorselected) { + message.error('没有可以删除的文件') + return + } + + if (topbtnLock.has('menuTrashSelectFile')) return + topbtnLock.add('menuTrashSelectFile') + try { + let successlist: string[] + if (isdelete) { + successlist = await AliFileCmd.ApiDeleteBatch(selectedData.user_id, selectedData.drive_id, selectedData.select_keys) + } else { + successlist = await AliFileCmd.ApiTrashBatch(selectedData.user_id, selectedData.drive_id, selectedData.select_keys) + } + + if (istree) { + /** 删除了一个文件夹, 跳转到父文件夹,也就强制清理了这个文件夹的缓存了 */ + PanDAL.aShowDir(selectedData.drive_id, selectedData.parent_dir_id, false) + } else { + + usePanFileStore().mDeleteFiles(selectedData.dir_id, successlist) + } + } catch (e: any) { + message.error(e.message) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('menuTrashSelectFile') +} + + +export function menuCopySelectedFile(istree: boolean, copyby: string) { + const selectedData = PanDAL.GetPanSelectedData(istree) + if (selectedData.iserror) { + message.error('复制移动操作失败 父文件夹错误') + return + } + + let files: IAliGetFileModel[] = [] + if (istree) { + files = [{ ...usePanTreeStore().selectDir, isdir: true, ext: '', category: '', icon: '', sizestr: '', timestr: '', starred: false, thumbnail: '' }] + } else { + files = usePanFileStore().GetSelected() + } + + const fileidlist: string[] = [] + const filenamelist: string[] = [] + const diridlist: string[] = [] + for (let i = 0, maxi = files.length; i < maxi; i++) { + if (files[i].isdir && diridlist.includes(files[i].parent_file_id) == false) diridlist.push(files[i].parent_file_id) + fileidlist.push(files[i].file_id) + } + + if (fileidlist.length == 0) { + message.error('没有可以复制移动的文件') + return + } + modalSelectPanDir(copyby, async function (user_id: string, drive_id: string, dir_id: string) { + if (!drive_id || !dir_id) return + let successlist: string[] + if (copyby == 'copy') { + successlist = await AliFileCmd.ApiCopyBatch(user_id, drive_id, fileidlist, drive_id, dir_id) + + + + + } else { + successlist = await AliFileCmd.ApiMoveBatch(user_id, drive_id, fileidlist, drive_id, dir_id) + + if (istree) { + + PanDAL.aShowDir(selectedData.drive_id, selectedData.parent_dir_id, false) + + } else { + + usePanFileStore().mDeleteFiles(selectedData.dir_id, successlist) + + } + } + setTimeout(() => { + //PanDAL.GetDirFileList(token.user_id, selectDir.drive_id, movetodirid, true) + }, 1000) + }) +} + + +export function dropMoveSelectedFile(movetodirid: string) { + const selectedData = PanDAL.GetPanSelectedData(false) + if (selectedData.iserrorselected) return + if (selectedData.iserror) { + message.error('复制移动操作失败 父文件夹错误') + return + } + + if (selectedData.dir_id == 'trash') { + message.error('回收站内文件不支持移动') + return + } + if (!movetodirid) { + message.error('没有选择要移动到的位置') + return + } + if (movetodirid == selectedData.dir_id) { + message.error('不能移动到原位置') + return + } + + const fileidlist: string[] = [] + const filenamelist: string[] = [] + const selectedFile = usePanFileStore().GetSelected() + for (let i = 0, maxi = selectedFile.length; i < maxi; i++) { + fileidlist.push(selectedFile[i].file_id) + filenamelist.push(selectedFile[i].name) + } + + if (fileidlist.includes(movetodirid)) { + + if (fileidlist.length == 1) message.info('用户取消移动') + else message.error('选中文件不能包含移动到') + return + } + + AliFileCmd.ApiMoveBatch(selectedData.user_id, selectedData.drive_id, fileidlist, selectedData.drive_id, movetodirid).then((success: string[]) => { + + + usePanFileStore().mDeleteFiles(selectedData.dir_id, success) + + }) +} + + +export async function menuFileColorChange(istree: boolean, color: string) { + const selectedData = PanDAL.GetPanSelectedData(istree) + if (selectedData.iserror) { + message.error('标记文件操作失败 父文件夹错误') + return + } + if (selectedData.iserrorselected) { + message.error('没有可以标记的文件') + return + } + + color = color.toLowerCase().replace('#', 'c') + + if (topbtnLock.has('menuFileColorChange')) return + topbtnLock.add('menuFileColorChange') + try { + let successlist = await AliFileCmd.ApiFileColorBatch(selectedData.user_id, selectedData.drive_id, color, selectedData.select_keys) + usePanFileStore().mColorFiles(color, successlist) + } catch (e: any) { + message.error(e.message) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('menuFileColorChange') +} + + +export function menuCreatShare(istree: boolean, shareby: string) { + const selectedData = PanDAL.GetPanSelectedData(istree) + if (selectedData.iserror) { + message.error('创建分享操作失败 父文件夹错误') + return + } + + let list: IAliGetFileModel[] = [] + if (istree) { + let dir = usePanTreeStore().selectDir + list = [ + { + __v_skip: true, + drive_id: dir.drive_id, + file_id: dir.file_id, + parent_file_id: dir.parent_file_id, + name: dir.name, + namesearch: dir.namesearch, + ext: '', + category: '', + icon: 'iconfolder', + size: 0, + sizestr: '', + time: 0, + timestr: '', + starred: false, + isdir: true, + thumbnail: '', + description: '' + } + ] + } else { + list = usePanFileStore().GetSelected() + } + if (list.length == 0) { + message.error('没有可以分享的文件!') + return + } + modalCreatNewShareLink(shareby, list) +} + + +export async function topFavorDeleteAll() { + const selectedData = PanDAL.GetPanSelectedData(false) + if (selectedData.iserror) { + message.error('清空收藏夹操作失败 父文件夹错误') + return + } + if (topbtnLock.has('topFavorDeleteAll')) return + topbtnLock.add('topFavorDeleteAll') + try { + const loadingkey = 'cleartrash_' + Date.now().toString() + message.loading('清空收藏夹执行中...', 60, loadingkey) + let count = 0 + while (true) { + + const resp: IAliFileResp = NewIAliFileResp(selectedData.user_id, selectedData.drive_id, 'favorite', '收藏夹') + await AliTrash.ApiFavorFileListOnePageForClean('updated_at', 'DESC', resp) + if (resp.items.length > 0) { + + const selectkeys = ArrayKeyList('file_id', resp.items) + let successlist = await AliFileCmd.ApiFavorBatch(selectedData.user_id, selectedData.drive_id, false, false, selectkeys) + count += successlist.length + + message.loading('清空收藏夹执行中...(' + count.toString() + ')', 60, loadingkey) + } else { + break + } + } + message.success('清空收藏夹 成功!', 3, loadingkey) + if (usePanTreeStore().selectDir.file_id == 'favorite') PanDAL.aShowDir('', 'refresh', false) + } catch (e: any) { + message.error(e.message) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('topFavorDeleteAll') +} + + +export async function topTrashDeleteAll() { + const selectedData = PanDAL.GetPanSelectedData(false) + if (selectedData.iserror) { + message.error('清空回收站操作失败 父文件夹错误') + return + } + + if (topbtnLock.has('topTrashDeleteAll')) return + topbtnLock.add('topTrashDeleteAll') + const loadingkey = 'cleartrash_' + Date.now().toString() + try { + message.loading('清空回收站执行中...', 60, loadingkey) + let count = 0 + while (true) { + + const resp: IAliFileResp = NewIAliFileResp(selectedData.user_id, selectedData.drive_id, 'trash', '回收站') + await AliTrash.ApiTrashFileListOnePageForClean('updated_at', 'DESC', resp) + if (resp.items.length > 0) { + + const selectkeys = ArrayKeyList('file_id', resp.items) + let successlist = await AliFileCmd.ApiTrashCleanBatch(selectedData.user_id, selectedData.drive_id, false, selectkeys) + count += successlist.length + + message.loading('清空回收站执行中...(' + count.toString() + ')', 0, loadingkey) + } else { + break + } + } + message.success('清空回收站 成功!', 3, loadingkey) + if (usePanTreeStore().selectDir.file_id == 'trash') PanDAL.aShowDir('', 'refresh', false) + } catch (e: any) { + message.error(e.message, 3, loadingkey) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('topTrashDeleteAll') +} + + +export async function topRestoreSelectedFile() { + const selectedData = PanDAL.GetPanSelectedData(false) + if (selectedData.iserror) { + message.error('还原文件操作失败 父文件夹错误') + return + } + if (selectedData.iserrorselected) { + message.error('没有可以还原的文件') + return + } + + if (topbtnLock.has('topRestoreSelectedFile')) return + topbtnLock.add('topRestoreSelectedFile') + try { + const successlist = await AliFileCmd.ApiTrashRestoreBatch(selectedData.user_id, selectedData.drive_id, true, selectedData.select_keys) + if (usePanTreeStore().selectDir.file_id == 'trash') { + + usePanFileStore().mDeleteFiles('trash', successlist) + } else { + + PanDAL.aShowDir('', 'refresh', false) + } + //todo:: 遍历successlist,读取每个文件的path,刷新Tree文件夹 + } catch (e: any) { + message.error(e.message) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('topRestoreSelectedFile') +} + + +export async function topRecoverSelectedFile() { + const selectedData = PanDAL.GetPanSelectedData(false) + if (selectedData.iserror) { + message.error('恢复文件操作失败 父文件夹错误') + return + } + + + const files = usePanFileStore().GetSelected() + const resumelist: { drive_id: string; file_id: string; content_hash: string; size: number; name: string }[] = [] + const selectparentkeys: string[] = ['root', 'recover'] + for (let i = 0, maxi = files.length; i < maxi; i++) { + let file = files[i] + if (file.size > 0) { + + resumelist.push({ drive_id: file.drive_id, file_id: file.file_id, content_hash: file.description, size: file.size, name: file.name }) + if (selectparentkeys.includes(files[i].parent_file_id) == false) selectparentkeys.push(files[i].parent_file_id) + } + } + if (resumelist.length == 0) { + message.error('没有可以恢复的文件(注意不能恢复大小为0的文件)') + return + } + + if (topbtnLock.has('topRecoverSelectedFile')) return + topbtnLock.add('topRecoverSelectedFile') + + const loadingkey = 'recover_' + Date.now().toString() + try { + message.loading('还原文件执行中...', 60, loadingkey) + let successlist: string[] = [] + let onetimelist: { drive_id: string; file_id: string; content_hash: string; size: number; name: string }[] = [] + for (let i = 0, maxi = resumelist.length; i < maxi; i++) { + onetimelist.push(resumelist[i]) + if (onetimelist.length > 99) { + const data = await AliFileCmd.ApiRecoverBatch(selectedData.user_id, onetimelist) + successlist = successlist.concat(data) + onetimelist.length = 0 + message.loading('还原文件执行中...(' + i.toString() + ')', 60, loadingkey) + } + } + if (onetimelist.length > 0) { + const data = await AliFileCmd.ApiRecoverBatch(selectedData.user_id, onetimelist) + successlist = successlist.concat(data) + onetimelist.length = 0 + } + message.success('还原文件(' + successlist.length + ') 成功!', 3, loadingkey) + //todo:: 刷新根目录(恢复文件时,会在根目录创建文件夹) + + usePanFileStore().mDeleteFiles('recover', successlist) + } catch (e: any) { + message.error(e.message, 3, loadingkey) + DebugLog.mSaveLog('danger', e.message) + } + topbtnLock.delete('topRecoverSelectedFile') +} + + +export async function topSearchAll(word: string) { + + if (word == 'topSearchAll高级搜索') { + modalSearchPan() + return + } + + const pantreeStore = usePanTreeStore() + if (!pantreeStore.user_id || !pantreeStore.drive_id || !pantreeStore.selectDir.file_id) { + message.error('搜索文件操作失败 父文件夹错误') + return + } + let searchid = 'search' + word + PanDAL.aShowDir('', searchid, false) +} + + +export async function menuJumpToDir() { + let first = usePanFileStore().GetSelectedFirst() + if (first && first.parent_file_id == '') first = await AliFile.ApiGetFile(usePanTreeStore().user_id, first.drive_id, first.file_id) + if (!first) { + message.error('没有选中任何文件') + return + } + + PanDAL.aShowDir('', first.parent_file_id, true) +} + +export function menuVideoXBT() { + let first = usePanFileStore().GetSelectedFirst() + if (!first) { + message.error('没有选中任何文件') + return + } + + if (first.icon == 'iconweifa') { + message.error('违规视频无法预览') + return + } + const pageVideoXBT: IPageVideoXBT = { user_id: usePanTreeStore().user_id, drive_id: first.drive_id, file_id: first.file_id, file_name: first.name } + window.WebOpenWindow({ page: 'PageVideoXBT', data: pageVideoXBT, theme: 'dark' }) +} + +export function menuDLNA() { + let first = usePanFileStore().GetSelectedFirst() + if (!first) { + message.error('没有选中任何文件') + return + } + modalDLNAPlayer() +} + +export function menuM3U8Download() { + let first = usePanFileStore().GetSelectedFirst() + if (!first) { + message.error('没有选中任何文件') + return + } + modalM3U8Download() +} diff --git a/packages/renderer/src/pic/PicLeft.vue b/packages/renderer/src/pic/PicLeft.vue new file mode 100644 index 0000000..051d4c3 --- /dev/null +++ b/packages/renderer/src/pic/PicLeft.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/packages/renderer/src/pic/PicRight.vue b/packages/renderer/src/pic/PicRight.vue new file mode 100644 index 0000000..e69de29 diff --git a/packages/renderer/src/pic/index.vue b/packages/renderer/src/pic/index.vue new file mode 100644 index 0000000..c297e98 --- /dev/null +++ b/packages/renderer/src/pic/index.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/packages/renderer/src/rss/ScanDAL.ts b/packages/renderer/src/rss/ScanDAL.ts new file mode 100644 index 0000000..0c8cda2 --- /dev/null +++ b/packages/renderer/src/rss/ScanDAL.ts @@ -0,0 +1,233 @@ +import { h, Ref, ref } from 'vue' +import AliDirList from '@/aliapi/dirlist' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import DB from '@/utils/db' +import TreeStore from '@/store/treestore' + +export interface TreeNodeData { + key: string + title: string + selectable?: boolean + disabled?: boolean + disableCheckbox?: boolean + checkable?: boolean + children: TreeNodeData[] + icon: any + size: number + sizestr?: string +} + +export interface FileNodeData { + hash: string + files: FileData[] +} +export interface FileData { + file_id: string + name: string + parent_file_id: string + size: number + sizestr: string + time: number + timestr: string + icon: string + parent_file_path: string +} + +export interface ScanTreeDataModel { + expandedKeys: string[] + checkedKeys: string[] + TreeData: TreeNodeData[] + TreeDataMap: Map +} + +export interface IScanDriverModel { + drive_id: string + + DirMap: Map + + DirChildrenMap: Map + + EnmptyDirMap: Map + WeiGuiDirMap: Map + NoShareDirMap: Map + SameDirMap: Map + CleanDirMap: Map +} + +export function NewScanDriver(drive_id: string): IScanDriverModel { + return { + drive_id, + DirMap: new Map(), + DirChildrenMap: new Map(), + EnmptyDirMap: new Map(), + WeiGuiDirMap: new Map(), + NoShareDirMap: new Map(), + SameDirMap: new Map(), + CleanDirMap: new Map() + } +} +export function ResetScanDriver(data: IScanDriverModel) { + data.drive_id = '' + data.DirMap = new Map() + data.DirChildrenMap = new Map() + data.EnmptyDirMap = new Map() + data.WeiGuiDirMap = new Map() + data.NoShareDirMap = new Map() + data.SameDirMap = new Map() +} + +function GetScanDriver(drive_id: string, children: IAliGetDirModel[]) { + let ts = Date.now() + const DriverData = NewScanDriver(drive_id) + + let root: IAliGetDirModel = { __v_skip: true, drive_id, file_id: 'root', parent_file_id: '', name: '根目录', namesearch: '', size: 0, time: 0, description: '' } + DriverData.DirMap.set(root.file_id, root) + let ChildrenMap = new Map() + ChildrenMap.set(root.file_id, []) + + try { + let parentid: string = '' + let parentdir: IAliGetDirModel[] = [] + let item: IAliGetDirModel + + for (let i = 0, maxi = children.length; i < maxi; i++) { + item = children[i] + item.description = '' + DriverData.DirMap.set(item.file_id, item) + if (parentid != item.parent_file_id) { + if (ChildrenMap.has(item.parent_file_id)) { + parentdir = ChildrenMap.get(item.parent_file_id)! + } else { + parentdir = [] + ChildrenMap.set(item.parent_file_id, parentdir) + } + parentid = item.parent_file_id + } + parentdir.push(item) + } + } catch {} + DriverData.DirChildrenMap = ChildrenMap + console.log('SaveAllDirLite time=', Date.now() - ts) + return DriverData +} + + +export function LoadScanDir(user_id: string, drive_id: string, TotalDirCount: Ref, Processing: Ref, ScanPanData: IScanDriverModel) { + ScanPanData.drive_id = drive_id + ScanPanData.DirMap = new Map() + ScanPanData.DirChildrenMap = new Map() + + return GetAllDir(user_id, drive_id).then((dirlist: IAliGetDirModel[]) => { + TotalDirCount.value = dirlist.length + Processing.value = 50 + const PanData = GetScanDriver(drive_id, dirlist) + Object.assign(ScanPanData, PanData) + }) +} + +async function GetAllDir(user_id: string, drive_id: string) { + let data = await DB.getValueObject('AllDir_' + drive_id) + if (data) { + let dt = await DB.getValueNumber('AllDir_' + drive_id) + if (Date.now() - dt < 1000 * 60 * 60) { + + return data as IAliGetDirModel[] + } + } + + return AliDirList.ApiFastAllDirList(user_id, drive_id) + .then((data) => { + if (!data.next_marker) { + TreeStore.SaveAllDir(drive_id, data.items, true) + return data.items + } else { + DebugLog.mSaveLog('warning', '列出文件夹失败file_id=all' + ' next_marker=' + data.next_marker) + message.error('列出全盘文件夹失败' + data.next_marker) + return [] + } + }) + .catch((err) => { + DebugLog.mSaveLog('warning', '列出文件夹失败file_id=all' + ' err=' + (err.message || '')) + message.error('列出全盘文件夹失败' + err.message) + return [] + }) +} + +const iconfolder = h('i', { class: 'iconfont iconfolder' }) +export const foldericonfn = () => iconfolder +const fileicon = h('i', { class: 'iconfont iconwenjian' }) +export const fileiconfn = () => fileicon +const iconweifa = h('i', { class: 'iconfont iconweifa' }) +const iconweixiang = h('i', { class: 'iconfont iconweixiang' }) +export const iconweixiangfn = () => iconweixiang +export const iconweifafn = () => iconweifa + +export function TreeSelectAll(checkedKeys: Ref, checkedKeysBak: string[]) { + if (checkedKeys.value.length == checkedKeysBak.length) { + checkedKeys.value = [] + } else { + checkedKeys.value = checkedKeysBak.concat() + } +} + +export function TreeSelectOne(selectedKeys: string[], checkedKeys: Ref) { + if (selectedKeys.length > 0) { + let key = selectedKeys[0] + let checkedkeys = checkedKeys.value + if (checkedkeys.includes(key)) { + checkedKeys.value = checkedkeys.filter(function (x) { + return x != key + }) + } else { + checkedKeys.value.push(key) + } + } +} + +export function TreeCheckFileChild(node: TreeNodeData, checkedKeys: Ref) { + if (node.icon != foldericonfn) { + TreeSelectOne([node.key], checkedKeys) + return + } + let keys: string[] = [] + + GetFileChildNode(keys, node) + if (keys.length == 0) return + let isall = true + let checkedkeys = new Set(checkedKeys.value) + for (let i = 0, maxi = keys.length; i < maxi; i++) { + if (!checkedkeys.has(keys[i])) { + isall = false + break + } + } + + if (isall) { + + for (let i = 0, maxi = keys.length; i < maxi; i++) { + checkedkeys.delete(keys[i]) + } + } else { + + for (let i = 0, maxi = keys.length; i < maxi; i++) { + checkedkeys.add(keys[i]) + } + } + checkedKeys.value = Array.from(checkedkeys) +} + +function GetFileChildNode(keys: string[], node: TreeNodeData) { + if (node.children && node.children.length > 0) { + for (let i = 0, maxi = node.children.length; i < maxi; i++) { + if (node.children[i].icon != foldericonfn) { + keys.push(node.children[i].key) + } else { + GetFileChildNode(keys, node.children[i]) + } + } + } else if (node.icon != foldericonfn) { + keys.push(node.key) + } +} diff --git a/packages/renderer/src/rss/appsame/AppSame.vue b/packages/renderer/src/rss/appsame/AppSame.vue new file mode 100644 index 0000000..ca4c150 --- /dev/null +++ b/packages/renderer/src/rss/appsame/AppSame.vue @@ -0,0 +1,299 @@ + + + + + + + diff --git a/packages/renderer/src/rss/appsame/same.ts b/packages/renderer/src/rss/appsame/same.ts new file mode 100644 index 0000000..8fba611 --- /dev/null +++ b/packages/renderer/src/rss/appsame/same.ts @@ -0,0 +1,121 @@ +import AliHttp from '@/aliapi/alihttp' +import { IAliFileItem, IAliGetDirModel, IAliGetFileModel } from '@/aliapi/alimodels' +import AliDirFileList from '@/aliapi/dirfilelist' +import DebugLog from '@/utils/debuglog' +import { humanSize } from '@/utils/format' +import message from '@/utils/message' +import { Ref } from 'vue' +import { FileData, IScanDriverModel } from '../ScanDAL' + +export async function GetDuplicateInfo(user_id: string, PanData: IScanDriverModel, ScanType: string) { + const url = 'adrive/v1/file/getDuplicateInfo' + const postdata = { category: ScanType, drive_id: PanData.drive_id } + const resp = await AliHttp.Post(url, postdata, user_id, '') + try { + if (AliHttp.IsSuccess(resp.code)) { + + return '找到' + (resp.body.total_group_count || 0) + '组重复文件,包含' + (resp.body.total_group_count || 0) + '个文件,总体积' + humanSize(resp.body.total_size || 0) + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'GetDuplicateInfo ' + PanData.drive_id + ' error=' + (e.message || '')) + } + return '查询出错' +} + + +export async function GetSameFile(user_id: string, PanData: IScanDriverModel, Processing: Ref, ScanCount: Ref, TotalFileCount: Ref, ScanType: string) { + ScanCount.value = 0 + + + let filelist = await ApiDuplicateList(user_id, PanData.drive_id, ScanType == 'all' ? '' : ScanType) + TotalFileCount.value += filelist.length + + for (let j = 0, maxj = filelist.length; j < maxj; j++) { + let fileitem = filelist[j] + let hash = fileitem.namesearch + if (hash) { + let savelist = PanData.SameDirMap.get(hash) + if (!savelist) savelist = [] + + if (savelist.length < 50) { + + savelist.push({ + file_id: fileitem.file_id, + name: fileitem.name, + parent_file_id: fileitem.parent_file_id, + size: fileitem.size, + sizestr: fileitem.sizestr, + time: fileitem.time, + timestr: fileitem.timestr, + icon: fileitem.icon, + parent_file_path: '' + }) + PanData.SameDirMap.set(hash, savelist) + } + } + } + + + let SameDirMap = new Map() + let entries = PanData.SameDirMap.entries() + for (let i = 0, maxi = PanData.SameDirMap.size; i < maxi; i++) { + let value = entries.next().value + let arr = value[1] as FileData[] + if (arr.length > 1) { + arr.map((a) => { + a.parent_file_path = GetParentPath(PanData, a.parent_file_id) + }) + arr.sort((a, b) => b.time - a.time) + SameDirMap.set(value[0], arr) + } + } + PanData.SameDirMap = SameDirMap + ScanCount.value = SameDirMap.size +} +/*计算出完整的路径* */ +function GetParentPath(PanData: IScanDriverModel, file_id: string) { + let path: string[] = [] + let dir: IAliGetDirModel | undefined + while (true) { + dir = PanData.DirMap.get(file_id) + if (!dir) break + path.push(dir.name) + file_id = dir.parent_file_id + if (!file_id) break + } + if (path.length == 0) return '' + path.reverse() + return path.join(' > ') +} + +async function ApiDuplicateList(user_id: string, drive_id: string, category: string) { + let next_marker = '' + let items: IAliGetFileModel[] = [] + do { + const url = 'adrive/v1/file/duplicateList' + let postdata = { drive_id: drive_id, marker: next_marker } + if (category) postdata = Object.assign(postdata, { category: category }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + try { + if (AliHttp.IsSuccess(resp.code)) { + next_marker = resp.body.next_marker + for (let i = 0, maxi = resp.body.items.length; i < maxi; i++) { + const oneitems = resp.body.items[i].items as IAliFileItem[] + for (let j = 0; j < oneitems.length; j++) { + const add = AliDirFileList.getFileInfo(oneitems[j], '') + add.namesearch = oneitems[j].content_hash + items.push(add) + } + } + continue + } else if (resp.body && resp.body.code) { + message.warning('列出文件出错 ' + resp.body.code, 2) + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'ApiDuplicateList ' + drive_id + ' error=' + (e.message || '')) + } + return [] + } while (next_marker) + + return items +} diff --git a/packages/renderer/src/rss/index.vue b/packages/renderer/src/rss/index.vue new file mode 100644 index 0000000..24cfb31 --- /dev/null +++ b/packages/renderer/src/rss/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/packages/renderer/src/rss/rssdrivecopy/RssDriveCopy.vue b/packages/renderer/src/rss/rssdrivecopy/RssDriveCopy.vue new file mode 100644 index 0000000..cd559c5 --- /dev/null +++ b/packages/renderer/src/rss/rssdrivecopy/RssDriveCopy.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/packages/renderer/src/rss/rssdrivecopy/drivecopy.ts b/packages/renderer/src/rss/rssdrivecopy/drivecopy.ts new file mode 100644 index 0000000..2b6c69a --- /dev/null +++ b/packages/renderer/src/rss/rssdrivecopy/drivecopy.ts @@ -0,0 +1,75 @@ +import { IAliGetFileModel } from '@/aliapi/alimodels' +import AliFile from '@/aliapi/file' +import message from '@/utils/message' +import { Ref } from 'vue' +import { fileiconfn, foldericonfn } from '../ScanDAL' +import AliTrash from '@/aliapi/trash' + +export interface ICopyTreeInfo { + user_id: string + drive_type: string + drive_id: string + dir_id: string + dir_name: string + parent_id: string + loading: boolean + onlydir: boolean +} +export function NewCopyTreeInfo(onlydir: boolean) { + return { + user_id: '', + drive_type: '', + drive_id: '', + dir_id: '', + dir_name: '', + parent_id: '', + loading: false, + onlydir: onlydir + } +} + +export interface ICopyTreeNode { + key: string + title: string + icon: any + download_url: string + disabled: boolean + children?: ICopyTreeNode[] +} + +export async function LoadDir(dir_id: string, DirData: ICopyTreeInfo, TreeData: Ref, disabledfile: boolean) { + DirData.loading = true + if (!dir_id) dir_id = 'root' + if (dir_id.startsWith('dir_')) dir_id = dir_id.substring('dir_'.length) + if (dir_id == 'root') { + DirData.dir_id = 'root' + DirData.dir_name = '根目录' + DirData.parent_id = 'root' + } else { + let getdir = await AliFile.ApiFileInfo(DirData.user_id, DirData.drive_id, dir_id) + if (getdir) { + DirData.dir_id = getdir.file_id + DirData.dir_name = getdir.name + DirData.parent_id = getdir.parent_file_id + } else { + message.error('读取文件夹信息失败') + } + } + + let resp = await AliTrash.ApiDirFileListNoLock(DirData.user_id, DirData.drive_id, dir_id, '', '', '') + DirData.loading = false + let list: ICopyTreeNode[] = [] + let items = resp.items + let item: IAliGetFileModel + for (let i = 0, maxi = items.length; i < maxi; i++) { + item = items[i] + list.push({ + key: (item.isdir ? 'dir_' : 'file_') + item.file_id, + title: item.name, + disabled: item.isdir ? false : disabledfile, + icon: item.isdir ? foldericonfn : fileiconfn, + download_url: '' + }) + } + TreeData.value = list +} \ No newline at end of file diff --git a/packages/renderer/src/rss/rssjiami/RssJiaMi.vue b/packages/renderer/src/rss/rssjiami/RssJiaMi.vue new file mode 100644 index 0000000..7e651c2 --- /dev/null +++ b/packages/renderer/src/rss/rssjiami/RssJiaMi.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/packages/renderer/src/rss/rssjiami/jiami.ts b/packages/renderer/src/rss/rssjiami/jiami.ts new file mode 100644 index 0000000..6179891 --- /dev/null +++ b/packages/renderer/src/rss/rssjiami/jiami.ts @@ -0,0 +1,100 @@ +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import fsPromises from 'fs/promises' +import { Buffer } from 'buffer' +import path from 'path' + +export async function DoXiMa(dirPath: string, breakSmall: boolean, matchExtList: string[]): Promise { + const filelist: string[] = [] + await GetAllFiles(dirPath, breakSmall, filelist) + if (filelist.length == 0) { + message.error('选择的文件夹下找不到任何文件') + return 0 + } else { + let rand = Date.now() + const rand1 = rand % 256 + rand = rand / 128 + const rand2 = Math.floor(rand % 256) + let rand3 = Math.floor(Math.random() * 255) + + let RunCount = 0 + for (let i = 0, maxi = filelist.length; i < maxi; i++) { + let file = filelist[i].toLowerCase().trimEnd() + if (matchExtList.length > 0) { + + let find = false + for (let j = 0; j < matchExtList.length; j++) { + if (file.endsWith(matchExtList[j])) { + find = true + break + } + } + if (find == false) continue + } + try { + const rand4 = (i % 255) + 1 + if (rand4 == 200) rand3 = Math.floor(Math.random() * 255) + const buff = Buffer.from([0, rand1, rand2, rand3, rand4]) + fsPromises.appendFile(filelist[i], buff).catch((e: any) => {}) + RunCount++ + } catch (e: any) { + DebugLog.mSaveLog('danger', 'XMappendFile' + (e.message || '') + filelist[i]) + } + } + return RunCount + } +} + +async function GetAllFiles(dir: string, breakSmall: boolean, filelist: string[]) { + if (dir.endsWith(path.sep) == false) dir = dir + path.sep + try { + let childfiles = await fsPromises.readdir(dir).catch((e: any) => { + if (e.code && e.code === 'EPERM') { + e = '没有权限访问文件夹' + message.error('没有权限访问文件夹:' + dir) + } + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) message.error('没有权限访问文件夹:' + dir) + DebugLog.mSaveLog('danger', 'XMGetAllFiles文件失败:' + dir + ' ' + (e || '')) + return [] + }) + + let alltask: Promise[] = [] + let dirlist: string[] = [] + for (let i = 0, maxi = childfiles.length; i < maxi; i++) { + const name = childfiles[i] as string + if (name.startsWith('.')) continue + if (name.startsWith('#')) continue + const item = dir + name + alltask.push( + fsPromises + .lstat(item) + .then((stat: any) => { + if (stat.isDirectory()) dirlist.push(item) + else if (stat.isSymbolicLink()) { + } else if (stat.isFile()) { + if (breakSmall == false || stat.size > 5 * 1024 * 1024) filelist.push(item) + } + }) + .catch() + ) + if (alltask.length > 10) { + await Promise.all(alltask).catch(() => {}) + alltask = [] + } + } + + if (alltask.length > 0) { + await Promise.all(alltask).catch(() => {}) + alltask = [] + } + + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + await GetAllFiles(dirlist[i], breakSmall, filelist) + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'GetAllFiles' + (e.message || '')) + } + + return true +} diff --git a/packages/renderer/src/rss/rssrename/RssRename.vue b/packages/renderer/src/rss/rssrename/RssRename.vue new file mode 100644 index 0000000..cfc63b5 --- /dev/null +++ b/packages/renderer/src/rss/rssrename/RssRename.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/packages/renderer/src/rss/rssscanclean/RssScanClean.vue b/packages/renderer/src/rss/rssscanclean/RssScanClean.vue new file mode 100644 index 0000000..4b0b113 --- /dev/null +++ b/packages/renderer/src/rss/rssscanclean/RssScanClean.vue @@ -0,0 +1,290 @@ + + + + diff --git a/packages/renderer/src/rss/rssscanclean/ScanClean.ts b/packages/renderer/src/rss/rssscanclean/ScanClean.ts new file mode 100644 index 0000000..9a3b7a9 --- /dev/null +++ b/packages/renderer/src/rss/rssscanclean/ScanClean.ts @@ -0,0 +1,218 @@ +import AliHttp from '@/aliapi/alihttp' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import { IAliDirBatchResp } from '@/aliapi/dirlist' +import AliDirFileList from '@/aliapi/dirfilelist' +import DebugLog from '@/utils/debuglog' +import { humanSize } from '@/utils/format' +import { HanToPin } from '@/utils/utils' +import { h, Ref } from 'vue' +import { foldericonfn, IScanDriverModel, TreeNodeData } from '../ScanDAL' + + +export async function GetCleanFile(user_id: string, PanData: IScanDriverModel, Processing: Ref, ScanCount: Ref, TotalFileCount: Ref, ScanType: string) { + ScanCount.value = 0 + let keys = PanData.DirMap.keys() + let dirlist: IAliDirBatchResp[] = [] + Processing.value = 0 + while (true) { + let add = 0 + while (dirlist.length < 20) { + let key = keys.next() + if (!key.done) { + add++ + dirlist.push({ dir_id: key.value, next_marker: '', items: [], itemsKey: new Set() }) + } else break + } + Processing.value += add + if (dirlist.length == 0) break + + let isget = await ApiBatchDirFileList(user_id, PanData.drive_id, dirlist, ScanType) + if (isget) { + let list: IAliDirBatchResp[] = [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].next_marker && dirlist[i].items.length < 2000) { + list.push(dirlist[i]) + } else { + let dir_id = dirlist[i].dir_id + + let filelist = dirlist[i].items + TotalFileCount.value += filelist.length + let savelist: IAliGetDirModel[] = [] + + for (let j = 0, maxj = filelist.length; j < maxj; j++) { + let fileitem = filelist[j] + savelist.push({ + __v_skip: true, + drive_id: fileitem.drive_id, + file_id: fileitem.file_id, + parent_file_id: fileitem.parent_file_id, + name: fileitem.name, + namesearch: fileitem.namesearch || HanToPin(fileitem.name), + size: fileitem.size, + time: fileitem.time, + + description: fileitem.icon + }) + } + if (savelist.length > 0) { + + let node = PanData.DirChildrenMap.get(dir_id) + if (node && node.length > 0) { + node.sort((a, b) => a.name.localeCompare(b.name)) + savelist.sort((a, b) => b.size - a.size) + savelist = node.concat(savelist) + } else { + savelist.sort((a, b) => b.size - a.size) + } + PanData.DirChildrenMap.set(dir_id, savelist) + } + if (savelist.length > 0) { + let dir = PanData.DirMap.get(dir_id)! + PanData.CleanDirMap.set(dir.file_id, 'clean') + while (true) { + if (!dir.parent_file_id || PanData.CleanDirMap.has(dir.parent_file_id)) break + PanData.CleanDirMap.set(dir.parent_file_id, 'parent') + dir = PanData.DirMap.get(dir.parent_file_id)! + } + } + } + } + dirlist.length = 0 + dirlist = list + } + } + Processing.value = PanData.DirMap.size +} + +async function ApiBatchDirFileList(user_id: string, drive_id: string, dirlist: IAliDirBatchResp[], ScanType: string) { + let postdata = '{"requests":[' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (i > 0) postdata = postdata + ',' + + let query = 'parent_file_id="' + dirlist[i].dir_id + '"' + if (ScanType == 'size10') query += ' and size > 10485760' + else if (ScanType == 'size100') query += ' and size > 104857600' + else if (ScanType == 'size1000') query += ' and size > 1048576000' + else if (['video', 'doc', 'image', 'audio', 'others', 'zip'].includes(ScanType)) query += ' and size > 1048576000 and category = "' + ScanType + '"' + if (!query.includes('category')) query += ' and type = "file"' + const data2 = { + body: { + drive_id: drive_id, + query: query, + marker: dirlist[i].next_marker, + limit: 100, + fields: 'thumbnail', + order_by: 'size DESC' + }, + headers: { 'Content-Type': 'application/json' }, + id: dirlist[i].dir_id, + method: 'POST', + url: '/file/search' + } + postdata = postdata + JSON.stringify(data2) + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch?jsonmask=responses(id%2Cstatus%2Cbody(next_marker%2Ctotal_count%2Citems(name%2Cfile_id%2Cdrive_id%2Ctype%2Csize%2Cupdated_at%2Ccategory%2Cfile_extension%2Cparent_file_id%2Cmime_type%2Cmime_extension%2Cpunish_flag)))' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let j = 0, maxj = responses.length; j < maxj; j++) { + const status = responses[j].status as number + if (status >= 200 && status <= 205) { + const respi = responses[j] + const id = respi.id || '' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].dir_id == id) { + const dir = dirlist[i] + const items = respi.body.items + dir.next_marker = respi.body.next_marker + for (let i = 0, maxi = items.length; i < maxi; i++) { + if (dir.itemsKey.has(items[i].file_id)) continue + const add = AliDirFileList.getFileInfo(items[i], '') + dir.items.push(add) + dir.itemsKey.add(add.file_id) + } + if (dir.items.length >= 3000) dir.next_marker = '' + break + } + } + } + } + return true + } + } catch (err: any) { + DebugLog.mSaveLog('warning', 'ApiBatchDirFileList err=' + (err.message || '')) + } + return false +} +const fileiconfn = (icon: string) => h('i', { class: 'iconfont ' + icon }) + +export function GetTreeNodes(PanData: IScanDriverModel, parentid: string, TreeDataMap: Map) { + let data: TreeNodeData[] = [] + let item: IAliGetDirModel + + let dirlist = PanData.DirChildrenMap.get(parentid) || [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + item = dirlist[i] + if (item.description != '' || PanData.CleanDirMap.has(item.file_id)) { + + let isdir = item.description == 'iconfolder' || item.description == '' + data.push({ + key: item.file_id, + title: item.name, + icon: isdir ? foldericonfn : () => fileiconfn(item.description), + children: GetTreeNodes(PanData, item.file_id, TreeDataMap), + size: isdir ? 0 : item.size, + sizestr: isdir ? '' : humanSize(item.size) + }) + } + } + data.map((a) => { + TreeDataMap.set(a.key as string, a) + }) + return data +} + + +export function DeleteFromScanClean(PanData: IScanDriverModel, idlist: string[]) { + let entries = PanData.DirChildrenMap.entries() + for (let i = 0, maxi = PanData.DirChildrenMap.size; i < maxi && idlist.length > 0; i++) { + let value = entries.next().value + let children = value[1] as IAliGetDirModel[] + let savelist: IAliGetDirModel[] = [] + for (let j = 0, maxj = children.length; j < maxj; j++) { + let key = children[j].file_id + if (idlist.includes(key)) { + + idlist = idlist.filter((t) => t != key) + } else { + savelist.push(children[j]) + } + } + if (children.length != savelist.length) PanData.DirChildrenMap.set(value[0], savelist) + } +} + +export function GetTreeCheckedSize(PanData: IScanDriverModel, checkedKeys: string[]) { + if (checkedKeys.length == 0) return 0 + let checkedmap = new Set(checkedKeys) + let checkedsize = 0 + let TreeDataMap = new Map() + GetTreeNodes(PanData, 'root', TreeDataMap) + let values = TreeDataMap.values() + let clen = 0 + for (let i = 0, maxi = TreeDataMap.size; i < maxi; i++) { + let node = values.next().value as TreeNodeData + if (checkedmap.has(node.key)) { + clen = node.children!.length + if (clen > 0) { + } else if (node.icon != foldericonfn) { + checkedsize += node.size + } + } + } + return checkedsize +} diff --git a/packages/renderer/src/rss/rssscanenmpty/RssScanEnmpty.vue b/packages/renderer/src/rss/rssscanenmpty/RssScanEnmpty.vue new file mode 100644 index 0000000..0ab2801 --- /dev/null +++ b/packages/renderer/src/rss/rssscanenmpty/RssScanEnmpty.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/packages/renderer/src/rss/rssscanenmpty/scanenmpty.ts b/packages/renderer/src/rss/rssscanenmpty/scanenmpty.ts new file mode 100644 index 0000000..ade61f5 --- /dev/null +++ b/packages/renderer/src/rss/rssscanenmpty/scanenmpty.ts @@ -0,0 +1,123 @@ +import AliHttp from '@/aliapi/alihttp' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import DebugLog from '@/utils/debuglog' +import { Ref } from 'vue' +import { foldericonfn, IScanDriverModel, TreeNodeData } from '../ScanDAL' + + +export async function GetEnmptyDir(user_id: string, PanData: IScanDriverModel, Processing: Ref, ScanCount: Ref) { + ScanCount.value = 0 + + let enmpty = new Map() + let entries = PanData.DirMap.keys() + for (let i = 0, maxi = PanData.DirMap.size; i < maxi; i++) { + let key = entries.next().value + if (!PanData.DirChildrenMap.has(key)) { + + enmpty.set(key, PanData.DirMap.get(key)!) + } + } + + let proadd = (100 - Processing.value) / ((enmpty.size + 1) / 99) + let proval = Processing.value + let idlist: string[] = [] + let keys = enmpty.keys() + for (let i = 0, maxi = enmpty.size; i < maxi; i++) { + idlist.push(keys.next().value) + if (idlist.length >= 100) { + proval += proadd + Processing.value = Math.max(50, Math.floor(proval)) + ScanCount.value += await TestEnmptyDir(user_id, PanData, idlist) + idlist.length = 0 + } + } + if (idlist.length > 0) { + ScanCount.value += await TestEnmptyDir(user_id, PanData, idlist) + idlist.length = 0 + } + Processing.value = 99 +} + +async function TestEnmptyDir(user_id: string, PanData: IScanDriverModel, idlist: string[]) { + let enmptyidlist = await ApiTestEnmptyDir(user_id, PanData.drive_id, idlist) + if (enmptyidlist.length > 0) { + for (let i = 0, maxi = enmptyidlist.length; i < maxi; i++) { + let dir = PanData.DirMap.get(enmptyidlist[i])! + PanData.EnmptyDirMap.set(dir.file_id, 'enmpty') + while (true) { + if (!dir.parent_file_id || PanData.EnmptyDirMap.has(dir.parent_file_id)) break + PanData.EnmptyDirMap.set(dir.parent_file_id, 'parent') + dir = PanData.DirMap.get(dir.parent_file_id)! + } + } + } + return enmptyidlist.length +} + +async function ApiTestEnmptyDir(user_id: string, drive_id: string, idlist: string[]) { + let list: string[] = [] + + let postdata = '{"requests":[' + for (let i = 0, maxi = idlist.length; i < maxi; i++) { + if (i > 0) postdata = postdata + ',' + const data2 = { + body: { + drive_id: drive_id, + query: 'parent_file_id="' + idlist[i] + '"', + limit: 1, + fields: 'thumbnail' + }, + headers: { 'Content-Type': 'application/json' }, + id: idlist[i], + method: 'POST', + url: '/file/search' + } + postdata = postdata + JSON.stringify(data2) + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let j = 0, maxj = responses.length; j < maxj; j++) { + const status = responses[j].status as number + if (status >= 200 && status <= 205) { + const respi = responses[j] + if (respi.body.items.length == 0) list.push(respi.id) + } + } + return list + } + } catch (err: any) { + DebugLog.mSaveLog('warning', 'ApiTestEnmptyDir err=' + (err.message || '')) + } + return list +} + + +export function GetTreeNodes(PanData: IScanDriverModel, parentid: string, TreeDataMap: Map) { + let data: TreeNodeData[] = [] + let item: IAliGetDirModel + + let dirlist = PanData.DirChildrenMap.get(parentid) || [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + item = dirlist[i] + if (PanData.EnmptyDirMap.has(item.file_id)) { + data.push({ + key: item.file_id, + title: item.name, + icon: foldericonfn, + size: item.size, + children: GetTreeNodes(PanData, item.file_id, TreeDataMap) + }) + } + } + data.sort((a, b) => a.title!.localeCompare(b.title!)) + data.map((a) => { + TreeDataMap.set(a.key as string, a) + }) + return data +} diff --git a/packages/renderer/src/rss/rssscanpunish/RssScanPunish.vue b/packages/renderer/src/rss/rssscanpunish/RssScanPunish.vue new file mode 100644 index 0000000..1daf606 --- /dev/null +++ b/packages/renderer/src/rss/rssscanpunish/RssScanPunish.vue @@ -0,0 +1,287 @@ + + + diff --git a/packages/renderer/src/rss/rssscanpunish/scanpunish.ts b/packages/renderer/src/rss/rssscanpunish/scanpunish.ts new file mode 100644 index 0000000..84d6424 --- /dev/null +++ b/packages/renderer/src/rss/rssscanpunish/scanpunish.ts @@ -0,0 +1,240 @@ +import AliHttp from '@/aliapi/alihttp' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import { IAliDirBatchResp } from '@/aliapi/dirlist' +import AliDirFileList from '@/aliapi/dirfilelist' +import DebugLog from '@/utils/debuglog' +import { Ref } from 'vue' +import { foldericonfn, iconweifafn, iconweixiangfn, IScanDriverModel, TreeNodeData } from '../ScanDAL' + + +export async function GetWeiGuiFile(user_id: string, PanData: IScanDriverModel, Processing: Ref, ScanCount: Ref, TotalFileCount: Ref, ScanType: string) { + ScanCount.value = 0 + let keys = PanData.DirMap.keys() + let dirlist: IAliDirBatchResp[] = [] + Processing.value = 0 + while (true) { + let add = 0 + while (dirlist.length < 20) { + let key = keys.next() + if (!key.done) { + add++ + dirlist.push({ dir_id: key.value, next_marker: '', items: [],itemsKey:new Set() }) + } else break + } + Processing.value += add + if (dirlist.length == 0) break + + let isget = await ApiBatchDirFileList(user_id, PanData.drive_id, dirlist, ScanType) + if (isget) { + let list: IAliDirBatchResp[] = [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].next_marker && dirlist[i].items.length < 2000) { + list.push(dirlist[i]) + } else { + let dir_id = dirlist[i].dir_id + + let filelist = dirlist[i].items + TotalFileCount.value += filelist.length + let savelist: IAliGetDirModel[] = [] + let weifa = 0 + let noshare = 0 + + for (let j = 0, maxj = filelist.length; j < maxj; j++) { + let fileitem = filelist[j] + if (fileitem.icon == 'iconweifa' || fileitem.icon == 'iconweixiang') { + savelist.push({ + __v_skip: true, + drive_id: fileitem.drive_id, + file_id: fileitem.file_id, + parent_file_id: fileitem.parent_file_id, + name: fileitem.name, + namesearch: '', + size: fileitem.size, + time: fileitem.time, + + description: fileitem.icon + }) + + if (fileitem.icon == 'iconweifa') weifa++ + if (fileitem.icon == 'iconweixiang') noshare++ + } + } + if (savelist.length > 0) { + + let node = PanData.DirChildrenMap.get(dir_id) + if (node && node.length > 0) { + node.sort((a, b) => a.name.localeCompare(b.name)) + savelist.sort((a, b) => a.name.localeCompare(b.name)) + savelist = node.concat(savelist) + } else { + savelist.sort((a, b) => a.name.localeCompare(b.name)) + } + PanData.DirChildrenMap.set(dir_id, savelist) + } + if (weifa > 0) { + let dir = PanData.DirMap.get(dir_id)! + PanData.WeiGuiDirMap.set(dir.file_id, 'weifa') + while (true) { + if (!dir.parent_file_id || PanData.WeiGuiDirMap.has(dir.parent_file_id)) break + PanData.WeiGuiDirMap.set(dir.parent_file_id, 'parent') + dir = PanData.DirMap.get(dir.parent_file_id)! + } + } + + if (noshare > 0) { + let dir = PanData.DirMap.get(dir_id)! + PanData.NoShareDirMap.set(dir.file_id, 'noshare') + while (true) { + if (!dir.parent_file_id || PanData.NoShareDirMap.has(dir.parent_file_id)) break + PanData.NoShareDirMap.set(dir.parent_file_id, 'parent') + dir = PanData.DirMap.get(dir.parent_file_id)! + } + } + } + } + dirlist.length = 0 + dirlist = list + } + } + Processing.value = PanData.DirMap.size +} + +async function ApiBatchDirFileList(user_id: string, drive_id: string, dirlist: IAliDirBatchResp[], ScanType: string) { + let postdata = '{"requests":[' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (i > 0) postdata = postdata + ',' + + let query = 'parent_file_id="' + dirlist[i].dir_id + '"' + if (ScanType == 'size10') query += ' and size > 10485760' + else if (ScanType == 'size100') query += ' and size > 104857600' + else if (ScanType == 'size1000') query += ' and size > 1048576000' + else if (['video', 'doc', 'image', 'audio', 'others', 'zip'].includes(ScanType)) query += ' and category = "' + ScanType + '"' + if (!query.includes('category')) query += ' and type = "file"' + + const data2 = { + body: { + drive_id: drive_id, + query: query, + marker: dirlist[i].next_marker, + limit: 100, + fields: 'thumbnail' + }, + headers: { 'Content-Type': 'application/json' }, + id: dirlist[i].dir_id, + method: 'POST', + url: '/file/search' + } + postdata = postdata + JSON.stringify(data2) + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch?jsonmask=responses(id%2Cstatus%2Cbody(next_marker%2Ctotal_count%2Citems(name%2Cfile_id%2Cdrive_id%2Ctype%2Csize%2Cupdated_at%2Ccategory%2Cfile_extension%2Cparent_file_id%2Cmime_type%2Cmime_extension%2Cpunish_flag)))' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let j = 0, maxj = responses.length; j < maxj; j++) { + const status = responses[j].status as number + if (status >= 200 && status <= 205) { + const respi = responses[j] + const id = respi.id || '' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].dir_id == id) { + const dir = dirlist[i] + const items = respi.body.items + dir.next_marker = respi.body.next_marker + for (let i = 0, maxi = items.length; i < maxi; i++) { + if (dir.itemsKey.has(items[i].file_id)) continue + const add = AliDirFileList.getFileInfo(items[i], '') + dir.items.push(add) + dir.itemsKey.add(add.file_id) + } + if (dir.items.length >= 3000) dir.next_marker = '' + break + } + } + } + } + return true + } + } catch (err: any) { + DebugLog.mSaveLog('warning', 'ApiBatchDirFileList err=' + (err.message || '')) + } + return false +} + + +export function GetTreeNodes(PanData: IScanDriverModel, parentid: string, TreeDataMap: Map, ShowWeiGui: boolean, ShowNoShare: boolean) { + let data: TreeNodeData[] = [] + let item: IAliGetDirModel + + let dirlist = PanData.DirChildrenMap.get(parentid) || [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + item = dirlist[i] + if (ShowWeiGui && (item.description == 'iconweifa' || PanData.WeiGuiDirMap.has(item.file_id))) { + + data.push({ + key: item.file_id, + title: item.name, + icon: item.description == 'iconweifa' ? iconweifafn : foldericonfn, + size: item.size, + children: GetTreeNodes(PanData, item.file_id, TreeDataMap, ShowWeiGui, ShowNoShare) + }) + } else if (ShowNoShare && (item.description == 'iconweixiang' || PanData.NoShareDirMap.has(item.file_id))) { + + data.push({ + key: item.file_id, + title: item.name, + icon: item.description == 'iconweixiang' ? iconweixiangfn : foldericonfn, + size: item.size, + children: GetTreeNodes(PanData, item.file_id, TreeDataMap, ShowWeiGui, ShowNoShare) + }) + } + } + data.map((a) => { + TreeDataMap.set(a.key as string, a) + }) + return data +} + + +export function DeleteFromScanDataPunish(PanData: IScanDriverModel, idlist: string[]) { + let entries = PanData.DirChildrenMap.entries() + for (let i = 0, maxi = PanData.DirChildrenMap.size; i < maxi && idlist.length > 0; i++) { + let value = entries.next().value + let children = value[1] as IAliGetDirModel[] + let savelist: IAliGetDirModel[] = [] + for (let j = 0, maxj = children.length; j < maxj; j++) { + let key = children[j].file_id + if (idlist.includes(key)) { + + idlist = idlist.filter((t) => t != key) + } else { + savelist.push(children[j]) + } + } + if (children.length != savelist.length) PanData.DirChildrenMap.set(value[0], savelist) + } +} + +export function GetTreeCheckedSize(PanData: IScanDriverModel, checkedKeys: string[], ShowWeiGui: boolean, ShowNoShare: boolean) { + if (checkedKeys.length == 0) return 0 + let checkedmap = new Set(checkedKeys) + let checkedsize = 0 + let TreeDataMap = new Map() + GetTreeNodes(PanData, 'root', TreeDataMap, ShowWeiGui, ShowNoShare) + let values = TreeDataMap.values() + let clen = 0 + for (let i = 0, maxi = TreeDataMap.size; i < maxi; i++) { + let node = values.next().value as TreeNodeData + if (checkedmap.has(node.key)) { + clen = node.children!.length + if (clen > 0) { + } else if (node.icon != foldericonfn) { + checkedsize += node.size + } + } + } + return checkedsize +} diff --git a/packages/renderer/src/rss/rssscansame/RssScanSame.vue b/packages/renderer/src/rss/rssscansame/RssScanSame.vue new file mode 100644 index 0000000..5066f58 --- /dev/null +++ b/packages/renderer/src/rss/rssscansame/RssScanSame.vue @@ -0,0 +1,306 @@ + + + + + + + diff --git a/packages/renderer/src/rss/rssscansame/scansame.ts b/packages/renderer/src/rss/rssscansame/scansame.ts new file mode 100644 index 0000000..14fc5da --- /dev/null +++ b/packages/renderer/src/rss/rssscansame/scansame.ts @@ -0,0 +1,230 @@ +import AliHttp from '@/aliapi/alihttp' +import { IAliGetDirModel } from '@/aliapi/alimodels' +import { IAliDirBatchResp } from '@/aliapi/dirlist' +import AliDirFileList from '@/aliapi/dirfilelist' +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import { Ref } from 'vue' +import { FileData, IScanDriverModel } from '../ScanDAL' + + +export async function GetSameFile(user_id: string, PanData: IScanDriverModel, Processing: Ref, ScanCount: Ref, TotalFileCount: Ref, ScanType: string) { + ScanCount.value = 0 + let keys = PanData.DirMap.keys() + let dirlist: IAliDirBatchResp[] = [] + + Processing.value = 0 + while (true) { + let add = 0 + while (dirlist.length < 20) { + let key = keys.next() + if (!key.done) { + add++ + dirlist.push({ dir_id: key.value, next_marker: '', items: [], itemsKey: new Set() }) + } else break + } + Processing.value += add + if (dirlist.length == 0) break + + let isget = await ApiBatchDirFileList(user_id, PanData.drive_id, dirlist, ScanType) + if (isget) { + let list: IAliDirBatchResp[] = [] + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].next_marker && dirlist[i].items.length < 2000) { + list.push(dirlist[i]) + } else { + + let filelist = dirlist[i].items + TotalFileCount.value += filelist.length + + for (let j = 0, maxj = filelist.length; j < maxj; j++) { + let fileitem = filelist[j] + let hash = fileitem.namesearch + if (hash) { + let savelist = PanData.SameDirMap.get(hash) + if (!savelist) savelist = [] + + if (savelist.length < 50) { + + savelist.push({ + file_id: fileitem.file_id, + name: fileitem.name, + parent_file_id: fileitem.parent_file_id, + size: fileitem.size, + sizestr: fileitem.sizestr, + time: fileitem.time, + timestr: fileitem.timestr, + icon: fileitem.icon, + parent_file_path: '' + }) + PanData.SameDirMap.set(hash, savelist) + } + } + } + } + } + dirlist.length = 0 + dirlist = list + } + } + Processing.value = PanData.DirMap.size + + + let SameDirMap = new Map() + let entries = PanData.SameDirMap.entries() + for (let i = 0, maxi = PanData.SameDirMap.size; i < maxi; i++) { + let value = entries.next().value + let arr = value[1] as FileData[] + if (arr.length > 1) { + arr.map((a) => { + a.parent_file_path = GetParentPath(PanData, a.parent_file_id) + }) + arr.sort((a, b) => b.time - a.time) + SameDirMap.set(value[0], arr) + } + } + PanData.SameDirMap = SameDirMap + ScanCount.value = SameDirMap.size +} +/*计算出完整的路径* */ +function GetParentPath(PanData: IScanDriverModel, file_id: string) { + let path: string[] = [] + let dir: IAliGetDirModel | undefined + while (true) { + dir = PanData.DirMap.get(file_id) + if (!dir) break + path.push(dir.name) + file_id = dir.parent_file_id + if (!file_id) break + } + if (path.length == 0) return '' + path.reverse() + return path.join(' > ') +} + +async function ApiBatchDirFileList(user_id: string, drive_id: string, dirlist: IAliDirBatchResp[], ScanType: string) { + let postdata = '{"requests":[' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (i > 0) postdata = postdata + ',' + + let query = 'parent_file_id="' + dirlist[i].dir_id + '"' + if (ScanType == 'size10') query += ' and size > 10485760' + else if (ScanType == 'size100') query += ' and size > 104857600' + else if (ScanType == 'size1000') query += ' and size > 1048576000' + else if (['video', 'doc', 'image', 'audio', 'others', 'zip'].includes(ScanType)) query += ' and category = "' + ScanType + '"' + if (!query.includes('category')) query += ' and type = "file"' + + const data2 = { + body: { + drive_id: drive_id, + query: query, + marker: dirlist[i].next_marker, + limit: 100, + fields: 'thumbnail' + }, + headers: { 'Content-Type': 'application/json' }, + id: dirlist[i].dir_id, + method: 'POST', + url: '/file/search' + } + postdata = postdata + JSON.stringify(data2) + } + postdata += '],"resource":"file"}' + + const url = 'v2/batch?jsonmask=responses(id%2Cstatus%2Cbody(next_marker%2Ctotal_count%2Citems(name%2Cfile_id%2Cdrive_id%2Ctype%2Csize%2Cupdated_at%2Ccategory%2Cfile_extension%2Cparent_file_id%2Cmime_type%2Cmime_extension%2Ccontent_hash%2Cpunish_flag)))' + const resp = await AliHttp.Post(url, postdata, user_id, '') + + try { + if (AliHttp.IsSuccess(resp.code)) { + const responses = resp.body.responses + for (let j = 0, maxj = responses.length; j < maxj; j++) { + const status = responses[j].status as number + if (status >= 200 && status <= 205) { + const respi = responses[j] + const id = respi.id || '' + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + if (dirlist[i].dir_id == id) { + const dir = dirlist[i] + const items = respi.body.items + dir.next_marker = respi.body.next_marker + for (let i = 0, maxi = items.length; i < maxi; i++) { + if (dir.itemsKey.has(items[i].file_id)) continue + const add = AliDirFileList.getFileInfo(items[i], '') + add.namesearch = items[i].content_hash + dir.items.push(add) + dir.itemsKey.add(add.file_id) + } + if (dir.items.length >= 3000) dir.next_marker = '' + break + } + } + } + } + return true + } + } catch (err: any) { + DebugLog.mSaveLog('warning', 'ApiBatchDirFileList err=' + (err.message || '')) + } + return false +} + +async function ApiWalkDirFileList(user_id: string, drive_id: string, file_id: string, limit: number, category: string) { + let next_marker = '' + let items: any[] = [] + do { + let url = 'v2/file/walk?jsonmask=next_marker%2Citems(name%2Cfile_id%2Cdrive_id%2Ctype%2Csize%2Cupdated_at%2Ccategory%2Cfile_extension%2Cparent_file_id%2Cmime_type%2Cmime_extension%2Ccontent_hash%2Cpunish_flag)' + let postdata = { + all: false, + drive_id: drive_id, + parent_file_id: file_id, + marker: next_marker, + limit: 1000, + fields: 'thumbnail', + order_by: 'updated_at', + order_direction: 'DESC', + image_cropping_aspect_ratios: ['1:1'], + type: 'file' + } + if (category && category != 'all') postdata = Object.assign(postdata, { category }) + const resp = await AliHttp.Post(url, postdata, user_id, '') + try { + if (AliHttp.IsSuccess(resp.code)) { + next_marker = resp.body.next_marker + items = items.concat(resp.body.items) + } else if (resp.code == 404) { + + next_marker = '' + break + } else if (resp.body && resp.body.code) { + items.length = 0 + next_marker = resp.body.code + message.warning('列出文件出错 ' + resp.body.code, 2) + return false + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'ApiWalkDirFileList' + file_id + ' error=' + (e.message || '')) + break + } + } while (next_marker) + return items +} + + +export function DeleteFromSameData(PanData: IScanDriverModel, idlist: string[]) { + let entries = PanData.SameDirMap.entries() + for (let i = 0, maxi = PanData.SameDirMap.size; i < maxi && idlist.length > 0; i++) { + let value = entries.next().value + let children = value[1] as FileData[] + let savelist: FileData[] = [] + for (let j = 0, maxj = children.length; j < maxj; j++) { + let key = children[j].file_id + if (idlist.includes(key)) { + + idlist = idlist.filter((t) => t != key) + } else { + savelist.push(children[j]) + } + } + if (children.length != savelist.length) PanData.SameDirMap.set(value[0], savelist) + } +} diff --git a/packages/renderer/src/rss/rssusercopy/RssUserCopy.vue b/packages/renderer/src/rss/rssusercopy/RssUserCopy.vue new file mode 100644 index 0000000..5f67fa4 --- /dev/null +++ b/packages/renderer/src/rss/rssusercopy/RssUserCopy.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/packages/renderer/src/rss/rssusercopy/usercopy.ts b/packages/renderer/src/rss/rssusercopy/usercopy.ts new file mode 100644 index 0000000..3527a6b --- /dev/null +++ b/packages/renderer/src/rss/rssusercopy/usercopy.ts @@ -0,0 +1,142 @@ +import { IAliGetFileModel } from '@/aliapi/alimodels' +import AliFile from '@/aliapi/file' +import AliDirFileList from '@/aliapi/dirfilelist' +import message from '@/utils/message' +import { Ref } from 'vue' +import { fileiconfn, foldericonfn } from '../ScanDAL' +import AliTrash from '@/aliapi/trash' + +export interface ICopyTreeInfo { + user_id: string + drive_id: string + dir_id: string + dir_name: string + parent_id: string + loading: boolean + onlydir: boolean +} +export function NewCopyTreeInfo(onlydir: boolean) { + return { + user_id: '', + drive_id: '', + dir_id: '', + dir_name: '', + parent_id: '', + loading: false, + onlydir: onlydir + } +} + +export interface ICopyTreeNode { + key: string + title: string + icon: any + download_url: string + children?: ICopyTreeNode[] +} + +export async function LoadDir(dir_id: string, DirData: ICopyTreeInfo, TreeData: Ref) { + DirData.loading = true + if (!dir_id) dir_id = 'root' + if (dir_id.startsWith('dir_')) dir_id = dir_id.substring('dir_'.length) + + if (dir_id == 'root') { + DirData.dir_id = 'root' + DirData.dir_name = '根目录' + DirData.parent_id = 'root' + } else { + let getdir = await AliFile.ApiFileInfo(DirData.user_id, DirData.drive_id, dir_id) + if (getdir) { + DirData.dir_id = getdir.file_id + DirData.dir_name = getdir.name + DirData.parent_id = getdir.parent_file_id + } else { + message.error('读取文件夹信息失败') + } + } + + let resp = await AliTrash.ApiDirFileListNoLock(DirData.user_id, DirData.drive_id, dir_id, '', '', DirData.onlydir ? 'folder' : '') + DirData.loading = false + let list: ICopyTreeNode[] = [] + let items = resp.items + let item: IAliGetFileModel + for (let i = 0, maxi = items.length; i < maxi; i++) { + item = items[i] + list.push({ + key: (item.isdir ? 'dir_' : 'file_') + item.file_id, + title: item.name, + icon: item.isdir ? foldericonfn : fileiconfn, + download_url: '' //item.download_url + }) + } + TreeData.value = list +} + +export async function LoadCopy(LeftData: ICopyTreeInfo, LeftCheckedKeys: string[], LeftTreeData: ICopyTreeNode[], CopyTreeLoading: Ref, TreeData: ICopyTreeNode[]) { + CopyTreeLoading.value = true + TreeData.length = 0 + for (let i = 0, maxi = LeftTreeData.length; i < maxi && LeftCheckedKeys.length > 0; i++) { + let node = LeftTreeData[i] + if (LeftCheckedKeys.includes(node.key)) { + let key = node.key + LeftCheckedKeys = LeftCheckedKeys.filter((t) => t != key) + TreeData.push({ ...node, children: [] }) + } + } + for (let i = 0, maxi = TreeData.length; i < maxi; i++) { + let node = TreeData[i] + if (node.key.startsWith('dir_')) { + await LoadChildDir(LeftData.user_id, LeftData.drive_id, node) + } + } + + + CopyTreeLoading.value = false +} + +async function LoadChildDir(user_id: string, drive_id: string, node: ICopyTreeNode) { + let dir_id = node.key.substring('dir_'.length) + let resp = await AliTrash.ApiDirFileListNoLock(user_id, drive_id, dir_id, '', '', 'folder') + + let list: ICopyTreeNode[] = [] + let items = resp.items + let item: IAliGetFileModel + for (let i = 0, maxi = items.length; i < maxi; i++) { + item = items[i] + list.push({ + key: (item.isdir ? 'dir_' : 'file_') + item.file_id, + title: item.name, + icon: item.isdir ? foldericonfn : fileiconfn, + download_url: '', //item.download_url, + children: [] + }) + } + node.children = list + + for (let i = 0, maxi = list.length; i < maxi; i++) { + let nd = list[i] + if (nd.key.startsWith('dir_')) { + await LoadChildDir(user_id, drive_id, nd) + } + } +} + + +export function GetTreeNodes(TreeData: ICopyTreeNode[], TreeDataMap: Map) { + let data: ICopyTreeNode[] = [] + for (let i = 0, maxi = TreeData.length; i < maxi; i++) { + let item = TreeData[i] + data.push({ + key: item.key, + title: item.title, + icon: item.icon, + download_url: item.download_url, + children: GetTreeNodes(item.children!, TreeDataMap) + }) + } + data.sort((a, b) => a.title!.localeCompare(b.title!)) + data.map((a) => { + TreeDataMap.set(a.key as string, a) + }) + return data +} diff --git a/packages/renderer/src/rss/rssxima/RssXiMa.vue b/packages/renderer/src/rss/rssxima/RssXiMa.vue new file mode 100644 index 0000000..4afed66 --- /dev/null +++ b/packages/renderer/src/rss/rssxima/RssXiMa.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/packages/renderer/src/rss/rssxima/xima.ts b/packages/renderer/src/rss/rssxima/xima.ts new file mode 100644 index 0000000..6179891 --- /dev/null +++ b/packages/renderer/src/rss/rssxima/xima.ts @@ -0,0 +1,100 @@ +import DebugLog from '@/utils/debuglog' +import message from '@/utils/message' +import fsPromises from 'fs/promises' +import { Buffer } from 'buffer' +import path from 'path' + +export async function DoXiMa(dirPath: string, breakSmall: boolean, matchExtList: string[]): Promise { + const filelist: string[] = [] + await GetAllFiles(dirPath, breakSmall, filelist) + if (filelist.length == 0) { + message.error('选择的文件夹下找不到任何文件') + return 0 + } else { + let rand = Date.now() + const rand1 = rand % 256 + rand = rand / 128 + const rand2 = Math.floor(rand % 256) + let rand3 = Math.floor(Math.random() * 255) + + let RunCount = 0 + for (let i = 0, maxi = filelist.length; i < maxi; i++) { + let file = filelist[i].toLowerCase().trimEnd() + if (matchExtList.length > 0) { + + let find = false + for (let j = 0; j < matchExtList.length; j++) { + if (file.endsWith(matchExtList[j])) { + find = true + break + } + } + if (find == false) continue + } + try { + const rand4 = (i % 255) + 1 + if (rand4 == 200) rand3 = Math.floor(Math.random() * 255) + const buff = Buffer.from([0, rand1, rand2, rand3, rand4]) + fsPromises.appendFile(filelist[i], buff).catch((e: any) => {}) + RunCount++ + } catch (e: any) { + DebugLog.mSaveLog('danger', 'XMappendFile' + (e.message || '') + filelist[i]) + } + } + return RunCount + } +} + +async function GetAllFiles(dir: string, breakSmall: boolean, filelist: string[]) { + if (dir.endsWith(path.sep) == false) dir = dir + path.sep + try { + let childfiles = await fsPromises.readdir(dir).catch((e: any) => { + if (e.code && e.code === 'EPERM') { + e = '没有权限访问文件夹' + message.error('没有权限访问文件夹:' + dir) + } + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) message.error('没有权限访问文件夹:' + dir) + DebugLog.mSaveLog('danger', 'XMGetAllFiles文件失败:' + dir + ' ' + (e || '')) + return [] + }) + + let alltask: Promise[] = [] + let dirlist: string[] = [] + for (let i = 0, maxi = childfiles.length; i < maxi; i++) { + const name = childfiles[i] as string + if (name.startsWith('.')) continue + if (name.startsWith('#')) continue + const item = dir + name + alltask.push( + fsPromises + .lstat(item) + .then((stat: any) => { + if (stat.isDirectory()) dirlist.push(item) + else if (stat.isSymbolicLink()) { + } else if (stat.isFile()) { + if (breakSmall == false || stat.size > 5 * 1024 * 1024) filelist.push(item) + } + }) + .catch() + ) + if (alltask.length > 10) { + await Promise.all(alltask).catch(() => {}) + alltask = [] + } + } + + if (alltask.length > 0) { + await Promise.all(alltask).catch(() => {}) + alltask = [] + } + + for (let i = 0, maxi = dirlist.length; i < maxi; i++) { + await GetAllFiles(dirlist[i], breakSmall, filelist) + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'GetAllFiles' + (e.message || '')) + } + + return true +} diff --git a/packages/renderer/src/setting/SettingAria.vue b/packages/renderer/src/setting/SettingAria.vue new file mode 100644 index 0000000..5df0f55 --- /dev/null +++ b/packages/renderer/src/setting/SettingAria.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/packages/renderer/src/setting/SettingDebug.vue b/packages/renderer/src/setting/SettingDebug.vue new file mode 100644 index 0000000..323c954 --- /dev/null +++ b/packages/renderer/src/setting/SettingDebug.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/packages/renderer/src/setting/SettingDown.vue b/packages/renderer/src/setting/SettingDown.vue new file mode 100644 index 0000000..2891d64 --- /dev/null +++ b/packages/renderer/src/setting/SettingDown.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/packages/renderer/src/setting/SettingLog.vue b/packages/renderer/src/setting/SettingLog.vue new file mode 100644 index 0000000..9fef220 --- /dev/null +++ b/packages/renderer/src/setting/SettingLog.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/packages/renderer/src/setting/SettingPan.vue b/packages/renderer/src/setting/SettingPan.vue new file mode 100644 index 0000000..25bb822 --- /dev/null +++ b/packages/renderer/src/setting/SettingPan.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/packages/renderer/src/setting/SettingUI.vue b/packages/renderer/src/setting/SettingUI.vue new file mode 100644 index 0000000..4b52c43 --- /dev/null +++ b/packages/renderer/src/setting/SettingUI.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/packages/renderer/src/setting/ShutDown.vue b/packages/renderer/src/setting/ShutDown.vue new file mode 100644 index 0000000..6b739b5 --- /dev/null +++ b/packages/renderer/src/setting/ShutDown.vue @@ -0,0 +1,56 @@ + + + + diff --git a/packages/renderer/src/setting/index.vue b/packages/renderer/src/setting/index.vue new file mode 100644 index 0000000..409e28a --- /dev/null +++ b/packages/renderer/src/setting/index.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/packages/renderer/src/setting/settingstore.ts b/packages/renderer/src/setting/settingstore.ts new file mode 100644 index 0000000..7a192e1 --- /dev/null +++ b/packages/renderer/src/setting/settingstore.ts @@ -0,0 +1,329 @@ +import { defineStore } from 'pinia' +import DebugLog from '@/utils/debuglog' +import { getResourcesPath } from '@/utils/electronhelper' +import { useAppStore } from '@/store' +import { existsSync, readFileSync, writeFileSync } from 'fs' + +export interface SettingState { + + + uiTheme: string + + uiImageMode: string + + uiVideoMode: string + + uiVideoPlayer: string + + uiVideoPlayerPath: string + + uiAutoColorVideo: boolean + + uiAutoPlaycursorVideo: boolean + + uiShowPanPath: boolean + + uiExitOnClose: boolean + + + + uiFolderSize: boolean + + uiFileOrderDuli: string + + uiTimeFolderFormate: string + + uiTimeFolderIndex: number + + uiShareDays: string + + uiSharePassword: string + + uiXBTNumber: number + + uiXBTWidth: number + + uiFileListOrder: string + + uiFileListMode: string + + uiFileColorArray: { key: string; title: string }[] + + + + downSavePath: string + + downSavePathDefault: boolean + + downSavePathFull: boolean + + downSaveBreakWeiGui: boolean + + uploadFileMax: number + + downFileMax: number + + downThreadMax: number + + downGlobalSpeed: number + + downGlobalSpeedM: string + + downAutoShutDown: number + + downSaveShowPro: boolean + + downSmallFileFirst: boolean + + downUploadBreakExist: boolean + + downUploadBreakFile: boolean + + downIngoredList: string[] + + + + ariaSavePath: string + + ariaUrl: string + + ariaPwd: string + + ariaHttps: boolean + + ariaState: string + + ariaLoading: boolean + + + + debugCacheSize: string + + debugFileListMax: number + + debugFavorListMax: number + + debugDowningListMax: number + + debugDownedListMax: number + + debugFolderSizeCacheHour: number + + + + yinsiLinkPassword: boolean + + yinsiZipPassword: boolean +} +const setting: SettingState = { + + uiTheme: 'system', + uiImageMode: 'fill', + uiVideoMode: 'mpv', + uiVideoPlayer: 'mpv', + uiVideoPlayerPath: '', + uiAutoColorVideo: true, + uiAutoPlaycursorVideo: true, + uiShowPanPath: true, + uiExitOnClose: false, + + uiFolderSize: true, + uiFileOrderDuli: 'null', + uiTimeFolderFormate: 'yyyy-MM-dd HH-mm-ss', + uiTimeFolderIndex: 1, + uiShareDays: 'always', + uiSharePassword: 'random', + uiXBTNumber: 36, + uiXBTWidth: 960, + uiFileListOrder: 'updated_at desc', + uiFileListMode: 'list', + uiFileColorArray: [ + { key: '#df5659', title: '鹅冠红' }, + { key: '#9c27b0', title: '兰花紫' }, + { key: '#42a5f5', title: '晴空蓝' }, + { key: '#00bc99', title: '竹叶青' }, + { key: '#4caf50', title: '宝石绿' }, + { key: '#ff9800', title: '金盏黄' } + ], + + downSavePath: '', + downSavePathDefault: true, + downSavePathFull: true, + downSaveBreakWeiGui: true, + uploadFileMax: 5, + downFileMax: 5, + downThreadMax: 4, + downGlobalSpeed: 0, + downGlobalSpeedM: 'MB', + downAutoShutDown: 0, + downSaveShowPro: true, + downSmallFileFirst: false, + downUploadBreakExist: false, + downUploadBreakFile: false, + downIngoredList: ['thumbs.db', 'desktop.ini', '.ds_store', '.td', '~', '.downloading'], + + ariaSavePath: '', + ariaUrl: '', + ariaPwd: '', + ariaHttps: false, + ariaState: 'local', + ariaLoading: false, + + debugCacheSize: '', + debugFileListMax: 1000, + debugFavorListMax: 1000, + debugDowningListMax: 1000, + debugDownedListMax: 5000, + debugFolderSizeCacheHour: 72, + + yinsiLinkPassword: false, + yinsiZipPassword: false +} +function patchSetting(val: any) { + + setting.uiTheme = defaultValue(val.uiTheme, ['system', 'light', 'dark']) + console.log('patchSetting', val) + useAppStore().toggleTheme(setting.uiTheme) + setting.uiImageMode = defaultValue(val.uiImageMode, ['fill', 'width', 'web']) + setting.uiVideoMode = defaultValue(val.uiVideoMode, ['mpv', 'online']) + setting.uiVideoPlayer = defaultValue(val.uiVideoPlayer, ['mpv', 'other', 'web']) + setting.uiVideoPlayerPath = defaultString(val.uiVideoPlayerPath, '') + setting.uiAutoColorVideo = defaultBool(val.uiAutoColorVideo, true) + setting.uiAutoPlaycursorVideo = defaultBool(val.uiAutoPlaycursorVideo, true) + setting.uiShowPanPath = defaultBool(val.uiShowPanPath, true) + setting.uiExitOnClose = defaultBool(val.uiExitOnClose, false) + + setting.uiFolderSize = defaultBool(val.uiFolderSize, true) + setting.uiFileOrderDuli = defaultString(val.uiFileOrderDuli, 'null') + setting.uiTimeFolderFormate = defaultString(val.uiTimeFolderFormate, 'yyyy-MM-dd HH-mm-ss').replace('mm-dd', 'MM-dd').replace('HH-MM', 'HH-mm') + setting.uiTimeFolderIndex = defaultNumber(val.uiTimeFolderIndex, 1) + setting.uiShareDays = defaultValue(val.uiShareDays, ['always', 'week', 'month']) + setting.uiSharePassword = defaultValue(val.uiSharePassword, ['random', 'last', 'nopassword']) + setting.uiXBTNumber = defaultValue(val.uiXBTNumber, [36, 24, 36, 48, 60, 72]) + setting.uiXBTWidth = defaultValue(val.uiXBTWidth, [960, 720, 960, 1080, 1280]) + setting.uiFileListOrder = defaultValue(val.uiFileListOrder, ['updated_at desc', 'name asc', 'name desc', 'updated_at asc', 'updated_at desc', 'size asc', 'size desc']) + setting.uiFileListMode = defaultValue(val.uiFileListMode, ['list', 'image', 'bigimage']) + if (val.uiFileColorArray && val.uiFileColorArray.length >= 6) setting.uiFileColorArray = val.uiFileColorArray + + + setting.downSavePath = defaultString(val.downSavePath, '') + setting.downSavePathDefault = defaultBool(val.downSavePathDefault, true) + setting.downSavePathFull = defaultBool(val.downSavePathFull, true) + setting.downSaveBreakWeiGui = defaultBool(val.downSaveBreakWeiGui, true) + setting.uploadFileMax = defaultValue(val.uploadFileMax, [5, 1, 3, 5, 10, 20, 30]) + setting.downFileMax = defaultValue(val.downFileMax, [5, 1, 3, 5, 10, 20, 30]) + setting.downThreadMax = defaultValue(val.downThreadMax, [4, 1, 2, 4, 8, 16]) + setting.downGlobalSpeed = defaultNumberSub(val.downGlobalSpeed, 0, 0, 999) + setting.downGlobalSpeedM = defaultValue(val.downGlobalSpeedM, ['MB', 'KB']) + setting.downAutoShutDown = 0 + setting.downSaveShowPro = defaultBool(val.downSaveShowPro, true) + setting.downSmallFileFirst = defaultBool(val.downSmallFileFirst, false) + setting.downUploadBreakExist = defaultBool(val.downUploadBreakExist, false) + setting.downUploadBreakFile = defaultBool(val.downUploadBreakFile, false) + setting.downIngoredList = val.downIngoredList && val.downIngoredList.length > 0 ? val.downIngoredList : ['thumbs.db', 'desktop.ini', '.ds_store', '.td', '~', '.downloading'] + + setting.ariaSavePath = defaultString(val.ariaSavePath, '') + if (setting.ariaSavePath.indexOf('/') < 0 && setting.ariaSavePath.indexOf('\\') < 0) setting.ariaSavePath = '' + setting.ariaUrl = defaultString(val.ariaUrl, '') + if (setting.ariaUrl.indexOf(':') < 0) setting.ariaUrl = '' + setting.ariaPwd = defaultString(val.ariaPwd, '') + setting.ariaHttps = defaultBool(val.ariaHttps, false) + setting.ariaState = 'local' + setting.ariaLoading = false + + setting.debugCacheSize = defaultString(val.debugCacheSize, '') + setting.debugFileListMax = defaultNumberSub(val.debugFileListMax, 1000, 1000, 3000) + setting.debugFavorListMax = defaultNumberSub(val.debugFavorListMax, 1000, 100, 3000) + setting.debugDowningListMax = 1000 + setting.debugDownedListMax = defaultNumberSub(val.debugDownedListMax, 5000, 1000, 50000) + setting.debugFolderSizeCacheHour = defaultValue(val.debugFolderSizeCacheHour, [72, 2, 8, 24, 48, 72]) + + setting.yinsiLinkPassword = defaultBool(val.yinsiLinkPassword, false) + setting.yinsiZipPassword = defaultBool(val.yinsiZipPassword, false) +} +let settingstr = '' + + +function LoadSetting() { + try { + let settingConfig = getResourcesPath('setting.config') + if (settingConfig && existsSync(settingConfig)) { + settingstr = readFileSync(settingConfig, 'utf-8') + let val = JSON.parse(settingstr) + patchSetting(val) + } else { + SaveSetting() + } + } catch { + SaveSetting() + } + return setting +} + +function defaultValue(val: any, check: any[]) { + if (val && check.includes(val)) return val + return check[0] +} +function defaultString(val: any, check: string) { + if (val && typeof val == 'string') return val + return check +} +function defaultBool(val: any, check: boolean) { + if (typeof val == 'boolean') return val + return check +} +function defaultNumber(val: any, check: number) { + if (typeof val == 'number') return val + return check +} +function defaultNumberSub(val: any, check: number, min: number, max: number) { + if (typeof val == 'number') { + if (val < min) return min + if (val > max) return max + return val + } + return check +} + + +function SaveSetting() { + try { + let savestr = JSON.stringify(setting) + if (savestr != settingstr) { + let settingConfig = getResourcesPath('setting.config') + writeFileSync(settingConfig, savestr, 'utf-8') + settingstr = savestr + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'SaveSettingToJsonError' + (e.message || '')) + } +} + +const useSettingStore = defineStore('setting', { + state: (): SettingState => LoadSetting(), + getters: { + AriaIsLocal(state: SettingState): boolean { + return state.ariaState == 'local' + } + }, + actions: { + updateStore(partial: Partial) { + if (partial.uiTimeFolderFormate) partial.uiTimeFolderFormate = partial.uiTimeFolderFormate.replace('mm-dd', 'MM-dd').replace('HH-MM', 'HH-mm') + this.$patch(partial) + SaveSetting() + useAppStore().toggleTheme(setting.uiTheme) + }, + + updateFileColor(key: string, title: string) { + if (!key) return + let arr = setting.uiFileColorArray.concat() + for (let i = 0; i < arr.length; i++) { + if (arr[i].key == key) arr[i].title = title + } + this.$patch({ uiFileColorArray: arr }) + SaveSetting() + } + } +}) + +export default useSettingStore diff --git a/packages/renderer/src/share/following/FollowingDAL.ts b/packages/renderer/src/share/following/FollowingDAL.ts new file mode 100644 index 0000000..e21639b --- /dev/null +++ b/packages/renderer/src/share/following/FollowingDAL.ts @@ -0,0 +1,112 @@ +import _ from 'lodash' +import AliFollowing from '@/aliapi/following' +import { IAliOtherFollowingModel } from '@/aliapi/alimodels' +import message from '@/utils/message' +import useOtherFollowingStore from './OtherFollowingStore' +import useMyFollowingStore from './MyFollowingStore' + +export default class FollowingDAL { + + static async aReloadOtherFollowingList(user_id: string, force: boolean) { + if(!user_id) return + const otherfollowingStore = useOtherFollowingStore() + if (!force && otherfollowingStore.TuiJianLoaded) return + if (otherfollowingStore.TuiJianLoading == true) return + otherfollowingStore.TuiJianLoading = true + const resp = await AliFollowing.ApiOtherFollowingListAll(user_id) + otherfollowingStore.aSaveOtherFollowingList('官方推荐', 'arcoblue', resp.items) + + const classed = await AliFollowing.ApiOtherFollowingClassListAll() + + const map = new Map() + for (let i = 0, maxi = classed.length; i < maxi; i++) { + let item = classed[i] + if (!item.class_name) continue + if (map.has(item.class_name) == false) map.set(item.class_name, []) + let list = map.get(item.class_name)! + let add: IAliOtherFollowingModel = { + avatar: item.avatar || '', + phone: '', + is_following: false, + description: item.description, + user_id: item.user_id, + nick_name: item.nick_name, + follower_count: item.follower_count + } + list.push(add) + } + + let entries = map.entries() + for (let i = 0, maxi = map.size; i < maxi; i++) { + let entry = entries.next().value + if (entry[1].length > 0) otherfollowingStore.aSaveOtherFollowingList(entry[0] + ' (' + entry[1].length + ')', 'orangered', entry[1]) + } + + otherfollowingStore.TuiJianLoading = false + otherfollowingStore.TuiJianLoaded = true + } + + static async aReloadMyFollowing(user_id: string, force: boolean) { + if(!user_id) return + const myfollowingStore = useMyFollowingStore() + if (!force && myfollowingStore.ListDataRaw.length > 0) return + if (myfollowingStore.ListLoading == true) return + myfollowingStore.ListLoading = true + const resp = await AliFollowing.ApiMyFollowingListAll(user_id) + myfollowingStore.aLoadListData(resp.items) + myfollowingStore.ListLoading = false + } + static onRFollowing = _.debounce( + (user_id: string) => { + FollowingDAL.aReloadMyFollowing(user_id, true) + }, + 3000, + { maxWait: 10000 } + ) + + static async aSetFollowing(user_id: string, followingid: string, following: boolean) { + await AliFollowing.ApiSetFollowing(user_id, followingid, following, true) + useMyFollowingStore().mSetFollowing(followingid, following) + FollowingDAL.onRFollowing(user_id) + } + + static async aSetFollowingBatch(user_id: string, idlist: string[], following: boolean) { + let followingid = '' + for (let i = 0, maxi = idlist.length; i < maxi; i++) { + followingid = idlist[i] + message.info((following ? '' : '取消') + '订阅中( ' + i + ' / ' + maxi + ' )', 3, 'aSetFollowingBatch' + following) + await AliFollowing.ApiSetFollowing(user_id, followingid, following, false) + useMyFollowingStore().mSetFollowing(followingid, following) + } + message.success((following ? '订阅' : '取消订阅') + ' 成功', 3, 'aSetFollowingBatch' + following) + } + + static aSetFollowingText(user_id: string, text: string, following: boolean) { + let idlist: string[] = [] + + + + text = text.replaceAll('/drive/subscription', '') + let index = text.indexOf('aliyundrive.com/u/') + while (index > 0) { + let id = text.substring(index + 'aliyundrive.com/u/'.length) + + + if (id.length > 50) id = id.substring(0, 50) + if (id.indexOf('/') > 0) id = id.substring(0, id.indexOf('/')) + if (id.indexOf('#') > 0) id = id.substring(0, id.indexOf('#')) + if (id.indexOf('?') > 0) id = id.substring(0, id.indexOf('?')) + if (id.indexOf('&') > 0) id = id.substring(0, id.indexOf('&')) + id = id.trim() + if (id.length == 32 && /^[A-Za-z0-9]+$/.test(id) && idlist.includes(id) == false) idlist.push(id) + text = text.substring(index + 'aliyundrive.com/u/'.length) + index = text.indexOf('aliyundrive.com/u/') + } + + if (idlist.length == 0) { + message.error('解析订阅链接失败,格式错误') + return Promise.resolve(false) + } + return FollowingDAL.aSetFollowingBatch(user_id, idlist, following).then(() => true) + } +} diff --git a/packages/renderer/src/share/following/MyFollowingRight.vue b/packages/renderer/src/share/following/MyFollowingRight.vue new file mode 100644 index 0000000..967ff57 --- /dev/null +++ b/packages/renderer/src/share/following/MyFollowingRight.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/packages/renderer/src/share/following/MyFollowingStore.ts b/packages/renderer/src/share/following/MyFollowingStore.ts new file mode 100644 index 0000000..0db85b6 --- /dev/null +++ b/packages/renderer/src/share/following/MyFollowingStore.ts @@ -0,0 +1,203 @@ +import fuzzysort from 'fuzzysort' +import { defineStore } from 'pinia' +import { IAliMyFollowingModel } from '@/aliapi/alimodels' +import { GetSelectedList, GetFocusNext, SelectAll, MouseSelectOne, KeyboardSelectOne } from '@/utils/selecthelper' +import { HanToPin } from '@/utils/utils' + +type Item = IAliMyFollowingModel +type State = MyFollowingState +const KEY = 'user_id' + +export interface MyFollowingState { + + ListLoading: boolean + + ListDataRaw: Item[] + + ListDataShow: Item[] + + + ListSelected: Set + + ListOrderKey: string + + ListFocusKey: string + + ListSelectKey: string + + ListSearchKey: string + + + FollowingKeys: Set +} + +const useMyFollowingStore = defineStore('myfollowing', { + state: (): State => ({ + ListLoading: false, + ListDataRaw: [], + ListDataShow: [], + ListSelected: new Set(), + ListOrderKey: 'time desc', + ListFocusKey: '', + ListSelectKey: '', + ListSearchKey: '', + FollowingKeys: new Set() + }), + + getters: { + ListDataCount(state: State): number { + return state.ListDataShow.length + }, + + IsListSelected(state: State): boolean { + return state.ListSelected.size > 0 + }, + ListSelectedCount(state: State): number { + return state.ListSelected.size + }, + ListDataSelectCountInfo(state: State): string { + return '已选中 ' + state.ListSelected.size + ' / ' + state.ListDataShow.length + ' 个' + }, + IsListSelectedAll(state: State): boolean { + return state.ListSelected.size > 0 && state.ListSelected.size == state.ListDataShow.length + } + }, + + actions: { + + aLoadListData(list: Item[]) { + + list.sort((a, b) => b.latest_messages[0].created - a.latest_messages[0].created) + let item: Item + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + item.SearchName = HanToPin(item.nick_name) + } + this.ListDataRaw = list + + let oldSelected = this.ListSelected + let newSelected = new Set() + let map = new Set() + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = list[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + map.add(key) + } + + this.$patch({ FollowingKeys: map, ListSelected: newSelected, ListFocusKey: '', ListSelectKey: '', ListSearchKey: '' }) + this.mRefreshListDataShow(true) + }, + + mSearchListData(value: string) { + + this.$patch({ ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '', ListSearchKey: value }) + this.mRefreshListDataShow(true) + }, + + mSetFollowing(followingid: string, following: boolean) { + + if (following) this.FollowingKeys.add(followingid) + else if (this.FollowingKeys.has(followingid)) this.FollowingKeys.delete(followingid) + + if (following) { + + } else { + + let listnew: Item[] = [] + const listold = this.ListDataRaw + for (let i = 0, maxi = listold.length; i < maxi; i++) { + if (listold[i].user_id !== followingid) { + listnew.push(listold[i]) + } + } + if (listnew.length != listold.length) { + this.ListDataRaw = listnew + this.mRefreshListDataShow(true) + } + if (this.ListSelected.has(followingid)) this.ListSelected.delete(followingid) + } + }, + + mRefreshListDataShow(refreshRaw: boolean) { + if (!refreshRaw) { + let ListDataShow = this.ListDataShow.concat() + Object.freeze(ListDataShow) + this.ListDataShow=ListDataShow + return + } + if (this.ListSearchKey) { + + let searchlist: Item[] = [] + let results = fuzzysort.go(this.ListSearchKey, this.ListDataRaw, { + threshold: -200000, + keys: ['nick_name', 'SearchName', 'description'], + scoreFn: (a) => Math.max(a[0] ? a[0].score : -200000, a[1] ? a[1].score : -200000, a[2] ? a[2].score - 100 : -200000) + }) + for (let i = 0, maxi = results.length; i < maxi; i++) { + if (results[i].score > -200000) searchlist.push(results[i].obj) + } + Object.freeze(searchlist) + this.ListDataShow = searchlist + } else { + + let ListDataShow = this.ListDataRaw.concat() + Object.freeze(ListDataShow) + this.ListDataShow=ListDataShow + } + + let freezelist = this.ListDataShow + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = freezelist.length; i < maxi; i++) { + key = freezelist[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + this.ListSelected = newSelected + }, + + mSelectAll() { + this.$patch({ ListSelected: SelectAll(this.ListDataShow, KEY, this.ListSelected), ListFocusKey: '', ListSelectKey: '' }) + this.mRefreshListDataShow(false) + }, + mMouseSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = MouseSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + mKeyboardSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = KeyboardSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + + GetSelected() { + return GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedFirst() { + let list = GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + if (list.length > 0) return list[0] + return undefined + }, + mSetFocus(key: string) { + this.ListFocusKey = key + this.mRefreshListDataShow(false) + }, + + mGetFocus() { + if (this.ListFocusKey == '' && this.ListDataShow.length > 0) return this.ListDataShow[0][KEY] + return this.ListFocusKey + }, + + mGetFocusNext(position: string) { + return GetFocusNext(this.ListDataShow, KEY, this.ListFocusKey, position) + } + } +}) + +export default useMyFollowingStore diff --git a/packages/renderer/src/share/following/OtherFollowingRight.vue b/packages/renderer/src/share/following/OtherFollowingRight.vue new file mode 100644 index 0000000..e86f280 --- /dev/null +++ b/packages/renderer/src/share/following/OtherFollowingRight.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/packages/renderer/src/share/following/OtherFollowingStore.ts b/packages/renderer/src/share/following/OtherFollowingStore.ts new file mode 100644 index 0000000..05925dc --- /dev/null +++ b/packages/renderer/src/share/following/OtherFollowingStore.ts @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia' +import { IAliOtherFollowingModel } from '@/aliapi/alimodels' +import useMyFollowingStore from './MyFollowingStore' + +export declare interface FollowingState { + + TuiJianLoading: boolean + + TuiJianLoaded: boolean + + TuiJianList: { key: string; color: string; list: IAliOtherFollowingModel[] }[] +} + +const useFollowingStore = defineStore('following', { + state: (): FollowingState => ({ + TuiJianLoading: false, + TuiJianLoaded: false, + TuiJianList: [{ key: '官方推荐', color: 'arcoblue', list: [] }] + }), + getters: {}, + actions: { + + aSaveOtherFollowingList(key: string, color: string, list: IAliOtherFollowingModel[]) { + list.sort((a, b) => b.follower_count - a.follower_count) + for (let i = 0, maxi = this.TuiJianList.length; i < maxi; i++) { + if (this.TuiJianList[i].key == key) { + this.TuiJianList[i].color = color + this.TuiJianList[i].list = list + return + } + } + this.TuiJianList.push({ key, color, list }) + } + } +}) + +export default useFollowingStore diff --git a/packages/renderer/src/share/index.vue b/packages/renderer/src/share/index.vue new file mode 100644 index 0000000..7b24391 --- /dev/null +++ b/packages/renderer/src/share/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/packages/renderer/src/share/share/EditShareLinkModal.vue b/packages/renderer/src/share/share/EditShareLinkModal.vue new file mode 100644 index 0000000..1764e42 --- /dev/null +++ b/packages/renderer/src/share/share/EditShareLinkModal.vue @@ -0,0 +1,221 @@ + + + + diff --git a/packages/renderer/src/share/share/MyShareRight.vue b/packages/renderer/src/share/share/MyShareRight.vue new file mode 100644 index 0000000..3bdd357 --- /dev/null +++ b/packages/renderer/src/share/share/MyShareRight.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/packages/renderer/src/share/share/MyShareStore.ts b/packages/renderer/src/share/share/MyShareStore.ts new file mode 100644 index 0000000..7dbe2b3 --- /dev/null +++ b/packages/renderer/src/share/share/MyShareStore.ts @@ -0,0 +1,254 @@ +import fuzzysort from 'fuzzysort' +import { defineStore } from 'pinia' +import { IAliShareItem } from '@/aliapi/alimodels' +import { GetSelectedList, GetFocusNext, SelectAll, MouseSelectOne, KeyboardSelectOne } from '@/utils/selecthelper' +import { HanToPin } from '@/utils/utils' +import { UpdateShareModel } from '@/aliapi/share' +import { humanExpiration } from '@/utils/format' + +type Item = IAliShareItem +type State = MyShareState +const KEY = 'share_id' + +export interface MyShareState { + + ListLoading: boolean + + ListDataRaw: Item[] + + ListDataShow: Item[] + + + ListSelected: Set + + ListOrderKey: string + + ListFocusKey: string + + ListSelectKey: string + + ListSearchKey: string +} + +const useMyShareStore = defineStore('myshare', { + state: (): State => ({ + ListLoading: false, + ListDataRaw: [], + ListDataShow: [], + ListSelected: new Set(), + ListOrderKey: 'time', + ListFocusKey: '', + ListSelectKey: '', + ListSearchKey: '' + }), + + getters: { + ListDataCount(state: State): number { + return state.ListDataShow.length + }, + + IsListSelected(state: State): boolean { + return state.ListSelected.size > 0 + }, + ListSelectedCount(state: State): number { + return state.ListSelected.size + }, + ListDataSelectCountInfo(state: State): string { + return '已选中 ' + state.ListSelected.size + ' / ' + state.ListDataShow.length + ' 个' + }, + IsListSelectedAll(state: State): boolean { + return state.ListSelected.size > 0 && state.ListSelected.size == state.ListDataShow.length + }, + + ListStats(state: State) { + let stats = { preview: 0, download: 0, save: 0, previewMax: 0, forbidden: 0, expired: 0, expir2day: 0 } + let list = state.ListDataShow + let item: Item + let exp = 0 + let day = new Date().getTime() + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + stats.preview += item.preview_count + stats.previewMax = Math.max(stats.previewMax, item.preview_count) + stats.download += item.download_count + stats.save += item.save_count + if (item.status == 'forbidden') stats.forbidden++ + if (item.expired) stats.expired++ + else if (new Date(item.expiration).getTime() - day < 2 * 24 * 60 * 60 * 1000) stats.expir2day++ + } + return stats + } + }, + + actions: { + + aLoadListData(list: Item[]) { + + let item: Item + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + item.description = HanToPin(item.share_name) + } + this.ListDataRaw = this.mGetOrder(this.ListOrderKey, list) + + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = list[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + + this.$patch({ ListSelected: newSelected, ListFocusKey: '', ListSelectKey: '', ListSearchKey: '' }) + this.mRefreshListDataShow(true) + }, + + mSearchListData(value: string) { + + this.$patch({ ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '', ListSearchKey: value }) + this.mRefreshListDataShow(true) + }, + + mOrderListData(value: string) { + + this.$patch({ ListOrderKey: value, ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '' }) + this.ListDataRaw = this.mGetOrder(value, this.ListDataRaw) + this.mRefreshListDataShow(true) + }, + mGetOrder(order: string, list: Item[]) { + if (order == 'time') list.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) + if (order == 'preview') list.sort((a, b) => b.preview_count - a.preview_count) + if (order == 'download') list.sort((a, b) => b.download_count - a.download_count) + if (order == 'save') list.sort((a, b) => b.save_count - a.save_count) + if (order == 'state') + list.sort((a, b) => { + let s = a.share_msg.localeCompare(b.share_msg) + if (s == 0) { + if (a.first_file && b.first_file) return 0 + if (a.first_file) return 1 + if (b.first_file) return -1 + return 0 + } + return s + }) + return list + }, + + mRefreshListDataShow(refreshRaw: boolean) { + if (!refreshRaw) { + let ListDataShow = this.ListDataShow.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + return + } + if (this.ListSearchKey) { + + let searchlist: Item[] = [] + let results = fuzzysort.go(this.ListSearchKey, this.ListDataRaw, { + threshold: -200000, + keys: ['share_name', 'description'], + scoreFn: (a) => Math.max(a[0] ? a[0].score : -200000, a[1] ? a[1].score : -200000) + }) + for (let i = 0, maxi = results.length; i < maxi; i++) { + if (results[i].score > -200000) searchlist.push(results[i].obj as IAliShareItem) + } + Object.freeze(searchlist) + this.ListDataShow = searchlist + } else { + + let ListDataShow = this.ListDataRaw.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + } + + let freezelist = this.ListDataShow + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = freezelist.length; i < maxi; i++) { + key = freezelist[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + this.ListSelected = newSelected + }, + + + mSelectAll() { + this.$patch({ ListSelected: SelectAll(this.ListDataShow, KEY, this.ListSelected), ListFocusKey: '', ListSelectKey: '' }) + this.mRefreshListDataShow(false) + }, + mMouseSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = MouseSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + mKeyboardSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = KeyboardSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + + GetSelected() { + return GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedFirst() { + let list = GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + if (list.length > 0) return list[0] + return undefined + }, + mSetFocus(key: string) { + this.ListFocusKey = key + this.mRefreshListDataShow(false) + }, + + mGetFocus() { + if (this.ListFocusKey == '' && this.ListDataShow.length > 0) return this.ListDataShow[0][KEY] + return this.ListFocusKey + }, + + mGetFocusNext(position: string) { + return GetFocusNext(this.ListDataShow, KEY, this.ListFocusKey, position) + }, + mDeleteFiles(shareidlist: string[]) { + let filemap = new Set(shareidlist) + let ListDataRaw = this.ListDataRaw + let NewDataList: Item[] = [] + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (!filemap.has(item.share_id)) { + NewDataList.push(item) + } + } + if (this.ListDataRaw.length != NewDataList.length) { + this.ListDataRaw = NewDataList + this.mRefreshListDataShow(true) + } + }, + mUpdateShare(success: UpdateShareModel[]) { + let ListDataRaw = this.ListDataRaw + const timenow = new Date().getTime() + for (let j = 0, jmax = success.length; j < jmax; j++) { + let info = success[j] + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (item.share_id == info.share_id) { + item.share_pwd = info.share_pwd + item.share_name = info.share_name + item.description = HanToPin(info.share_name) + item.expiration = info.expiration + item.share_msg = humanExpiration(info.expiration, timenow) + item.expired = item.share_msg == '过期失效' + break + } + } + } + this.mRefreshListDataShow(false) + } + } +}) + +export default useMyShareStore diff --git a/packages/renderer/src/share/share/OtherShareRight.vue b/packages/renderer/src/share/share/OtherShareRight.vue new file mode 100644 index 0000000..197d725 --- /dev/null +++ b/packages/renderer/src/share/share/OtherShareRight.vue @@ -0,0 +1,302 @@ + + + + + diff --git a/packages/renderer/src/share/share/OtherShareStore.ts b/packages/renderer/src/share/share/OtherShareStore.ts new file mode 100644 index 0000000..2926bc1 --- /dev/null +++ b/packages/renderer/src/share/share/OtherShareStore.ts @@ -0,0 +1,213 @@ +import fuzzysort from 'fuzzysort' +import { defineStore } from 'pinia' +import { GetSelectedList, GetFocusNext, SelectAll, MouseSelectOne, KeyboardSelectOne } from '@/utils/selecthelper' +import { HanToPin } from '@/utils/utils' + + +export interface IOtherShareLinkModel { + share_id: string + share_name: string + description: string + share_pwd: string + expiration: string + expired: boolean + share_msg: string + created_at: string + updated_at: string + saved_at: string + saved_time: number +} + +type Item = IOtherShareLinkModel +type State = OtherShareState +const KEY = 'share_id' + +export interface OtherShareState { + + ListLoading: boolean + + ListDataRaw: Item[] + + ListDataShow: Item[] + + + ListSelected: Set + + ListOrderKey: string + + ListFocusKey: string + + ListSelectKey: string + + ListSearchKey: string +} + +const useOtherShareStore = defineStore('othershare', { + state: (): State => ({ + ListLoading: false, + ListDataRaw: [], + ListDataShow: [], + ListSelected: new Set(), + ListOrderKey: 'time', + ListFocusKey: '', + ListSelectKey: '', + ListSearchKey: '' + }), + + getters: { + ListDataCount(state: State): number { + return state.ListDataShow.length + }, + + IsListSelected(state: State): boolean { + return state.ListSelected.size > 0 + }, + ListSelectedCount(state: State): number { + return state.ListSelected.size + }, + ListDataSelectCountInfo(state: State): string { + return '已选中 ' + state.ListSelected.size + ' / ' + state.ListDataShow.length + ' 个' + }, + IsListSelectedAll(state: State): boolean { + return state.ListSelected.size > 0 && state.ListSelected.size == state.ListDataShow.length + } + }, + + actions: { + + aLoadListData(list: Item[]) { + + let item: Item + for (let i = 0, maxi = list.length; i < maxi; i++) { + item = list[i] + item.description = HanToPin(item.share_name) + } + this.ListDataRaw = this.mGetOrder(this.ListOrderKey, list) + + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = list[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + + this.$patch({ ListSelected: newSelected, ListFocusKey: '', ListSelectKey: '', ListSearchKey: '' }) + this.mRefreshListDataShow(true) + }, + + mSearchListData(value: string) { + + this.$patch({ ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '', ListSearchKey: value }) + this.mRefreshListDataShow(true) + }, + + mOrderListData(value: string) { + + this.$patch({ ListOrderKey: value, ListSelected: new Set(), ListFocusKey: '', ListSelectKey: '' }) + this.ListDataRaw = this.mGetOrder(value, this.ListDataRaw) + this.mRefreshListDataShow(true) + }, + mGetOrder(order: string, list: Item[]) { + if (order == 'state') list.sort((a, b) => a.share_msg.localeCompare(b.share_msg)) + if (order == 'update') list.sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()) + if (order == 'time') list.sort((a, b) => b.saved_time - a.saved_time) + return list + }, + + mRefreshListDataShow(refreshRaw: boolean) { + if (!refreshRaw) { + let ListDataShow = this.ListDataShow.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + return + } + if (this.ListSearchKey) { + + let searchlist: Item[] = [] + let results = fuzzysort.go(this.ListSearchKey, this.ListDataRaw, { + threshold: -200000, + keys: ['share_name', 'description'], + scoreFn: (a) => Math.max(a[0] ? a[0].score : -200000, a[1] ? a[1].score : -200000) + }) + for (let i = 0, maxi = results.length; i < maxi; i++) { + if (results[i].score > -200000) searchlist.push(results[i].obj) + } + Object.freeze(searchlist) + this.ListDataShow = searchlist + } else { + + let ListDataShow = this.ListDataRaw.concat() + Object.freeze(ListDataShow) + this.ListDataShow = ListDataShow + } + + let freezelist = this.ListDataShow + let oldSelected = this.ListSelected + let newSelected = new Set() + let key = '' + for (let i = 0, maxi = freezelist.length; i < maxi; i++) { + key = freezelist[i][KEY] + if (oldSelected.has(key)) newSelected.add(key) + } + this.ListSelected = newSelected + }, + + + mSelectAll() { + this.$patch({ ListSelected: SelectAll(this.ListDataShow, KEY, this.ListSelected), ListFocusKey: '', ListSelectKey: '' }) + this.mRefreshListDataShow(false) + }, + mMouseSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = MouseSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + mKeyboardSelect(key: string, Ctrl: boolean, Shift: boolean) { + if (this.ListDataShow.length == 0) return + const data = KeyboardSelectOne(this.ListDataShow, KEY, this.ListSelected, this.ListFocusKey, this.ListSelectKey, key, Ctrl, Shift) + this.$patch({ ListSelected: data.selectedNew, ListFocusKey: data.focusLast, ListSelectKey: data.selectedLast }) + this.mRefreshListDataShow(false) + }, + + + GetSelected() { + return GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + }, + + GetSelectedFirst() { + let list = GetSelectedList(this.ListDataShow, KEY, this.ListSelected) + if (list.length > 0) return list[0] + return undefined + }, + mSetFocus(key: string) { + this.ListFocusKey = key + this.mRefreshListDataShow(false) + }, + + mGetFocus() { + if (this.ListFocusKey == '' && this.ListDataShow.length > 0) return this.ListDataShow[0][KEY] + return this.ListFocusKey + }, + + mGetFocusNext(position: string) { + return GetFocusNext(this.ListDataShow, KEY, this.ListFocusKey, position) + }, + mDeleteFiles(shareidlist: string[]) { + let filemap = new Set(shareidlist) + let ListDataRaw = this.ListDataRaw + let NewDataList: Item[] = [] + for (let i = 0, maxi = ListDataRaw.length; i < maxi; i++) { + let item = ListDataRaw[i] + if (!filemap.has(item.share_id)) { + NewDataList.push(item) + } + } + this.ListDataRaw = NewDataList + this.mRefreshListDataShow(true) + } + } +}) + +export default useOtherShareStore diff --git a/packages/renderer/src/share/share/ShareDAL.ts b/packages/renderer/src/share/share/ShareDAL.ts new file mode 100644 index 0000000..08f19b3 --- /dev/null +++ b/packages/renderer/src/share/share/ShareDAL.ts @@ -0,0 +1,162 @@ +import AliShareList from '@/aliapi/sharelist' +import DB from '@/utils/db' +import { humanDateTime, humanExpiration, Sleep } from '@/utils/format' +import message from '@/utils/message' +import useMyShareStore from './MyShareStore' +import { useServerStore, IShareSiteModel } from '../../store' +import useOtherShareStore, { IOtherShareLinkModel } from './OtherShareStore' +import ServerHttp from '@/aliapi/server' +import { IID, ParseShareIDList } from '@/utils/idhelper' +import { RunBatch } from '@/aliapi/batch' +import AliShare from '@/aliapi/share' +import { IAliShareAnonymous } from '@/aliapi/alimodels' + +export default class ShareDAL { + + static async aLoadFromDB() { + + const shareSiteList = await DB.getValueObject('shareSiteList') + useServerStore().mSaveShareSiteList(shareSiteList as IShareSiteModel[]) + + ShareDAL.aReloadOtherShare() + } + + + static async aReloadMyShare(user_id: string, force: boolean) { + if (!user_id) return + const myshareStore = useMyShareStore() + if (!force && myshareStore.ListDataRaw.length > 0) return + if (myshareStore.ListLoading == true) return + myshareStore.ListLoading = true + const resp = await AliShareList.ApiShareListAll(user_id) + myshareStore.aLoadListData(resp.items) + myshareStore.ListLoading = false + } + + + + + static async aReloadOtherShare() { + const othershareStore = useOtherShareStore() + if (othershareStore.ListLoading == true) return + othershareStore.ListLoading = true + + const sharelist = await DB.getOtherShareAll() + const timenow = new Date().getTime() + for (let i = 0, maxi = sharelist.length; i < maxi; i++) { + const item = sharelist[i] + if (item.updated_at) { + let updated_at = new Date(item.updated_at).getTime() + item.updated_at = humanDateTime(updated_at) + } + if (item.expired == false) { + if (item.share_msg != '已失效') item.share_msg = humanExpiration(item.expiration, timenow) + item.expired = item.share_msg == '过期失效' + } + } + othershareStore.aLoadListData(sharelist) + await Sleep(1000) + othershareStore.ListLoading = false + } + + + static async SaveOtherShare(password: string, info: IAliShareAnonymous, refresh: boolean) { + let share = await DB.getOtherShare(info.shareinfo.shareid) + if (!share) { + share = { + share_id: info.shareinfo.shareid, + share_name: info.shareinfo.shareid, + description: '', + share_pwd: password, + expiration: '0', + expired: false, + created_at: '', + updated_at: new Date().toISOString(), + saved_at: '', + saved_time: Date.now(), + share_msg: '' + } + } + share.share_name = info.shareinfo.display_name || info.shareinfo.shareid + share.created_at = info.shareinfo.created_at || new Date().toISOString() + share.updated_at = info.shareinfo.updated_at || new Date().toISOString() + share.saved_at = humanDateTime(share.saved_time) + + if (info.error != '') { + share.share_msg = '已失效' + share.expired = false + } else { + share.expiration = info.shareinfo.expiration + share.share_msg = humanExpiration(share.expiration) + share.expired = share.share_msg == '过期失效' + } + await DB.saveOtherShare(share) + if (!refresh) return + ShareDAL.aReloadOtherShare() + } + + + static async SaveOtherShareText(text: string) { + let idlist = ParseShareIDList(text) + + if (idlist.length == 0) { + message.error('解析分享链接失败,格式错误') + return false + } + + const savefunc = (one: IID) => { + return AliShare.ApiGetShareAnonymous(one.id).then((info) => { + return ShareDAL.SaveOtherShare(one.pwd, info, false) + }) + } + + await RunBatch('解析分享链接', idlist, 10, savefunc) + ShareDAL.aReloadOtherShare() + return true + } + + + static async SaveOtherShareRefresh() { + const sharelist = await DB.getOtherShareAll() + + if (sharelist.length == 0) { + return false + } + const savefunc = (share: IOtherShareLinkModel) => { + return AliShare.ApiGetShareAnonymous(share.share_id).then((info) => { + if (info.error != '') { + share.expired = false + share.share_msg = '已失效' + } else { + share.share_name = info.shareinfo.display_name + share.expiration = info.shareinfo.expiration + share.updated_at = info.shareinfo.updated_at + share.share_msg = humanExpiration(share.expiration) + share.expired = share.share_msg == '过期失效' + } + return DB.saveOtherShare(share) + }) + } + await RunBatch('更新状态', sharelist, 10, savefunc) + ShareDAL.aReloadOtherShare() + return true + } + + + static async DeleteOtherShare(selectkeys: string[]) { + if (selectkeys) await DB.deleteOtherShareBatch(selectkeys) + useOtherShareStore().mDeleteFiles(selectkeys) + } + + + + static aLoadShareSite() { + if (useServerStore().ShareSiteList.length == 0) ServerHttp.CheckUpgrade(false) + } + + + static SaveShareSite(list: IShareSiteModel[]) { + DB.saveValueObject('shareSiteList', list).catch(() => {}) + useServerStore().mSaveShareSiteList(list) + } +} diff --git a/packages/renderer/src/share/share/ShareSiteRight.vue b/packages/renderer/src/share/share/ShareSiteRight.vue new file mode 100644 index 0000000..0e6381f --- /dev/null +++ b/packages/renderer/src/share/share/ShareSiteRight.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/packages/renderer/src/share/share/ShowShareLinkModal.vue b/packages/renderer/src/share/share/ShowShareLinkModal.vue new file mode 100644 index 0000000..34d747b --- /dev/null +++ b/packages/renderer/src/share/share/ShowShareLinkModal.vue @@ -0,0 +1,485 @@ + + + + diff --git a/packages/renderer/src/store/appstore.ts b/packages/renderer/src/store/appstore.ts new file mode 100644 index 0000000..1ddcd11 --- /dev/null +++ b/packages/renderer/src/store/appstore.ts @@ -0,0 +1,234 @@ +import { onHideRightMenu } from '@/utils/keyboardhelper' +import { defineStore } from 'pinia' + +export interface IPageOffice { + user_id: string + drive_id: string + file_id: string + file_name: string + preview_url: string + access_token: string +} +export interface IPageCode { + user_id: string + drive_id: string + file_id: string + file_name: string + code_ext: string + file_size: number + download_url: string +} + +export interface IPageImage { + user_id: string + drive_id: string + file_id: string + file_name: string + mode: string + imageidlist: string[] + imagenamelist: string[] +} + +export interface IPageVideoXBT { + user_id: string + drive_id: string + file_id: string + file_name: string +} + +export interface IPageVideo { + user_id: string + drive_id: string + file_id: string + file_name: string +} + +export interface AppState { + appTheme: string + + appPage: string + + appTab: string + appTabMenu: string[] + + appTabMenuMap: Map + appDark: boolean + appShutDown: boolean + + + pageOffice?: IPageOffice + pageCode?: IPageCode + pageImage?: IPageImage + pageVideoXBT?: IPageVideoXBT + pageVideo?: IPageVideo +} + +const useAppStore = defineStore('app', { + state: (): AppState => ({ + appTheme: 'light', + appPage: 'PageLoading', + appTab: 'pan', + appTabMenu: ['pan', 'wangpan'], + appTabMenuMap: new Map([ + ['enmpty', 'enmpty'], + ['pan', 'wangpan'], + ['pic', 'allpic'], + ['down', 'DowningRight'], + ['share', 'OtherShareRight'], + ['rss', 'AppSame'], + ['setting', ''] + ]), + appDark: false, + appShutDown: false + }), + + getters: { + GetAppTabMenu(state: AppState): string { + return state.appTabMenuMap.get(state.appTab)! + } + }, + + actions: { + updateStore(partial: Partial) { + this.$patch(partial) + }, + + toggleTheme(theme: string) { + console.log('toggleTheme', theme, this) + this.appTheme = theme + if (this.appTheme == 'dark' || (this.appTheme == 'system' && this.appDark)) { + document.body.setAttribute('arco-theme', 'dark') + } else { + document.body.removeAttribute('arco-theme') + } + }, + + toggleDark(dark: boolean) { + console.log('toggleDark', dark, this) + this.appDark = dark + if (this.appTheme == 'dark' || (this.appTheme == 'system' && dark)) { + document.body.setAttribute('arco-theme', 'dark') + } else { + document.body.removeAttribute('arco-theme') + } + }, + + togglePage(page: string) { + if (page == this.appPage) return + this.appPage = page + }, + resetTab() { + this.$patch({ + appTab: 'pan', + appTabMenu: ['pan', 'wangpan'], + appTabMenuMap: new Map([ + ['pan', 'wangpan'], + ['pic', 'allpic'], + ['down', 'DowningRight'], + ['share', 'OtherShareRight'], + ['rss', 'AppSame'], + ['setting', ''] + ]) + }) + }, + + toggleTab(tab: string) { + if (this.appTab != tab) { + this.appTab = tab + onHideRightMenu() + } + }, + + toggleTabMenu(tab: string, menu: string) { + if (this.appTab != tab) this.appTab = tab + this.appTabMenuMap.set(tab, menu) + this.$patch({ appTabMenu: [tab, menu] }) + if (tab == 'setting') document.getElementById(menu)?.scrollIntoView() + onHideRightMenu() + }, + + toggleTabSetting(tab: string, menu: string) { + if (tab == this.appTab && this.appTabMenuMap.get(tab) == menu) return + if (this.appTab != tab) this.appTab = tab + if (menu) { + this.appTabMenuMap.set(tab, menu) + } + }, + + toggleTabNext() { + switch (this.appTab) { + case 'pan': { + this.appTab = 'pic' + break + } + case 'pic': { + this.appTab = 'down' + break + } + case 'down': { + this.appTab = 'share' + break + } + case 'share': { + this.appTab = 'rss' + break + } + case 'rss': { + this.appTab = 'setting' + break + } + case 'setting': { + this.appTab = 'pan' + break + } + } + onHideRightMenu() + }, + + toggleTabNextMenu() { + const next = function (map: Map, tab: string, menulist: string[]) { + let menu = map.get(tab)! + for (let i = 0, maxi = menulist.length; i < maxi; i++) { + if (menulist[i] == menu) { + + if (i + 1 >= menulist.length) map.set(tab, menulist[0]) + else map.set(tab, menulist[i + 1]) + } + } + } + + switch (this.appTab) { + case 'pan': { + next(this.appTabMenuMap, this.appTab, ['wangpan', 'kuaijie', 'fangying']) + break + } + case 'pic': { + next(this.appTabMenuMap, this.appTab, ['allpic', 'xiangce']) + break + } + case 'down': { + next(this.appTabMenuMap, this.appTab, ['DowningRight', 'DownedRight', 'UploadingRight', 'UploadedRight', 'SyncRight', 'M3U8Right']) + break + } + case 'share': { + next(this.appTabMenuMap, this.appTab, ['OtherShareRight', 'MyShareRight', 'MyFollowingRight', 'OtherFollowingRight', 'ShareSiteRight']) + break + } + case 'rss': { + next(this.appTabMenuMap, this.appTab, ['AppSame', 'RssXiMa','RssRename', 'RssJiaMi', 'RssScanClean', 'RssScanSame', 'RssScanPunish', 'RssScanEnmpty', 'RssMakeFileTree', 'RssMakeTreeMap', 'RssDriveCopy', 'RssUserCopy']) + break + } + case 'setting': { + next(this.appTabMenuMap, this.appTab, ['SettingUI', 'SettingDown', 'SettingPan', 'SettingDebug', 'SettingAria', 'SettingLog']) + let menu = this.appTabMenuMap.get('setting')! + document.getElementById(menu)?.scrollIntoView() + break + } + } + + onHideRightMenu() + } + } +}) + +export default useAppStore diff --git a/packages/renderer/src/store/footstore.ts b/packages/renderer/src/store/footstore.ts new file mode 100644 index 0000000..2207600 --- /dev/null +++ b/packages/renderer/src/store/footstore.ts @@ -0,0 +1,86 @@ +import AliFile from '@/aliapi/file' +import { ApiGetAsyncTask } from '@/aliapi/utils' +import PanDAL from '@/pan/pandal' +import usePanFileStore from '@/pan/panfilestore' +import { humanTime } from '@/utils/format' +import { defineStore } from 'pinia' + +export interface AsyncModel { + user_id: string + key: string + title: string + starttime: number + endtime: number + usetime: string + status: string + file_id: string + drive_id: string + type: string +} + +export interface FootState { + visible: boolean + tasklist: AsyncModel[] + audiourl: string +} + +const useFootStore = defineStore('foot', { + state: (): FootState => ({ + visible: false, + tasklist: [], + audiourl: '' + }), + + getters: { + GetIsRunning(state: FootState): boolean { + return state.tasklist.length > 0 + } + }, + + actions: { + updateStore(partial: Partial) { + this.$patch(partial) + }, + mDeleteTask(key: string) { + this.tasklist = this.tasklist.filter((t) => t.key != key) + }, + mAddTask(user_id: string, key: string, type: string, title: string, drive_id: string, file_id: string) { + this.tasklist = [{ user_id, drive_id, file_id, key, type, title: type + ' ' + title, status: 'running', starttime: new Date().getTime(), endtime: 0, usetime: '' }].concat(this.tasklist) + this.visible = true + }, + + aUpdateTask() { + let list = this.tasklist + for (let i = 0, maxi = list.length; i < maxi; i++) { + let item = list[i] + if (item.status == 'running') { + ApiGetAsyncTask(item.user_id, item.key).then((resp) => { + item.status = resp + list[i].endtime = new Date().getTime() + list[i].usetime = humanTime((list[i].endtime - list[i].starttime) / 1000) + if (item.status != 'running') { + //复制 导入分享 需要刷新dir_id + if (item.type == '复制' || item.type == '导入分享' || item.type == '从回收站还原') { + PanDAL.GetDirFileList(item.user_id, item.drive_id, item.file_id, '') + } + } + }) + } + } + }, + + mClearTask() { + let list = this.tasklist + let newlist: AsyncModel[] = [] + for (let i = 0, maxi = list.length; i < maxi; i++) { + if (list[i].status == 'running') newlist.push(list[i]) + } + this.tasklist = newlist + }, + mSaveAudioUrl(url: string) { + this.audiourl = url + } + } +}) + +export default useFootStore diff --git a/packages/renderer/src/store/index.ts b/packages/renderer/src/store/index.ts new file mode 100644 index 0000000..595f32d --- /dev/null +++ b/packages/renderer/src/store/index.ts @@ -0,0 +1,54 @@ +import { createPinia } from 'pinia' +import useAppStore from './appstore' +import useKeyboardStore from './keyboardstore' +import type { KeyboardState } from './keyboardstore' +import useLogStore from './logstore' +import useModalStore from './modalstore' +import type { ModalState } from './modalstore' +import useWinStore from './winstore' +import type { WinState } from './winstore' +import useSettingStore from '../setting/settingstore' +import useUserStore from '../user/userstore' +import type { ITokenInfo } from '../user/userstore' +import usePanTreeStore from '../pan/pantreestore' +import usePanFileStore from '../pan/panfilestore' + +import useServerStore from './serverstore' +import type { IOtherShareLinkModel } from '../share/share/OtherShareStore' +import type { IShareSiteModel } from './serverstore' +import useMyShareStore from '../share/share/MyShareStore' +import useOtherShareStore from '../share/share/OtherShareStore' +import useMyFollowingStore from '../share/following/MyFollowingStore' +import useOtherFollowingStore from '../share/following/OtherFollowingStore' +import type { FollowingState } from '../share/following/OtherFollowingStore' + +import useFootStore from './footstore' +import type { AsyncModel } from './footstore' + +const pinia = createPinia() +export { + useAppStore, + useSettingStore, + useLogStore, + useModalStore, + ModalState, + useWinStore, + WinState, + useKeyboardStore, + KeyboardState, + useUserStore, + ITokenInfo, + usePanTreeStore, + usePanFileStore, + useServerStore, + IOtherShareLinkModel, + IShareSiteModel, + useMyShareStore, + useOtherShareStore, + useOtherFollowingStore, + FollowingState, + useMyFollowingStore, + useFootStore, + AsyncModel +} +export default pinia diff --git a/packages/renderer/src/store/keyboardstore.ts b/packages/renderer/src/store/keyboardstore.ts new file mode 100644 index 0000000..1aa7057 --- /dev/null +++ b/packages/renderer/src/store/keyboardstore.ts @@ -0,0 +1,43 @@ +import { defineStore } from 'pinia' + +export interface KeyboardMessage { + + Code: string + + Key: string + Ctrl: boolean + Shift: boolean + + Alt: boolean + + Repeat: boolean + + IsInput: boolean + IsEnmpty: boolean +} + +export interface KeyboardState { + KeyDownEvent: KeyboardMessage + KeyUpEvent: KeyboardMessage +} + +const useKeyboardStore = defineStore('keyboard', { + state: (): KeyboardState => ({ + KeyDownEvent: { Ctrl: false, Shift: false, Alt: false, Repeat: false, IsInput: false, Code: '', Key: '', IsEnmpty: true }, + KeyUpEvent: { Ctrl: false, Shift: false, Alt: false, Repeat: false, IsInput: false, Code: '', Key: '', IsEnmpty: true } + }), + + getters: {}, + + actions: { + updateStore(partial: Partial) { + this.$patch(partial) + }, + KeyDown(event: KeyboardEvent) { + console.log(event) + this.KeyDownEvent = { Ctrl: event.ctrlKey, Shift: event.shiftKey, Alt: event.altKey, Repeat: event.repeat, IsInput: false, Code: event.code, Key: event.key.toLowerCase(), IsEnmpty: false } + } + } +}) + +export default useKeyboardStore diff --git a/packages/renderer/src/store/logstore.ts b/packages/renderer/src/store/logstore.ts new file mode 100644 index 0000000..7c31942 --- /dev/null +++ b/packages/renderer/src/store/logstore.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia' + +export interface LogState { + logTime: number +} + +const useLogStore = defineStore('log', { + state: (): LogState => ({ + logTime: Date.now() + }), + + getters: {}, + + actions: { + logRefresh(time: number) { + this.logTime = time + } + } +}) + +export default useLogStore diff --git a/packages/renderer/src/store/modalstore.ts b/packages/renderer/src/store/modalstore.ts new file mode 100644 index 0000000..4fe48dc --- /dev/null +++ b/packages/renderer/src/store/modalstore.ts @@ -0,0 +1,28 @@ +import { defineStore } from 'pinia' +import { nextTick } from 'vue' + +export interface ModalState { + modalname: string + modaldata: any +} + +const useModalStore = defineStore('modal', { + state: (): ModalState => ({ + modalname: '', + modaldata: {} + }), + + actions: { + showModal(modalname: string, modaldata: any) { + if (modalname && modalname == this.modalname) { + + this.$patch({ modalname: '', modaldata: {} }) + setTimeout(() => { + this.$patch({ modalname, modaldata }) + }, 300) + } else this.$patch({ modalname, modaldata }) + } + } +}) + +export default useModalStore diff --git a/packages/renderer/src/store/serverstore.ts b/packages/renderer/src/store/serverstore.ts new file mode 100644 index 0000000..0933d89 --- /dev/null +++ b/packages/renderer/src/store/serverstore.ts @@ -0,0 +1,33 @@ +import { defineStore } from 'pinia' + + +export interface IShareSiteModel { + title: string + url: string + tip: string +} + +export interface ServerState { + + ShareSiteList: IShareSiteModel[] + HelpUrl: string +} + +const useServerStore = defineStore('serverstore', { + state: (): ServerState => ({ + ShareSiteList: [], + HelpUrl: 'aHR0cHM6Ly9naXRodWIuY29tL2xpdXBhbjE4OTAvYWxpeXVucGFuL3dpa2k=' + }), + actions: { + + mSaveShareSiteList(ShareSiteList: IShareSiteModel[]) { + this.ShareSiteList = ShareSiteList || [] + }, + + mSaveHelpUrl(url: string) { + this.HelpUrl = url || 'aHR0cHM6Ly9naXRodWIuY29tL2xpdXBhbjE4OTAvYWxpeXVucGFuL3dpa2k=' + } + } +}) + +export default useServerStore diff --git a/packages/renderer/src/store/treestore.ts b/packages/renderer/src/store/treestore.ts new file mode 100644 index 0000000..c9bd4e9 --- /dev/null +++ b/packages/renderer/src/store/treestore.ts @@ -0,0 +1,315 @@ +import { IAliFileResp } from '../aliapi/dirfilelist' +import { IAliGetDirModel, IAliGetFileModel } from '../aliapi/alimodels' +import DB from '../utils/db' +import { humanSize, SortNumber } from '../utils/format' +import { ArrayCopy, HanToPin } from '../utils/utils' +import { usePanTreeStore, useSettingStore } from '@/store' + +export interface TreeNodeData { + __v_skip: true + key: string + title: string + namesearch: string + children: TreeNodeData[] + icon?: any + isLeaf?: boolean +} + +interface IDriverModel { + drive_id: string + + DirMap: Map + + DirChildrenMap: Map + + DirSizeMap: Map + + + FileOrderMap: Map +} + +const DriverData = new Map() + +const UserAllDir = new Map() + +export default class TreeStore { + /** + * 加载文件夹体积,文件夹排序,刷新整个Tree + * 登录后第一次加载全部文件夹,完整的覆盖保存一次 saveToDB=是否保存到DB + */ + static async SaveAllDir(drive_id: string, children: IAliGetDirModel[], saveToDB: boolean) { + console.time('SaveAllDir') + if (saveToDB) { + + UserAllDir.set(drive_id, new Date().getTime()) + await DB.saveValueObject('AllDir_' + drive_id, children) + await DB.saveValueNumber('AllDir_' + drive_id, Date.now()) + } + + const OneDriver: IDriverModel = { + drive_id, + DirMap: new Map(), + DirChildrenMap: new Map(), + DirSizeMap: new Map(), + FileOrderMap: new Map() + } + + const jsonsize = await DB.getValueString('DirSize_' + drive_id) + const sizemap = jsonsize ? new Map(JSON.parse(jsonsize)) : new Map() + + const jsonorder = await DB.getValueString('FileOrder_' + drive_id) + OneDriver.FileOrderMap = jsonorder ? new Map(JSON.parse(jsonorder)) : new Map() + + let root: IAliGetDirModel = { __v_skip: true, drive_id, file_id: 'root', parent_file_id: '', name: '根目录', namesearch: '', size: 0, time: 0, description: '' } + OneDriver.DirMap.set(root.file_id, root) + + let ChildrenMap = new Map() + ChildrenMap.set(root.file_id, []) + + try { + let parentid: string = '' + let childdirlist: IAliGetDirModel[] = [] + let item: IAliGetDirModel + + for (let i = 0, maxi = children.length; i < maxi; i++) { + item = children[i] + OneDriver.DirMap.set(item.file_id, item) + OneDriver.DirSizeMap.set(item.file_id, sizemap.get(item.file_id) || 0) + if (parentid != item.parent_file_id) { + if (ChildrenMap.has(item.parent_file_id)) { + childdirlist = ChildrenMap.get(item.parent_file_id)! + } else { + childdirlist = [] + ChildrenMap.set(item.parent_file_id, childdirlist) + } + parentid = item.parent_file_id + } + childdirlist.push(item) + } + } catch {} + + + let ChildrenMap2 = new Map() + ChildrenMap.forEach(function (value, key) { + Object.freeze(value) + ChildrenMap2.set(key, value) + }) + OneDriver.DirChildrenMap = ChildrenMap2 + + DriverData.set(drive_id, OneDriver) + + TreeStore.RefreshPanTreeAllNode(OneDriver) + console.timeEnd('SaveAllDir') + } + + + static async SaveOneDirFileList(dir: IAliFileResp) { + console.log('SaveOneDirFileList', dir.m_dir_id) + + if (dir.m_dir_id == 'favorite' || dir.m_dir_id == 'trash' || dir.m_dir_id == 'recover' || dir.m_dir_id.startsWith('search') || dir.m_dir_id.startsWith('color') || dir.m_dir_id.startsWith('video')) { + + return + } + + let driverData = DriverData.get(dir.m_drive_id) + if (!driverData) { + + let cache = await DB.getValueObject('AllDir_' + dir.m_drive_id) + if (cache) { + console.log('SaveOneDirFileList LoadCacheAllDir') + await TreeStore.SaveAllDir(dir.m_drive_id, cache as IAliGetDirModel[], false) + driverData = DriverData.get(dir.m_drive_id)! + } else return + } + + let dirs: IAliGetFileModel[] = [] + let files: IAliGetFileModel[] = [] + for (let i = 0, maxi = dir.items.length; i < maxi; i++) { + if (dir.items[i].isdir) dirs.push(dir.items[i]) + else files.push(dir.items[i]) + } + + + let dirsize = 0 + for (let i = 0, maxi = files.length; i < maxi; i++) { + dirsize += files[i].size + } + driverData.DirSizeMap.set(dir.m_dir_id, dirsize) + + + const dirlist: IAliGetDirModel[] = [] + for (let i = 0, maxi = dirs.length; i < maxi; i++) { + const item = dirs[i] + const diritem: IAliGetDirModel = { + __v_skip: true, + drive_id: item.drive_id, + file_id: item.file_id, + parent_file_id: item.parent_file_id, + name: item.name, + namesearch: '' , + size: 0, + time: item.time, + description: item.description + } + dirlist.push(diritem) + driverData.DirMap.set(diritem.file_id, diritem) + } + Object.freeze(dirlist) + driverData.DirChildrenMap.set(dir.m_dir_id, dirlist) + + TreeStore.RefreshPanTreeOneDirNode(driverData, dir.m_dir_id, dir.m_dir_name) + } + + + static GetDirOrder(drive_id: string, dir_id: string) { + const settingStore = useSettingStore() + let order = settingStore.uiFileListOrder || 'name desc' + if (settingStore.uiFileOrderDuli != 'null') { + + let driverData = DriverData.get(drive_id) + if (driverData) order = driverData.FileOrderMap.get(dir_id) || settingStore.uiFileOrderDuli || order + } + return order.toLowerCase() + } + static SaveDirOrder(drive_id: string, dir_id: string, order: string) { + const settingStore = useSettingStore() + if (settingStore.uiFileOrderDuli != 'null') { + + let driverData = DriverData.get(drive_id) + if (driverData) { + driverData.FileOrderMap.set(dir_id, order) + let jsonorder = JSON.stringify(Array.from(driverData.FileOrderMap)) + DB.saveValueString('FileOrder_' + drive_id, jsonorder) + } + } else { + + settingStore.updateStore({ uiFileListOrder: order }) + } + } + + static RefreshPanTreeAllNode(OneDriver: IDriverModel) { + let dir: TreeNodeData = { __v_skip: true, title: '根目录', namesearch: '', key: 'root', children: [] } + let map = new Map() + TreeStore._GetTreeDataOneDir(OneDriver, dir, map, true) + map.set(dir.key, dir) + usePanTreeStore().mSaveTreeAllNode(OneDriver.drive_id, dir, map) + } + + static RefreshPanTreeOneDirNode(OneDriver: IDriverModel, dir_id: string, dir_name: string) { + let finddir = OneDriver.DirMap.get(dir_id) + if (!finddir) return + let dir: TreeNodeData = { __v_skip: true, title: dir_name, namesearch: '', key: dir_id, children: [] } + let map = new Map() + TreeStore._GetTreeDataOneDir(OneDriver, dir, map, true) + usePanTreeStore().mSaveTreeOneDirNode(OneDriver.drive_id, dir_id, dir, map) + } + + static GetPanTreeAllNodeForModal(drive_id: string) { + let driverData = DriverData.get(drive_id) + if (!driverData) return [] + let dir: TreeNodeData = { __v_skip: true, title: '根目录', namesearch: '', key: 'root', children: [] } + let map = new Map() + TreeStore._GetTreeDataOneDir(driverData, dir, map, true) + return [dir] + } + + static _GetTreeDataOneDir(driverData: IDriverModel, node: TreeNodeData, map: Map, getChildren: boolean) { + let childdirlist: IAliGetDirModel[] = ArrayCopy(driverData.DirChildrenMap.get(node.key) || []) + node.isLeaf = childdirlist.length == 0 + + let children: TreeNodeData[] = [] + for (let i = 0, maxi = childdirlist.length; i < maxi; i++) { + let item = childdirlist[i] + let itemnode: TreeNodeData = { __v_skip: true, key: item.file_id, title: item.name, namesearch: item.namesearch, children: [] } + if (getChildren) TreeStore._GetTreeDataOneDir(driverData, itemnode, map, getChildren) + children.push(itemnode) + map.set(itemnode.key, itemnode) + } + node.children = children + } + + + static GetDir(drive_id: string, dir_id: string): IAliGetDirModel | undefined { + if (dir_id == 'root') return { __v_skip: true, drive_id, file_id: 'root', parent_file_id: '', name: '根目录', namesearch: '', size: 0, time: 0, description: '' } + if (dir_id == 'favorite') return { __v_skip: true, drive_id, file_id: 'favorite', parent_file_id: '', name: '收藏夹', namesearch: '', size: 0, time: 0, description: '' } + if (dir_id == 'trash') return { __v_skip: true, drive_id, file_id: 'trash', parent_file_id: '', name: '回收站', namesearch: '', size: 0, time: 0, description: '' } + if (dir_id == 'recover') return { __v_skip: true, drive_id, file_id: 'recover', parent_file_id: '', name: '恢复文件', namesearch: '', size: 0, time: 0, description: '' } + if (dir_id.startsWith('search')) return { __v_skip: true, drive_id, file_id: dir_id, parent_file_id: '', name: ('搜索 ' + dir_id.substring(6)).trimEnd(), namesearch: '', size: 0, time: 0, description: '' } + if (dir_id.startsWith('color')) return { __v_skip: true, drive_id, file_id: dir_id, parent_file_id: '', name: '标记 · ' + dir_id.substring(dir_id.indexOf(' ') + 1), namesearch: '', size: 0, time: 0, description: '' } + if (dir_id == 'video') return { __v_skip: true, drive_id, file_id: 'video', parent_file_id: '', name: '放映室', namesearch: '', size: 0, time: 0, description: '' } + if (dir_id.startsWith('video')) return { __v_skip: true, drive_id, file_id: dir_id, parent_file_id: '', name: '放映室 · ' + dir_id.substring('video'.length), namesearch: '', size: 0, time: 0, description: '' } + + let driverData = DriverData.get(drive_id) + if (!driverData) return undefined + const dir = driverData.DirMap.get(dir_id) + if (!dir) return undefined + return { ...dir } + } + + + static GetDirPath(drive_id: string, dir_id: string): IAliGetDirModel[] { + const dirPath: IAliGetDirModel[] = [] + if (!drive_id || !dir_id) return dirPath + if (dir_id == 'root') return [{ __v_skip: true, drive_id, file_id: 'root', parent_file_id: '', name: '根目录', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id == 'favorite') return [{ __v_skip: true, drive_id, file_id: 'favorite', parent_file_id: '', name: '收藏夹', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id == 'trash') return [{ __v_skip: true, drive_id, file_id: 'trash', parent_file_id: '', name: '回收站', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id == 'recover') return [{ __v_skip: true, drive_id, file_id: 'recover', parent_file_id: '', name: '恢复文件', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id == 'search') return [{ __v_skip: true, drive_id, file_id: 'search', parent_file_id: '', name: '全盘搜索', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id.startsWith('search')) { + return [ + { __v_skip: true, drive_id, file_id: 'search', parent_file_id: '', name: '全盘搜索', namesearch: '', size: 0, time: 0, description: '' }, + { __v_skip: true, drive_id, file_id: dir_id, parent_file_id: 'search', name: dir_id.substring(6), namesearch: '', size: 0, time: 0, description: '' } + ] + } + if (dir_id.startsWith('color')) return [{ __v_skip: true, drive_id, file_id: dir_id, parent_file_id: '', name: '标记 · ' + dir_id.substring(dir_id.indexOf(' ') + 1), namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id == 'video') return [{ __v_skip: true, drive_id, file_id: 'video', parent_file_id: '', name: '放映室', namesearch: '', size: 0, time: 0, description: '' }] + if (dir_id.startsWith('video')) + return [ + { __v_skip: true, drive_id, file_id: 'video', parent_file_id: '', name: '放映室', namesearch: '', size: 0, time: 0, description: '' }, + { __v_skip: true, drive_id, file_id: dir_id, parent_file_id: '', name: '放映室 · ' + dir_id.substring('video'.length), namesearch: '', size: 0, time: 0, description: '' } + ] + + let driverData = DriverData.get(drive_id) + if (!driverData) return dirPath + const DirMap = driverData.DirMap + + let file_id = dir_id + while (true) { + const dir = DirMap.get(file_id) + if (!dir) break + dirPath.push({ ...dir }) + file_id = dir.parent_file_id + } + dirPath.reverse() + return dirPath + } + + + static ReGetDirAllChildDirID(drive_id: string, dir_id: string): string[] { + let alllist = [dir_id] + let driverData = DriverData.get(drive_id) + if (!driverData) return alllist + const childrens = driverData.DirChildrenMap.get(dir_id) + if (childrens) TreeStore._ReGetDirAllChildDirID(alllist, childrens, driverData.DirChildrenMap) + return alllist + } + static _ReGetDirAllChildDirID(alllist: string[], childrens: IAliGetDirModel[], DirChildrenMap: Map) { + for (let i = 0, maxi = childrens.length; i < maxi; i++) { + alllist.push(childrens[i].file_id) + const childrens2 = DirChildrenMap.get(childrens[i].file_id) + if (childrens2) TreeStore._ReGetDirAllChildDirID(alllist, childrens2, DirChildrenMap) + } + } + + static RenameDirs(drive_id: string, filelist: { file_id: string; parent_file_id: string; name: string; isdir: boolean }[]) { + let driverData = DriverData.get(drive_id) + if (!driverData) return + let DirMap = driverData.DirMap + for (let i = 0, maxi = filelist.length; i < maxi; i++) { + let item = filelist[i] + if (!item.isdir) continue + let findnode = DirMap.get(item.file_id) + if (findnode) findnode.name = item.name + } + } +} diff --git a/packages/renderer/src/store/winstore.ts b/packages/renderer/src/store/winstore.ts new file mode 100644 index 0000000..7a72954 --- /dev/null +++ b/packages/renderer/src/store/winstore.ts @@ -0,0 +1,30 @@ +import { defineStore } from 'pinia' + +export interface WinState { + width: number + height: number +} + +const useWinStore = defineStore('win', { + state: (): WinState => ({ + width: 0, + height: 0 + }), + + getters: { + GetListHeight(state: WinState): string { + return (state.height - 192).toString() + 'px' + }, + GetListHeightNumber(state: WinState): number { + return state.height - 192 + } + }, + + actions: { + updateStore(partial: Partial) { + this.$patch(partial) + } + } +}) + +export default useWinStore diff --git a/packages/renderer/src/user/UserInfo.vue b/packages/renderer/src/user/UserInfo.vue new file mode 100644 index 0000000..09bd6d5 --- /dev/null +++ b/packages/renderer/src/user/UserInfo.vue @@ -0,0 +1,147 @@ + + + + diff --git a/packages/renderer/src/user/UserLogin.vue b/packages/renderer/src/user/UserLogin.vue new file mode 100644 index 0000000..15b546f --- /dev/null +++ b/packages/renderer/src/user/UserLogin.vue @@ -0,0 +1,213 @@ + + + + diff --git a/packages/renderer/src/user/userdal.ts b/packages/renderer/src/user/userdal.ts new file mode 100644 index 0000000..c693bd2 --- /dev/null +++ b/packages/renderer/src/user/userdal.ts @@ -0,0 +1,236 @@ +import DB from '@/utils/db' +import AliUser from '@/aliapi/user' +import message from '@/utils/message' +import useUserStore, { ITokenInfo } from './userstore' +import { usePanTreeStore, usePanFileStore, useMyShareStore, useMyFollowingStore, useOtherFollowingStore, useAppStore } from '@/store' +//import FollowingDAL from '@/share/following/FollowingDAL' +//import ShareDAL from '@/share/share/ShareDAL' +import PanDAL from '@/pan/pandal' +import DebugLog from '@/utils/debuglog' + +export const UserTokenMap = new Map() + +export default class UserDAL { + + static async aLoadFromDB() { + const tokenlist = await DB.getUserAll() + let defaultUser = await DB.getValueString('uiDefaultUser') + let defaultUserAdd = false + UserTokenMap.clear() + if (defaultUser) { + + try { + for (let i = 0, maxi = tokenlist.length; i < maxi; i++) { + const token = tokenlist[i] + if (token.user_id == defaultUser && token.user_id) { + const islogin = await AliUser.ApiTokenRefreshAccount(token, false) + if (islogin) { + defaultUserAdd = true + await this.UserLogin(token).catch(() => {}) + break + } + } + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'aLoadFromDB defaultUser ' + (e.message || '')) + } + } + + for (let i = 0, maxi = tokenlist.length; i < maxi; i++) { + const token = tokenlist[i] + try { + if (token.user_id != defaultUser && token.user_id) { + const islogin = await AliUser.ApiTokenRefreshAccount(token, false) + if (islogin) { + if (defaultUserAdd == false) { + + defaultUserAdd = true + await this.UserLogin(token).catch(() => {}) + } + } + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'aLoadFromDB allUser ' + i + ' ' + token.user_id + ' ' + (e.message || '')) + } + } + if (defaultUserAdd == false) { + + useUserStore().userShowLogin = true + } + } + + static async aRefreshAllUserToken() { + const tokenlist = await DB.getUserAll() + let datenow = new Date().getTime() + for (let i = 0, maxi = tokenlist.length; i < maxi; i++) { + const token = tokenlist[i] + try { + let expire_time = new Date(token.expire_time).getTime() + + if (expire_time - datenow < 1800000) await AliUser.ApiTokenRefreshAccount(token, false) + } catch (e: any) { + DebugLog.mSaveLog('danger', 'aRefreshAllUserToken ' + (e.message || '')) + } + } + } + + static GetUserToken(userID: string): ITokenInfo { + if (userID && UserTokenMap.has(userID)) return UserTokenMap.get(userID)! + + return { + tokenfrom: 'token', + access_token: '', + refresh_token: '', + expires_in: 0, + token_type: '', + user_id: '', + user_name: '', + avatar: '', + nick_name: '', + default_drive_id: '', + default_sbox_drive_id: '' , + role: '', + status: '', + expire_time: '', + state: '', + pin_setup: false, + is_first_login: false, + need_rp_verify: false, + name: '', + spu_id: '', + is_expires: false, + used_size: 0, + total_size: 0, + spaceinfo: '', + pic_drive_id: '' + } + } + + static async GetUserTokenFromDB(userID: string) { + if (!userID) return undefined + if (UserTokenMap.has(userID)) return UserTokenMap.get(userID) + return await DB.getUser(userID) + } + + static GetUserList() { + const list: ITokenInfo[] = [] + for (let [id, token] of UserTokenMap) { + list.push(token) + } + return list.sort((a, b) => a.name.localeCompare(b.name)) + } + + + static SaveUserToken(token: ITokenInfo) { + if (token.user_id) { + let oldtoken = UserTokenMap.get(token.user_id) + if (oldtoken && oldtoken.is_expires == false) { + //DebugLog.mSaveLog('danger', 'SaveUserToken' + token.user_id + ' new=' + token.expire_time + ' old=' + oldtoken.expire_time) + + if (new Date(oldtoken.expire_time).getTime() > new Date(token.expire_time).getTime()) { + token.access_token = oldtoken.access_token + token.token_type = oldtoken.token_type + token.refresh_token = oldtoken.refresh_token + token.expire_time = oldtoken.expire_time + token.expires_in = oldtoken.expires_in + token.tokenfrom = oldtoken.tokenfrom + DebugLog.mSaveLog('danger', 'SaveUserToken Use Old') + } + } + UserTokenMap.set(token.user_id, token) + DB.saveUser(token).catch(() => {}) + } + } + + + static async UserLogin(token: ITokenInfo) { + const loadingkey = 'userlogin_' + Date.now().toString() + message.loading('加载用户信息中...', 0, loadingkey) + UserTokenMap.set(token.user_id, token) + + + + await Promise.all([AliUser.ApiUserInfo(token), AliUser.ApiUserPic(token)]).catch(() => {}) + + useUserStore().userLogin(token.user_id) + await DB.saveValueString('uiDefaultUser', token.user_id) + UserDAL.SaveUserToken(token) + window.WebUserToken({ user_id: token.user_id, name: token.user_name, access_token: token.access_token, login: true }) + + + useAppStore().resetTab() + + useMyShareStore().$reset() + useMyFollowingStore().$reset() + useOtherFollowingStore().$reset() + + + PanDAL.aReLoadDrive(token.user_id, token.default_drive_id) + PanDAL.aReLoadQuickFile(token.user_id) + //PanDAL.aReLoadDirSizeFromDB(token.user_id, token.pic_drive_id) + //PanDAL.GetAllDirList(token.user_id, token.pic_drive_id) + + message.success('加载用户成功!', 2, loadingkey) + } + + + static async UserLogOff(userID: string) { + DB.deleteUser(userID) + UserTokenMap.delete(userID) + + + let newUserID = '' + for (let [user_id, token] of UserTokenMap) { + const islogin = token.user_id && (await AliUser.ApiTokenRefreshAccount(token, false)) + if (islogin) { + await this.UserLogin(token).catch(() => {}) + newUserID = user_id + break + } + } + + if (!newUserID) { + useUserStore().userLogOff() + usePanTreeStore().$reset() + usePanFileStore().$reset() + useUserStore().userShowLogin = true + } + return newUserID != '' + } + + + static async UserChange(userID: string) { + if (UserTokenMap.has(userID) == false) return false + const token = UserTokenMap.get(userID)! + + const islogin = token.user_id && (await AliUser.ApiTokenRefreshAccount(token, false)) + if (islogin == false) { + message.warning('该账号需要重新登陆[' + token.name + ']') + DB.deleteUser(userID) + UserTokenMap.delete(userID) + return false + } + + await this.UserLogin(token).catch(() => {}) + return true + } + + + static async UserRefreshByUserFace(userID: string, force: boolean) { + let token = UserDAL.GetUserToken(userID) + if (!token || !token.access_token) return + let time = Date.now() - (new Date(token.expire_time).getTime() - token.expires_in * 1000) + time = time / 1000 + if (force === false && time < 600) return true + + + const islogin = token.user_id && (await AliUser.ApiTokenRefreshAccount(token, true)) + if (islogin == false) return false + + await Promise.all([AliUser.ApiUserInfo(token), AliUser.ApiUserPic(token)]).catch(() => {}) + useUserStore().userLogin(token.user_id) + return true + } + + +} diff --git a/packages/renderer/src/user/userstore.ts b/packages/renderer/src/user/userstore.ts new file mode 100644 index 0000000..c1815e1 --- /dev/null +++ b/packages/renderer/src/user/userstore.ts @@ -0,0 +1,70 @@ +import { defineStore } from 'pinia' +import UserDAL from './userdal' + + +export interface ITokenInfo { + tokenfrom: 'token' | 'account' + + + access_token: string + refresh_token: string + expires_in: number + token_type: string + user_id: string + user_name: string + avatar: string + nick_name: string + default_drive_id: string + default_sbox_drive_id: string + role: string + status: string + expire_time: string + state: string + pin_setup: boolean + is_first_login: boolean + need_rp_verify: boolean + + + name: string + spu_id: string + is_expires: boolean + used_size: number + total_size: number + spaceinfo: string + + + pic_drive_id: string +} + +export interface UserState { + userID: string + userLogined: boolean + userShowLogin: boolean +} + +const useUserStore = defineStore('user', { + state: (): UserState => ({ + userID: '', + userLogined: false, + userShowLogin: false + }), + + getters: { + GetUserToken(state: UserState): ITokenInfo { + return UserDAL.GetUserToken(state.userID) + } + }, + + actions: { + userLogin(userID: string) { + this.userID = userID + this.userLogined = true + }, + userLogOff() { + this.userID = '' + this.userLogined = false + } + } +}) + +export default useUserStore diff --git a/packages/renderer/src/utils/appcache.ts b/packages/renderer/src/utils/appcache.ts new file mode 100644 index 0000000..1e40faf --- /dev/null +++ b/packages/renderer/src/utils/appcache.ts @@ -0,0 +1,134 @@ +import { useSettingStore } from '@/store' +//import { AriaShoutDown } from './aria2c' +import DebugLog from './debuglog' +import { humanSize, Sleep } from './format' +import message from './message' +import { app } from '@electron/remote' +import path from 'path' +import fsPromises from 'fs/promises' + +export default class AppCache { + + static AppUserData = '' + + static AppAsarPath = '' + /** win32 darwin linux */ + static AppPlatform = '' + /** 'arm', 'arm64', 'ia32', 'mips', 'x32','x64' */ + static AppArch = '' + + static AppExecPath = '' + + + static LoadCache() { + if (!AppCache.AppUserData) { + AppCache.AppAsarPath = app.getAppPath() + AppCache.AppUserData = app.getPath('userData') + AppCache.AppPlatform = process.platform + AppCache.AppArch = process.arch + AppCache.AppExecPath = process.execPath + } + } + + + static async LoadDirSize(dir: string) { + try { + const childfiles = await fsPromises.readdir(dir, { withFileTypes: true }).catch((e: any) => { + if (e.code && e.code === 'EPERM') { + e = '没有权限访问文件夹' + message.error('没有权限访问文件夹:' + dir) + } + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) message.error('没有权限访问文件夹:' + dir) + DebugLog.mSaveLog('danger', 'LoadDirSize失败:' + dir + ' ' + (e || '')) + return [] + }) + let total = 0 + for (let i = 0, maxi = childfiles.length; i < maxi; i++) { + if (childfiles[i].isFile()) { + + const stat = await fsPromises.lstat(path.join(dir, childfiles[i].name)).catch((e: any) => { + return { size: 0 } + }) + total += stat.size + } else if (childfiles[i].isDirectory()) { + + total += await AppCache.LoadDirSize(path.join(dir, childfiles[i].name)) + } + } + return total + } catch { + return 0 + } + } + + static DeleteDir(dir: string): Promise { + return fsPromises + .rm(dir, { force: true, recursive: true }) + .then(() => {}) + .catch(() => {}) + } + + + static async aLoadCacheSize() { + AppCache.LoadCache() + if (!AppCache.AppUserData) return + const dirsize = await AppCache.LoadDirSize(AppCache.AppUserData) + if (dirsize > 800 * 1024 * 1024) message.warning('缓存文件夹体积较大,该去 设置 里清理了') + + useSettingStore().debugCacheSize = humanSize(dirsize) + } + + + static async aClearCache(delby: string) { + AppCache.LoadCache() + const dir = AppCache.AppUserData + //await AppCache.DeleteDir(path.join(dir, 'Cache')) + if (delby == 'all') { + //window.WebClearCache({ cache: true }) + if (window.WebClearCache) + window.WebClearCache({ + storages: [`appcache`, `cookies`, `filesystem`, `shadercache`, `serviceworkers`, `cachestorage`, `indexdb`, `localstorage`, `websql`], + quotas: [`temporary`, `persistent`, `syncable`] + }) + } else { + //window.WebClearCache({ cache: true }) + if (window.WebClearCache) + window.WebClearCache({ + storages: [`appcache`, `cookies`, `filesystem`, `shadercache`, `serviceworkers`, `cachestorage`], + quotas: [`temporary`, `persistent`, `syncable`] + }) + } + if (delby == 'all') { + await AppCache.DeleteDir(path.join(dir, 'databases')).catch(() => {}) + await AppCache.DeleteDir(path.join(dir, 'IndexedDB')).catch(() => {}) + await AppCache.DeleteDir(path.join(dir, 'Local Storage')).catch(() => {}) + await AppCache.DeleteDir(path.join(dir, 'Session Storage')).catch(() => {}) + } else if (delby == 'db') { + await AppCache.DeleteDir(path.join(dir, 'databases')).catch(() => {}) + } + await AppCache.DeleteDir(path.join(dir, 'Code Cache', 'js')).catch(() => {}) + await AppCache.DeleteDir(path.join(dir, 'Code Cache', 'wasm')).catch(() => {}) + + await Sleep(4000) + + //AriaShoutDown() + if (delby == 'all') { + message.success('删除全部数据成功,自动重启小白羊') + Sleep(3000).then(() => { + window.WebRelaunch() + }) + } else if (delby == 'db') { + message.success('删除数据库成功,自动重启小白羊') + Sleep(3000).then(() => { + window.WebRelaunch() + }) + } else { + message.success('清理缓存成功,自动重启小白羊') + Sleep(3000).then(() => { + //window.WebReload() + window.WebRelaunch() + }) + } + } +} diff --git a/packages/renderer/src/utils/aria2c.ts b/packages/renderer/src/utils/aria2c.ts new file mode 100644 index 0000000..b3b3d5c --- /dev/null +++ b/packages/renderer/src/utils/aria2c.ts @@ -0,0 +1,189 @@ +import AliFile from '@/aliapi/file' +import AliDirFileList, { IAliFileResp } from '@/aliapi/dirfilelist' + +import axios from 'axios' +import DownDAL, { IAriaDownProgress, IStateDownFile } from '@/down/downdal' +import message from './message' +import UserDAL from '@/user/userdal' +import { useSettingStore } from '@/store' +import DebugLog from './debuglog' +import Config from './config' +import AliTrash from '@/aliapi/trash' +import path from 'path' +import fsPromises from 'fs/promises' +import fs from 'fs' + +const localpwd = 'S4znWTaZYQi3cpRNb' + + +let Aria2cChangeing: boolean = false +let Aria2EngineLocal: any | undefined = undefined +let Aria2EngineRemote: any | undefined = undefined + +let IsAria2cOnlineLocal: boolean = false + +let Aria2cLocalRelanchTime = 0 + +let IsAria2cOnlineRemote: boolean = false + +let Aria2cRemoteRetryTime = 0 + +function GetAria() { + return undefined +} + +function SetAriaOnline(isOnline: boolean, ariaState: string = '') {} + +function CloseRemote() {} + + +export async function AriaTest(https: boolean, host: string, port: number, secret: string) { + return false +} +function Sleep(msTime: number) { + return new Promise((resolve) => + setTimeout( + () => + resolve({ + success: true, + time: msTime + }), + msTime + ) + ) +} + + +export async function AriaChangeToRemote() { + return undefined +} + + +export async function AriaChangeToLocal() { + return true +} + + +export async function AriaGlobalSpeed() {} + +export async function AriaConnect() {} + + +export async function AriaGetDowningList() {} + + +export async function AriaDeleteList(list: string[]) {} + + +export async function AriaStopList(list: string[]) {} + + +export function AriaShoutDown() {} + + +export async function AriaAddUrl(file: IStateDownFile): Promise { + return Promise.resolve('创建Aria任务失败1') +} + + +export function AriaHashFile(downitem: IStateDownFile): { DownID: string; Check: boolean } { + return { DownID: '', Check: false } +} + + +export function FormateAriaError(code: string, message: string): string { + switch (code) { + case '0': + return '' + case '1': + return 'aria2c未知错误' + case '2': + return 'aria2c网络超时' + case '3': + return 'aria2c网络文件404' + case '4': + return 'aria2c网络文件404' + case '5': + return 'aria2c下载缓慢自动退出' + case '6': + return 'aria2c发生网络中断' + case '7': + return 'aria2c被强制退出错误' + case '8': + return 'aria2c服务器不支持断点续传' + case '9': + return 'aria2c本地硬盘空间不足' + case '10': + return 'aria2c分片大小更改' + case '11': + return 'aria2c重复任务' + case '12': + return 'aria2c重复BT任务' + case '13': + return 'aria2c文件已存在且不能覆盖' + case '14': + return 'aria2c文件重命名失败' + case '15': + return 'aria2c打开文件失败' + case '16': + return 'aria2c创建文件时失败' + case '17': + return 'aria2c文件写入失败' + case '18': + return 'aria2c创建文件夹失败' + case '19': + return 'aria2cDNS解析失败' + case '20': + return 'aria2c解析磁力失败' + case '21': + return 'aria2cFTP不支持的命令' + case '22': + if (message.includes('403')) return '服务器拒绝访问403' + if (message.includes('503')) return '服务器返回错误503' + return message + case '23': + return 'aria2cHTTP重定向失败' + case '24': + return 'aria2cHTTP认证失败' + case '25': + return 'aria2c格式化种子失败' + case '26': + return 'aria2c读取种子信息失败' + case '27': + return 'aria2c磁力链接错误' + case '28': + return 'aria2c提供了错误的参数' + case '29': + return 'aria2c服务器超载暂时无法处理请求' + case '30': + return 'aria2cRPC传输参数错误' + case '31': + return 'aria2c多余的响应数据' + case '32': + return 'aria2c文件sha1校验失败' + default: + return message + } +} + + +export function ClearFileName(filename: string): string { + if (!filename) return '' + /** + * window 文件名不能含有 < > : " / \ | ? * 不能空格开头结尾 不能以点结尾 + * mac 文件名不能以.开头 + * linux 不能有 / + * + * js 可无脑转义元字符: ^ $ . * + ? | \ / ( ) [ ] { } = ! : - , + * */ + filename = filename.replace(/[<>\:"\/\\\|\?\*]+/g, '') + filename = filename.replace(/[\f\n\r\t\v]/g, '') + while (filename.endsWith(' ') || filename.endsWith('.')) filename = filename.substring(0, filename.length - 1) + while (filename.startsWith(' ')) filename = filename.substr(1) + if (window.platform == 'win32') { + } else if (window.platform == 'darwin') { + while (filename.startsWith('.')) filename = filename.substr(1) + } else if (window.platform == 'linux') { + } + return filename +} diff --git a/packages/renderer/src/utils/aria2c.ts.bak b/packages/renderer/src/utils/aria2c.ts.bak new file mode 100644 index 0000000..08425bc --- /dev/null +++ b/packages/renderer/src/utils/aria2c.ts.bak @@ -0,0 +1,572 @@ +import AliFile from '@/aliapi/file' +import AliDirFileList, { IAliFileResp } from '@/aliapi/dirfilelist' + +import Aria2 from 'aria2' +import axios from 'axios' +import DownDAL, { IAriaDownProgress, IStateDownFile } from '@/down/downdal' +import message from './message' +import UserDAL from '@/user/userdal' +import { useSettingStore } from '@/store' +import DebugLog from './debuglog' +import Config from './config' +import AliTrash from '@/aliapi/trash' + +const path = window.require('path') +const fspromises = window.require('fs/promises') +const fs = window.require('fs') + +const localpwd = 'S4znWTaZYQi3cpRNb' + + +let Aria2cChangeing: boolean = false +let Aria2EngineLocal: any | undefined = undefined +let Aria2EngineRemote: any | undefined = undefined + +let IsAria2cOnlineLocal: boolean = false + +let Aria2cLocalRelanchTime = 0 + +let IsAria2cOnlineRemote: boolean = false + +let Aria2cRemoteRetryTime = 0 + +function GetAria() { + if (useSettingStore().AriaIsLocal) return Aria2EngineLocal + return Aria2EngineRemote +} + +function SetAriaOnline(isOnline: boolean, ariaState: string = '') { + if (!ariaState) ariaState = useSettingStore().ariaState + let doc = document.getElementById('footAria') + if (ariaState == 'local') { + IsAria2cOnlineLocal = isOnline + if (isOnline) { + let txt = 'Aria ⚯ localhost' + if (doc && doc.innerText != txt) doc.innerText = txt + } else { + if (doc && doc.innerText != 'Aria 已断开') doc.innerText = 'Aria 已断开' + } + } else { + IsAria2cOnlineRemote = isOnline + if (isOnline) { + let txt = 'Aria ⚯ ' + (Aria2EngineRemote?.host || '') + if (doc && doc.innerText != txt) doc.innerText = txt + } else { + if (doc && doc.innerText != 'Aria 已断开') doc.innerText = 'Aria 已断开' + } + } +} + +function CloseRemote() { + + if (IsAria2cOnlineRemote) { + IsAria2cOnlineRemote = false + if (Aria2EngineRemote) { + try { + Aria2EngineRemote.close() + } catch {} + Aria2EngineRemote = undefined + } + } +} + + +export async function AriaTest(https: boolean, host: string, port: number, secret: string) { + const url = (https ? 'https://' : 'http://') + host + ':' + port.toString() + '/jsonrpc' + return axios + .post( + url, + { method: 'aria2.getGlobalStat', jsonrpc: '2.0', id: 'id' + Date.now(), params: ['token:' + secret] }, + { + responseType: 'json', + headers: { + 'Content-Type': 'application/json' + }, + timeout: 4000 + } + ) + .then(() => { + return true + }) + .catch(function (error) { + if (error.response && error.response.data && error.response.data.error) { + if (error.response.data.error.message == 'Unauthorized') { + message.error('连接失败 密码错误 ' + url + ' secret=' + secret) + return false + } + } + if (error.message && error.message.indexOf('timeout of') >= 0) { + message.error('连接失败 网络连接超时 ' + url) + return false + } + message.error('连接失败 ' + (error.message ? error.message : '') + ' ' + url + ' secret=' + secret) + return false + }) +} +function Sleep(msTime: number) { + return new Promise((resolve) => + setTimeout( + () => + resolve({ + success: true, + time: msTime + }), + msTime + ) + ) +} + + +export async function AriaChangeToRemote() { + if (Aria2cChangeing) return undefined + Aria2cChangeing = true + CloseRemote() + try { + const settingStore = useSettingStore() + const host = settingStore.ariaUrl.split(':')[0] + const port = parseInt(settingStore.ariaUrl.split(':')[1]) + const secret = settingStore.ariaPwd + + const Aria2FC = Aria2.default ? Aria2.default : Aria2 + + Aria2EngineRemote = new Aria2FC({ + host, + port, + secure: settingStore.ariaHttps, + secret, + path: '/jsonrpc' + }) + + Aria2EngineRemote.on('close', () => { + if (IsAria2cOnlineRemote == true && Aria2cChangeing == false) { + if (settingStore.AriaIsLocal == false) { + message.error('Aria2远程连接已断开') + SetAriaOnline(false, 'remote') + } + } + }) + await Sleep(1000) + await Aria2EngineRemote.open() + .then(() => { + Aria2cRemoteRetryTime = 0 + SetAriaOnline(true, 'remote') + }) + .catch(() => { + Aria2cRemoteRetryTime++ + SetAriaOnline(false, 'remote') + }) + + if (IsAria2cOnlineRemote == false) { + const url = host + ':' + port + ' secret=' + secret + if (settingStore.AriaIsLocal == false && Aria2cRemoteRetryTime % 10 == 1) message.error('无法连接到远程Aria2 ' + url) + } else { + const limit = settingStore.downGlobalSpeed.toString() + (settingStore.downGlobalSpeedM == 'MB' ? 'M' : 'K') + await Aria2EngineRemote.call('aria2.changeGlobalOption', { 'max-overall-download-limit': limit }).catch((e: any) => { + if (e && e.message == 'Unauthorized') message.error('Aria2密码错误(密码不要有 ^ 或特殊字符)') + IsAria2cOnlineRemote = false + }) + } + } catch (e) { + SetAriaOnline(false, 'remote') + } + Aria2cChangeing = false + return IsAria2cOnlineRemote +} + + +export async function AriaChangeToLocal() { + CloseRemote() + try { + + if (Aria2EngineLocal == undefined) { + const Aria2FC = Aria2.default ? Aria2.default : Aria2 + Aria2EngineLocal = new Aria2FC({ + host: 'localhost', + port: 29387, + secure: false, + secret: localpwd, + path: '/jsonrpc' + }) + Aria2EngineLocal.on('close', () => { + IsAria2cOnlineLocal = false + if (useSettingStore().AriaIsLocal) { + message.error('Aria2本地连接已断开') + let doc = document.getElementById('footAria') + if (doc && doc.innerText != 'Aria 已断开') doc.innerText = 'Aria 已断开' + } + }) + } + + await Aria2EngineLocal.open() + .then(() => { + Aria2cLocalRelanchTime = 0 + SetAriaOnline(true, 'local') + }) + .catch(() => { + SetAriaOnline(false, 'local') + Aria2cLocalRelanchTime++ + if (Aria2cLocalRelanchTime < 2) { + message.info('正在尝试重启Aria进程中。。。') + if (window.WebRelaunchAria) window.WebRelaunchAria() + } + }) + + if (IsAria2cOnlineLocal == false) { + const url = 'localhost:29387 secret=' + localpwd + if (Aria2cLocalRelanchTime < 2) message.error('无法连接到本地Aria2 ' + url) + } else { + const settingStore = useSettingStore() + const limit = settingStore.downGlobalSpeed.toString() + (settingStore.downGlobalSpeedM == 'MB' ? 'M' : 'K') + await Aria2EngineLocal.call('aria2.changeGlobalOption', { 'max-overall-download-limit': limit }).catch((e: any) => { + if (e && e.message == 'Unauthorized') message.error('Aria2密码错误(密码不要有 ^ 或特殊字符)') + IsAria2cOnlineLocal = false + }) + } + } catch (e) { + SetAriaOnline(false, 'local') + } + return true +} + + +export async function AriaGlobalSpeed() { + try { + const settingStore = useSettingStore() + const limit = settingStore.downGlobalSpeed.toString() + (settingStore.downGlobalSpeedM == 'MB' ? 'M' : 'K') + await GetAria().call('aria2.changeGlobalOption', { 'max-overall-download-limit': limit }) + } catch { + SetAriaOnline(false) + } +} + +export async function AriaConnect() { + if (useSettingStore().AriaIsLocal) { + if (!IsAria2cOnlineLocal) await AriaChangeToLocal() + return IsAria2cOnlineLocal + } else { + if (!IsAria2cOnlineRemote) await AriaChangeToRemote() + return IsAria2cOnlineRemote + } +} + + +export async function AriaGetDowningList() { + const multicall = [ + ['aria2.tellActive', ['gid', 'status', 'totalLength', 'completedLength', 'downloadSpeed', 'errorCode', 'errorMessage']], + ['aria2.tellWaiting', 0, 100, ['gid', 'status', 'totalLength', 'completedLength', 'downloadSpeed', 'errorCode', 'errorMessage']], + ['aria2.tellStopped', 0, 100, ['gid', 'status', 'totalLength', 'completedLength', 'downloadSpeed', 'errorCode', 'errorMessage']] + ] + try { + const result = await GetAria().multicall(multicall) + if (result) { + let list: IAriaDownProgress[] = [] + let arr = result[0][0] + list = list.concat(arr) + arr = result[1][0] + list = list.concat(arr) + arr = result[2][0] + list = list.concat(arr) + DownDAL.mSpeedEvent(list) + SetAriaOnline(true) + } + } catch (e: any) { + DebugLog.mSaveLog('danger', 'AriaGetDowningList' + (e.message || '')) + SetAriaOnline(false) + } +} + + +export async function AriaDeleteList(list: string[]) { + const multicall = [] + for (let i = 0, maxi = list.length; i < maxi; i++) { + multicall.push(['aria2.forceRemove', list[i]]) + multicall.push(['aria2.removeDownloadResult', list[i]]) + } + try { + await GetAria().multicall(multicall) + SetAriaOnline(true) + } catch { + SetAriaOnline(false) + } +} + + +export async function AriaStopList(list: string[]) { + const multicall = [] + for (let i = 0, maxi = list.length; i < maxi; i++) { + multicall.push(['aria2.forcePause', list[i]]) + } + try { + await GetAria().multicall(multicall) + SetAriaOnline(true) + } catch { + SetAriaOnline(false) + } +} + + +export function AriaShoutDown() { + if (useSettingStore().AriaIsLocal) { + Aria2EngineLocal.call('aria2.forceShutdown').catch((e: any) => {}) + } +} + + +export async function AriaAddUrl(file: IStateDownFile): Promise { + try { + const info = file.Info + const token = UserDAL.GetUserToken(info.user_id) + if (!token || !token.access_token) return '账号失效,操作取消' + if (info.isDir) { + + const dirfull = path.join(info.DownSavePath, info.name) + if (info.ariaRemote == false) { + + await fspromises.mkdir(dirfull, { recursive: true }).catch((e: any) => { + if (e.code && e.code === 'EPERM') e = '没有权限' + if (e.code && e.code === 'EBUSY') e = '文件夹被占用或锁定中' + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) e = '没有权限' + DebugLog.mSaveLog('danger', 'AriaAddUrl创建文件夹失败:' + dirfull + ' ' + (e || '')) + return undefined + }) + } + + const dir: IAliFileResp = { + items: [], + itemsKey:new Set(), + punished_file_count: 0, + next_marker: '', + m_user_id: info.user_id, + m_drive_id: info.drive_id, + m_dir_id: info.file_id, + m_dir_name: info.name + } + do { + const isget = await AliTrash.ApiFileListOnePageAria('name', 'ASC', dir) + if (isget != true) { + return '解析子文件列表失败,稍后重试' + } else { + if (file.Down.IsStop) { + dir.items.length = 0 + return '已暂停' + } + if (dir.items.length > 0) DownDAL.aAddDownload(dir.items, dirfull, false, false) + dir.items.length = 0 + } + } while (dir.next_marker) + + return 'downed' + } else { + + const dir = info.DownSavePath + const out = info.ariaRemote ? info.name : info.name + '.td' + const filefull = path.join(dir, info.name) + if (info.ariaRemote == false) { + try { + const finfo = await fspromises.stat(filefull) + if (finfo && finfo.size == info.size) return 'downed' + else return '本地存在重名文件,请手动删除' + } catch (e: any) { + if (e.code && e.code === 'EPERM') e = '文件没有读取权限' + if (e.code && e.code === 'EBUSY') e = '文件被占用或锁定中' + if (e.message) e = e.message + if (typeof e == 'string' && e.indexOf('EACCES') >= 0) e = '文件没有读取权限' + if (typeof e == 'string' && e.indexOf('no such file') >= 0) { + + } else { + DebugLog.mSaveLog('danger', 'AriaAddUrl访问文件失败:' + filefull + ' ' + (e || '')) + return e + } + } + + if (info.size == 0) { + try { + + await (await fspromises.open(filefull, 'w')).close().catch((e: any) => { + return undefined + }) + return 'downed' + } catch { + return '创建空文件失败' + } + } + } + + + let downurl = file.Down.DownUrl + + if (downurl != '' && downurl.indexOf('x-oss-expires=') > 0) { + + let expires = downurl.substr(downurl.indexOf('x-oss-expires=') + 'x-oss-expires='.length) + expires = expires.substr(0, expires.indexOf('&')) + const lasttime = parseInt(expires) - Date.now() / 1000 + const needtime = (info.size + 1) / 1024 / 1024 + if (lasttime < 60 || lasttime < needtime + 60) downurl = '' + } else downurl = '' + + if (!downurl) { + const durl = await AliFile.ApiFileDownloadUrl(info.user_id, info.drive_id, info.file_id, 14400) + if (typeof durl == 'string') return '生成下载链接失败,' + durl + else if (!durl.url) { + DebugLog.mSaveLog('danger', info.file_id + '生成下载链接失败,' + JSON.stringify(durl)) + return '生成下载链接失败,' + JSON.stringify(durl) + } + downurl = durl.url + file.Down.DownUrl = downurl + } + if (!downurl) return '生成下载链接失败0' + if (file.Down.IsStop) return '已暂停' + + + const split = useSettingStore().downThreadMax + const referer = Config.referer + const userAgent = Config.userAgent + const multicall = [ + ['aria2.forceRemove', info.GID], + ['aria2.removeDownloadResult', info.GID], + ['aria2.addUri', [downurl], { gid: info.GID, dir, out, split, referer, 'user-agent': userAgent, 'check-certificate': 'false', 'file-allocation': 'trunc' }] + ] + const result = await GetAria().multicall(multicall) + if (result == undefined || result.length < 3 || (result[2].code != undefined && result[2].code) != 0) return '创建aria任务失败,稍后自动重试' + result[2].message + if (result[2].length == 1) return 'success' + } + } catch (e: any) { + SetAriaOnline(false) + DebugLog.mSaveLog('danger', 'AriaAddUrl' + (e.message || '')) + return Promise.resolve('创建Aria任务失败连接断开') + } + return Promise.resolve('创建Aria任务失败1') +} + + +export function AriaHashFile(downitem: IStateDownFile): { DownID: string; Check: boolean } { + const DownID = downitem.DownID + const dir = downitem.Info.DownSavePath + const out = downitem.Info.ariaRemote ? downitem.Info.name : downitem.Info.name + '.td' + const sha1 = downitem.Info.sha1 + const crc64 = downitem.Info.crc64 + + const data = { + DownID: DownID, + inputfile: path.join(dir, out), + movetofile: path.join(dir, downitem.Info.name), + hash: crc64 ? 'crc64' : sha1 ? 'sha1' : '', + check: crc64 || sha1 || '' + } + let success = false + if (data.inputfile == data.movetofile) { + success = true + } else { + try { + fs.renameSync(data.inputfile, data.movetofile) + success = true + } catch { + try { + fs.renameSync(data.inputfile, data.movetofile) + success = true + } catch (e: any) { + DebugLog.mSaveLog('danger', 'AriaRename file=' + data.inputfile + ' error=' + (e.message || '')) + } + } + } + return { DownID, Check: success } +} + + +export function FormateAriaError(code: string, message: string): string { + switch (code) { + case '0': + return '' + case '1': + return 'aria2c未知错误' + case '2': + return 'aria2c网络超时' + case '3': + return 'aria2c网络文件404' + case '4': + return 'aria2c网络文件404' + case '5': + return 'aria2c下载缓慢自动退出' + case '6': + return 'aria2c发生网络中断' + case '7': + return 'aria2c被强制退出错误' + case '8': + return 'aria2c服务器不支持断点续传' + case '9': + return 'aria2c本地硬盘空间不足' + case '10': + return 'aria2c分片大小更改' + case '11': + return 'aria2c重复任务' + case '12': + return 'aria2c重复BT任务' + case '13': + return 'aria2c文件已存在且不能覆盖' + case '14': + return 'aria2c文件重命名失败' + case '15': + return 'aria2c打开文件失败' + case '16': + return 'aria2c创建文件时失败' + case '17': + return 'aria2c文件写入失败' + case '18': + return 'aria2c创建文件夹失败' + case '19': + return 'aria2cDNS解析失败' + case '20': + return 'aria2c解析磁力失败' + case '21': + return 'aria2cFTP不支持的命令' + case '22': + if (message.includes('403')) return '服务器拒绝访问403' + if (message.includes('503')) return '服务器返回错误503' + return message + case '23': + return 'aria2cHTTP重定向失败' + case '24': + return 'aria2cHTTP认证失败' + case '25': + return 'aria2c格式化种子失败' + case '26': + return 'aria2c读取种子信息失败' + case '27': + return 'aria2c磁力链接错误' + case '28': + return 'aria2c提供了错误的参数' + case '29': + return 'aria2c服务器超载暂时无法处理请求' + case '30': + return 'aria2cRPC传输参数错误' + case '31': + return 'aria2c多余的响应数据' + case '32': + return 'aria2c文件sha1校验失败' + default: + return message + } +} + + +export function ClearFileName(filename: string): string { + if (!filename) return '' + /** + * window 文件名不能含有 < > : " / \ | ? * 不能空格开头结尾 不能以点结尾 + * mac 文件名不能以.开头 + * linux 不能有 / + * + * js 可无脑转义元字符: ^ $ . * + ? | \ / ( ) [ ] { } = ! : - , + * */ + filename = filename.replace(/[<>\:"\/\\\|\?\*]+/g, '') + filename = filename.replace(/[\f\n\r\t\v]/g, '') + while (filename.endsWith(' ') || filename.endsWith('.')) filename = filename.substring(0, filename.length - 1) + while (filename.startsWith(' ')) filename = filename.substr(1) + if (window.platform == 'win32') { + } else if (window.platform == 'darwin') { + while (filename.startsWith('.')) filename = filename.substr(1) + } else if (window.platform == 'linux') { + } + return filename +} diff --git a/packages/renderer/src/utils/config.ts b/packages/renderer/src/utils/config.ts new file mode 100644 index 0000000..d0d99a4 --- /dev/null +++ b/packages/renderer/src/utils/config.ts @@ -0,0 +1,8 @@ +export default class Config { + static appVersion = 'v3.08.25' + static referer = 'https://www.aliyundrive.com/' + static userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 2.1.8 Chrome/89.0.4389.128 Electron/12.0.9 Safari/537.36' + static loginUrl = 'https://auth.aliyundrive.com/v2/oauth/authorize?login_type=custom&response_type=code&redirect_uri=https%3A%2F%2Fwww.aliyundrive.com%2Fsign%2Fcallback&client_id=25dzX3vbYqktVxyX&state=%7B%22origin%22%3A%22*%22%7D' + + static loginUrlAccount = 'https://passport.aliyundrive.com/mini_login.htm?lang=zh_cn&appName=aliyun_drive&appEntrance=web&styleType=auto&bizParams=¬LoadSsoView=false¬KeepLogin=false&isMobile=false&&rnd=0.1100330129139' +} diff --git a/packages/renderer/src/utils/db.ts b/packages/renderer/src/utils/db.ts new file mode 100644 index 0000000..e1c7a02 --- /dev/null +++ b/packages/renderer/src/utils/db.ts @@ -0,0 +1,229 @@ +import Dexie from 'dexie' +import { ITokenInfo } from '@/user/userstore' +import { IOtherShareLinkModel } from '@/share/share/OtherShareStore' +import { IStateUploadFile } from '@/aliapi/models' + +export interface ICache { + key: string + time: number + value: object +} + +class XBYDB3 extends Dexie { + iobject: Dexie.Table + istring: Dexie.Table + inumber: Dexie.Table + ibool: Dexie.Table + + itoken: Dexie.Table + iothershare: Dexie.Table + idowning: Dexie.Table + idowned: Dexie.Table + iuploading: Dexie.Table + iuploaded: Dexie.Table + ifilehash: Dexie.Table + + constructor() { + super('XBYDB3') + + this.version(2) + .stores({ + iobject: '', + istring: '', + inumber: '', + ibool: '', + + itoken: '', + iothershare: '', + idowning: '', + idowned: '', + iuploading: '', + iuploaded: '', + ifilehash: '' + }) + .upgrade((tx: any) => { + console.log('upgrade', tx) + }) + this.iobject = this.table('iobject') + this.istring = this.table('istring') + this.inumber = this.table('inumber') + this.ibool = this.table('ibool') + + this.itoken = this.table('itoken') + this.iothershare = this.table('iothershare') + this.idowning = this.table('idowning') + this.idowned = this.table('idowned') + this.iuploading = this.table('iuploading') + this.iuploaded = this.table('iuploaded') + this.ifilehash = this.table('ifilehash') + } + + async getValueString(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.istring.get(key) + if (val) return val + else return '' + } + async saveValueString(key: string, value: string) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.istring.put(value || '', key) + } + async getValueNumber(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.inumber.get(key) + if (val) return val + return 0 + } + async saveValueNumber(key: string, value: number) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.inumber.put(value, key) + } + async getValueBool(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.ibool.get(key) + if (val) return true + return false + } + async saveValueBool(key: string, value: boolean) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.ibool.put(value || false, key) + } + async getValueObject(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.iobject.get(key) + if (val) return val + else return undefined + } + async saveValueObject(key: string, value: object) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iobject.put(value, key).catch(() => {}) + } + async deleteValueObject(key: string) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iobject.delete(key) + } + + async getUser(userid: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + return await this.itoken.get(userid) + } + async getUserAll(): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const list = await this.itoken.toArray() + return list.sort((a: ITokenInfo, b: ITokenInfo) => b.used_size - a.used_size) + } + async deleteUser(userid: string) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.itoken.delete(userid) + } + async saveUser(token: ITokenInfo) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.itoken.put(token, token.user_id).catch(() => {}) + } + + async getOtherShare(share_id: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + return await this.iothershare.get(share_id) + } + async getOtherShareAll(): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const list = await this.iothershare.toArray() + return list.sort((a: IOtherShareLinkModel, b: IOtherShareLinkModel) => b.saved_time - a.saved_time) + } + async deleteOtherShareBatch(share_id_list: string[]) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iothershare.bulkDelete(share_id_list) + } + async saveOtherShare(share: IOtherShareLinkModel) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iothershare.put(share, share.share_id).catch(() => {}) + } + + async getDowning(key: number): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.idowning.get(key) + if (val) return val + else return undefined + } + async deleteDowning(key: number) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowning.delete(key) + } + async saveDowning(key: number, value: Buffer) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowning.put(value, key).catch(() => {}) + } + async deleteDowningAll() { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowning.clear() + } + + async getDowned(key: number): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.idowned.get(key) + if (val) return val + else return undefined + } + async deleteDowned(key: number) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowned.delete(key) + } + async saveDowned(key: number, value: Buffer) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowned.put(value, key).catch(() => {}) + } + async deleteDownedAll() { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.idowned.clear() + } + + async getUploading(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.iuploading.get(key) + if (val) return val + else return undefined + } + async getUploadingAll(): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const list = await this.iuploading.toArray() + return list + } + async deleteUploading(key: string) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploading.delete(key) + } + async deleteUploadings(keys: string[]) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploading.bulkDelete(keys) + } + async saveUploading(key: string, value: IStateUploadFile) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploading.put(value, key).catch(() => {}) + } + async deleteUploadingAll() { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploading.clear() + } + + async getUploaded(key: string): Promise { + if (!this.isOpen()) await this.open().catch(() => {}) + const val = await this.iuploaded.get(key) + if (val) return val + else return undefined + } + async deleteUploaded(key: string) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploaded.delete(key) + } + async saveUploaded(key: string, value: IStateUploadFile) { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploaded.put(value, key).catch(() => {}) + } + async deleteUploadedAll() { + if (!this.isOpen()) await this.open().catch(() => {}) + return this.iuploaded.clear() + } +} + +const DB = new XBYDB3() +export default DB diff --git a/packages/renderer/src/utils/debuglog.ts b/packages/renderer/src/utils/debuglog.ts new file mode 100644 index 0000000..cac7c40 --- /dev/null +++ b/packages/renderer/src/utils/debuglog.ts @@ -0,0 +1,52 @@ +import { useLogStore } from '@/store' +import DB from './db' + +export interface IStateDebugLog { + logtime: string + logtype: LogLeve + logmessage: string +} + +class DebugLogC { + public logList: IStateDebugLog[] = [] + public logLoaded: boolean = false + public logTime: number = 0 + mSaveLogClear() { + this.logList = [] + this.logTime = Date.now() + + try { + DB.saveValueObject('logList', this.logList).catch(() => {}) + useLogStore().logRefresh(this.logTime) + } catch {} + } + + mSaveLog(logtype: LogLeve, logmessage: string) { + if (!logmessage) return + if (!this.logLoaded) return + if (logmessage.length > 300) logmessage = logmessage.substring(0, 300)+'...' + let time = new Date() + if (this.logList.length > 500) this.logList.splice(250) + this.logList.unshift({ + logtime: time.getDate().toString().padStart(2, '0') + ' ' + time.getHours().toString().padStart(2, '0') + ':' + time.getMinutes().toString().padStart(2, '0') + ':' + time.getSeconds().toString().padStart(2, '0'), + logtype: logtype, + logmessage + }) + this.logTime = time.getTime() + try { + DB.saveValueObject('logList', this.logList).catch(() => {}) + useLogStore().logRefresh(this.logTime) + } catch {} + } + + async aLoadFromDB() { + const logList2 = await DB.getValueObject('logList') + if (logList2) this.logList = logList2 as IStateDebugLog[] + this.logLoaded = true + this.logTime = Date.now() + this.mSaveLog('success', '小白羊启动') + } +} + +const DebugLog = new DebugLogC() +export default DebugLog diff --git a/packages/renderer/src/utils/electronhelper.ts b/packages/renderer/src/utils/electronhelper.ts new file mode 100644 index 0000000..7fd9905 --- /dev/null +++ b/packages/renderer/src/utils/electronhelper.ts @@ -0,0 +1,30 @@ +import { app } from '@electron/remote' +import path from 'path' + +export function getFromClipboard() { + return window.Electron.clipboard.readText() as string +} + +export function copyToClipboard(text: string) { + window.Electron.clipboard.writeText(text, 'clipboard') +} +export function openExternal(url: string) { + window.Electron.shell.openExternal(url) +} + +export function getResourcesPath(filename: string) { + try { + console.log(app.getAppPath()) + let basePath: string = path.resolve(app.getAppPath(), '..') + return path.join(basePath, filename) + } catch { + return '' + } +} + +export function getAppNewPath() { + let basePath = path.resolve(app.getAppPath()) + let baseNew = path.join(basePath, '..', 'app.new') + console.log(baseNew) + return baseNew +} diff --git a/packages/renderer/src/utils/foot.ts b/packages/renderer/src/utils/foot.ts new file mode 100644 index 0000000..1f9b913 --- /dev/null +++ b/packages/renderer/src/utils/foot.ts @@ -0,0 +1,25 @@ +const FootMap = new Map() + +export function FootLoading(msg: string, key: string) { + console.log('FootLoading', key, msg) + + if (msg != '') FootMap.set(key, msg) + else FootMap.delete(key) + + let info = '' + FootMap.forEach(function (value, key) { + let item = '' + value + '' + if (info.includes(item) == false) info += item + }) + + let doc = document.getElementById('footLoading') + if (doc) { + if (!info) { + doc.innerHTML = '' + } else { + doc.innerHTML = + '
' + + info + } + } +} \ No newline at end of file diff --git a/packages/renderer/src/utils/format.ts b/packages/renderer/src/utils/format.ts new file mode 100644 index 0000000..2f44ccf --- /dev/null +++ b/packages/renderer/src/utils/format.ts @@ -0,0 +1,487 @@ +const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] + + +export function humanSize(bytes: number | string | undefined) { + if (!bytes && bytes != 0) return '' + if (typeof bytes === 'string') bytes = parseInt(bytes) + let u = 0 + while (bytes >= 1024 && u < units.length - 1) { + bytes /= 1024 + ++u + } + return `${bytes.toFixed(2)}${units[u]}` +} + + +export function humanCount(bytes: number) { + if (bytes < 1000) return bytes + if (bytes < 10000) return (bytes / 1000).toFixed(2) + 'K' + return (bytes / 10000).toFixed(2) + '万' +} + +const byTime = [365 * 24 * 60 * 60 * 1000, 24 * 60 * 60 * 1000, 60 * 60 * 1000, 60 * 1000, 1000] +const unit = ['年', '天', '小时', '分钟', '秒'] + +export function humanTimeAgo(value: number | string | undefined) { + if (!value) return '' + if (typeof value === 'string') value = parseInt(value) + const date = new Date(value) + var ct = new Date().getTime() - date.getTime() + if (ct < 0) return '' + + var sb = [] + for (var i = 0; i < byTime.length; i++) { + if (ct < byTime[i]) { + continue + } + var temp = Math.floor(ct / byTime[i]) + ct = ct % byTime[i] + if (temp > 0) { + sb.push(temp + unit[i]) + } + + /*sb.length控制最多输出几个时间单位: + 一个时间单位如:N分钟前 + 两个时间单位如:M分钟N秒前 + 三个时间单位如:M年N分钟X秒前 + */ + if (sb.length >= 1) { + break + } + } + return sb.join('') + '前' +} + + +export function humanDateTime(value: number | string | undefined) { + if (!value) return '' + if (typeof value === 'string') value = parseInt(value) + const date = new Date(value) + const y = date.getFullYear().toString() + let m: number | string = date.getMonth() + 1 + m = m < 10 ? '0' + m.toString() : m.toString() + let d: number | string = date.getDate() + d = d < 10 ? '0' + d.toString() : d.toString() + let h: number | string = date.getHours() + h = h < 10 ? '0' + h.toString() : h.toString() + let minute: number | string = date.getMinutes() + minute = minute < 10 ? '0' + minute.toString() : minute.toString() + let second: number | string = date.getSeconds() + second = second < 10 ? '0' + second.toString() : second.toString() + return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second +} +export function humanDateTimeDateStr(value: string | undefined) { + if (!value) return '' + const date = new Date(value) + const y = date.getFullYear().toString() + let m: number | string = date.getMonth() + 1 + m = m < 10 ? '0' + m.toString() : m.toString() + let d: number | string = date.getDate() + d = d < 10 ? '0' + d.toString() : d.toString() + let h: number | string = date.getHours() + h = h < 10 ? '0' + h.toString() : h.toString() + let minute: number | string = date.getMinutes() + minute = minute < 10 ? '0' + minute.toString() : minute.toString() + let second: number | string = date.getSeconds() + second = second < 10 ? '0' + second.toString() : second.toString() + return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second +} + + +export function humanTime(value: number | string | undefined) { + if (!value) return '' + if (typeof value === 'string') value = parseInt(value) + var hours = Math.floor(value / 3600) + value = value % 3600 + var minutes = Math.floor(value / 60) + value = value % 60 + var seconds = Math.floor(value) + + var hourStr = (hours < 10 ? '0' : '') + String(hours) + var minStr = (minutes < 10 ? '0' : '') + String(minutes) + var secStr = (seconds < 10 ? '0' : '') + String(seconds) + return hourStr + ':' + minStr + ':' + secStr +} + + +export function humanExpiration(expiration: string | undefined, timenow: number = new Date().getTime()) { + if (expiration) { + const date = Math.floor((new Date(expiration).getTime() - timenow) / 1000) + if (date <= 0) return '过期失效' + else if (date < 60) return date + '秒后' + else if (date < 3600) return (date / 60).toFixed(1) + '分钟' + else if (date < 3600 * 24) return (date / 3600).toFixed(1) + '小时' + else return (date / 3600 / 24).toFixed(1) + '天后' + } else { + return '永久' + } +} + + +export function GetKeyHashHex(full: string) { + const buffa = Buffer.from(full) + + let h1b, k1 + + const remainder = buffa.length & 3 + const bytes = buffa.length - remainder + let h1 = 0 + const c1 = 0xcc9e2d51 + const c2 = 0x1b873593 + let i = 0 + + while (i < bytes) { + k1 = buffa.readUInt8(i) | (buffa.readUInt8(++i) << 8) | (buffa.readUInt8(++i) << 16) | (buffa.readUInt8(++i) << 24) + ++i + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff + k1 = (k1 << 15) | (k1 >>> 17) + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff + h1 ^= k1 + h1 = (h1 << 13) | (h1 >>> 19) + h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff + h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16) + } + + k1 = 0 + switch (remainder) { + case 3: + k1 ^= buffa.readUInt8(i + 2) << 16 + case 2: + k1 ^= buffa.readUInt8(i + 1) << 8 + case 1: + k1 ^= buffa.readUInt8(i) + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff + k1 = (k1 << 15) | (k1 >>> 17) + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff + h1 ^= k1 + } + + h1 ^= buffa.length + h1 ^= h1 >>> 16 + h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff + h1 ^= h1 >>> 13 + h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff + h1 ^= h1 >>> 16 + return (h1 >>> 0).toString(16).padStart(8, '0') +} + + +export function GetKeyHashNumber(full: string) { + const buffa = Buffer.from(full) + + let h1b, k1 + + const remainder = buffa.length & 3 + const bytes = buffa.length - remainder + let h1 = 0 + const c1 = 0xcc9e2d51 + const c2 = 0x1b873593 + let i = 0 + + while (i < bytes) { + k1 = buffa.readUInt8(i) | (buffa.readUInt8(++i) << 8) | (buffa.readUInt8(++i) << 16) | (buffa.readUInt8(++i) << 24) + ++i + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff + k1 = (k1 << 15) | (k1 >>> 17) + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff + h1 ^= k1 + h1 = (h1 << 13) | (h1 >>> 19) + h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff + h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16) + } + + k1 = 0 + switch (remainder) { + case 3: + k1 ^= buffa.readUInt8(i + 2) << 16 + case 2: + k1 ^= buffa.readUInt8(i + 1) << 8 + case 1: + k1 ^= buffa.readUInt8(i) + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff + k1 = (k1 << 15) | (k1 >>> 17) + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff + h1 ^= k1 + } + + h1 ^= buffa.length + h1 ^= h1 >>> 16 + h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff + h1 ^= h1 >>> 13 + h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff + h1 ^= h1 >>> 16 + return h1 >>> 0 +} + +function replaceHanNumber(a: string): string { + let b = '' + let c = '' + + for (let i = 0, maxi = a.length; i < maxi; i++) { + c = a[i] + switch (c) { + case '零': + b += '0' + break + case '一': + b += '1' + break + case 'Ⅰ': + b += '1' + break + case '壹': + b += '1' + break + case '二': + b += '2' + break + case 'Ⅱ': + b += '2' + break + case '贰': + b += '2' + break + case '三': + b += '3' + break + case 'Ⅲ': + b += '3' + break + case '叁': + b += '3' + break + case '四': + b += '4' + break + case 'Ⅳ': + b += '4' + break + case '肆': + b += '4' + break + case '五': + b += '5' + break + case 'Ⅴ': + b += '5' + break + case '伍': + b += '5' + break + case '六': + b += '6' + break + case 'Ⅵ': + b += '6' + break + case '陆': + b += '6' + break + case '七': + b += '7' + break + case 'Ⅶ': + b += '7' + break + case '柒': + b += '7' + break + case '八': + b += '8' + break + case 'Ⅷ': + b += '8' + break + case '捌': + b += '8' + break + case '九': + b += '9' + break + case 'Ⅸ': + b += '9' + break + case '玖': + b += '9' + break + case '十': + b += '' + break + case 'Ⅹ': + b += '' + break + case '拾': + b += '' + break + case '百': + b += '' + break + case '佰': + b += '' + break + case '千': + b += '' + break + case '仟': + b += '' + break + case '万': + b += '' + break + default: + b += c + } + } + return b +} + +export function SortNumber(a: string, b: string): number { + if (a.substring(0, 1) != b.substring(0, 1) && '0123456789零一二三四五六七八九十壹贰叁肆伍陆柒捌玖'.indexOf(a.substring(0, 1)) == -1) return a.localeCompare(b, 'zh-CN') + + const a10 = a.indexOf('十') + if (a10 < 0) { + } else if (a10 == 0) a = '1' + a.substring(1) + else { + const a09 = a.substring(a10 - 1, 1) + if ('一二三四五六七八九'.indexOf(a09) < 0) a = a.substring(0, a10) + '1' + a.substring(a10 + 1) + } + + const b10 = b.indexOf('十') + if (b10 < 0) { + } else if (b10 == 0) b = '1' + b.substring(1) + else { + const b09 = b.substring(b10 - 1, 1) + if ('一二三四五六七八九'.indexOf(b09) < 0) b = b.substring(0, b10) + '1' + b.substring(b10 + 1) + } + + a = replaceHanNumber(a) + b = replaceHanNumber(b) + + const aNums = a.match(/[0-9]+/g) + const bNums = b.match(/[0-9]+/g) + + if (!aNums || !bNums) { + return a.localeCompare(b, 'zh-CN') + } + for (let i = 0, minLen = Math.min(aNums.length, bNums.length); i < minLen; i++) { + const aIndex = a.indexOf(aNums[i]) + const bIndex = b.indexOf(bNums[i]) + + const aPrefix = a.substring(0, aIndex) + const bPrefix = b.substring(0, bIndex) + + if (aIndex !== bIndex || aPrefix !== bPrefix) { + return a.localeCompare(b, 'zh-CN') + } + + if (aNums[i] === bNums[i]) { + if (i === minLen - 1) { + return a.substring(aIndex).localeCompare(b.substring(bIndex), 'zh-CN') + } else { + a = a.substring(aIndex + aNums[i].length) + b = b.substring(bIndex + bNums[i].length) + } + } else if (~~aNums[i] === ~~bNums[i]) { + return aNums[i].lastIndexOf((~~aNums[i]).toString()) - bNums[i].lastIndexOf((~~bNums[i]).toString()) + } else { + return ~~aNums[i] - ~~bNums[i] + } + } + return a.localeCompare(b, 'zh-CN') +} + +export function StringsToMap(list: string[]): Map { + const map = new Map() + try { + for (let i = 0, maxi = list.length; i < maxi; i++) { + map.set(list[i], true) + } + } catch {} + return map +} + +export function guid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) +} +const pk = 'abcDEfgFGHJIdeoOPQpyzABqwxC5678KLhijklmnMNWXYZ012rstuv34RSTUV99' +export function randomSharePassword() { + return 'xxxx'.replace(/[x]/g, function (c) { + var r = Math.floor((Math.random() * 169) | 0) % (pk.length - 1) + return pk.substring(r, r + 1) + }) +} + + +export function b64encode(str: string) { + try { + return Buffer.from(str).toString('base64') + } catch { + return '' + } +} + + +export function b64decode(base64: string) { + try { + return Buffer.from(base64, 'base64').toString() + } catch { + return '' + } +} + +export function B64decode(b64str: string) { + if (!b64str) return '' + try { + b64str = b64str.replaceAll('-', '+') + b64str = b64str.replaceAll('_', '/') + b64str = b64str.replaceAll('*', '=') + return b64decode(b64str) + } catch { + return '' + } +} + +export function B64encode(str: string) { + if (!str) return '' + try { + let b64str = b64encode(str) + b64str = b64str.replaceAll('+', '-') + b64str = b64str.replaceAll('/', '_') + b64str = b64str.replaceAll('=', '*') + return b64str + } catch { + return '' + } +} + +export function Sleep(msTime: number) { + return new Promise((resolve) => + setTimeout( + () => + resolve({ + success: true, + time: msTime + }), + msTime + ) + ) +} + + +export function Unicode(str: string) { + var v = str.split('') + var ascii = '' + for (let i = 0, maxi = v.length; i < maxi; i++) { + var code = Number(v[i].charCodeAt(0)) + ascii += '\\u' + code.toString(16).padStart(4, '0') + } + return ascii +} + +export function SafeJsonStr(str: string) { + return str.replaceAll('\\', '\\\\').replaceAll('"', '\\"') +} diff --git a/packages/renderer/src/utils/idhelper.ts b/packages/renderer/src/utils/idhelper.ts new file mode 100644 index 0000000..259ad83 --- /dev/null +++ b/packages/renderer/src/utils/idhelper.ts @@ -0,0 +1,40 @@ +export interface IID { + id: string + pwd: string +} + +/**解析分享链接(批量) + * 链接:https://www.aliyundrive.com/s/BULJVH9ShDe 提取码:XFwH + */ +export function ParseShareIDList(txt: string): IID[] { + txt = txt.replaceAll('密码', '提取码').replaceAll('password', '提取码').replaceAll('pwd', '提取码').replaceAll('PWD', '提取码') + txt = txt.replaceAll('\n提取码', '提取码') + let list: IID[] = [] + txt.split('\n').map((t) => { + let p = GetShareID(t) + if (p.id) list.push(p) + }) + return list +} +/**解析分享链接(一条) + * 链接:https://www.aliyundrive.com/s/BULJVH9ShDe 提取码:XFwH + */ +export function ParseShareIDOne(txt: string): IID { + txt = txt.replaceAll('密码', '提取码').replaceAll('password', '提取码').replaceAll('pwd', '提取码').replaceAll('PWD', '提取码') + txt = txt.replaceAll('\n提取码', '提取码') + return GetShareID(txt) +} + +/**解析分享链接 + * 链接:https://www.aliyundrive.com/s/BULJVH9ShDe 提取码:XFwH + * 链接:https://www.aliyundrive.com/s/BULJVH9ShDe 密码:XFwH + * 链接:https://www.aliyundrive.com/s/BULJVH9ShDe pwd:XFwH + */ +function GetShareID(txt: string): IID { + const ret = { id: '', pwd: '' } + let id = txt.match(/(?<=\/s\/)[0-9a-zA-Z]{11,12}/) + if (id && id.length > 0) ret.id = id[0] + let pwd = txt.match(/(?<=提取码[^0-9a-zA-Z]{0,6})[0-9a-zA-Z]{4}/) + if (pwd && pwd.length > 0) ret.pwd = pwd[0] + return ret +} diff --git a/packages/renderer/src/utils/keyboardhelper.ts b/packages/renderer/src/utils/keyboardhelper.ts new file mode 100644 index 0000000..524e0f1 --- /dev/null +++ b/packages/renderer/src/utils/keyboardhelper.ts @@ -0,0 +1,254 @@ +import { KeyboardMessage } from '@/store/keyboardstore' + + +export function TestCtrlShift(key: string, event: KeyboardMessage, fun: any) { + if (event.Key.toLowerCase() == key.toLowerCase() && event.Ctrl && event.Shift && event.Repeat == false) { + fun() + return true + } + return false +} + +export function TestCtrl(key: string, event: KeyboardMessage, fun: any) { + if (event.Key.toLowerCase() == key.toLowerCase() && event.Ctrl && event.Repeat == false) { + fun() + return true + } + return false +} + +export function TestShift(key: string, event: KeyboardMessage, fun: any) { + if (event.Key.toLowerCase() == key.toLowerCase() && event.Shift && event.Repeat == false) { + fun() + return true + } + return false +} + +export function TestAlt(key: string, event: KeyboardMessage, fun: any) { + if (event.Key.toLowerCase() == key.toLowerCase() && event.Alt && event.Repeat == false) { + fun() + return true + } + return false +} + +export function TestKey(key: string, event: KeyboardMessage, fun: any) { + if (event.Key.toLowerCase() == key.toLowerCase() && event.Repeat == false && event.Ctrl == false && event.Shift == false && event.Alt == false) { + fun() + return true + } + return false +} +/** pagedown pageup home end */ +export function TestKeyboardScroll(event: KeyboardMessage, vlist: any, store: any) { + try { + let element = vlist.$el + if (!element) return false + let alist = element.getElementsByClassName('arco-list') + if (alist.length == 0) return false + element = alist[0] + + + + + if (element.children[0].className.indexOf('arco-list-virtual') > 0) element = element.children[0] + + if (event.Key.toLowerCase() == 'pagedown') { + element.scrollBy(0, element.clientHeight) + setTimeout(() => { + if (vlist.virtualListRef && vlist.virtualListRef.viewportRef) { + let doc = vlist.virtualListRef.viewportRef.getElementsByClassName('listitemdiv') + if (doc && doc.length > 0) { + let id = doc[doc.length > 1 ? 1 : 0].getAttribute('data-id') + store.mSetFocus(id) + } + } + }, 300) + return true + } + if (event.Key.toLowerCase() == 'pageup') { + element.scrollBy(0, -element.clientHeight) + setTimeout(() => { + if (vlist.virtualListRef && vlist.virtualListRef.viewportRef) { + let doc = vlist.virtualListRef.viewportRef.getElementsByClassName('listitemdiv') + if (doc && doc.length > 0) { + let id = doc[doc.length > 1 ? 1 : 0].getAttribute('data-id') + store.mSetFocus(id) + } + } + }, 300) + return true + } + if (event.Key.toLowerCase() == 'home') { + element.scrollTo(0, 0) + let key = store.mGetFocusNext('top') + store.mSetFocus(key) + return true + } + if (event.Key.toLowerCase() == 'end') { + element.scrollTo(0, element.scrollHeight) + let key = store.mGetFocusNext('end') + store.mSetFocus(key) + return true + } + } catch { + return true + } + return false +} + +export function TestKeyboardSelect(event: KeyboardMessage, viewlist: any, store: any, enterFun: any) { + const tselect = () => { + let key = store.mGetFocusNext('top') + store.mKeyboardSelect(key, false, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestCtrl('t', event, tselect)) return true + const eselect = () => { + let key = store.mGetFocusNext('end') + store.mKeyboardSelect(key, false, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestCtrl('e', event, eselect)) return true + + const cdown = () => { + let key = store.mGetFocusNext('next') + store.mSetFocus(key) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestCtrl('arrowdown', event, cdown)) return true + const sdown = () => { + let key = store.mGetFocusNext('next') + store.mKeyboardSelect(key, false, true) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestShift('arrowdown', event, sdown)) return true + const down = () => { + let key = store.mGetFocusNext('next') + store.mKeyboardSelect(key, false, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestKey('arrowdown', event, down)) return true + const cup = () => { + let key = store.mGetFocusNext('prev') + store.mSetFocus(key) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestCtrl('arrowup', event, cup)) return true + const sup = () => { + let key = store.mGetFocusNext('prev') + store.mKeyboardSelect(key, false, true) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestShift('arrowup', event, sup)) return true + const up = () => { + let key = store.mGetFocusNext('prev') + store.mKeyboardSelect(key, false, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestKey('arrowup', event, up)) return true + const enter = () => { + let key = store.mGetFocus() + store.mKeyboardSelect(key, false, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + if (enterFun) enterFun(key) + } + if (TestKey('enter', event, enter)) return true + const esc = () => { + store.mKeyboardSelect('', false, false) + } + if (TestKey('escape', event, esc)) return true + + const space = () => { + let key = store.mGetFocus() + store.mKeyboardSelect(key, false, true) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestShift(' ', event, space)) return true + const cspace = () => { + let key = store.mGetFocus() + store.mKeyboardSelect(key, true, false) + viewlist.scrollIntoView({ key: key, align: 'auto' }) + } + if (TestCtrl(' ', event, cspace)) return true +} + +export function RefreshScroll(element: any) { + try { + let alist = element.getElementsByClassName('arco-list') + if (alist.length == 0) return false + element = alist[0] + if (element.children[0].className.indexOf('arco-list-virtual') > 0) element = element.children[0] + + element.scrollBy(0, 1) + element.scrollBy(0, -1) + } catch {} +} + +export function RefreshScrollTo(element: any, top: number) { + try { + let alist = element.getElementsByClassName('arco-list') + if (alist.length == 0) return false + element = alist[0] + if (element.children[0].className.indexOf('arco-list-virtual') > 0) element = element.children[0] + + element.scrollTo(0, top) + } catch {} +} + +const menulist = ['leftpansubmove', 'leftpansubzhankai', 'leftpanmenu', 'rightpansubmove', 'rightpansubbiaoji', + 'rightpansubmore', 'rightpanmenu', 'rightpantrashmenu', 'rightmysharemenu', 'rightothersharemenu', 'uploadingrightmenu'] +const menuliststate = new Set() + +export function onHideRightMenu() { + for (let i = 0; i < menulist.length; i++) { + let menukey = menulist[i] + let menu = document.getElementById(menukey) + if (menu && (menuliststate.has(menukey) || menu.style.left != '-200px')) { + menu.style.left = '-200px' + menu.style.opacity = '0' + menu.style.zIndex = '-1' + menuliststate.delete(menukey) + } + } +} + +export function onHideRightMenuScroll() { + for (let i = 0; i < menulist.length; i++) { + let menukey = menulist[i] + if (menuliststate.has(menukey)) { + let menu = document.getElementById(menukey) + if (menu) { + menu.style.left = '-200px' + menu.style.opacity = '0' + menu.style.zIndex = '-1' + } + menuliststate.delete(menukey) + } + } +} + +export function onShowRightMenu(menukey: string, clientX: number, clientY: number) { + onHideRightMenuScroll() + let menu = document.getElementById(menukey) + if (menu) { + menuliststate.add(menukey) + let screenY = window.innerHeight + let screenX = window.innerWidth + + if (menu.offsetHeight + clientY + 30 > screenY) { + menu.style.top = (clientY - menu.offsetHeight).toString() + 'px' + } else { + menu.style.top = clientY.toString() + 'px' + } + if (menu.offsetWidth + clientX + 10 > screenX) { + menu.style.left = (clientX - menu.offsetWidth).toString() + 'px' + } else { + menu.style.left = clientX.toString() + 'px' + } + + menu.style.opacity = '1' + menu.style.zIndex = '1001' + } +} diff --git a/packages/renderer/src/utils/message.ts b/packages/renderer/src/utils/message.ts new file mode 100644 index 0000000..9c597e5 --- /dev/null +++ b/packages/renderer/src/utils/message.ts @@ -0,0 +1,31 @@ +import { Message } from '@arco-design/web-vue' +export default class message { + static info(msg: string, duration: number = 3, key: string = '') { + if (!key && duration > 0 && msg) key = msg + if (key) return Message.info({ id: key, content: msg, position: 'bottom', duration: duration * 1000 }) + return Message.info({ content: msg, position: 'bottom', duration: duration * 1000 }) + } + static error(msg: string, duration: number = 3, key: string = '') { + if (!key && duration > 0 && msg) key = msg + if (key) return Message.error({ id: key, content: msg, position: 'bottom', duration: duration * 1000 }) + return Message.error({ content: msg, position: 'bottom', duration: duration * 1000 }) + } + + static success(msg: string, duration: number = 3, key: string = '') { + if (!key && duration > 0 && msg) key = msg + if (key) return Message.success({ id: key, content: msg, position: 'bottom', duration: duration * 1000 }) + return Message.success({ content: msg, position: 'bottom', duration: duration * 1000 }) + } + + static warning(msg: string, duration: number = 3, key: string = '') { + if (!key && duration > 0 && msg) key = msg + if (key) return Message.warning({ id: key, content: msg, position: 'bottom', duration: duration * 1000 }) + return Message.warning({ content: msg, position: 'bottom', duration: duration * 1000 }) + } + + static loading(msg: string, duration: number = 3, key: string = '') { + if (!key && duration > 0 && msg) key = msg + if (key) return Message.loading({ id: key, content: msg, position: 'bottom', duration: duration * 1000 }) + return Message.loading({ content: msg, position: 'bottom', duration: duration * 1000 }) + } +} diff --git a/packages/renderer/src/utils/modal.ts b/packages/renderer/src/utils/modal.ts new file mode 100644 index 0000000..9022acc --- /dev/null +++ b/packages/renderer/src/utils/modal.ts @@ -0,0 +1,59 @@ +import { IAliGetFileModel, IAliShareItem } from '@/aliapi/alimodels' +import { useModalStore } from '@/store' + +export function modalCloseAll() { + useModalStore().showModal('', {}) +} + +export function modalCreatNewFile() { + useModalStore().showModal('creatfile', {}) +} +export function modalCreatNewDir(dirtype: string, parentdirid: string = '', callback: any = undefined) { + useModalStore().showModal('creatdir', { dirtype, parentdirid, callback }) +} + +export function modalCreatNewShareLink(sharetype: string, filelist: IAliGetFileModel[]) { + useModalStore().showModal('creatshare', { sharetype, filelist }) +} + +export function modalDaoRuShareLink() { + useModalStore().showModal('daorushare', {}) +} +export function modalDaoRuShareLinkMulti() { + useModalStore().showModal('daorusharemulti', {}) +} + +export function modalRename(istree: boolean, ismulti: boolean) { + useModalStore().showModal(ismulti ? 'renamemulti' : 'rename', { istree }) +} + +export function modalEditShareLink(sharelist: IAliShareItem[]) { + useModalStore().showModal('editshare', { sharelist }) +} +/** + * @param withsave 是否显示保存按钮 + * @param file_id_list 需要高亮显示的文件id列表 + */ +export function modalShowShareLink(share_id: string, share_pwd: string, share_token: string, withsave: boolean, file_id_list: string[]) { + useModalStore().showModal('showshare', { share_id, share_pwd, share_token, withsave, file_id_list }) +} + +export function modalSelectPanDir(selecttype: string, callback: (user_id: string, drive_id: string, dir_id: string, dir_name: string) => void) { + useModalStore().showModal('selectpandir', { selecttype, callback }) +} + +export function modalShuXing(istree: boolean, ismulti: boolean) { + ismulti = false + useModalStore().showModal(ismulti ? 'shuxingmulti' : 'shuxing', { istree }) +} + +export function modalSearchPan() { + useModalStore().showModal('searchpan', {}) +} + +export function modalDLNAPlayer() { + useModalStore().showModal('dlna', {}) +} +export function modalM3U8Download() { + useModalStore().showModal('m3u8download', {}) +} diff --git a/packages/renderer/src/utils/openfile.ts b/packages/renderer/src/utils/openfile.ts new file mode 100644 index 0000000..6844e7b --- /dev/null +++ b/packages/renderer/src/utils/openfile.ts @@ -0,0 +1,421 @@ +import { IAliGetFileModel } from '@/aliapi/alimodels' +import AliFile from '@/aliapi/file' +import AliFileCmd from '@/aliapi/filecmd' +import { useFootStore, usePanFileStore, useSettingStore, useUserStore } from '@/store' +import { IPageCode, IPageImage, IPageOffice, IPageVideo } from '@/store/appstore' +import UserDAL from '@/user/userdal' +import Config from './config' +import message from './message' +import { CleanStringForCmd } from './utils' + +let _OpenFile = false +export async function menuOpenFile(file: IAliGetFileModel) { + if (_OpenFile) return + _OpenFile = true + setTimeout(() => { + _OpenFile = false + }, 500) + + let file_id = file.file_id + let drive_id = file.drive_id + + if (file.ext == 'zip' || file.ext == 'rar') { + + message.info('此版本暂不支持在线解压') + return + } + + if (file.category == 'image' || file.category == 'image2') { + + Image(drive_id, file_id, file.name) + return + } + if (file.category == 'image3') { + message.info('此格式暂不支持预览') + return + } + + if (file.category.startsWith('video')) { + + Video(drive_id, file_id, file.name, file.icon == 'iconweifa', file.description) + return + } + + if (file.category.startsWith('audio')) { + + Audio(drive_id, file_id, file.name, file.icon == 'iconweifa') + return + } + + if (file.category.startsWith('doc')) { + + Office(drive_id, file_id, file.name) + return + } + + const codeExt = PrismExt(file.ext) + if (file.size < 100 * 1024 || (file.size < 5 * 1024 * 1024 && codeExt)) { + Code(drive_id, file_id, file.name, codeExt, file.size) + return + } + message.info('此格式暂不支持预览') +} + +async function Audio(drive_id: string, file_id: string, name: string, weifa: boolean) { + message.loading('Loading...', 2) + const userID = useUserStore().userID + const token = await UserDAL.GetUserTokenFromDB(userID) + if (!token || !token.access_token) { + message.error('在线预览失败 账号失效,操作取消') + return + } + const data = await AliFile.ApiAudioPreviewUrl(userID, drive_id, file_id) + if (data && data.url != '') { + useFootStore().mSaveAudioUrl(data.url) + } +} + +async function Video(drive_id: string, file_id: string, name: string, weifa: boolean, dec: string) { + message.loading('Loading...', 2) + const userID = useUserStore().userID + const token = await UserDAL.GetUserTokenFromDB(userID) + if (!token || !token.access_token) { + message.error('在线预览失败 账号失效,操作取消') + return + } + let settingStore = useSettingStore() + if (settingStore.uiAutoColorVideo && dec == '') { + AliFileCmd.ApiFileColorBatch(userID, drive_id, 'c5b89b8', [file_id]).then((success) => { + usePanFileStore().mColorFiles('c5b89b8', success) + }) + } + + /** + 播放源 downurl/m3u8 + 播放器 mpv/other/web + downurl=>(mpv/other) + m3u8=>(mpv/other/web) + */ + + if (settingStore.uiVideoPlayer == 'web') { + + const pageVideo: IPageVideo = { user_id: token.user_id, drive_id, file_id, file_name: name } + window.WebOpenWindow({ page: 'PageVideo', data: pageVideo, theme: 'dark' }) + return + } + + let url = '' + let mode = '' + if (weifa || settingStore.uiVideoMode == 'online') { + + + const data = await AliFile.ApiVideoPreviewUrl(userID, drive_id, file_id) + if (data && data.url != '') { + url = data.url + mode = '转码视频模式_没有字幕请切换原始文件模式' + } + } + if (!url && weifa == false) { + + const data = await AliFile.ApiFileDownloadUrl(userID, drive_id, file_id, 14400) + if (typeof data !== 'string' && data.url && data.url != '') { + url = data.url + mode = '原始文件模式' + } + } + if (!url) { + message.error('视频地址解析失败,操作取消') + return + } + + const title = mode + '__' + name + + if (settingStore.uiVideoPlayer == 'mpv') { + let ag2: string[] = [] + if (window.platform == 'win32') { + ag2 = ['"' + url + '"', '--title="' + CleanStringForCmd(title) + '"', '--user-agent="' + CleanStringForCmd(Config.userAgent) + '"'] + } else if (window.platform == 'darwin') { + ag2 = ["'" + url + "'", "--title='" + CleanStringForCmd(title) + "'", "--user-agent='" + CleanStringForCmd(Config.userAgent) + "'"] + } else if (window.platform == 'linux') { + ag2 = ["'" + url + "'", "--title='" + CleanStringForCmd(title) + "'", "--user-agent='" + CleanStringForCmd(Config.userAgent) + "'"] + } else { + message.error('不支持的系统,操作取消') + return + } + + window.WebExecSync( + { + command: 'mpv', + args: ['--referrer=https://www.aliyundrive.com/', '--force-window=immediate', '--hwdec=auto', '--geometry=80%', '--autofit-larger=100%x100%', '--autofit-smaller=640', ...ag2] + }, + (rdata: any) => {} + ) + } else { + let command = settingStore.uiVideoPlayerPath + let args = ['"' + url + '"'] + if (window.platform == 'win32') { + command = '"' + settingStore.uiVideoPlayerPath + '"' + args = ['"' + url + '"'] //win 双引号包裹 + if (command.toLowerCase().indexOf('potplayer') > 0) { + args = ['"' + url + '"', '/new', '/referer=https://www.aliyundrive.com/'] + } else if (command.toLowerCase().indexOf('mpv') > 0) { + args = ['"' + url + '"', '--referrer=https://www.aliyundrive.com/', '--title="' + CleanStringForCmd(title) + '"'] + } else { + if (url.indexOf('x-oss-additional-headers=referer') > 0) { + message.error('用户token已过期,请点击头像里退出按钮后重新登录账号') + return + } + } + } else if (window.platform == 'darwin') { + command = "open -a '" + command + "'" + args = ["'" + url + "'"] //mac 单引号包裹 + if (url.indexOf('x-oss-additional-headers=referer') > 0) { + message.error('用户token已过期,请点击头像里退出按钮后重新登录账号') + return + } + } else if (window.platform == 'linux') { + command = settingStore.uiVideoPlayerPath //不能加引号 + args = ["'" + url + "'"] //linux 单引号包裹 + + if (url.indexOf('x-oss-additional-headers=referer') > 0) { + message.error('用户token已过期,请点击头像里退出按钮后重新登录账号') + return + } + } else { + message.error('不支持的系统,操作取消') + return + } + + window.WebExecSync( + { + command, + args + }, + (rdata: any) => {} + ) + } +} + +async function Image(drive_id: string, file_id: string, name: string) { + message.loading('Loading...', 2) + const userID = useUserStore().userID + const token = await UserDAL.GetUserTokenFromDB(userID) + if (!token || !token.access_token) { + message.error('在线预览失败 账号失效,操作取消') + return + } + + const imageidlist: string[] = [] + const imagenamelist: string[] = [] + + const filelist = usePanFileStore().ListDataRaw + for (let i = 0, maxi = filelist.length; i < maxi; i++) { + if (filelist[i].category == 'image' || filelist[i].category == 'image2') { + imageidlist.push(filelist[i].file_id) + imagenamelist.push(filelist[i].name) + } + } + if (imageidlist.length == 0) { + message.error('获取文件预览链接失败,操作取消') + return + } + + const pageImage: IPageImage = { user_id: token.user_id, drive_id, file_id, file_name: name, mode: useSettingStore().uiImageMode, imageidlist, imagenamelist } + window.WebOpenWindow({ page: 'PageImage', data: pageImage, theme: 'dark' }) +} + +async function Office(drive_id: string, file_id: string, name: string) { + message.loading('Loading...', 2) + const userID = useUserStore().userID + const token = await UserDAL.GetUserTokenFromDB(userID) + if (!token || !token.access_token) { + message.error('在线预览失败 账号失效,操作取消') + return + } + + const data = await AliFile.ApiOfficePreViewUrl(userID, drive_id, file_id) + if (!data || !data.preview_url) { + message.error('获取文件预览链接失败,操作取消') + return + } + const pageOffice: IPageOffice = { user_id: token.user_id, drive_id, file_id, file_name: name, preview_url: data.preview_url, access_token: data.access_token } + window.WebOpenWindow({ page: 'PageOffice', data: pageOffice }) +} + +async function Code(drive_id: string, file_id: string, name: string, code_ext: string, file_size: number) { + message.loading('Loading...', 2) + const userID = useUserStore().userID + const token = await UserDAL.GetUserTokenFromDB(userID) + if (!token || !token.access_token) { + message.error('在线预览失败 账号失效,操作取消') + return + } + const data = await AliFile.ApiFileDownloadUrl(userID, drive_id, file_id, 14400) + if (typeof data == 'string') { + message.error('获取文件预览链接失败,操作取消') + return + } + + const pageCode: IPageCode = { user_id: token.user_id, drive_id, file_id, file_name: name, code_ext, file_size, download_url: data.url } + window.WebOpenWindow({ page: 'PageCode', data: pageCode, theme: 'dark' }) +} + + +export function PrismExt(file_ext: string) { + const ext = '.' + file_ext.toLowerCase() + '.' + const fext = file_ext.toLowerCase() + let iscode = false + let codeext = '' + iscode = iscode || ';.markup.html.xml.svg.mathml.ssml.atom.rss.css.clike.javascript.js.abap.'.indexOf(ext) > 0 + iscode = iscode || ';.actionscript.ada.agda.al.antlr4.g4.apacheconf.apex.apl.applescript.abnf.'.indexOf(ext) > 0 + iscode = iscode || ';.aql.arduino.arff.asciidoc.adoc.aspnet.asm6502.autohotkey.autoit.bash.shell.'.indexOf(ext) > 0 + iscode = iscode || ';.basic.batch.bbcode.shortcode.birb.bison.bnfrbnf.brainfuck.brightscript.'.indexOf(ext) > 0 + iscode = iscode || ';.bro.bsl.oscript.c.csharp.cs.dotnet.cpp.cfscript.cfc.chaiscript.cil.clojure.cmake.'.indexOf(ext) > 0 + iscode = iscode || ';.cobol.coffeescript.coffee.concurnas.conc.csp.coq.crystal.css-extras.csv.cypher.n4jsd.'.indexOf(ext) > 0 + iscode = iscode || ';.d.dart.dataweave.dax.dhall.diff.django.jinja2.dns-zone-file.dns-zone..purs.purescript.'.indexOf(ext) > 0 + iscode = iscode || ';.docker.dockerfile.dot.gv.ebnf.editorconfig.eiffel.ejs.eta.elixir.elm.etlua.erb.erlang.'.indexOf(ext) > 0 + iscode = iscode || ';.fsharp.factor.false.firestore-security-rules.flow.fortran.ftl.gml.gamemakerlanguage.'.indexOf(ext) > 0 + iscode = iscode || ';.gcode.gdscript.gedcom.gherkin.git.glsl.go.graphql.groovy.haml.handlebars.hbs.'.indexOf(ext) > 0 + iscode = iscode || ';.haskell.hs.haxe.hcl.hlsl.hoon.http.hpkp.hsts.ichigojam.icon.icu-message-format.'.indexOf(ext) > 0 + iscode = iscode || ';.idris.idr.ignore.gitignore.hgignore.npmignore.inform7.ini.io.j.java.javadoc.javadoclike.'.indexOf(ext) > 0 + iscode = iscode || ';.javastacktrace.jexl.jolie.jq.jsdoc.js-extras.json.webmanifest.json5.jsonp.jsstacktrace.px.'.indexOf(ext) > 0 + iscode = iscode || ';.js-templates.julia.keyman.kotlin.kt.kts.kumir.kum.latex.tex.context.latte.less.lilypond.ly.'.indexOf(ext) > 0 + iscode = iscode || ';.liquid.lisp.emacs.elisp.emacs-lisp.livescript.llvm.log.lolcode.lua.makefile.markdown.md.'.indexOf(ext) > 0 + iscode = iscode || ';.markup-templating.matlab.mel.mizar.mongodb.monkey.moonscript.moon.n1ql.n4js.'.indexOf(ext) > 0 + iscode = iscode || ';.nand2tetris-hdl.naniscript.nani.nasm.neon.nevod.nginx.nim.nix.nsis.objectivec.objc.'.indexOf(ext) > 0 + iscode = iscode || ';.ocaml.opencl.openqasm.qasm.oz.parigp.parser.pascal.objectpascal.pascaligo.psl.pcaxis.'.indexOf(ext) > 0 + iscode = iscode || ';.peoplecode.pcode.perl.php.phpdoc.php-extras.plsql.powerquery.pq.mscript.powershell.'.indexOf(ext) > 0 + iscode = iscode || ';.processing.prolog.promql.properties.protobuf.pug.puppet.pure.purebasic.pbfasm.twig.'.indexOf(ext) > 0 + iscode = iscode || ';.python.py.qsharp.qs.q.qml.qore.r.racket.rkt.jsx.tsx.reason.regex.rego.renpy.rpy.rest.rip.'.indexOf(ext) > 0 + iscode = iscode || ';.robotframework.robot.ruby.rb.rust.sas.sass.scss.scala.scheme.shell-session.sh-session.sql.'.indexOf(ext) > 0 + iscode = iscode || ';.smali.smalltalk.smarty.sml.smlnj.solidity.sol.solution-file.sln.soy.sparql.rq.splunk-spl.sqf.'.indexOf(ext) > 0 + iscode = iscode || ';.squirrel.stan.iecst.stylus.swift.t4-templating.t4-cs.t4.t4-vb.tap.tcl.tt2.textile.toml.turtle.trig.'.indexOf(ext) > 0 + iscode = iscode || ';.typescript.ts.typoscript.tsconfig.unrealscript.uscript.uc.uri.url.v.vala.vbnet.velocity.verilog.'.indexOf(ext) > 0 + iscode = iscode || ';.vim.visual-basic.vb.vba.warpscript.wasm.wiki.wolfram.mathematica.nb.wl.xeora.xeoracube.'.indexOf(ext) > 0 + iscode = iscode || ';.xml-doc.xojo.xquery.yaml.yml.yang.zig.excel-formula.xlsx.xls.shellsession.roboconf.vhdl.'.indexOf(ext) > 0 + + if (iscode) { + codeext = fext + } else { + + switch (fext) { + case 'prettierrc': + codeext = 'json' + break + case 'vue': + codeext = 'javascript' + case 'h': + codeext = 'c' + break + case 'as': + codeext = 'actionscript' + break + case 'sh': + codeext = 'bash' + break + case 'zsh': + codeext = 'bash' + break + case 'bf': + codeext = 'brainfuck' + break + case 'hpp': + codeext = 'cpp' + break + case 'cc': + codeext = 'cpp' + break + case 'hh': + codeext = 'cpp' + break + case 'c++': + codeext = 'cpp' + break + case 'h++': + codeext = 'cpp' + break + case 'cxx': + codeext = 'cpp' + break + case 'hxx': + codeext = 'cpp' + break + case 'cson': + codeext = 'coffeescript' + break + case 'iced': + codeext = 'coffeescript' + break + case 'dns': + codeext = 'dns-zone' + break + case 'zone': + codeext = 'dns-zone' + break + case 'bind': + codeext = 'dns-zone' + break + case 'plist': + codeext = 'xml' + break + case 'xhtml': + codeext = 'html' + break + case 'iml': + codeext = 'xml' + break + case 'mk': + codeext = 'makefile' + break + case 'mak': + codeext = 'makefile' + break + case 'make': + codeext = 'makefile' + break + case 'mkdown': + codeext = 'markdown' + break + case 'mkd': + codeext = 'markdown' + break + case 'nginxconf': + codeext = 'nginx' + break + case 'nimrod': + codeext = 'nim' + break + case 'mm': + codeext = 'objectivec' + break + case 'obj-c': + codeext = 'objectivec' + break + case 'obj-c++': + codeext = 'objectivec' + break + case 'objective-c++': + codeext = 'objectivec' + break + case 'ps': + codeext = 'powershell' + break + case 'ps1': + codeext = 'powershell' + break + case 'gyp': + codeext = 'python' + break + case 'rs': + codeext = 'rust' + break + case 'vb': + codeext = 'vbnet' + break + case 'conf': + codeext = 'ini' + break + } + } + return codeext +} diff --git a/packages/renderer/src/utils/selecthelper.ts b/packages/renderer/src/utils/selecthelper.ts new file mode 100644 index 0000000..3bbf040 --- /dev/null +++ b/packages/renderer/src/utils/selecthelper.ts @@ -0,0 +1,203 @@ + +export function GetSelectedList(list: T[], keyname: string, selectedMap: Set): T[] { + let selectedList: T[] = [] + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = (list[i] as any)[keyname] + if (selectedMap.has(key)) selectedList.push(list[i]) + } + return selectedList +} + +export function GetSelectedListID(list: T[], keyname: string, selectedMap: Set): string[] { + let selectedList: string[] = [] + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = (list[i] as any)[keyname] + if (selectedMap.has(key)) selectedList.push(key) + } + return selectedList +} + +export function SelectAll(list: T[], keyname: string, selectedOld: Set): Set { + let selectedNew = new Set() + if (selectedOld.size == list.length) { + + } else { + + for (let i = 0, maxi = list.length; i < maxi; i++) { + selectedNew.add((list[i] as any)[keyname]) + } + } + return selectedNew +} + + +export function GetFocusNext(list: any[], keyname: string, focusKey: string, position: string): string { + if (list.length <= 0) return '' + + if (position == 'top') return list[0][keyname] + if (position == 'end') return list[list.length - 1][keyname] + + if (focusKey == '') return list[0][keyname] + + let key = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + key = list[i][keyname] + if (key == focusKey) { + if (position == 'next') { + + if (i + 1 < maxi) return list[i + 1][keyname] + else return list[maxi - 1][keyname] + } else { + + if (i > 0) return list[i - 1][keyname] + else return list[0][keyname] + } + } + } + return '' +} + +export function MouseSelectOne(list: any[], keyname: string, selectedOld: Set, focusKey: string, selectKey: string, Key: string, Ctrl: boolean, Shift: boolean) { + if (Key == '') return { selectedNew: new Set(), selectedLast: '', focusLast: '' } + + if (Shift) { + if (!selectKey) selectKey = list[0][keyname] + + let posToSelect = -1 + let posLastSelect = -1 + let posFocus = -1 + let TempKey = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + TempKey = list[i][keyname] + if (TempKey == Key) posToSelect = i + if (TempKey == selectKey) posLastSelect = i + if (TempKey == focusKey) posFocus = i + if (posToSelect >= 0 && posLastSelect >= 0 && posFocus >= 0) break + } + let selectedNew = new Set(selectedOld) + + if (posToSelect >= 0 && posLastSelect >= 0) { + for (let n = Math.min(posToSelect, posLastSelect), maxn = Math.max(posToSelect, posLastSelect); n <= maxn; n++) { + selectedNew.add(list[n][keyname]) + } + } + + if (posToSelect >= 0 && posFocus >= 0 && posLastSelect >= 0) { + + + + + + + if (posLastSelect <= posToSelect && posToSelect <= posFocus) { + for (let n = posToSelect + 1; n <= posFocus; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posToSelect <= posLastSelect && posLastSelect <= posFocus) { + for (let n = posLastSelect + 1; n <= posFocus; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posFocus <= posLastSelect && posLastSelect <= posToSelect) { + for (let n = posFocus; n <= posLastSelect - 1; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posFocus <= posToSelect && posToSelect <= posLastSelect) { + for (let n = posFocus; n <= posToSelect - 1; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } + } + + return { selectedNew: selectedNew, selectedLast: selectKey, focusLast: Key } + + } + + + if (Ctrl) { + + if (selectedOld.has(Key)) { + selectedOld.delete(Key) + } else { + selectedOld.add(Key) + } + return { selectedNew: selectedOld, selectedLast: Key, focusLast: Key } + } + + + if (selectedOld.has(Key) && selectedOld.size == 1) return { selectedNew: new Set(), selectedLast: Key, focusLast: Key } + return { selectedNew: new Set([Key]), selectedLast: Key, focusLast: Key } +} + + +export function KeyboardSelectOne(list: any[], keyname: string, selectedOld: Set, focusKey: string, selectKey: string, Key: string, Ctrl: boolean, Shift: boolean) { + if (Key == '') return { selectedNew: new Set(), selectedLast: '', focusLast: Key } + + + if (Shift) { + if (!selectKey) selectKey = list[0][keyname] + + let posToSelect = -1 + let posLastSelect = -1 + let posFocus = -1 + let TempKey = '' + for (let i = 0, maxi = list.length; i < maxi; i++) { + TempKey = list[i][keyname] + if (TempKey == Key) posToSelect = i + if (TempKey == selectKey) posLastSelect = i + if (TempKey == focusKey) posFocus = i + if (posToSelect >= 0 && posLastSelect >= 0 && posFocus >= 0) break + } + let selectedNew = new Set(selectedOld) + + if (posToSelect >= 0 && posLastSelect >= 0) { + for (let n = Math.min(posToSelect, posLastSelect), maxn = Math.max(posToSelect, posLastSelect); n <= maxn; n++) { + selectedNew.add(list[n][keyname]) + } + } + + if (posToSelect >= 0 && posFocus >= 0 && posLastSelect >= 0) { + + + + + + + if (posLastSelect <= posToSelect && posToSelect <= posFocus) { + for (let n = posToSelect + 1; n <= posFocus; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posToSelect <= posLastSelect && posLastSelect <= posFocus) { + for (let n = posLastSelect + 1; n <= posFocus; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posFocus <= posLastSelect && posLastSelect <= posToSelect) { + for (let n = posFocus; n <= posLastSelect - 1; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } else if (posFocus <= posToSelect && posToSelect <= posLastSelect) { + for (let n = posFocus; n <= posToSelect - 1; n++) { + if (selectedNew.has(list[n][keyname])) selectedNew.delete(list[n][keyname]) + } + } + } + + return { selectedNew: selectedNew, selectedLast: selectKey, focusLast: Key } + + } + + + if (Ctrl) { + + if (selectedOld.has(Key)) { + selectedOld.delete(Key) + } else { + selectedOld.add(Key) + } + return { selectedNew: selectedOld, selectedLast: Key, focusLast: Key } + } + + + return { selectedNew: new Set([Key]), selectedLast: Key, focusLast: Key } +} diff --git a/packages/renderer/src/utils/utils.ts b/packages/renderer/src/utils/utils.ts new file mode 100644 index 0000000..5245908 --- /dev/null +++ b/packages/renderer/src/utils/utils.ts @@ -0,0 +1,139 @@ +import { deflateRawSync, inflateRawSync } from 'zlib' + +export function ArrayCopyReverse(arr: any[]) { + let copy: any[] = [] + for (let i = arr.length - 1; i >= 0; i--) { + copy.push(arr[i]) + } + return copy +} +export function ArrayCopy(arr: any[]) { + let copy: any[] = [] + for (let i = 0, maxi = arr.length; i < maxi; i++) { + copy.push(arr[i]) + } + return copy +} + +export function MapKeyToArray(map: Map) { + let arr: T[] = [] + let keys = map.keys() + for (let i = 0, maxi = map.size; i < maxi; i++) { + arr.push(keys.next().value) + } + return arr +} + +export function ArrayToMap(keyname: string, arr: T[]) { + let map = new Map() + let item: any + for (let i = 0, maxi = arr.length; i < maxi; i++) { + item = arr[i] + map.set(item[keyname], item) + } + return map +} + +export function ArrayKeyList(keyname: string, arr: any[]) { + const selectkeys: string[] = [] + for (let i = 0, maxi = arr.length; i < maxi; i++) { + selectkeys.push(arr[i][keyname]) + } + return selectkeys +} + +export function BlobToString(body: Blob, encoding: string): Promise { + return new Promise((resolve) => { + const reader = new FileReader() + reader.readAsText(body, encoding) + reader.onload = function () { + resolve((reader.result as string) || '') + } + }) +} + +export function BlobToBuff(body: Blob): Promise { + return new Promise((resolve) => { + const reader = new FileReader() + reader.readAsArrayBuffer(body) + reader.onload = function () { + resolve(reader.result as ArrayBuffer) + } + }) +} + +export function GzipObject(input: object): Buffer { + return deflateRawSync(JSON.stringify(input)) +} + +export function UnGzipObject(input: Buffer): object { + return JSON.parse(inflateRawSync(input).toString()) +} + +export function HanToPin(input: string): string { + if (!input) return '' + let arr = pinyinlite(input, { keepUnrecognized: true }) + let strarr = new Array(arr.length * 2 + 1) + let l = false + for (let p = 1, i = 0, maxi = arr.length; i < maxi; p += 2, i++) { + strarr[p] = arr[i].join(' ') + l = strarr[p].length > 1 + if (l) { + strarr[p - 1] = ' ' + strarr[p + 1] = ' ' + } else { + strarr[p + 1] = '' + } + } + strarr[0] = '' + return strarr.join('') +} + + +export function ClearFileName(filename: string): string { + if (!filename) return '' + /** + * window 文件名不能含有 < > : " / \ | ? * 不能空格开头结尾 不能以点结尾 + * mac 文件名不能以.开头 + * linux 不能有 / + * + * js 可无脑转义元字符: ^ $ . * + ? | \ / ( ) [ ] { } = ! : - , + * */ + filename = filename.replace(/[<>\:"\/\\\|\?\*]+/g, '') + filename = filename.replace(/[\f\n\r\t\v]/g, '') + while (filename.endsWith(' ') || filename.endsWith('.')) filename = filename.substring(0, filename.length - 1) + while (filename.startsWith(' ')) filename = filename.substring(1) + if (window.platform == 'win32') { + } else if (window.platform == 'darwin') { + while (filename.startsWith('.')) filename = filename.substring(1) + } else if (window.platform == 'linux') { + } + return filename +} + + +export function CheckFileName(filename: string): string { + if (!filename) return '不能为空' + /** + * window 文件名不能含有 < > : " / \ | ? * 不能空格开头结尾 不能以点结尾 + * mac 文件名不能以.开头 + * linux 不能有 / + * + * js 可无脑转义元字符: ^ $ . * + ? | \ / ( ) [ ] { } = ! : - , + * */ + if (filename.match(/[<>\:"\/\\\|\?\*]+/g)) return '不能包含 < > : " / | ? * ' + if (filename.match(/[\f\n\r\t\v]/g)) return '不能包含 \\f \\n \\r \\t \\v' + if (filename.endsWith(' ') || filename.endsWith('.')) return '不能以空格或.结尾' + if (filename.startsWith(' ')) return '不能以空格开头' + if (window.platform == 'win32') { + } else if (window.platform == 'darwin') { + if (filename.startsWith('.')) '不能以.开头' + } else if (window.platform == 'linux') { + } + return '' +} + +export function CleanStringForCmd(title: string) { + title = title.replace(/[<>"\/\\\|\?\* '&%$^`,;=()!\[\]\-~#]+/g, '') + return title +} diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json new file mode 100644 index 0000000..2a0eea0 --- /dev/null +++ b/packages/renderer/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "sourceMap": false, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/packages/renderer/vite.config.ts b/packages/renderer/vite.config.ts new file mode 100644 index 0000000..2fb4508 --- /dev/null +++ b/packages/renderer/vite.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import electron from 'vite-plugin-electron-renderer' +import pkg from '../../package.json' +import path, { resolve } from 'path' + +export default defineConfig({ + mode: process.env.NODE_ENV, + root: __dirname, + + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + //WebViewTag: 'webview' + } + }, + + plugins: [vue(),electron()], + base: './', + build: { + sourcemap: false, + emptyOutDir: false, + outDir: '../../dist/renderer', + assetsDir: '', + lib: { + entry: './src/main.ts', + formats: ['cjs'], + fileName: () => '[name].js' + }, + rollupOptions: { + input: { + main: resolve(__dirname, 'index.html') + } + }, + minify: 'terser', + terserOptions: { + sourceMap: false, + compress: { + //生产环境时移除console + drop_console: true, + drop_debugger: true + } + } + }, + server: { + host: pkg.env.VITE_DEV_SERVER_HOST, + port: pkg.env.VITE_DEV_SERVER_PORT + } +}) diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..cb967ca --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,5 @@ +import { build } from 'vite' + +await build({ configFile: 'packages/main/vite.config.ts' }) +await build({ configFile: 'packages/preload/vite.config.ts' }) +await build({ configFile: 'packages/renderer/vite.config.ts' }) diff --git a/scripts/watch.mjs b/scripts/watch.mjs new file mode 100644 index 0000000..a0250d1 --- /dev/null +++ b/scripts/watch.mjs @@ -0,0 +1,66 @@ +import { spawn } from 'child_process' +import { createServer, build } from 'vite' +import electron from 'electron' + +const query = new URLSearchParams(import.meta.url.split('?')[1]) +const debug = query.has('debug') + +/** + * @type {(server: import('vite').ViteDevServer) => Promise} + */ +function watchMain(server) { + /** + * @type {import('child_process').ChildProcessWithoutNullStreams | null} + */ + let electronProcess = null + const address = server.httpServer.address() + const env = Object.assign(process.env, { + VITE_DEV_SERVER_HOST: address.address, + VITE_DEV_SERVER_PORT: address.port, + }) + /** + * @type {import('vite').Plugin} + */ + const startElectron = { + name: 'electron-main-watcher', + writeBundle() { + electronProcess && electronProcess.kill() + electronProcess = spawn(electron, ['.'], { stdio: 'inherit', env }) + }, + } + + return build({ + configFile: 'packages/main/vite.config.ts', + mode: 'development', + plugins: [!debug && startElectron].filter(Boolean), + build: { + watch: true, + }, + }) +} + +/** + * @type {(server: import('vite').ViteDevServer) => Promise} + */ +function watchPreload(server) { + return build({ + configFile: 'packages/preload/vite.config.ts', + mode: 'development', + plugins: [{ + name: 'electron-preload-watcher', + writeBundle() { + server.ws.send({ type: 'full-reload' }) + }, + }], + build: { + watch: true, + }, + }) +} + + +const server = await createServer({ configFile: 'packages/renderer/vite.config.ts' }) + +await server.listen() +await watchPreload(server) +await watchMain(server) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c838734 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "importHelpers": true, + "jsx": "preserve", + "esModuleInterop": true, + "resolveJsonModule": true, + "sourceMap": false, + "strict": true, + "paths": {}, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + } +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..111f999 --- /dev/null +++ b/types.d.ts @@ -0,0 +1,44 @@ + +declare namespace NodeJS { + interface ProcessEnv { + NODE_ENV: 'development' | 'production' + readonly VITE_DEV_SERVER_HOST: string + readonly VITE_DEV_SERVER_PORT: string + } +} + +declare interface Window { + Electron: any + platform: any + WebToElectron: any + WebToElectronCB: any + WebSpawnSync: any + WebExecSync: any + WebShowOpenDialogSync: any + WebShowSaveDialogSync: any + WebShowItemInFolder: any + WebPlatformSync: any + WebClearCookies: any + WebClearCache: any + WebSaveTheme: any + WebUserToken: any + WebReload: any + WebRelaunch: any + WebRelaunchAria: any + WebSetProgressBar: any + WebSetCookies: any + WebOpenWindow: any + WebShutDown: any + openDatabase: any + loginfn: any + postdataFunc: any + Prism: any + winmain: number + winworker: number + WinMsg: any + WinMsgToMain: any + WinMsgToUI: any + getDvaApp: any + dark: boolean + test: any +} diff --git "a/v2.10.19\346\200\247\350\203\275\346\265\213\350\257\225.md" "b/v2.10.19\346\200\247\350\203\275\346\265\213\350\257\225.md" new file mode 100644 index 0000000..a506c9e --- /dev/null +++ "b/v2.10.19\346\200\247\350\203\275\346\265\213\350\257\225.md" @@ -0,0 +1,61 @@ +阿里云盘小白羊版性能测试 +==== + +阿里云盘小白羊版 v2.10.19做个能测试 +>测试方法,就是简单的选择文件上传下载,人工计时 +> +>测试平台:18年产联想Y7000笔记本,i5-8300H,16G内存,512GB M2 西数固态硬盘 + +#### 补充说明 +1. 所有测试上传的文件都是可以秒传的,既只测试程序性能,不测试网络性能。 +2. 只测试一遍没有多次测试取平均值,测试期间电脑不运行其他程序,上传中不操作电脑 +3. 测试基于特定程序版本,人工计时有误差。结果并不能说明什么 + +------ +
+ +### 测试结果 小白羊占用较低的CPU和内存,但对比阿里云盘官方PC客户端更快 + +

+ +------ + +#### 测试方案一:大量小文件 + +M2.SSD硬盘上的 4.4万个json格式小文件(共24GB) 上传到网盘再从网盘下载到本地 + +| 程序 | CPU | 内存 | 总用时 | 用时基准 | +| --- | :---: | :---: | ---: | ---: | +| 上传 | | | | | +| 小白羊版 v2.10.19 | 15% | 300MB | 24分钟 | :zap:58% | +| PC客户端 v2.2.6 | [20%-39%]() | [860MB-1.7GB]() | 41分钟 | 100% | +| 下载 | | | | | +| 小白羊版 v2.10.19 | 15% | 220MB | 25分钟 | :zap:42% | +| PC客户端 v2.2.6 | [40%-66%]() | 400MB | 59分钟 | 100% | +
+ +注: +1. 小白羊在设置里设置为60文件同时执行,PC客户端并不支持修改同时执行任务数 +1. 上传小文件时PC客户端CPU使用率和内存使用量浮动很大 +2. 测试是一次性下载258个文件夹,每个文件夹里包含100-800个文件,PC客户端出现了大量下载失败,手动重新开始,导致总用时记录的不准确 + +
+ +------ + +#### 测试方案二:批量大文件 + +M2.SSD硬盘上的 33个大文件(共90GB)上传到网盘再从网盘下载到本地 + +| 程序 | CPU | 内存 | 总用时 | 用时基准 | +| --- | :---: | :---: | ---: | ---: | +| 上传 | | | | | +| 小白羊版 v2.10.19 | 57% | 200MB | 1分10秒 | :zap:44% | +| PC客户端 v2.2.6 | 36% | 190MB | 2分40秒 | 100% | +| 下载 | | | | | +| 小白羊版 v2.10.19 | 15% | 294MB | 38分钟 | :zap:52% | +| PC客户端 v2.2.6 | 26% | 188MB | 72分钟 | 100% | +
+ +------ + diff --git "a/v2.11.11\350\207\252\345\256\232\344\271\211\346\222\255\346\224\276\350\275\257\344\273\266.md" "b/v2.11.11\350\207\252\345\256\232\344\271\211\346\222\255\346\224\276\350\275\257\344\273\266.md" new file mode 100644 index 0000000..3bb9210 --- /dev/null +++ "b/v2.11.11\350\207\252\345\256\232\344\271\211\346\222\255\346\224\276\350\275\257\344\273\266.md" @@ -0,0 +1,89 @@ +自v2.11.11开始实验性的支持自己选择播放软件 + +只要播放软件本身支持传入URL后播放,就可以用,下面列出了已测试可用的播放软件,还有很多软件以后会慢慢测试补充上来 + +支持 windows(7款) mac (3款) linux (8款)如下: + +# + +### windows: + +操作:小白羊--设置--UI--自定义播放软件--选择播放软件 +在弹窗后,选择桌面上的播放软件的快捷方式(例如:VLC media player) +或者直接选择播放软件的exe文件(例如:C:\Program Files\VideoLAN\VLC\vlc.exe) + +# + +已测试支持的: +1. MPV播放器 +2. Potplayer +3. VLC media player +4. KMPlayer +5. 恒星播放器 +6. SMPlayer +7. MPC-HC + +![Image](https://raw.githubusercontent.com/liupan1890/aliyunpan/main/doc/win%E9%80%89%E6%8B%A9.png) + +# + +不能用的: +1. 影音先锋(只支持原话视频,不支持转码视频) +2. QQ影音播放器(可以复制下载地址后播放) +3. 迅雷影音播放器 +4. 搜狐影音 +5. 暴风影音 + +# + +### macos: + +操作:小白羊--设置--UI--自定义播放软件--选择播放软件 +在弹窗后,点击左侧的 应用程序,点击 IINA,点击 选择 + +已测试支持的: +1. IINA +2. MKPlayer +3. VLC + +![Image](https://raw.githubusercontent.com/liupan1890/aliyunpan/main/doc/mac%E9%80%89%E6%8B%A9.png) + +# + +已测试不能直接用,但是可以复制url后在app里打开播放的: + +1. 恒星播放器 +2. Elmedia Video Player +3. OmniPlayerStore +4. IMVIDEO +5. MAX 播放器 + +# + +### linux + +操作:小白羊--设置--UI--自定义播放软件 + +点击输入框(弹出下拉菜单),直接选择其中一个,最后点击保存按钮! +也可以自己手动输入,其他电脑上已安装的播放软件(需要能在终端通过软件名正常调用) + +注意:linux 只测试了ubuntu 20.04 + + +已测试支持的: +1. totem    [sudo apt install totem]() +2. vlc     [sudo apt install vlc]() +3. mpv    [sudo apt install mpv]() +4. kodi    [sudo apt install kodi]() +5. mplayer   [sudo apt install mplayer mplayer-gui]() +6. smplayer  [sudo apt install smplayer]() +7. xine    [sudo apt install xine-ui]() +8. parole   [sudo apt install parole]() + +![Image](https://raw.githubusercontent.com/liupan1890/aliyunpan/main/doc/linux%E9%80%89%E6%8B%A9.png) + +# + +已测试不能直接用,但是可以复制url后在app里打开播放的: +1. deepin-movie +2. dragon player diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..11bccd9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3325 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ant-design/colors@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" + integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== + +"@ant-design/icons-vue@^6.1.0": + version "6.1.0" + resolved "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz#f9324fdc0eb4cea943cf626d2bf3db9a4ff4c074" + integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + +"@antfu/utils@^0.5.2": + version "0.5.2" + resolved "https://registry.npmmirror.com/@antfu/utils/-/utils-0.5.2.tgz#8c2d931ff927be0ebe740169874a3d4004ab414b" + integrity sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA== + +"@arco-design/color@^0.4.0": + version "0.4.0" + resolved "https://registry.npmmirror.com/@arco-design/color/-/color-0.4.0.tgz#52ddb40d318ee6df1057ca8c653cc1675023928f" + integrity sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g== + dependencies: + color "^3.1.3" + +"@arco-design/web-vue@^2.35.1": + version "2.35.1" + resolved "https://registry.npmmirror.com/@arco-design/web-vue/-/web-vue-2.35.1.tgz#67052bdd33520b92cca5d1140fd00485f64ba1b3" + integrity sha512-aL49HAshYMkfM+GKy21KrjPfyc4bVdUdh9fsomDP2uhpkx4kjTQu6slvDkJZidp55w+gUWzap4btqofCLQ6C0w== + dependencies: + "@arco-design/color" "^0.4.0" + b-tween "^0.3.3" + b-validate "^1.3.1" + compute-scroll-into-view "^1.0.17" + dayjs "^1.10.3" + number-precision "^1.5.0" + resize-observer-polyfill "^1.5.1" + scroll-into-view-if-needed "^2.2.28" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.18.8": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.18.13.tgz#6aff7b350a1e8c3e40b029e46cbe78e24a913483" + integrity sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw== + +"@babel/core@^7.18.6": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.18.13.tgz#9be8c44512751b05094a4d3ab05fc53a47ce00ac" + integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.13" + "@babel/types" "^7.18.13" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.13": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.18.13.tgz#59550cbb9ae79b8def15587bdfbaa388c4abf212" + integrity sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ== + dependencies: + "@babel/types" "^7.18.13" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.9": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz#63e771187bd06d234f95fdf8bd5f8b6429de6298" + integrity sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.13.tgz#5b2dd21cae4a2c5145f1fbd8ca103f9313d3b7e4" + integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-typescript@^7.18.8": + version "7.18.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz#712e9a71b9e00fde9f8c0238e0cceee86ab2f8fd" + integrity sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-typescript" "^7.18.6" + +"@babel/runtime@^7.10.5": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.18.6": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.18.13.tgz#5ab59ef51a997b3f10c4587d648b9696b6cb1a68" + integrity sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.13" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.13" + "@babel/types" "^7.18.13" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9": + version "7.18.13" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.18.13.tgz#30aeb9e514f4100f7c1cb6e5ba472b30e48f519a" + integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@ctrl/tinycolor@^3.4.0": + version "3.4.1" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32" + integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@electron/get@^1.14.1": + version "1.14.1" + resolved "https://registry.npmmirror.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/remote@^2.0.8": + version "2.0.8" + resolved "https://registry.npmmirror.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3" + integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw== + +"@electron/universal@1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" + integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/pluginutils@^4.2.1": + version "4.2.1" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@simonwep/pickr@~1.8.0": + version "1.8.2" + resolved "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz#96dc86675940d7cad63d69c22083dd1cbb9797cb" + integrity sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA== + dependencies: + core-js "^3.15.1" + nanopop "^2.1.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lodash@^4.14.184": + version "4.14.184" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe" + integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "18.7.13" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.7.13.tgz#23e6c5168333480d454243378b69e861ab5c011a" + integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== + +"@types/node@^16.11.26": + version "16.11.56" + resolved "https://registry.npmmirror.com/@types/node/-/node-16.11.56.tgz#dcbb617669481e158e0f1c6204d1c768cd675901" + integrity sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A== + +"@types/node@^17.0.45": + version "17.0.45" + resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/verror@^1.10.3": + version "1.10.6" + resolved "https://registry.npmmirror.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" + integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.1": + version "17.0.11" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@vitejs/plugin-vue-jsx@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-2.0.0.tgz#9947c72f9ead40cb7950ba5a9e9f7ac4c5b74df1" + integrity sha512-WF9ApZ/ivyyW3volQfu0Td0KNPhcccYEaRNzNY1NxRLVJQLSX0nFqquv3e2g7MF74p1XZK4bGtDL2y5i5O5+1A== + dependencies: + "@babel/core" "^7.18.6" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.18.8" + "@vue/babel-plugin-jsx" "^1.1.1" + +"@vitejs/plugin-vue@^3.0.3": + version "3.0.3" + resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.3.tgz#7e3e401ccb30b4380d2279d9849281413f1791ef" + integrity sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g== + +"@volar/code-gen@0.40.1": + version "0.40.1" + resolved "https://registry.npmmirror.com/@volar/code-gen/-/code-gen-0.40.1.tgz#30637162626bd2ea6e3c3c3cedab291494870c25" + integrity sha512-mN1jn08wRKLoUj+KThltyWfsiEGt6Um1yT6S7bkruwV76yiLlzIR4WZgWng254byGMozJ00qgkZmBhraD5b48A== + dependencies: + "@volar/source-map" "0.40.1" + +"@volar/source-map@0.40.1": + version "0.40.1" + resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-0.40.1.tgz#9fcefb21ce0e0ca272f76129b6a98b6f08f4debb" + integrity sha512-ORYg5W+R4iT2k/k2U4ASkKvDxabIzKtP+lXZ1CcqFIbTF81GOooAv5tJZImf8ifhUV9p8bgGaitFj/VnNzkdYg== + +"@volar/typescript-faster@0.40.1": + version "0.40.1" + resolved "https://registry.npmmirror.com/@volar/typescript-faster/-/typescript-faster-0.40.1.tgz#99a37f0386934d971b71586ee0dcdd20b3537d90" + integrity sha512-UiX8OzVRJtpudGfTY2KgB5m78DIA8oVbwI4QN5i4Ot8oURQPOviH7MahikHeeXidbh3iOy/u4vceMb+mfdizpQ== + dependencies: + semver "^7.3.7" + +"@volar/vue-language-core@0.40.1": + version "0.40.1" + resolved "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-0.40.1.tgz#a11429b59351202af1a89167039a07b4bffbcefc" + integrity sha512-RBU2nQkj+asKZ/ht3sU3hTau+dGuTjJrQS3nNSw4+vnwUJnN/WogO/MmgKdrvVf3pUdLiucIog1E/Us1C8Y5wg== + dependencies: + "@volar/code-gen" "0.40.1" + "@volar/source-map" "0.40.1" + "@vue/compiler-core" "^3.2.37" + "@vue/compiler-dom" "^3.2.37" + "@vue/compiler-sfc" "^3.2.37" + "@vue/reactivity" "^3.2.37" + "@vue/shared" "^3.2.37" + +"@volar/vue-typescript@0.40.1": + version "0.40.1" + resolved "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-0.40.1.tgz#5c6e9dd6a5a5e9ec47c90c70c98d2c97f1e8a20d" + integrity sha512-58nW/Xwy7VBkeIPmbyEmi/j1Ta2HxGl/5aFiEEpWxoas7vI1AM+txz8+MhWho4ZMw0w0eCqPtGgugD2rr+/v7w== + dependencies: + "@volar/code-gen" "0.40.1" + "@volar/typescript-faster" "0.40.1" + "@volar/vue-language-core" "0.40.1" + +"@vue/babel-helper-vue-transform-on@^1.0.2": + version "1.0.2" + resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" + integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== + +"@vue/babel-plugin-jsx@^1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1" + integrity sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + "@vue/babel-helper-vue-transform-on" "^1.0.2" + camelcase "^6.0.0" + html-tags "^3.1.0" + svg-tags "^1.0.0" + +"@vue/compiler-core@3.2.37", "@vue/compiler-core@^3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz#b3c42e04c0e0f2c496ff1784e543fbefe91e215a" + integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.37" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.37", "@vue/compiler-dom@^3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz#10d2427a789e7c707c872da9d678c82a0c6582b5" + integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ== + dependencies: + "@vue/compiler-core" "3.2.37" + "@vue/shared" "3.2.37" + +"@vue/compiler-sfc@3.2.37", "@vue/compiler-sfc@^3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz#3103af3da2f40286edcd85ea495dcb35bc7f5ff4" + integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.37" + "@vue/compiler-dom" "3.2.37" + "@vue/compiler-ssr" "3.2.37" + "@vue/reactivity-transform" "3.2.37" + "@vue/shared" "3.2.37" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz#4899d19f3a5fafd61524a9d1aee8eb0505313cff" + integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw== + dependencies: + "@vue/compiler-dom" "3.2.37" + "@vue/shared" "3.2.37" + +"@vue/devtools-api@^6.2.1": + version "6.2.1" + resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092" + integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ== + +"@vue/reactivity-transform@3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz#0caa47c4344df4ae59f5a05dde2a8758829f8eca" + integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.37" + "@vue/shared" "3.2.37" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@3.2.37", "@vue/reactivity@^3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz#5bc3847ac58828e2b78526e08219e0a1089f8848" + integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A== + dependencies: + "@vue/shared" "3.2.37" + +"@vue/runtime-core@3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz#7ba7c54bb56e5d70edfc2f05766e1ca8519966e3" + integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ== + dependencies: + "@vue/reactivity" "3.2.37" + "@vue/shared" "3.2.37" + +"@vue/runtime-dom@3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz#002bdc8228fa63949317756fb1e92cdd3f9f4bbd" + integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw== + dependencies: + "@vue/runtime-core" "3.2.37" + "@vue/shared" "3.2.37" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz#840a29c8dcc29bddd9b5f5ffa22b95c0e72afdfc" + integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA== + dependencies: + "@vue/compiler-ssr" "3.2.37" + "@vue/shared" "3.2.37" + +"@vue/shared@3.2.37", "@vue/shared@^3.2.37": + version "3.2.37" + resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz#8e6adc3f2759af52f0e85863dfb0b711ecc5c702" + integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw== + +acorn@^8.5.0, acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.0: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ant-design-vue@^3.2.11: + version "3.2.11" + resolved "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-3.2.11.tgz#034b2a2adef82a34440c10b90a5e02bcd25b376b" + integrity sha512-QKCAcOY5EJF0PepiVGA4X5PzUetYUvG5qALmA+2TON40pc2+brOEiVTwr3kjF9N+f7q4MpyiLPu4pIErwoajOQ== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-vue" "^6.1.0" + "@babel/runtime" "^7.10.5" + "@ctrl/tinycolor" "^3.4.0" + "@simonwep/pickr" "~1.8.0" + array-tree-filter "^2.1.0" + async-validator "^4.0.0" + dayjs "^1.10.5" + dom-align "^1.12.1" + dom-scroll-into-view "^2.0.0" + lodash "^4.17.21" + lodash-es "^4.17.15" + resize-observer-polyfill "^1.5.1" + scroll-into-view-if-needed "^2.2.25" + shallow-equal "^1.0.0" + vue-types "^3.0.0" + warning "^4.0.0" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.3.3: + version "23.3.3" + resolved "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-23.3.3.tgz#78b9dbb0bd8a69842461edd77a3226d0547c5939" + integrity sha512-m0+M53+HYMzqKxwNQZT143K7WwXEGUy9LY31l8dJphXx2P/FQod615mVbxHyqbDCG4J5bHdWm21qZ0e2DVY6CQ== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.1" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.3.3" + builder-util-runtime "9.0.3" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.7" + electron-osx-sign "^0.6.0" + electron-publish "23.3.3" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^4.0.10" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.1.2" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.7" + tar "^6.1.11" + temp-file "^3.4.0" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +asar@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async-validator@^4.0.0: + version "4.2.5" + resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +b-tween@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/b-tween/-/b-tween-0.3.3.tgz#7a93ed199c98cd41a33ba4c711a0fa7e86db3fa2" + integrity sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA== + +b-validate@^1.3.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/b-validate/-/b-validate-1.4.1.tgz#908bb3997d45780e8e0ca501d70361ff9f75e374" + integrity sha512-X6ImDku5YY8NfWTh/hX8CAaronWnNXpb159cqs6lDWLtI4OWiehZ4B0NshfatTuKt1HIeNq9PObE/Xl5YoJYUg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.npmmirror.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.20.2: + version "4.21.3" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== + dependencies: + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.0.3: + version "9.0.3" + resolved "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.0.3.tgz#6c62c493ba2b73c2af92432db4013b5a327f02b2" + integrity sha512-SfG2wnyjpUbbdtpnqDpWwklujofC6GarGpvdWrEkg9p5AD/xJmTF2buTNaqs3qtsNBEVQDDjZz9xc2GGpVyMfA== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@23.3.3: + version "23.3.3" + resolved "https://registry.npmmirror.com/builder-util/-/builder-util-23.3.3.tgz#449ee57ec1ffc7e59f7a3a8a1a33d25cf5e39e43" + integrity sha512-MJZlUiq2PY5hjYv9+XNaoYdsITqvLgRDoHSFg/4nzpInbNxNjLQOolL04Zsyp+hgfcbFvMC4h0KkR1CMPHLWbA== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.0.3" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001370: + version "1.0.30001382" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001382.tgz#4d37f0d0b6fffb826c8e5e1c0f4bf8ce592db949" + integrity sha512-2rtJwDmSZ716Pxm1wCtbPvHtbDWAreTPxXbkc5RkKglow3Ig/4GNGazDI9/BVnXbG/wnv6r3B5FEbkfg9OcTGg== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.2" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmmirror.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.npmmirror.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +core-js@^3.15.1: + version "3.24.1" + resolved "https://registry.npmmirror.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" + integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +csstype@^2.6.8: + version "2.6.20" + resolved "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda" + integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== + +dayjs@^1.10.3, dayjs@^1.10.5, dayjs@^1.11.5: + version "1.11.5" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" + integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^2.6.8: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dexie@^3.2.2: + version "3.2.2" + resolved "https://registry.npmmirror.com/dexie/-/dexie-3.2.2.tgz#fa6f2a3c0d6ed0766f8d97a03720056f88fe0e01" + integrity sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dmg-builder@23.3.3: + version "23.3.3" + resolved "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-23.3.3.tgz#b37547f8403c3e9f7c60265a93d902f5b0c395ea" + integrity sha512-ECwAjt+ZWyOvddrkDx1xRD6IVUCZb5SV6vSMHZd+Va3G2sUXHrnglR1cGDKRF4oYRQm8SYVrpLZKbi8npyDcAQ== + dependencies: + app-builder-lib "23.3.3" + builder-util "23.3.3" + builder-util-runtime "9.0.3" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +dom-align@^1.12.1: + version "1.12.3" + resolved "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.3.tgz#a36d02531dae0eefa2abb0c4db6595250526f103" + integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA== + +dom-scroll-into-view@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b" + integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w== + +dom-to-image@^2.6.0: + version "2.6.0" + resolved "https://registry.npmmirror.com/dom-to-image/-/dom-to-image-2.6.0.tgz#8a503608088c87b1c22f9034ae032e1898955867" + integrity sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA== + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +ejs@^3.1.7: + version "3.1.8" + resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-builder@^23.3.3: + version "23.3.3" + resolved "https://registry.npmmirror.com/electron-builder/-/electron-builder-23.3.3.tgz#88d4e584a99b9e36ca4e8432b1163a1ef877355f" + integrity sha512-mFYYdhoFPKevP6y5uaaF3dusmB2OtQ/HnwwpyOePeU7QDS0SEIAUokQsHUanAiJAZcBqtY7iyLBgX18QybdFFw== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.3.3" + builder-util "23.3.3" + builder-util-runtime "9.0.3" + chalk "^4.1.1" + dmg-builder "23.3.3" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.3.3: + version "23.3.3" + resolved "https://registry.npmmirror.com/electron-publish/-/electron-publish-23.3.3.tgz#c4125fbb00620acb854f6e994fd3ab3115662ddd" + integrity sha512-1dX17eE5xVXedTxjC+gjsP74oC0+sIHgqysp0ryTlF9+yfQUyXjBk6kcK+zhtBA2SsHMSglDtM+JPxDD/WpPTQ== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.3.3" + builder-util-runtime "9.0.3" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-to-chromium@^1.4.202: + version "1.4.228" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.228.tgz#3baff13cf54198c2045f9bdd8b64db93aafd7f33" + integrity sha512-XfDHCvou7CsDMlFwb0WZ1tWmW48e7Sn7VBRyPfZsZZila9esRsJl1trO+OqDNV97GggFSt0ISbWslKXfQkG//g== + +electron@20.0.3: + version "20.0.3" + resolved "https://registry.npmmirror.com/electron/-/electron-20.0.3.tgz#e3c557faa69915d29b212363e53e8668956d782d" + integrity sha512-Yx0a/SGgus/XqDAoMMs165JUikgE5vBmQpNJ+0XMDG/IYFj6TNNzfY2ATI+t171JjhKKO+MYPO8xqyZdFRoIDw== + dependencies: + "@electron/get" "^1.14.1" + "@types/node" "^16.11.26" + extract-zip "^2.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.47: + version "0.14.54" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11: + version "3.2.11" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +follow-redirects@^1.14.9: + version "1.15.1" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +fuzzysort@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/fuzzysort/-/fuzzysort-2.0.1.tgz#e1bf6abbcfeefd1191900a5f56527aa0508d6934" + integrity sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.npmmirror.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.10" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +html-tags@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.10: + version "4.0.10" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jschardet@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" + integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +local-pkg@^0.4.2: + version "0.4.2" + resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz#13107310b77e74a0e513147a131a2ba288176c2f" + integrity sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg== + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.26.2: + version "0.26.2" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" + integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0: + version "1.2.6" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minipass@^3.0.0: + version "3.3.4" + resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nano-staged@^0.8.0: + version "0.8.0" + resolved "https://registry.npmmirror.com/nano-staged/-/nano-staged-0.8.0.tgz#23fd9a696a8f0d5b7b451b45a71a0ee884d115c1" + integrity sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g== + dependencies: + picocolors "^1.0.0" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanopop@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/nanopop/-/nanopop-2.1.0.tgz#23476513cee2405888afd2e8a4b54066b70b9e60" + integrity sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw== + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +number-precision@^1.5.0: + version "1.5.2" + resolved "https://registry.npmmirror.com/number-precision/-/number-precision-1.5.2.tgz#22abbde9e2402629199b511deafcdb614e125875" + integrity sha512-q7C1ZW3FyjsJ+IpGB6ykX8OWWa5+6M+hEY0zXBlzq1Sq1IPY9GeI3CQ9b2i6CMIYoeSuFhop2Av/OhCxClXqag== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmmirror.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pinia@^2.0.20: + version "2.0.20" + resolved "https://registry.npmmirror.com/pinia/-/pinia-2.0.20.tgz#3b7f1a5a660282fab6a0c83bae62c48ee0b1bc1f" + integrity sha512-fdHHumXW/0U5HhxmY1emo3I4z85p8NJPdbtFQSlmJXFe3ktuF0pYNVgVtk2q+j2zCtTufY763xzaEMx0t6T59g== + dependencies: + "@vue/devtools-api" "^6.2.1" + vue-demi "*" + +plist@^3.0.1, plist@^3.0.4: + version "3.0.6" + resolved "https://registry.npmmirror.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" + integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +postcss@^8.1.10, postcss@^8.4.16: + version "8.4.16" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" + integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== + dependencies: + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +"rollup@>=2.75.6 <2.77.0 || ~2.77.0": + version "2.77.3" + resolved "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scroll-into-view-if-needed@^2.2.25, scroll-into-view-if-needed@^2.2.28: + version "2.2.29" + resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885" + integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg== + dependencies: + compute-scroll-into-view "^1.0.17" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +shallow-equal@^1.0.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@^0.5.19, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +tar@^6.1.11: + version "6.1.11" + resolved "https://registry.npmmirror.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +terser@^5.15.0: + version "5.15.0" + resolved "https://registry.npmmirror.com/terser/-/terser-5.15.0.tgz#e16967894eeba6e1091509ec83f0c60e179f2425" + integrity sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unplugin-vue-components@^0.22.4: + version "0.22.4" + resolved "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.4.tgz#774a96339368f3b8436fa7c20e059d9fee42c983" + integrity sha512-2rRZcM9OnJGXnYxQNfaceEYuPeVACcWySIjy8WBwIiN3onr980TmA3XE5pRJFt8zoQrUA+c46oyIq96noLqrEQ== + dependencies: + "@antfu/utils" "^0.5.2" + "@rollup/pluginutils" "^4.2.1" + chokidar "^3.5.3" + debug "^4.3.4" + fast-glob "^3.2.11" + local-pkg "^0.4.2" + magic-string "^0.26.2" + minimatch "^5.1.0" + resolve "^1.22.1" + unplugin "^0.9.0" + +unplugin@^0.9.0: + version "0.9.4" + resolved "https://registry.npmmirror.com/unplugin/-/unplugin-0.9.4.tgz#53e6f4fc92905122219af0e3f40af753563d38b6" + integrity sha512-lUe769wSsZiltVA1Ns9ZRx3K1ri/4yzOrLLI/ebSAj2f0PsXqIJeHIXhkhiayEe1pv+mHuZYyBS3B2RXG2Q2EQ== + dependencies: + acorn "^8.8.0" + chokidar "^3.5.3" + webpack-sources "^3.2.3" + webpack-virtual-modules "^0.4.4" + +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +viewerjs@^1.10.5: + version "1.10.5" + resolved "https://registry.npmmirror.com/viewerjs/-/viewerjs-1.10.5.tgz#a0f52fe7c15fa27003099af8e7552378ed5fc94d" + integrity sha512-QwKrmXlSfKg5x4y74F/jicpHIRqBMMfHXyboOxHDi5n4XAaejjpalphPq4/HW6venQAoMiD57HpVwBk0JvqpSA== + +vite-plugin-electron-renderer@^0.9.0: + version "0.9.0" + resolved "https://registry.npmmirror.com/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.9.0.tgz#12da19cf7c6fdb0d1b271a91873ee58883a264cb" + integrity sha512-Vc9rB3i0zlw32n5UGfoLmHAOZdH0ZbbA+tI0TPn36HbwXtmsfu+LVLqeccZh88iaQ3VJIm00rUDGMvswN2PLRg== + +vite-plugin-resolve@^2.1.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/vite-plugin-resolve/-/vite-plugin-resolve-2.1.2.tgz#40f3016f62a9c2c1ee9e8108390d2eca0c30b477" + integrity sha512-u1qAHClpMS6v/UM6yBiLOXEeceeK+zvZYRjYC0ReOy1Y2Anxcbf9oKHqN29MOMPxif5ZFLqy2dSsSdXv3rz9eQ== + +vite@^3.0.9: + version "3.0.9" + resolved "https://registry.npmmirror.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30" + integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== + dependencies: + esbuild "^0.14.47" + postcss "^8.4.16" + resolve "^1.22.1" + rollup ">=2.75.6 <2.77.0 || ~2.77.0" + optionalDependencies: + fsevents "~2.3.2" + +vue-demi@*: + version "0.13.10" + resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.10.tgz#e01bccb9d515ea0ed4a50c1387cbce3e60e93256" + integrity sha512-/R4QhdqGyGqSysOfhkxmYHKwdETZq2z6HAf/fjeGErdJX9cJifX5ijHJS+VjNblGIhjXz/yQTwe/t7Cip+/aJw== + +vue-tsc@^0.40.1: + version "0.40.1" + resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-0.40.1.tgz#96470c63d47d060178639d08ac18f1b1f8834d2c" + integrity sha512-Z+3rlp/6TrtKvLuaFYwBn03zrdinMR6lBb3mWBJtDA+KwlRu+I4eMoqC1qT9D7i/29u0Bw58dH7ErjMpNLN9bQ== + dependencies: + "@volar/vue-language-core" "0.40.1" + "@volar/vue-typescript" "0.40.1" + +vue-types@^3.0.0: + version "3.0.2" + resolved "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz#ec16e05d412c038262fc1efa4ceb9647e7fb601d" + integrity sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw== + dependencies: + is-plain-object "3.0.1" + +vue@^3.2.37: + version "3.2.37" + resolved "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e" + integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ== + dependencies: + "@vue/compiler-dom" "3.2.37" + "@vue/compiler-sfc" "3.2.37" + "@vue/runtime-dom" "3.2.37" + "@vue/server-renderer" "3.2.37" + "@vue/shared" "3.2.37" + +warning@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.4.4: + version "0.4.4" + resolved "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz#a19fcf371923c59c4712d63d7d194b1e4d8262cc" + integrity sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA== + +whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.1: + version "17.5.1" + resolved "https://registry.npmmirror.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" diff --git "a/\346\272\220\347\240\201\345\274\200\345\217\221\346\211\223\345\214\205\345\270\256\345\212\251.md" "b/\346\272\220\347\240\201\345\274\200\345\217\221\346\211\223\345\214\205\345\270\256\345\212\251.md" new file mode 100644 index 0000000..ab6d4e5 --- /dev/null +++ "b/\346\272\220\347\240\201\345\274\200\345\217\221\346\211\223\345\214\205\345\270\256\345\212\251.md" @@ -0,0 +1,32 @@ +### 小白羊v3版本源码帮助 + +v3采用 ts + vue3 + vite + electron 模板开发 + +#### 1.下载源代码 + +``` +https://github.com/PingKuNet/aliyunpan.git +``` + +#### 2.打开代码目录,安装依赖 + +```cmd +yarn install +``` + +#### 3.开发调试运行 + +```cmd +yarn run dev +``` + +执行命令后会调起electron窗口,配合vscode正常开发调试即可 + +#### 4.打包发布 + +```cmd +yarn run build +``` + +执行命令后会生成`release\win-unpacked\resources\app.asar`文件 +把该文件复制到任意electron版本的`resources`目录下即可打包出安装包