listdir.php 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. <?php
  2. /* Simple well-not-designed PHP file index
  3. Author: Saren
  4. License: GPL v3 */
  5. /* Settings */
  6. error_reporting(0);
  7. $settings = array(
  8. "helpers" => True,/* Enable thumbnails, text preview, tooltip */
  9. "responsive" => True,/* Enable responsive design */
  10. "icons" => True,/* File icons */
  11. "displayDot" => False, /* Display files and folders start with "." */
  12. "thumbMimes" => array("image"), /* MIME types that thumbnails are able to be generated. */
  13. "thumbnailSize" => 220, /* Max PX of each side */
  14. "previewMimes" => array("subtitle", "text", "python", "javascript", "script"/*, "html", "c++" */),
  15. "previewLimit" => 250, /* Bytes */
  16. "displayRows" => 50, /* Default display rows */
  17. "rowsSelection" => array(10 ,20, 30, 50, 100), /* Numbers of display rows for selection */
  18. "indexFiles" => array("index.php", "index.html", "index.htm"),/* WARNING: Does not really prevent your files in a directory from being listed! */
  19. //"indexFiles" => array(), /* Do if you want the index page list files of indexed directories instead. */
  20. /* Cache Time To Live (TTL) settings. They are all in seconds.
  21. In case you don't know: Caches gets things faster, but things will not be updated real-time.
  22. If TTL is up, then cache expires, the page will have to generate the cache again, things would get a bit slower. */
  23. "contentTTL" => 10, /* Content of a directory */
  24. "hasIndexTTL" => 3600,/* Whether a directory has an index file */
  25. "sizeTTL" => 180, /* Size of a file */
  26. "lastModdedTTL" => 180, /* Last modified time of a file */
  27. "thumbnailTTL" => 600, /* Thumbnail of a viewable image */
  28. "previewTTL" => 180, /* Preview text of a file */
  29. );
  30. $localization = array(
  31. "filename" => "檔案名稱",
  32. "filetype" => "檔案類型",
  33. "filesize" => "檔案大小",
  34. "filemtime" => "最後修改日期",
  35. "thumbnail" => "縮圖",
  36. "preview" => "預覽",
  37. "image" => "圖像",
  38. "video" => "視像",
  39. "audio" => "音像",
  40. "compressed" => "壓縮檔",
  41. "cdimage" => "映像檔",
  42. "executable" => "可執行檔",
  43. "subtitle" => "字幕",
  44. "installer" => "安裝程式",
  45. "appext" => "程式擴展",
  46. "text" => "純文字",
  47. "python" => "Python指令",
  48. "javascript" => "Javascript指令",
  49. "script" => "工序指令",
  50. /* "html" => "Happy toffee milk lemon", */
  51. "folder" => "=資料夾=",
  52. "file" => "檔案",
  53. "goBackToParentDirectory" => "回上層目錄",
  54. "measureWordOfEntitles" => "項",
  55. "entitles" => "內容",
  56. "firstPage" => "首頁",
  57. "lastPage" => "尾頁",
  58. "nextPage" => "下一頁",
  59. "previousPage" => "上一頁",
  60. "all" => "所有",
  61. "filter" => "篩選",
  62. "show" => "顯示",
  63. "sInfo" => "資料夾總共有_TOTAL_項內容,正在顯示第_START_項至第_END_項",
  64. "sInfoFiltered" => "(已從_MAX_項內容中篩選)",
  65. "sInfoEmpty" => "沒有符合要求的結果",
  66. "sEmptyTable" => "資料夾中沒有內容",
  67. );
  68. $mimeTypes = array(
  69. "image" => array("jpg", "jpeg", "png", "gif", "tif", "tiff", "pcd", "psd", "png", "ico"),
  70. "video" => array("avi", "wmv", "mov", "mp4", "mkv", "wtv", "rm", "rmvb", "rma", "m4v", "flv", "f4v", "ts", "mpg", "3gp", "webm", "pmp", "264"),
  71. "audio" => array("mp3", "ogg", "aac", "ape", "tta", "wav", "flac", "mid"),
  72. "compressed" => array("zip", "rar", "7z", "tar", "gz", "bz2", "lzw", "tgz"),
  73. "cdimage" => array("iso", "cue", "mds", "mdf"),
  74. "executable" => array("exe"),
  75. "subtitle" => array("ass", "srt"),
  76. "installer" => array("msi", "apk", "ipa"),
  77. "appext" => array("dll", "so"),
  78. "text" => array("txt", "nfo"),
  79. "python" => array("py"),
  80. "javascript" => array("js"),
  81. "script" => array("sh", "bat"),
  82. /* "html" => array("html", "htm"), */
  83. );
  84. $iconOfMimeTypes = array(
  85. /* Base64 encoded 24*24 PNG. Gnome icons are from Open Icon Library.
  86. I don't either understand or care about the licenses of them,
  87. but I am pretty sure I am permitted to used them without asking. */
  88. "image" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAACXZwQWcAAAAYAAAAGAB4TKWmAAACz0lEQVRIx+2UTUhUURiGn3Pu38zozL3Mn8loU9NIRSUkUlD0Q62CIKhd0KKIKIgWhgVtWlWU/diiXRBRmxYR1aZNtZQyKbR/CcNxbMxoQB2zGb2nhZo6hlq2aNG7ut/hnPf53vNxLvzXLBIAFy81PM4X8pv/prGhGw+O1h3bBsCFi+eG1F/WufNnFIAOIDUJwNmG0wgxv86VguP1J5By1FMv3pBpfzovQHly7ZR6GsC23Cl1b3aAD529LKkMEwn6R7tkbHjjXU+uhZoZ4C8CGI6JGA7Q3pFmMGezMllGe+cXqhaGJzWRI2R7kVIyUuQ3PYFHFdUaEcehOhGg5W0PN+49Y82KcmyPoudrjqa2NHaJhXRtEjGHrJgFUJxgXM/f97JxVYS29gxbaxYALgOmS8+XPrasXkosUgK4ZGdPMB0wMDRMsERy+/F7PMbEHiti4PdoLIt5kXJszTTnlkDTQTclQlOEhjXKHZtEmcmhy8/QRB6AWw87OLlnObo+dsb0EQ5EZgYELIXhFVSs24AvGgMhKAz20930CMcLdTuTHG5sIeqYNB6qxtQFoJCGF08wTp9vKkBOuyKfS2VtDb6yRWDEQK/AKI0SW78FJ6jYvSnKt/ww29dECJdCwONil1qEFsRxonGCwRCprk5c151IoJT6OXu7FKyyCtAchLAAUDKE7hnCXwIjBRelFOneHAHLRegeNDvOvqsZNO0z8XiGxOLEVACT3smGUzk4dZOZNCQd7r6yeHIFqpIxkksqMIwsBw7upzv9iVSqCylF8y8T7N29g7nIMAxCoQjhcBR/wKbwvZ/MpwypzhTAyMeOrl0TAHf0cR2vPzEn82K1vWwlmayiK5UGxcjbN+/2XLt2vfsnIF8ovDjbcLr2T8yVUgghEALVPzDYfO/O/SOtra2vYfSvMX41fiDxR+2PjQUoAH1Adtx8MqD4+7eDzOPsP64fQBsycjclrewAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMTEtMTVUMjM6MDQ6MjUtMDc6MDBt/LoyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAxLTExVDA5OjEwOjE5LTA3OjAw0PLOhAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0xMVQwOToxMDoxOS0wNzowMKGvdjgAAAA0dEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC9sagaoAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTExLTE1VDIzOjA0OjI1LTA3OjAwMk3MBgAAABd0RVh0U291cmNlAEdOT01FIEljb24gVGhlbWXB+SZpAAAAIHRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9hcnQuZ25vbWUub3JnLzLkkXkAAAAASUVORK5CYII=",
  89. "video" => "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",
  90. "audio" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAl2cEFnAAAAGAAAABgAeEylpgAAAxxJREFUSMftlU1oXFUUx3/n3vfezMtXP/JR/KofqWAUXClkkRZpzaIqutCViht3bhQVStBFwIUbty5Ed7pxoQt3GqQgaqUYKBaqJbaNaUUTJjOTmcy8mffuvcdFRh1KMBPciQcO53L53/M7517uvfC//edNBhGdfvPQ2aD6oKIGMKoYQHZi6BsjoCKIM87c98U7W9eiQQCF97OvP7tQHh85ynB5gqH4AKV4jMSWEbEELchdm65r0M6rvPXRy52NyuYkMBgAYDQ9hLEBEY8xQmRjyvEYSTRMt2juQLyhnIxBUA24ADAwoLK9QloaYSu7QWKHiKMUIwkAPjgKl+FDh0BO12UYZX8ARHjvk/fb9e1mWVUFEBECSABUjPjYWnn1uVdKIISd+X0AgGbWTkSjw8fTWnNxcafCfjt5ZkRVFSMW2+vADJxdFUE0TWvFbsn/lnnA4BPZH0BRRESbTP7jmqAeg4h4dH8ADRgxmuL3BKiI7HuLgnpAyOphD4CDoOL3OuRTC6PjAF++3az+BRC0JHsDVNBIdwE8eiY9GifpB4Xzc0Yw5dKwzi+YOI5ij3gMaNuoOb14eKzoFi/FUfxC4YppY2xhhFywhaqPFc+uHdi49M0Dx+65Zf6hJ+3dE7O40KGVV/mtftHmoYEPjkTUBKcfz9w1c/Lp4y8md0zeT+7aSSNbH/69cRGlg3deot0umvd+6tidt9ut7io/rlfwIafwGYXL+Xr5h0xVrwcbdyM186dm52w1v0Dl+jKKR8RgTcxPV3/WViezTkMTwPYDpk+Usitrv86NDqdxp2hRbdS4dOVq8dX3F7JKrb60cr7++PKHnWz6ROmJxnbj4NTByTgEod0pWPllLZw9f651efXaam29+9S377bWAN//XAuQPvz80Guj48kzEnOrKL6+4c41N9xnlz/vLAEe4MhMMn7vI8kb6YHoMVUMnmJrw13aXM2XbnyXf5rnVIE2ULsZkAATwG296IE6sAnkfToLDAFHgCmgBDSBjZ62CbSA6s0fjul53HN6EN+X/M9oegWVekDt6XLA9WJnoEv2b+wPYSaLU22dSJ8AAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDUtMDdUMjI6NTc6MDEtMDQ6MDAC3CDyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAxLTExVDA5OjEzOjIxLTA3OjAwhqU8AwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0xMVQwOToxMzoyMS0wNzowMPf4hL8AAAA0dEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC9sagaoAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTA3VDIyOjU2OjI5LTA0OjAww2V04gAAABN0RVh0U291cmNlAEdOT01FLUNvbG9yc6qZROIAAAAxdEVYdFNvdXJjZV9VUkwAaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dub21lLWNvbG9ycy9QHbXrAAAAAElFTkSuQmCC",
  91. "compressed" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3XAAAN1wFCKJt4AAAACXZwQWcAAAAYAAAAGAB4TKWmAAADrElEQVRIx7WWXYhVVRTHf2vvfc791BnHq404FaWmPpihZZMTmhSIU0IfD4qJL0G9BQX1EkE+RxDpi0EvQ0L4kH2AJkUPRWEU9ZBl5ReR44Bf43jv3Llzz9l79XDPODed9DbQgs1ZnI//76y1/rC3qCr/Z7jZfLR3V+47lyvflzSufp1OpltfOqAT//aumQ1AbG7djtc+iVfev/nhKHaf7xmU3Kwr2LNdlnixG12+uL7ZrH/48v70kBiHyxW5d+DJXEiba3//6cvD774gm5/fp8ktAbt3i+n+w+50cfFpDWFDacGd+aX926R3WX/+yN5ntwNlAGMd1VNfsHrjtvxk42r/md9++Ah4/JaAypnSL8vWP7Fi+YPPMP+O1cTlCj4oNi7h08nS2zusGhchNsbFOaonPmPV2k2FC+dOD76zqzj04lB9101nkCSNFQNPvUJPpZe0do7ayDEmrgxD8AA89uo3zF90D7XLZ5nbtw5rhWT0FMuWLseEZOeth6yKrw7TuHictDpCSGqQ1kFbgDB2klUbtvPtwTdxcxaR7+7DimdBzxzSEKQjFyVjf0I6AZpijSWKC4S0gYhh7NeDFMaPUzt/gkNDbyD5CrnyApyLOneRaEKYHKc2dplG8yTj9TpnT/9MvmcJ8xavZP7Cbh7oWsrRrw7z8ftvsenRQQrlSmeAcnkOAhz59APGLv5FsCUaPiKhSG/fXaTVEdJ8lbTaoKtyOxdH6xz9/ke2bNnaGaBWq9JsNnhkYA3CGhCLLd2GK/fiSgtxxQq20EPZxixujDEwfoGkOoJv1kA6ALR6ZAjeIwhiIB2/QDoxCpdOImJRETQoqCf4JiFt4nJzQTsFYEmbddSnhJCiwROm8uwavEdDeu1+vufuzoesQPAJ6n0GaAmp+gwWCCGFDK4hYGzcKl7EqGqY0aYiknVRQAQxBmMsYhzGxRgbY1yMi2JclMfFRVyuSJQrEBW7p2SiaZ22CrKbJssxYsEIQQzWWDQE1Ho0KKoBEwKoRzUQQiAuXAPkgSRrxA0tilozNoiNEA1AQBRUFUVBW0s10NqsWnlc7GkH1GaagWQPAcEYASxG7bT7hGmnyD89GRW7ptIcbYa9oQIR8T6ZsKW+h0AEVb0OMD2m9sQndUTEA/ZmLgrna+69A/tef05VLf8lRMLwFbsf/ERbncjUpp8NOQbmAd1ZqSb7xfY1UygwCYwCl4CGZsLSfqrIIC5b5iaCM0Wg5Z5U20Tl+mNLu4dnE3qd4N8b9Ka8rSrEfwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMi0wOFQxMzoyNDo1Mi0wNzowMJhtlpsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDEtMTFUMDk6MTM6MjEtMDc6MDD3+IS/AAAANHRFWHRMaWNlbnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0dQTC8yLjAvbGoGqAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAATdEVYdFNvdXJjZQBHTk9NRS1Db2xvcnOqmUTiAAAAMXRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nbm9tZS1jb2xvcnMvUB216wAAAABJRU5ErkJggg==",
  92. "cdimage" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAANkE3LLaAgAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAAl2cEFnAAAAGAAAABgAeEylpgAAA99JREFUSMeVlc2uFEUUx3/12d0z03fugIiIuGLhQ/gEJO5N3JC4daHxOXTlTp+AlTu2vAFrDSEQCGPM3Av0fHR3ddUpF8OMd2Cuwkk6lU6fqt85/3NOtQJ4/vz5l6enp79aa7/gPSznzDAM66ZpflksFj9fv3797xs3bhz1tQDDMEyMMWPn3Pucj4iQUhobY76pqur86dOnvz18+PB8Pp9z586dA18NkFJSOef3OvwCAO/9Z3VdfzeZTO42TXNy+/btd3z1LuUPNRFBa81sNrs1m81+nM1m37548WL24MGDdwEi8sGAnDMxRowxTKfTT6fT6Q91Xd8NIczu379/CLjM1D7aTEpCSkLOGa011lpCCCwWC5qmAbjlvf++KIqvz87Oyt0ZdhfNMZk2Xc9yuaEPw5vvCq0VZeGpSsd4PCaEwDAMaK2p6/pzEfnq/Pz8d2C+B4jIASClxOK8oVmuKQrPZFThnAUyXT+w2nS8btZMTyqqssJ7T0oJESHGWLqt82EGu1VEmP91xqvlhk8+vsqVWY01/yo5BWJMNMsNr14vAcVJPSLnTEqJrutQSnGpROcvl5y9XvHR1RlFWSBHpLPWcGVWUxSOxdmrbZbjChHh7Vk6yKAPA4uXDd57lFa0XU/OAqWHLCilMNailEIB41FJ349ZrVvKwqGU2qtwJANhtWppu8BoPGIIkWxBUiJ0HUZrtFb4wlNVJUopRDLWGvow0PWBwrvLASKZtuuRDFmEJIKWRE6CcRbZN0PAaI3znrbrWW06whDp+4B3lpQSKaXjNUgioOCi6sYYtDYUhdt2SRLatqcfEqt1y2q9YRgiInkf/aUAqzXWmK3WWuOdxRmNNRqRBCgkJTbtAEqx2nSsN+2FgZTjgN0cOG8pvMU5g/OWsiwovSPnxBACMUbaLtDHSBgi63VL2wfqUYm1et+qMcZjNRC81ZTe4rxnVBZUpcc7QxaDArROlAKrlz3L1YZN26G1Yjwq3mQpxwE7iDFbgHWGcVXgnQUF2iiqqiSlTDck+n5gvWnJOTOtJ5xMqr1EbwP0Re0gU3iLpEiMkSSyLd5O4yyEMNCHQAam9ZhrV04oCndQ4KMS7VatFdYoVqsVIRQURYH3FqP1PpCycIxLz+nJiFFVoC524mVtuit0zhmlQOVM37WE0GOtxVpDTIIic3U6wVmNcwbI7G6TSzN4M3kHfzelwBhFzkIcAnHYbnAGlDVc2HdwC8cY1TuAx48fN1rrJ1VVkbd2MPK79/95VEopz+fzJ8+ePesPAPfu3fvj5s2bP1VVdQ3IF+X6L8DbAYhIbprmz0ePHr3eAf4BS8zt+2hvfX0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTAtMDItMjNUMTg6MTQ6MjAtMDc6MDD1++xzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEwLTAyLTIzVDE4OjE0OjIwLTA3OjAwhKZUzwAAADV0RVh0TGljZW5zZQBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9MR1BMLzIuMS87wbQYAAAAFHRFWHRTb3VyY2UAQ3J5c3RhbCBDbGVhcvXi56gAAAA6dEVYdFNvdXJjZV9VUkwAaHR0cDovL2NvbW1vbnMud2lraW1lZGlhLm9yZy93aWtpL0NyeXN0YWxfQ2xlYXKvvkVjAAAAAElFTkSuQmCC",
  93. "executable" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3WAAAN1gGQb3mcAAAACXZwQWcAAAAYAAAAGAB4TKWmAAADsElEQVRIx9WVy28bVRTGv3vnjmfs+FmqxM+4cQtNSYKitKUEUaUSpGklBIuKVXe0gQVteS3gT2ADElt2ECGVZcWrFRJCIm2UkFTK063r1E79jBN74tiZiV8zLDJuTYhTIyQkjnR171zN/L7vnPsY4P8epNUXXzz3qQtAUn90T938LNXKd/SfwK+Mnt144/WTMoCkPvfvBerw994elrrcXvvQ8T7T+ZGBlkVoK/Arl4algM/nCMZXsRRL4/f5uOn06eeLrYjQp8GvXh6Wurw+RyiZAaMUPONw9a0zmA2vm18ePPpUEbof/Nrls9Ihj8+xnF4H4zgwjoJxHH6dCUHgeSyntsyvnunbV4Q2g78/OiL5PV5HNJMDoxSMUnDcTn/upWMQeAaBZzBb7eZro+eVZiJ0L/gH74xInW6PI7a+8dh1vaeE4LubMxjsD+DYYRdKlSq8zg7ja0N9hb1E6G74h++OSD6Xx5HM5XeguvO6+w67GQ6rCZqq4USPH85nbLj+0zSkombp7+nM7xZpzCB58c2BvNfpcaxuFHZcU/qkpztZ/DIehOugDe0HLNCqKoKhFATGIPI8zNaDNn+7QcGTAwnWIOD+9sbdZJWIpd7ugMBRArlUBSEAQGAycIgmcqjWVJzs7cRWqYLbf4QhGhgoIaCEYDUZ0VYyZSO06qk6lKsPEuHxoufIK18t3ot9ks3l5IDfy4ciGficdqzEsqhWVczfT8LAGKwWIzQVWF0rgOc48ByHTDqqzYXWCNHKXVO3Pl+sc/92F9XXovc5pzx4asC0vLIOAoBSAqNowOCJACghmF2Mo1DcBiUEqcRDbWohQYhW7pq89UV0322qX2LuhVDaNDU5LXcHOh5vSaga7oXSYJRCraoQeYZMKtIU3vSg1UVmQxnT5MSk/Oyhdog8jzZRgM/lAOM4mE0iMsmINjEXbwr/yxrsjkR4XG6zucYkRfi4JmeV/he6+WqlBqvFBItZRHBpQfv5zgOSS84dn7/zTRyABkBtVcAC4EA2tWQoKfkbCue5VNta2+7tOco0FXgUCWPs+xkSXfjxQuzBbQmAEYCg82qNQnsJtAGwArADcMiFjLiZe/RbSTh8oVJIlStlhRv74S7uT1//KJcOFXQwayi3CmB7PwGmOzLpzVJW8oJSzIYU3j8UjKxhaeLrLwtSfFMvSw1AGUBJByv6eO9tqoegZ1BvNr1sbQB43aUMoABgE8BGQys2glr5J9ezEQEY9FJoACq6UxnAlj7338efIoWKYDKL1gkAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMTEtMTVUMjM6MDQ6MjUtMDc6MDBt/LoyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAxLTExVDA5OjEwOjE5LTA3OjAw0PLOhAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0xMVQwOToxMDoxOS0wNzowMKGvdjgAAAA0dEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC9sagaoAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTExLTE1VDIzOjA0OjI1LTA3OjAwMk3MBgAAABd0RVh0U291cmNlAEdOT01FIEljb24gVGhlbWXB+SZpAAAAIHRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9hcnQuZ25vbWUub3JnLzLkkXkAAAAASUVORK5CYII=",
  94. "subtitle" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAABGdBTUEAANkE3LLaAgAAAAJiS0dEAACqjSMyAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAYAAAAGAB4TKWmAAACTElEQVQ4y23TS29bRRgG4OccO76kpY2Jy6UQLmIBAcIKsUAgUQmVFWLLZYPEFiQQf4IfgQSsWcEf6IKqJc2CBgqOwCQhtJKbtG6TNsWOz5lh4eMb5ft2M/POe/lm8NdrB6178f4+jLfubn5x4aFN01UmO14+VnF/5bJj6Qfz3c0vz3everdYTcmT6P8qyNQeX/j45Ie3TyyPV1P+ezwpmqCkudT8fPGjncb3E0lhBhJ1dCVSj4kyD1g8Pfgsc/3r7269MwTMMvSck2r42VnPOHRdFJcqn9Z721/pkRJm5HS01VX1XFFyQklQcvKJxbcbDSOGCUfwmzu2DAQbbmsqGcjlQq1angLEIoE71h1queeUm9oeUTMnyPUlo5SmTW/bsGvOsj03rOkrqaiqGU0qnWbIXLZl11POONJ1ScdoP8ongCDIRV2rrhl43nNO6/rVZUGQyYUinELSsP9wyQ2Lnlbzor4d5+zLBVEoGKZMH1nzp390fKNuy6G7ftT2UiFoDAgF3U3nHYjW/UKhuW3NslSQy6ZN54KWn0R1DQsaGhaU7fvBXiEom0ga5nxBR8Vb3jCv5Miub12xbkNTkBnMeui4qOdRbzqjLBEc2LHhbxe9rDQGpCMPLW1znrXiuIo5VU2velhuVUeclURuwXsGVjypOp77Kz6xpzFjujzMI7XiBaRKRXwkHvS+KJHKpz0E0iiVGgYw/EaT30eUGSRjQPsg3a6LMY5nPpn98GHGZBCvbV/tD69wtrn0+vypGGePT0BRFOL+71urrT7/AkHnQc6pFAmEAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAyLTIzVDE4OjE0OjIwLTA3OjAw9fvscwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMi0yM1QxODoxNDoyMC0wNzowMISmVM8AAAA1dEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvTEdQTC8yLjEvO8G0GAAAABR0RVh0U291cmNlAENyeXN0YWwgQ2xlYXL14ueoAAAAOnRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9jb21tb25zLndpa2ltZWRpYS5vcmcvd2lraS9DcnlzdGFsX0NsZWFyr75FYwAAAABJRU5ErkJggg==",
  95. "installer" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3XAAAN1wFCKJt4AAAACXZwQWcAAAAYAAAAGAB4TKWmAAADrElEQVRIx7WWXYhVVRTHf2vvfc791BnHq404FaWmPpihZZMTmhSIU0IfD4qJL0G9BQX1EkE+RxDpi0EvQ0L4kH2AJkUPRWEU9ZBl5ReR44Bf43jv3Llzz9l79XDPODed9DbQgs1ZnI//76y1/rC3qCr/Z7jZfLR3V+47lyvflzSufp1OpltfOqAT//aumQ1AbG7djtc+iVfev/nhKHaf7xmU3Kwr2LNdlnixG12+uL7ZrH/48v70kBiHyxW5d+DJXEiba3//6cvD774gm5/fp8ktAbt3i+n+w+50cfFpDWFDacGd+aX926R3WX/+yN5ntwNlAGMd1VNfsHrjtvxk42r/md9++Ah4/JaAypnSL8vWP7Fi+YPPMP+O1cTlCj4oNi7h08nS2zusGhchNsbFOaonPmPV2k2FC+dOD76zqzj04lB9101nkCSNFQNPvUJPpZe0do7ayDEmrgxD8AA89uo3zF90D7XLZ5nbtw5rhWT0FMuWLseEZOeth6yKrw7TuHictDpCSGqQ1kFbgDB2klUbtvPtwTdxcxaR7+7DimdBzxzSEKQjFyVjf0I6AZpijSWKC4S0gYhh7NeDFMaPUzt/gkNDbyD5CrnyApyLOneRaEKYHKc2dplG8yTj9TpnT/9MvmcJ8xavZP7Cbh7oWsrRrw7z8ftvsenRQQrlSmeAcnkOAhz59APGLv5FsCUaPiKhSG/fXaTVEdJ8lbTaoKtyOxdH6xz9/ke2bNnaGaBWq9JsNnhkYA3CGhCLLd2GK/fiSgtxxQq20EPZxixujDEwfoGkOoJv1kA6ALR6ZAjeIwhiIB2/QDoxCpdOImJRETQoqCf4JiFt4nJzQTsFYEmbddSnhJCiwROm8uwavEdDeu1+vufuzoesQPAJ6n0GaAmp+gwWCCGFDK4hYGzcKl7EqGqY0aYiknVRQAQxBmMsYhzGxRgbY1yMi2JclMfFRVyuSJQrEBW7p2SiaZ22CrKbJssxYsEIQQzWWDQE1Ho0KKoBEwKoRzUQQiAuXAPkgSRrxA0tilozNoiNEA1AQBRUFUVBW0s10NqsWnlc7GkH1GaagWQPAcEYASxG7bT7hGmnyD89GRW7ptIcbYa9oQIR8T6ZsKW+h0AEVb0OMD2m9sQndUTEA/ZmLgrna+69A/tef05VLf8lRMLwFbsf/ERbncjUpp8NOQbmAd1ZqSb7xfY1UygwCYwCl4CGZsLSfqrIIC5b5iaCM0Wg5Z5U20Tl+mNLu4dnE3qd4N8b9Ka8rSrEfwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMi0wOFQxMzoyNDo1Mi0wNzowMJhtlpsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDEtMTFUMDk6MTM6MjEtMDc6MDD3+IS/AAAANHRFWHRMaWNlbnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0dQTC8yLjAvbGoGqAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAATdEVYdFNvdXJjZQBHTk9NRS1Db2xvcnOqmUTiAAAAMXRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nbm9tZS1jb2xvcnMvUB216wAAAABJRU5ErkJggg==",
  96. "appext" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAABGdBTUEAANkE3LLaAgAAAAJiS0dEAACqjSMyAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAYAAAAGAB4TKWmAAACL0lEQVQ4y2XSS24jRRzH8U+Vux07jh2HOIMICWLLHWDLjj0Sm5HYsgBxCQ6BxB04A0LiBCMhlAloGGXIJE6ch1/dVSzc2A5TvWhVq779e/wLf346efGY330e8vj+7Idfn53ZXgXVXtFre3fVql78avf67Mdfrl/5svkaqUNuNpVLY9nSrVpS6ZwMv9l/fjP4ZP2bSF5vpv7xRmXmtQWSltHp6PvDr/86+HkDpDXStmegpaWQBFmlcHh8+N3w+bxBipXCVLJrx4eCKOqLgoUrU9H01Le7s/OfzNaWxi4kFFqYuHSrNnZvoXaj/Gj0xcFBo5BkhbCVJSpFURcDLXtKRadTrC0lXdEm/kC0p2Wk0pN8LLnbzCGrXXu0oy8jWBjr4d7SQKGtNv9/S0FuFLJkZtG8k9WJrN4oBEcqHbVaFBXe05J0BUk2FyTJVugdbVRe6zswd2OgcmGqreOlfbEBIlluRJNHj7Klt2YqE3emkjv36m1LSbViDZVqpSNEx+Z6+EBprtq2dGnhWO3OQNJ2IqvtN2X0BQ+WG4Vs4tah7FLdlLsqg2zuQmn51FJXLWFfqRIaAILKTP00Q62SLZr7WVuY6Os2WOl9wdtmdAVZ5cqDgeBSYejKhSMnjVLQk6RNhiToaykFA6WoUCqb3ldIrXoCxGeSiFMEQz1FA+QGWIY18Mcknnfl/N/4NoPMzT3LYZn/Pn81X6n5fHT62e5RzunJ4Q2cZSnf/v7ytxdz/gUmPCzciAyRsQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMi0yM1QxODoxNDoyMC0wNzowMPX77HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDItMjNUMTg6MTQ6MjAtMDc6MDCEplTPAAAANXRFWHRMaWNlbnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0xHUEwvMi4xLzvBtBgAAAAUdEVYdFNvdXJjZQBDcnlzdGFsIENsZWFy9eLnqAAAADp0RVh0U291cmNlX1VSTABodHRwOi8vY29tbW9ucy53aWtpbWVkaWEub3JnL3dpa2kvQ3J5c3RhbF9DbGVhcq++RWMAAAAASUVORK5CYII=",
  97. "text" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3WAAAN1gGQb3mcAAAACXZwQWcAAAAYAAAAGAB4TKWmAAADMklEQVRIx7WVzW4bVRTHf2dsxzb1CiUF27OgXytEqlCBirpgBQsWLUFCqqBQQOIReIA+AE9QaIHi8iXa8ABZsEGs2JQmhTZSW5PxoqRuSByPOzPnsJg7/kpsghBXM3Pn3pk5v3PO/5478D83GR58/V3jUC7nfZzEyWmDXDpr2YGI7Hgia2b2S6L6I1jj7bPnH+8b8O33V6+dWHhh8dAzRxCRXS8nSUJnZ5tOZ5sHfz7o3bx5Y1NVPzL48p233tN/BFz95ov47Jvncu3NDeI4xsxQVdQUU0VEyOcLFAoFkkg5UKnw2++r4crqr/c00VPvnvtgYxzgDQ9ULSciRFGUGlbFTFOQGXESs9Pt8GizTTO4x61bqywcP1F66cVTx8Tzlj+78ml5HJAfHpiZAynrwTrdbhczwwxMFTBEhJlikVzO4+HDNgCHDx/12puPnl1ZuXH98ucXX3v//Ic6AZDOqynVp6uApQD3zMwwtf791l9b/W8Xjj+fb7fbL99v3j0J/LQ3QC0jsb4eEIahg4AZYIo5aKFQYGurwyeXLhJHEWdOL+LX/GLzj7uvTASoS5GZUa1V+zBzffYsg8zOzTK78STN+02uL11j8fU3xBPvDHBhqgYYBK0WYdgFE5DUINZ/0a1BoVQqMT8/z0xxBlUliqLnJovsUmQYtVrVVZelqzkzOry6hQEUo16vk6jmJwOcyIjQClqEYUhab5JN74ZgVA5UOPjUwVEdp2mQ8zx8309NiPT7cdMD3/dI87QUeeKlGnR7ICDphT0DAErFMvV6bTQL00T2+hFIf08a78db5rhOjcDRRTyCoEWvFzqDkqngPJchBaBcLg0i2I8GIoLv1xGRwZlF4+5HCK4u9q2BiBAEAb2w1zeY2hZEPESEcrmM7/turzK3nPepAUC9Xh/1eiwaJN2z0p+R9UXQaSkCS8zSLdvMsiJGyIpNMOmrMfjKqeIcTCYBio+jaPnO2u1Xjx45NnG1TGpmxp2128RxvAwUgd4wwAPmGle+aux0upVK5YmTZoOfkWEj1TQqZLrbiohub3d+Xlr6oQHMAQGgw24WgRpQ+Feu726RM977j3b21/4GPBfM1+Kggw4AAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMTEtMTVUMjM6MDQ6MjUtMDc6MDBt/LoyAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAxLTExVDA5OjEwOjE5LTA3OjAw0PLOhAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0xMVQwOToxMDoxOS0wNzowMKGvdjgAAAA0dEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvR1BMLzIuMC9sagaoAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTExLTE1VDIzOjA0OjI1LTA3OjAwMk3MBgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAXdEVYdFNvdXJjZQBHTk9NRSBJY29uIFRoZW1lwfkmaQAAACB0RVh0U291cmNlX1VSTABodHRwOi8vYXJ0Lmdub21lLm9yZy8y5JF5AAAAAElFTkSuQmCC",
  98. "folder" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAk1JREFUSIntlb1rFEEYh5+Z3b27fCcXjWCn5IoUClqphfpH2ImgYJPCwkrBkAQTENGTaCVBsNTG2sbGQq3SqKWEILkYvNxH7rLn7s7OjIWE5G4vOS8KNj7VwL7ze3benZmF/3RAbA9uT1296Ej3Vax1trXI9dyNKIwvPbj3/G23And74HnpxSuXJ7PDQ4cTRaXy2qEXL589BSYOLIgidXxoMMva9yWMiXcKHI+x0ZOEkcp1G94kAOsI4aCUairQOkJKl1Qq7dy6c83uFyaEVK505ubvLs61EYAQAhWZxMTqZoEbk1MIKRLPmrDWyz+engb2FoSRTswrrC9TWF/ePxw4MXEBa01TZotAUqtv8fnjJ2IVQac3buH9uw94KY+pmesVpJyfn1nMu80lgpXlFc6eOc/pU+ewNrmaTggh0bEezi/M3gfyLSuAIAg4MnYU368ShI2uBZ7rkfL6AHxo9w3CiJ6eflQcYoxql9FJgd+o40i53lYQRQGZdIZGsNF0Hn4XIaBWqwLia0JgjEFKieu6qDjAmn23/Z7UamW0Nl8Sglq9wuBAllgrtD5Ie351oVQtK6PjlYSgt7efXC6H1iFaRwcSgEOlXIqMkKsJQV9vP+Pjx1AqwNju+2+tRQiXjVIRa2yTYADAGEsqlSbWIdYmr4xOSOlhjGWzuplaLXyr7BaMCCHiOPZd18ngeX30ZEa7FgjhYLRG69h783qpsVtAYyt48nBh9qaUorv7oQVjbOj7Px4Vi8UIdv5oA8AIIP8kfLcHqAD1v5T3D/kJir30caSVdCgAAAAASUVORK5CYII=",
  99. "file" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3WAAAN1gGQb3mcAAAACXZwQWcAAAAYAAAAGAB4TKWmAAAC0UlEQVRIx7WUTU9TQRSG3zNtKZQqLoQEKJHPREMMQaLBsHClS40LE6L4Ef+DP8O9kRg/oOBHBPwBLNy5cqMICiyICQlBApi2CPfec1zMTO9w6a01xmknc+e2eZ9z5j1ngP88yN28fJPvSiTUw8APrgqQ0G/FfkFEJUW0KiIfA+b3gORvjd49qBnw+u3UzNDg+etdnT0goiN/DoIAxVIBxWIBmz829xcWPu0y8wMBJm/fvMd/BEy9euGP3hhLbO9uwfd9iAiYGSwMYQYRIZlMIZVKIfAYjdksvn5b/PVl8fMaBzxyZ+z+VhSg3A2zJIgInudpYWaIsAaJwA98lPaK2Nndxvf1NSwtLWJwYKj+4oWRPlJq/tnEk4aqABExIB21nSICmN/syDRmsPNzGwDQ3d2rzpzu71dEs0+fj6sqAH2M+kiMqNUluxAIQF0yBeHw2AcHziVbW3OXWGQ4HsBiSRAzdQkJIGRKCQARAEIyVYf89CQejz/CxsYGcm25NBEux3tgjkFEoD9uEgIiHT8RgRShpeUkTnV24NjxLGbnZtDUdIIUqWuuZrKSB+VIzQORhplmAAlARMg0ZJDJZdCR68CBdwBmhud5Z+MBbGM1BCGADMT4oFcV+mJiqk/Xo729HQFzMh5gTAZZQTINp5UP957dHK6uso+VANaDhFJO1OEalUYFhEgVgKUrUkbYRO6ulSjiArgKwNCVCgH2Toqu0WED56oZGDqR0qXoeEBOJm4uoZzU7oErXp42G+foQl0pZ1+TB3HieionM4QdTxZQgwdR84QiL8X2CsLn8kVZJQNAAhF9ZYtIuc/IaTyxZkfiIJANMIgDpA88b35ldflKb09fbLXEDRHByuoyfN+fB5AGsO8CFIDm/MR0vlTcy2azmWGR8CIUSKTWD7UWRN9NXCgUP8zNvcsDaAawDoDdMNMA2gCk/ir0o8Mz4vv/qFPb+A0FdoALrAKQWQAAACV0RVh0Y3JlYXRlLWRhdGUAMjAwOS0xMS0xNVQyMzowNDoyNS0wNzowMG38ujIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTAtMDEtMTFUMDk6MTA6MTgtMDc6MDB2hcUwAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEwLTAxLTExVDA5OjEwOjE4LTA3OjAwB9h9jAAAADR0RVh0TGljZW5zZQBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9HUEwvMi4wL2xqBqgAAAAldEVYdG1vZGlmeS1kYXRlADIwMDktMTEtMTVUMjM6MDQ6MjUtMDc6MDAyTcwGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAABd0RVh0U291cmNlAEdOT01FIEljb24gVGhlbWXB+SZpAAAAIHRFWHRTb3VyY2VfVVJMAGh0dHA6Ly9hcnQuZ25vbWUub3JnLzLkkXkAAAAASUVORK5CYII=",
  100. "python" => "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",
  101. "javascript" => "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",
  102. "script" => "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAANkE3LLaAgAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAAl2cEFnAAAAGAAAABgAeEylpgAAA3hJREFUSMeVVbtu40YUPfMQX5JWDyqAEUix4SKw4cJFim3yC2kNA2kCpE2RIL3/IKnSZYH0bhY20i2Qyp+wgLCGI9MGZVuLXVmSRZnkzHBSrIcQLXljDXBBkJi5Z86591wSALi4uPi20Wj8yTnfwjOW1hppmka3t7d/3Nzc/L62tvZ+c3Nz6V4OAFLKCue8bFnWc/JDKQUpZZlS+r3necNer/fq5ORkGIYh9vf3FwGUUkRr/azkAJBlGaSUcBynXa/XfxJCyMFg8Gp7e3vyeC81lFddWZaBMYZWq9VptVq/+r7/4+XlZeP4+HgRIMuylUAIIdBaQwgBzjl83//S9/1f6vX6D2maNo6OjooSrcqAUgrOOaIowmAwgNYaWuuOZVk/u64bB0HwF4C4wGCVRQiB4zioVqtgjOVy1Wq1r3zf/67RaDQWGKwqUalUgud54JxDCAGlFJRSyLLMsW2bLwV46G8IIZ4NppQCADiOAwBIkgSEkGINTJHjOMZwOESpVAKltLDxqZVlGZIkAaUUvu/jsZcKDKbTKQghGI1GCPt9VMrlpSCEEBBCIKUEAKyvr2MymaBSqRRYFQCMeQghOD09xb9BANdxcH11hVkUFWpkAIQQqFQq2NvbA2MMQog811KJzGGpFFIh8M3Llyi/eIG/X79GFEUFAHNuY2MD0+kUnuflt1/KwASlFFJKjCcTdLtddN++RRAEiOMYZu98gS3LQhRFeZEf5tRyiYBPJhJpin/evMHtcIgkSfD11hbatRquwhAXvR6klNBaI0kSNJvNgjRLGWRZlocp3rtuF7PZDJVqFR8/fMD9/T0mo1HexkIIJEmSe2AeYL7NCxIZFoQQ2Lb9yVCcY3B9DcZY3u+MMVBKoZTKnyaHlPJpiYy+lFJYlgVKKVzXhW3bYIzlCUzfzwOY20spFxmY5CZqtRp2dnagtYbjOAUAI00cx7i7u0O73QYhJM/xZJENiziOsbu7i4ODg1yyeZ+YSNM0Hwue5+UyfRYAAMIwBGMs13yevmljxhhs20apVIJSCrPZDOUH139OIup5HprNJsbjcX4LM5PMWDYXmfeDZVlotVpmWJIFgLOzswmlNHBdF1przRjL/1rzMj02pQkhBKIoIkII3e/3gzAMkwLA4eHhu06n85vneV9orfXjov/f+9x3PR6PT8/Pz8cG4D+xu+SRhHTxZQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxMC0wMi0yM1QxODoxNDoyMC0wNzowMPX77HMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDItMjNUMTg6MTQ6MjAtMDc6MDCEplTPAAAANXRFWHRMaWNlbnNlAGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0xHUEwvMi4xLzvBtBgAAAAUdEVYdFNvdXJjZQBDcnlzdGFsIENsZWFy9eLnqAAAADp0RVh0U291cmNlX1VSTABodHRwOi8vY29tbW9ucy53aWtpbWVkaWEub3JnL3dpa2kvQ3J5c3RhbF9DbGVhcq++RWMAAAAASUVORK5CYII=",
  103. /* "html" => "iAmAbAsE64ENCodEDPng", */
  104. );
  105. /* End of settings */
  106. $GLOBALS["requestPath"] = explode('?', $_SERVER['REQUEST_URI'], 2)[0];
  107. /* Fake APC function, 10x slower than APC. */
  108. if (!function_exists("apc_exists") AND !function_exists("apc_store") AND !function_exists("apc_fetch")) {
  109. $fakeAPC = array();
  110. function apc_exists($key) {
  111. global $fakeAPC;
  112. return array_key_exists($key, $fakeAPC);
  113. }
  114. function apc_store($key, $val, $ttl) {
  115. global $fakeAPC;
  116. $fakeAPC[$key] = $val;
  117. return True;
  118. }
  119. function apc_fetch($key) {
  120. global $fakeAPC;
  121. return $fakeAPC[$key];
  122. }
  123. }
  124. function currentDir() {
  125. foreach ($_GET as $key => $val) {
  126. $key = base64_decode(preg_replace("/\_/", "+", $key));
  127. while (!is_dir("./".$key) or isBadDir($key)) {
  128. $key = dirname($key);
  129. if ($key == "." or empty($key)) {
  130. /* prevent infinite loop */
  131. return "./";
  132. }
  133. }
  134. /* "./path/to////a//folder/" -> "./path/to/a/folder/" */
  135. return preg_replace("/\/+/", "/", $key."/");
  136. }
  137. return "./";
  138. }
  139. function parentDirLink() {
  140. $parentDir = dirname($GLOBALS["currentDir"]);
  141. if ($GLOBALS["currentDir"] == "./") {
  142. return "<a href='..'>Index of ".$GLOBALS["requestPath"].substr($GLOBALS["currentDir"], 2)."</a>";
  143. }
  144. return "<a href='?".base64_encode($parentDir)."'>Index of ".$GLOBALS["requestPath"].substr($GLOBALS["currentDir"], 2)."</a>";
  145. }
  146. function isBadDir($dir) {
  147. /* Unreliable trick to prevent parent directory of this index page from being listed. It can be bypassed easily I think?*/
  148. if (empty($dir)) {
  149. return True;
  150. } elseif (strpos($dir, "../") !== false) {
  151. return True;
  152. } else {
  153. $tree = explode("/", $dir);
  154. $len = count($tree);
  155. if (empty($tree[$len-1])) {
  156. if ($tree[$len-2] == "." or $tree[$len-2] == "..") {
  157. return True;
  158. }
  159. } else {
  160. if ($tree[$len-1] == "." or $tree[$len-1] == "..") {
  161. return True;
  162. }
  163. }
  164. return False;
  165. }
  166. }
  167. function getURL($file) {
  168. global $settings;
  169. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_File_".base64_encode($file))) {
  170. $href = $GLOBALS["currentDir"].$file;
  171. $iconImg = "";
  172. if (!is_file($href)) {
  173. if ($settings["icons"]) {
  174. $iconImg = "<img src='?i=folder'/>";
  175. }
  176. $url = "<a href='?".base64_encode($href)."'>".$iconImg." ".$file."</a>";
  177. } else {
  178. $href = str_replace("./", "", $href);
  179. if ($settings["icons"]) {
  180. $iconImg = "<img src='?i=".getMimeType($GLOBALS["currentDir"].$file)."'/>";
  181. }
  182. $href = rawurlencode($href);
  183. $href = str_replace("%2F", "/", $href);
  184. $url = "<a href='$href'>$iconImg $file</a>";
  185. }
  186. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_File_".base64_encode($file), $url, $settings["contentTTL"]);
  187. } else {
  188. $url = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_File_".base64_encode($file));
  189. }
  190. return $url;
  191. }
  192. function getContent($dir) {
  193. global $settings;
  194. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_Content_".base64_encode($dir))) {
  195. $files = array();
  196. if ($handle = opendir($dir)) {
  197. while (false !== ($file = readdir($handle))) { //scan the folder
  198. if ($settings["displayDot"]) {
  199. if ($file != "." AND $file != "..") {
  200. $files[] = $file;
  201. }
  202. } else {
  203. if (substr($file, 0, 1) != ".") {
  204. $files[] = $file;
  205. }
  206. }
  207. }
  208. closedir($handle);
  209. }
  210. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_Content_".base64_encode($dir), $files, $settings["contentTTL"]);
  211. } else {
  212. $files = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_Content_".base64_encode($dir));
  213. }
  214. return $files;
  215. }
  216. function getMimeType($file) {
  217. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_MimeType_".base64_encode($file))) {
  218. global $mimeTypes, $settings;
  219. if (!is_file($file)) {
  220. $mime = "folder";
  221. } else {
  222. foreach ($mimeTypes as $key => $val) {
  223. $fileExt = pathinfo($file, PATHINFO_EXTENSION);
  224. if (in_array(strtolower($fileExt), $val)) {
  225. $mime = $key;
  226. break;
  227. }
  228. }
  229. if (!isset($mime)) {
  230. $mime = "file";
  231. }
  232. }
  233. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_MimeType_".base64_encode($file), $mime, $settings["contentTTL"]);
  234. } else {
  235. $mime = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_MimeType_".base64_encode($file));
  236. }
  237. return $mime;
  238. }
  239. function hasIndex($dir) {
  240. /* If a directory contains index such as index.html, return the real path */
  241. global $settings;
  242. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_hasIndex_".base64_encode($dir))) {
  243. $hasIndex = False;
  244. foreach (getContent($dir) as $childFile) {
  245. if (in_array($childFile, $settings["indexFiles"])) {
  246. $hasIndex = True;
  247. break;
  248. }
  249. }
  250. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_hasIndex_".base64_encode($dir), $hasIndex, $settings["hasIndexTTL"]);
  251. } else {
  252. $hasIndex = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_hasIndex_".base64_encode($dir));
  253. }
  254. return $hasIndex;
  255. }
  256. function getSize($file) {
  257. global $settings;
  258. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_filesizeString_".base64_encode($file))) {
  259. if (is_file($file)) {
  260. $filesize = filesize($file);
  261. $filesizeString = toHumanReadable($filesize);
  262. } else {
  263. $filesizeString = "";
  264. }
  265. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_filesizeString_".base64_encode($file), $filesizeString, $settings["sizeTTL"]);
  266. } else {
  267. $filesizeString = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_filesizeString_".base64_encode($file));
  268. }
  269. return $filesizeString;
  270. }
  271. function toHumanReadable($filesize) {
  272. $sizeTexts = array("B", "KB", "MB", "GB", "TB", "PB");
  273. $tmpfilesize = $filesize;
  274. foreach ($sizeTexts as $lvl => $sizeText) {
  275. if ($filesize <= pow(1024,$lvl+1)) {
  276. return round($tmpfilesize,2).$sizeText;
  277. } else {
  278. $tmpfilesize = $tmpfilesize/1024;
  279. }
  280. }
  281. }
  282. function getLastModded($file) {
  283. global $settings;
  284. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_lastModded_".base64_encode($file))) {
  285. $lastModded = date("Y-m-d h:i:s", filemtime($file));
  286. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_lastModded_".base64_encode($file), $lastModded, $settings["lastModdedTTL"]);
  287. } else {
  288. $lastModded = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_lastModded_".base64_encode($file));
  289. }
  290. return $lastModded;
  291. }
  292. function getThumbnail($filepathEncoded) {
  293. global $settings;
  294. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_$filepathEncoded")) {
  295. $filepathDecoded = base64_decode($filepathEncoded);
  296. /* Unreliable trick to prevent parent directory of this index page from being listed, again. */
  297. if (isBadDir($filepathDecoded)) {
  298. exit;
  299. }
  300. if (!in_array(getMimeType($filepathDecoded), $settings["thumbMimes"])) {
  301. exit;
  302. }
  303. $handle = fopen($filepathDecoded, "r");
  304. list($width, $height) = getimagesize($filepathDecoded);
  305. $srcImageStr = fread($handle, filesize($filepathDecoded));
  306. $srcImage = imagecreatefromstring($srcImageStr);
  307. $maxPx = max($width, $height);
  308. if ($maxPx >= $settings["thumbnailSize"]) {
  309. $percent = $settings["thumbnailSize"]/$maxPx;
  310. } else {
  311. /* Make sure the file is really an picture */
  312. ob_start();
  313. imagepng($srcImage);
  314. $srcImageStr = ob_get_contents();
  315. ob_end_clean();
  316. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_$filepathEncoded", $srcImageStr, $settings["thumbnailTTL"]);
  317. return $srcImageStr;
  318. }
  319. $newwidth = $width * $percent;
  320. $newheight = $height * $percent;
  321. $thumb = imagecreatetruecolor($newwidth, $newheight);
  322. imagealphablending($thumb, false);
  323. imagesavealpha($thumb, true);
  324. imagecopyresampled($thumb, $srcImage, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  325. ob_start();
  326. imagepng($thumb);
  327. $thumbStr = ob_get_contents();
  328. ob_end_clean();
  329. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_lastModded_$filepathEncoded", time(), $settings["thumbnailTTL"]);
  330. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_$filepathEncoded", $thumbStr, $settings["thumbnailTTL"]);
  331. } else {
  332. $thumbStr = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_$filepathEncoded");
  333. }
  334. return $thumbStr;
  335. }
  336. function getPreviewText($file) {
  337. global $settings;
  338. if (!apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_previewText_".base64_encode($file))) {
  339. $handle = fopen($file, "r");
  340. $previewText = htmlentities(fread($handle, $settings["previewLimit"]), ENT_QUOTES | ENT_IGNORE, "UTF-8");
  341. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_previewText_".base64_encode($file), $previewText, $settings["previewTTL"]);
  342. } else {
  343. $previewText = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_previewText_".base64_encode($file));
  344. }
  345. return $previewText;
  346. }
  347. if (isset($_GET["t"]) AND !empty($_GET["t"])):
  348. header('Content-Type: image/png');
  349. $lastModded = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_lastModded_".$_GET["t"]);
  350. header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModded) . " GMT");
  351. if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModded && apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_thumb_".$_GET["t"])) {
  352. header("HTTP/1.1 304 Not Modified");
  353. exit();
  354. }
  355. echo getThumbnail($_GET["t"]);
  356. elseif (isset($_GET["i"]) AND !empty($_GET["i"])):
  357. header('Content-Type: image/png');
  358. if (apc_exists($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_icon_lastModded_".$_GET["i"])) {
  359. $lastModded = apc_fetch($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_icon_lastModded_".$_GET["i"]);
  360. } else {
  361. $lastModded = time();
  362. apc_store($_SERVER['HTTP_HOST'].$GLOBALS["requestPath"]."_icon_lastModded_".$_GET["i"], $lastModded);
  363. }
  364. header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModded) . " GMT");
  365. if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModded) {
  366. header("HTTP/1.1 304 Not Modified");
  367. exit();
  368. }
  369. echo base64_decode($iconOfMimeTypes[$_GET["i"]]);
  370. elseif (hasIndex($GLOBALS["currentDir"] = currentDir()) && $GLOBALS["currentDir"] != "./"):
  371. $GLOBALS["currentDir"] = str_replace("./", "", $GLOBALS["currentDir"]);
  372. $GLOBALS["currentDir"] = rawurlencode($GLOBALS["currentDir"]);
  373. $GLOBALS["currentDir"] = str_replace("%2F", "/", $GLOBALS["currentDir"]);
  374. header("Location: ".$GLOBALS['currentDir'], true, 302);
  375. else:
  376. ?>
  377. <!DOCTYPE HTML>
  378. <html>
  379. <head>
  380. <title>Index of <?php echo $GLOBALS["requestPath"].substr($GLOBALS["currentDir"], 2); ?></title>
  381. <meta charset="utf-8">
  382. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  383. <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
  384. <style>
  385. .container {
  386. padding-top: 150px;
  387. padding-bottom: 60px;
  388. width: 80%;
  389. }
  390. .page-header {
  391. float: left;
  392. position: absolute;
  393. margin-top: 50px;
  394. width: 100%;
  395. background-color: white;
  396. }
  397. .filter {
  398. text-align: right;
  399. margin: auto;
  400. position: fixed;
  401. right: 20px;
  402. bottom: 20px;
  403. height: 34px;
  404. }
  405. .pagingfull_numbers {
  406. text-align: left;
  407. margin: auto;
  408. position: fixed;
  409. left: 20px;
  410. bottom: 20px;
  411. }
  412. .info {
  413. text-align: center;
  414. position: fixed;
  415. width: 380px;
  416. bottom: 20px;
  417. left: 0;
  418. right: 0;
  419. margin: auto;
  420. }
  421. #display_menu {
  422. width: auto;
  423. display: inline;
  424. }
  425. table {
  426. margin: 1em 0;
  427. clear: both;
  428. }
  429. </style>
  430. <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  431. <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
  432. <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
  433. <script>
  434. /* Default class modification */
  435. $.extend( $.fn.dataTableExt.oStdClasses, {
  436. "sInfo": "help-block",
  437. "sPageFirst": "btn btn-primary",
  438. "sPagePrevious": "btn btn-primary",
  439. "sPageNext": "btn btn-primary",
  440. "sPageLast": "btn btn-primary",
  441. "sPageButton": "btn btn-default",
  442. "sPageButtonStaticDisabled": "btn btn-default disabled",
  443. "sPageButtonActive": "btn btn-default disabled",
  444. "sFilter": "<?php if ($settings["responsive"]) { echo "filter"; } ?>",
  445. "sPaging": "<?php if ($settings["responsive"]) { echo "paging"; } ?>",
  446. "sInfo": "<?php if ($settings["responsive"]) { echo "info"; } ?> well well-sm",
  447. } );
  448. /* Sort by human-readable file size. http://datatables.net/plug-ins/sorting#file_size */
  449. $.extend( $.fn.dataTableExt.oSort, {
  450. "file-size-pre": function ( a ) {
  451. var x = a.substring(0,a.length - 2);
  452. if (a.substring(a.length - 2, a.length) == "KB") {
  453. var x_unit = 1024;
  454. } else if (a.substring(a.length - 2, a.length) == "MB") {
  455. var x_unit = 1048576;
  456. } else if (a.substring(a.length - 2, a.length) == "GB") {
  457. var x_unit = 1073741824;
  458. } else if (a.substring(a.length - 2, a.length) == "TB") {
  459. var x_unit = 1099511627776;
  460. } else if (a.substring(a.length - 2, a.length) == "TB") {
  461. var x_unit = 1125899906842624;
  462. } else if (a.substring(a.length - 1, a.length) == "B") {
  463. x = a.substring(0,a.length - 1);
  464. var x_unit = 1;
  465. } else {
  466. return -1;
  467. }
  468. return parseInt( x * x_unit, 10 );
  469. },
  470. "file-size-asc": function ( a, b ) {
  471. return ((a < b) ? -1 : ((a > b) ? 1 : 0));
  472. },
  473. "file-size-desc": function ( a, b ) {
  474. return ((a < b) ? 1 : ((a > b) ? -1 : 0));
  475. }
  476. } );
  477. $(document).ready(function() {
  478. /* Mother of sort and filtering */
  479. $('.table').dataTable({
  480. "sPaginationType": "full_numbers",
  481. "iDisplayLength": <?php echo $settings["displayRows"]; ?>,
  482. "oLanguage": {
  483. "sSearch": "",
  484. "sInfo": "<?php echo $localization["sInfo"]; ?>",
  485. "sInfoFiltered": "<br/><?php echo $localization["sInfoFiltered"]; ?>",
  486. "sInfoEmpty": "<?php echo $localization["sInfoEmpty"]; ?>",
  487. "sEmptyTable": "<?php echo $localization["sEmptyTable"]; ?>",
  488. "sLengthMenu": '<?php echo $localization["show"]; ?><select id="display_menu" class="form-control">'+
  489. <?php
  490. foreach ($settings["rowsSelection"] as $val) { ?>
  491. '<option value="<?php echo $val; ?>"><?php echo $val.$localization["measureWordOfEntitles"]; ?></option>'+
  492. <?php
  493. }
  494. ?>
  495. '<option value="-1"><?php echo $localization["all"]; ?></option>'+
  496. '</select><?php echo $localization["entitles"]; ?>',
  497. "oPaginate": {
  498. "sFirst": "<?php echo $localization["firstPage"]; ?>",
  499. "sLast": "<?php echo $localization["lastPage"]; ?>",
  500. "sNext": "<?php echo $localization["nextPage"]; ?>",
  501. "sPrevious": "<?php echo $localization["previousPage"]; ?>",
  502. }
  503. },
  504. "aaSorting": [
  505. [ 1, "asc" ],
  506. [ 0, "asc" ]
  507. ],
  508. "aoColumns": [
  509. null,
  510. null,
  511. { "sType": "file-size" },
  512. null
  513. ]
  514. });
  515. $("input[aria-controls='DataTables_Table_0']").addClass("form-control");
  516. $("input[aria-controls='DataTables_Table_0']").attr("placeholder", "<?php echo $localization["filter"]; ?>");
  517. /* Set navbar(.page-header) to fixed if it is scrolled over */
  518. var navpos = $(".page-header").offset();
  519. $(window).bind('scroll', function() {
  520. if ($(window).scrollTop() > navpos.top && $(window).height() > 500) {
  521. $(".page-header").css({
  522. "position": "fixed",
  523. "margin-top": "0px",
  524. });
  525. } else {
  526. $(".page-header").css({
  527. "position": "absolute",
  528. "margin-top": "50px",
  529. });
  530. }
  531. });
  532. function responsive() {
  533. if ($(window).width()/2 <= paginateWidth + 210) {
  534. $(".well-sm").removeClass("info");
  535. } else {
  536. $(".well-sm").addClass("info");
  537. }
  538. if ($(window).width() <= paginateWidth + filterWidth + 156) {
  539. $("#DataTables_Table_0_filter").removeClass("filter");
  540. $("#DataTables_Table_0_paginate").removeClass("pagingfull_numbers");
  541. } else {
  542. $("#DataTables_Table_0_filter").addClass("filter");
  543. $("#DataTables_Table_0_paginate").addClass("pagingfull_numbers");
  544. }
  545. if (paginateWidth >= $(".table-responsive").width()) {
  546. $("#DataTables_Table_0_first").text("<<");
  547. $("#DataTables_Table_0_previous").text("<");
  548. $("#DataTables_Table_0_next").text(">");
  549. $("#DataTables_Table_0_last").text(">>");
  550. } else {
  551. $("#DataTables_Table_0_first").text(firstStr);
  552. $("#DataTables_Table_0_previous").text(prevStr);
  553. $("#DataTables_Table_0_next").text(nextStr);
  554. $("#DataTables_Table_0_last").text(lastStr);
  555. }
  556. if ($(window).width() <= 960) {
  557. $(".container").css({
  558. "width": "100%",
  559. "padding-right": "0px",
  560. "padding-left": "0px",
  561. });
  562. } else {
  563. $(".container").css({
  564. "width": "80%",
  565. "padding-right": "15px",
  566. "padding-left": "15px",
  567. });
  568. }
  569. if ($(window).height() <= 500) {
  570. $(".page-header").css({
  571. "position": "absolute",
  572. "margin-top": "50px",
  573. });
  574. } else if ($(window).scrollTop() > navpos.top) {
  575. $(".page-header").css({
  576. "position": "fixed",
  577. "margin-top": "0px",
  578. });
  579. }
  580. }
  581. function helpersInit() {
  582. $(".page-header").tooltip({
  583. container: "body",
  584. placement: "auto",
  585. });
  586. $('.has_popover').popover({
  587. trigger: "hover",
  588. container: "body",
  589. placement: "auto",
  590. html: true,
  591. });
  592. }
  593. <?php
  594. if ($settings["responsive"]) {
  595. echo ' $(window).resize(function() {
  596. responsive();
  597. });
  598. $("#display_menu").change(function() {
  599. paginateWidth = $("#DataTables_Table_0_paginate").width();
  600. });
  601. var paginateWidth = $("#DataTables_Table_0_paginate").width();
  602. var filterWidth = $(".form-control").width();
  603. var firstStr = $("#DataTables_Table_0_first").html()
  604. var prevStr = $("#DataTables_Table_0_previous").html()
  605. var nextStr = $("#DataTables_Table_0_next").html()
  606. var lastStr = $("#DataTables_Table_0_last").html()
  607. ';
  608. echo "responsive();";
  609. }
  610. if ($settings["helpers"]) {
  611. echo ' $("body").bind("click mouseover", function() {
  612. helpersInit();
  613. });
  614. ';
  615. echo "helpersInit();";
  616. }
  617. ?>
  618. });
  619. </script>
  620. </head>
  621. <body>
  622. <div title="<?php echo $localization["goBackToParentDirectory"]; ?>" class="page-header" style="text-align: center; ">
  623. <h1><?php echo parentDirLink(); ?></h1>
  624. </div>
  625. <div class="container">
  626. <div class="<?php if ($settings["responsive"]) { echo "table-responsive"; } ?>">
  627. <table class="table table-hover table-condensed">
  628. <thead>
  629. <tr>
  630. <th title="<?php echo $localization["filename"]; ?>"><?php echo $localization["filename"]; ?></th>
  631. <th title="<?php echo $localization["filetype"]; ?>"><?php echo $localization["filetype"]; ?></th>
  632. <th title="<?php echo $localization["filesize"]; ?>" style="width: 90px;"><?php echo $localization["filesize"]; ?></th>
  633. <th title="<?php echo $localization["filemtime"]; ?>" style="width: 160px;"><?php echo $localization["filemtime"]; ?></th>
  634. </tr>
  635. </thead>
  636. <tbody>
  637. <?php
  638. foreach (getContent($GLOBALS["currentDir"]) as $file) { ?>
  639. <tr<?php
  640. if (!is_file($GLOBALS["currentDir"].$file)) {
  641. echo " class='success'";
  642. }
  643. $mineType = getMimeType($GLOBALS["currentDir"].$file);
  644. ?>>
  645. <?php
  646. if (in_array($mineType, $settings["thumbMimes"])) {
  647. ?>
  648. <td class='has_popover' title='<?php echo $localization["thumbnail"]; ?>' data-content='<img src="?t=<?php echo base64_encode($GLOBALS["currentDir"].$file); ?>"/>'><?php echo getURL($file); ?></td>
  649. <?php
  650. } elseif (in_array($mineType, $settings["previewMimes"])) {
  651. ?>
  652. <td class='has_popover' title='<?php echo $localization["preview"]; ?>' data-content='<pre><?php echo getPreviewText($GLOBALS["currentDir"].$file); ?></pre>'><?php echo getURL($file); ?></td>
  653. <?php
  654. } else {
  655. ?>
  656. <td><?php echo getURL($file); ?></td>
  657. <?php
  658. }
  659. ?>
  660. <td><?php echo $localization[$mineType]; ?></td>
  661. <td><?php echo getSize($GLOBALS["currentDir"].$file); ?></td>
  662. <td><?php echo getLastModded($GLOBALS["currentDir"].$file); ?></td>
  663. </tr>
  664. <?php
  665. }
  666. ?>
  667. </tbody>
  668. </table>
  669. </div>
  670. </div>
  671. </body>
  672. </html>
  673. <?php
  674. endif;
  675. ?>