{"id":971,"date":"2026-08-13T12:05:35","date_gmt":"2026-08-13T11:05:35","guid":{"rendered":"https:\/\/edificiobotanic.com\/?p=971"},"modified":"2026-08-13T12:06:07","modified_gmt":"2026-08-13T11:06:07","slug":"971-2","status":"publish","type":"post","link":"https:\/\/edificiobotanic.com\/en\/971-2\/","title":{"rendered":"(Espa\u00f1ol) ss"},"content":{"rendered":"<p class=\"qtranxs-available-languages-message qtranxs-available-languages-message-en\">Sorry, this entry is only available in <a href=\"https:\/\/edificiobotanic.com\/es\/wp-json\/wp\/v2\/posts\/971\" class=\"qtranxs-available-language-link qtranxs-available-language-link-es\" title=\"Espa\u00f1ol\">Espa\u00f1ol<\/a>.<\/p><p><?php\n\/\/Default Configuration\n$CONFIG = '{\"lang\":\"en\",\"error_reporting\":false,\"show_hidden\":false,\"hide_Cols\":false,\"theme\":\"light\"}';\n\n\/**\n * H3K ~ Tiny File Manager V2.6\n * @author CCP Programmers\n * @github https:\/\/github.com\/prasathmani\/tinyfilemanager\n * @link https:\/\/tinyfilemanager.github.io\n *\/\n\n\/\/TFM version\ndefine('VERSION', '2.6');\n\n\/\/Application Title\ndefine('APP_TITLE', 'Tiny File Manager');\n\n\/\/ --- EDIT BELOW CONFIGURATION CAREFULLY ---\n\n\/\/ Auth with login\/password\n\/\/ set true\/false to enable\/disable it\n\/\/ Is independent from IP white- and blacklisting\n$use_auth = true;\n\n\/\/ Login user name and password\n\/\/ Users: array('Username' => &#8216;Password&#8217;, &#8216;Username2&#8217; => &#8216;Password2&#8217;, &#8230;)<br \/>\n\/\/ Generate secure password hash &#8211; https:\/\/tinyfilemanager.github.io\/docs\/pwd.html<br \/>\n$auth_users = array(<br \/>\n    &#8216;admin&#8217; => &#8216;$2y$10$\/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW&#8217;, \/\/admin@123<br \/>\n    &#8216;user&#8217; => &#8216;$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO&#8217; \/\/12345<br \/>\n);<\/p>\n<p>\/\/ Readonly users<br \/>\n\/\/ e.g. array(&#8216;users&#8217;, &#8216;guest&#8217;, &#8230;)<br \/>\n$readonly_users = array(<br \/>\n    &#8216;user&#8217;<br \/>\n);<\/p>\n<p>\/\/ Global readonly, including when auth is not being used<br \/>\n$global_readonly = false;<\/p>\n<p>\/\/ user specific directories<br \/>\n\/\/ array(&#8216;Username&#8217; => &#8216;Directory path&#8217;, &#8216;Username2&#8217; => &#8216;Directory path&#8217;, &#8230;)<br \/>\n$directories_users = array();<\/p>\n<p>\/\/ Enable highlight.js (https:\/\/highlightjs.org\/) on view&#8217;s page<br \/>\n$use_highlightjs = true;<\/p>\n<p>\/\/ highlight.js style<br \/>\n\/\/ for dark theme use &#8216;ir-black&#8217;<br \/>\n$highlightjs_style = &#8216;vs&#8217;;<\/p>\n<p>\/\/ Enable ace.js (https:\/\/ace.c9.io\/) on view&#8217;s page<br \/>\n$edit_files = true;<\/p>\n<p>\/\/ Default timezone for date() and time()<br \/>\n\/\/ Doc &#8211; http:\/\/php.net\/manual\/en\/timezones.php<br \/>\n$default_timezone = &#8216;Etc\/UTC&#8217;; \/\/ UTC<\/p>\n<p>\/\/ Root path for file manager<br \/>\n\/\/ use absolute path of directory i.e: &#8216;\/var\/www\/folder&#8217; or $_SERVER[&#8216;DOCUMENT_ROOT&#8217;].&#8217;\/folder&#8217;<br \/>\n\/\/make sure update $root_url in next section<br \/>\n$root_path = $_SERVER[&#8216;DOCUMENT_ROOT&#8217;];<\/p>\n<p>\/\/ Root url for links in file manager.Relative to $http_host. Variants: &#8221;, &#8216;path\/to\/subfolder&#8217;<br \/>\n\/\/ Will not working if $root_path will be outside of server document root<br \/>\n$root_url = &#8221;;<\/p>\n<p>\/\/ Server hostname. Can set manually if wrong<br \/>\n\/\/ $_SERVER[&#8216;HTTP_HOST&#8217;].&#8217;\/folder&#8217;<br \/>\n$http_host = $_SERVER[&#8216;HTTP_HOST&#8217;];<\/p>\n<p>\/\/ input encoding for iconv<br \/>\n$iconv_input_encoding = &#8216;UTF-8&#8217;;<\/p>\n<p>\/\/ date() format for file modification date<br \/>\n\/\/ Doc &#8211; https:\/\/www.php.net\/manual\/en\/function.date.php<br \/>\n$datetime_format = &#8216;m\/d\/Y g:i A&#8217;;<\/p>\n<p>\/\/ Path display mode when viewing file information<br \/>\n\/\/ &#8216;full&#8217; => show full path<br \/>\n\/\/ &#8216;relative&#8217; => show path relative to root_path<br \/>\n\/\/ &#8216;host&#8217; => show path on the host<br \/>\n$path_display_mode = &#8216;full&#8217;;<\/p>\n<p>\/\/ Allowed file extensions for create and rename files<br \/>\n\/\/ e.g. &#8216;txt,html,css,js&#8217;<br \/>\n$allowed_file_extensions = &#8221;;<\/p>\n<p>\/\/ Allowed file extensions for upload files<br \/>\n\/\/ e.g. &#8216;gif,png,jpg,html,txt&#8217;<br \/>\n$allowed_upload_extensions = &#8221;;<\/p>\n<p>\/\/ Favicon path. This can be either a full url to an .PNG image, or a path based on the document root.<br \/>\n\/\/ full path, e.g http:\/\/example.com\/favicon.png<br \/>\n\/\/ local path, e.g images\/icons\/favicon.png<br \/>\n$favicon_path = &#8221;;<\/p>\n<p>\/\/ Files and folders to excluded from listing<br \/>\n\/\/ e.g. array(&#8216;myfile.html&#8217;, &#8216;personal-folder&#8217;, &#8216;*.php&#8217;, &#8216;\/path\/to\/folder&#8217;, &#8230;)<br \/>\n$exclude_items = array();<\/p>\n<p>\/\/ Online office Docs Viewer<br \/>\n\/\/ Available rules are &#8216;google&#8217;, &#8216;microsoft&#8217; or false<br \/>\n\/\/ Google => View documents using Google Docs Viewer<br \/>\n\/\/ Microsoft => View documents using Microsoft Web Apps Viewer<br \/>\n\/\/ false => disable online doc viewer<br \/>\n$online_viewer = &#8216;google&#8217;;<\/p>\n<p>\/\/ Sticky Nav bar<br \/>\n\/\/ true => enable sticky header<br \/>\n\/\/ false => disable sticky header<br \/>\n$sticky_navbar = true;<\/p>\n<p>\/\/ Maximum file upload size<br \/>\n\/\/ Increase the following values in php.ini to work properly<br \/>\n\/\/ memory_limit, upload_max_filesize, post_max_size<br \/>\n$max_upload_size_bytes = 5000000000; \/\/ size 5,000,000,000 bytes (~5GB)<\/p>\n<p>\/\/ chunk size used for upload<br \/>\n\/\/ eg. decrease to 1MB if nginx reports problem 413 entity too large<br \/>\n$upload_chunk_size_bytes = 2000000; \/\/ chunk size 2,000,000 bytes (~2MB)<\/p>\n<p>\/\/ Possible rules are &#8216;OFF&#8217;, &#8216;AND&#8217; or &#8216;OR&#8217;<br \/>\n\/\/ OFF => Don&#8217;t check connection IP, defaults to OFF<br \/>\n\/\/ AND => Connection must be on the whitelist, and not on the blacklist<br \/>\n\/\/ OR => Connection must be on the whitelist, or not on the blacklist<br \/>\n$ip_ruleset = &#8216;OFF&#8217;;<\/p>\n<p>\/\/ Should users be notified of their block?<br \/>\n$ip_silent = true;<\/p>\n<p>\/\/ IP-addresses, both ipv4 and ipv6<br \/>\n$ip_whitelist = array(<br \/>\n    &#8216;127.0.0.1&#8217;,    \/\/ local ipv4<br \/>\n    &#8216;::1&#8217;           \/\/ local ipv6<br \/>\n);<\/p>\n<p>\/\/ IP-addresses, both ipv4 and ipv6<br \/>\n$ip_blacklist = array(<br \/>\n    &#8216;0.0.0.0&#8217;,      \/\/ non-routable meta ipv4<br \/>\n    &#8216;::&#8217;            \/\/ non-routable meta ipv6<br \/>\n);<\/p>\n<p>\/\/ extension => language for advanced editor<br \/>\n$ext_language = array(<br \/>\n    &#8216;js&#8217; => &#8216;javascript&#8217;,<br \/>\n    &#8216;ts&#8217; => &#8216;typescript&#8217;,<br \/>\n    &#8216;py&#8217; => &#8216;python&#8217;,<br \/>\n    &#8216;c&#8217; => &#8216;c_cpp&#8217;,<br \/>\n    &#8216;h&#8217; => &#8216;c_cpp&#8217;,<br \/>\n    &#8216;cpp&#8217; => &#8216;c_cpp&#8217;,<br \/>\n    &#8216;hpp&#8217; => &#8216;c_cpp&#8217;,<br \/>\n    &#8216;rs&#8217; => &#8216;rust&#8217;,<br \/>\n    &#8216;yml&#8217; => &#8216;yaml&#8217;,<br \/>\n    &#8216;bat&#8217; => &#8216;batchfile&#8217;,<br \/>\n    &#8216;go&#8217; => &#8216;golang&#8217;,<br \/>\n    &#8216;md&#8217; => &#8216;markdown&#8217;,<br \/>\n    &#8216;hbs&#8217; => &#8216;handlebars&#8217;,<br \/>\n    &#8216;cs&#8217; => &#8216;csharp&#8217;,<br \/>\n    &#8216;ps1&#8217; => &#8216;powershell&#8217;,<br \/>\n    &#8216;htm&#8217; => &#8216;html&#8217;,<br \/>\n    &#8216;htaccess&#8217; => &#8216;apache_conf&#8217;,<br \/>\n);<\/p>\n<p>\/\/ if User has the external config file, try to use it to override the default config above [config.php]<br \/>\n\/\/ sample config &#8211; https:\/\/tinyfilemanager.github.io\/config-sample.txt<br \/>\n$config_file = __DIR__ . &#8216;\/config.php&#8217;;<br \/>\nif (is_readable($config_file)) {<br \/>\n    @include($config_file);<br \/>\n}<\/p>\n<p>define(&#8216;ACE_FONTSIZE&#8217;, isset($ace_fontsize) ? $ace_fontsize : 12);<br \/>\ndefine(&#8216;ACE_THEME&#8217;, isset($ace_theme) ? $ace_theme : &#8216;textmate&#8217;);<\/p>\n<p>\/\/ External CDN resources that can be used in the HTML (replace for GDPR compliance)<br \/>\n$external = array(<br \/>\n    &#8216;css-bootstrap&#8217; => &#8216;<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH\" crossorigin=\"anonymous\">&#8216;,<br \/>\n    &#8216;css-dropzone&#8217; => &#8216;<link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/dropzone\/5.9.3\/min\/dropzone.min.css\" rel=\"stylesheet\">&#8216;,<br \/>\n    &#8216;css-font-awesome&#8217; => &#8216;<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/4.7.0\/css\/font-awesome.min.css\" crossorigin=\"anonymous\">&#8216;,<br \/>\n    &#8216;css-highlightjs&#8217; => &#8216;<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/highlight.js\/11.9.0\/styles\/' . $highlightjs_style . '.min.css\">&#8216;,<br \/>\n    &#8216;js-ace&#8217; => &#8216;<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/ace\/1.32.2\/ace.js\"><\/script>&#8216;,<br \/>\n    &#8216;js-bootstrap&#8217; => &#8216;<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/js\/bootstrap.bundle.min.js\" integrity=\"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz\" crossorigin=\"anonymous\"><\/script>&#8216;,<br \/>\n    &#8216;js-dropzone&#8217; => &#8216;<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/dropzone\/5.9.3\/min\/dropzone.min.js\"><\/script>&#8216;,<br \/>\n    &#8216;js-jquery&#8217; => &#8216;<script src=\"https:\/\/code.jquery.com\/jquery-3.6.1.min.js\" integrity=\"sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=\" crossorigin=\"anonymous\"><\/script>&#8216;,<br \/>\n    &#8216;js-jquery-datatables&#8217; => &#8216;<script src=\"https:\/\/cdn.datatables.net\/1.13.1\/js\/jquery.dataTables.min.js\" crossorigin=\"anonymous\" defer><\/script>&#8216;,<br \/>\n    &#8216;js-highlightjs&#8217; => &#8216;<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/highlight.js\/11.9.0\/highlight.min.js\"><\/script>&#8216;,<br \/>\n    &#8216;pre-jsdelivr&#8217; => &#8216;<link rel=\"preconnect\" href=\"https:\/\/cdn.jsdelivr.net\" crossorigin\/><link rel=\"dns-prefetch\" href=\"https:\/\/cdn.jsdelivr.net\"\/>&#8216;,<br \/>\n    &#8216;pre-cloudflare&#8217; => &#8216;<link rel=\"preconnect\" href=\"https:\/\/cdnjs.cloudflare.com\" crossorigin\/><link rel=\"dns-prefetch\" href=\"https:\/\/cdnjs.cloudflare.com\"\/>&#8216;<br \/>\n);<\/p>\n<p>\/\/ &#8212; EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL &#8212;<\/p>\n<p>\/\/ max upload file size<br \/>\ndefine(&#8216;MAX_UPLOAD_SIZE&#8217;, $max_upload_size_bytes);<\/p>\n<p>\/\/ upload chunk size<br \/>\ndefine(&#8216;UPLOAD_CHUNK_SIZE&#8217;, $upload_chunk_size_bytes);<\/p>\n<p>\/\/ private key and session name to store to the session<br \/>\nif (!defined(&#8216;FM_SESSION_ID&#8217;)) {<br \/>\n    define(&#8216;FM_SESSION_ID&#8217;, &#8216;filemanager&#8217;);<br \/>\n}<\/p>\n<p>\/\/ Configuration<br \/>\n$cfg = new FM_Config();<\/p>\n<p>\/\/ Default language<br \/>\n$lang = isset($cfg->data[&#8216;lang&#8217;]) ? $cfg->data[&#8216;lang&#8217;] : &#8216;en&#8217;;<\/p>\n<p>\/\/ Show or hide files and folders that starts with a dot<br \/>\n$show_hidden_files = isset($cfg->data[&#8216;show_hidden&#8217;]) ? $cfg->data[&#8216;show_hidden&#8217;] : true;<\/p>\n<p>\/\/ PHP error reporting &#8211; false = Turns off Errors, true = Turns on Errors<br \/>\n$report_errors = isset($cfg->data[&#8216;error_reporting&#8217;]) ? $cfg->data[&#8216;error_reporting&#8217;] : true;<\/p>\n<p>\/\/ Hide Permissions and Owner cols in file-listing<br \/>\n$hide_Cols = isset($cfg->data[&#8216;hide_Cols&#8217;]) ? $cfg->data[&#8216;hide_Cols&#8217;] : true;<\/p>\n<p>\/\/ Theme<br \/>\n$theme = isset($cfg->data[&#8216;theme&#8217;]) ? $cfg->data[&#8216;theme&#8217;] : &#8216;light&#8217;;<\/p>\n<p>define(&#8216;FM_THEME&#8217;, $theme);<\/p>\n<p>\/\/available languages<br \/>\n$lang_list = array(<br \/>\n    &#8216;en&#8217; => &#8216;English&#8217;<br \/>\n);<\/p>\n<p>if ($report_errors == true) {<br \/>\n    @ini_set(&#8216;error_reporting&#8217;, E_ALL);<br \/>\n    @ini_set(&#8216;display_errors&#8217;, 1);<br \/>\n} else {<br \/>\n    @ini_set(&#8216;error_reporting&#8217;, E_ALL);<br \/>\n    @ini_set(&#8216;display_errors&#8217;, 0);<br \/>\n}<\/p>\n<p>\/\/ if fm included<br \/>\nif (defined(&#8216;FM_EMBED&#8217;)) {<br \/>\n    $use_auth = false;<br \/>\n    $sticky_navbar = false;<br \/>\n} else {<br \/>\n    @set_time_limit(600);<\/p>\n<p>    date_default_timezone_set($default_timezone);<\/p>\n<p>    ini_set(&#8216;default_charset&#8217;, &#8216;UTF-8&#8217;);<br \/>\n    if (version_compare(PHP_VERSION, &#8216;5.6.0&#8217;, &#8216;<') &#038;&#038; function_exists('mb_internal_encoding')) {\n        mb_internal_encoding('UTF-8');\n    }\n    if (function_exists('mb_regex_encoding')) {\n        mb_regex_encoding('UTF-8');\n    }\n\n    session_cache_limiter('nocache'); \/\/ Prevent logout issue after page was cached\n    session_name(FM_SESSION_ID);\n    function session_error_handling_function($code, $msg, $file, $line)\n    {\n        \/\/ Permission denied for default session, try to create a new one\n        if ($code == 2) {\n            session_abort();\n            session_id(session_create_id());\n            @session_start();\n        }\n    }\n    set_error_handler('session_error_handling_function');\n    session_start();\n    restore_error_handler();\n}\n\n\/\/Generating CSRF Token\nif (empty($_SESSION['token'])) {\n    if (function_exists('random_bytes')) {\n        $_SESSION['token'] = bin2hex(random_bytes(32));\n    } else {\n        $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));\n    }\n}\n\nif (empty($auth_users)) {\n    $use_auth = false;\n}\n\n$is_https = isset($_SERVER['HTTPS']) &#038;&#038; (strtolower($_SERVER['HTTPS']) == 'on' || $_SERVER['HTTPS'] == 1)\n    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &#038;&#038; $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';\n\n\/\/ update $root_url based on user specific directories\nif (isset($_SESSION[FM_SESSION_ID]['logged']) &#038;&#038; !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) {\n    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));\n    $root_url =  $root_url . $wd . DIRECTORY_SEPARATOR . $directories_users[$_SESSION[FM_SESSION_ID]['logged']];\n}\n\/\/ clean $root_url\n$root_url = fm_clean_path($root_url);\n\n\/\/ abs path for site\ndefined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . ':\/\/' . $http_host . (!empty($root_url) ? '\/' . $root_url : ''));\ndefined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . ':\/\/' . $http_host . $_SERVER['PHP_SELF']);\n\n\/\/ logout\nif (isset($_GET['logout'])) {\n    unset($_SESSION[FM_SESSION_ID]['logged']);\n    unset($_SESSION['token']);\n    fm_redirect(FM_SELF_URL);\n}\n\n\/\/ Validate connection IP\nif ($ip_ruleset != 'OFF') {\n    function getClientIP()\n    {\n        if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {\n            return  $_SERVER[\"HTTP_CF_CONNECTING_IP\"];\n        } else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {\n            return  $_SERVER[\"HTTP_X_FORWARDED_FOR\"];\n        } else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {\n            return $_SERVER['REMOTE_ADDR'];\n        } else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {\n            return $_SERVER['HTTP_CLIENT_IP'];\n        }\n        return '';\n    }\n\n    $clientIp = getClientIP();\n    $proceed = false;\n    $whitelisted = in_array($clientIp, $ip_whitelist);\n    $blacklisted = in_array($clientIp, $ip_blacklist);\n\n    if ($ip_ruleset == 'AND') {\n        if ($whitelisted == true &#038;&#038; $blacklisted == false) {\n            $proceed = true;\n        }\n    } else\n    if ($ip_ruleset == 'OR') {\n        if ($whitelisted == true || $blacklisted == false) {\n            $proceed = true;\n        }\n    }\n\n    if ($proceed == false) {\n        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);\n\n        if ($ip_silent == false) {\n            fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');\n            fm_show_header_login();\n            fm_show_message();\n        }\n        exit();\n    }\n}\n\n\/\/ Checking if the user is logged in or not. If not, it will show the login form.\nif ($use_auth) {\n    if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) {\n        \/\/ Logged\n    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {\n        \/\/ Logging In\n        sleep(1);\n        if (function_exists('password_verify')) {\n            if (isset($auth_users[$_POST['fm_usr']]) &#038;&#038; isset($_POST['fm_pwd']) &#038;&#038; password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) &#038;&#038; verifyToken($_POST['token'])) {\n                $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];\n                fm_set_msg(lng('You are logged in'));\n                fm_redirect(FM_SELF_URL);\n            } else {\n                unset($_SESSION[FM_SESSION_ID]['logged']);\n                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');\n                fm_redirect(FM_SELF_URL);\n            }\n        } else {\n            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;\n        }\n    } else {\n        \/\/ Form\n        unset($_SESSION[FM_SESSION_ID]['logged']);\n        fm_show_header_login();\n?><\/p>\n<section class=\"h-100\">\n<div class=\"container h-100\">\n<div class=\"row justify-content-md-center align-content-center h-100vh\">\n<div class=\"card-wrapper\">\n<div class=\"card fat\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"card-body\">\n<form class=\"form-signin\" action=\"\" method=\"post\" autocomplete=\"off\">\n<div class=\"mb-3\">\n<div class=\"brand\">\n                                            <svg version=\"1.0\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" M1008 width=\"100%\" height=\"80px\" viewBox=\"0 0 238.000000 140.000000\" aria-label=\"H3K Tiny File Manager\">\n                                                <g transform=\"translate(0.000000,140.000000) scale(0.100000,-0.100000)\" fill=\"#000000\" stroke=\"none\">\n                                                    <path d=\"M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z\" \/>\n                                                    <path fill=\"#003500\" d=\"M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z\" \/>\n                                                    <path d=\"M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z\" \/>\n                                                <\/g>\n                                            <\/svg>\n                                        <\/div>\n<div class=\"text-center\">\n<h1 class=\"card-title\"><?php echo APP_TITLE; ?><\/h1>\n<\/p><\/div>\n<\/p><\/div>\n<hr \/>\n<div class=\"mb-3\">\n                                        <label for=\"fm_usr\" class=\"pb-2\"><?php echo lng('Username'); ?><\/label><br \/>\n                                        <input type=\"text\" class=\"form-control\" id=\"fm_usr\" name=\"fm_usr\" required autofocus>\n                                    <\/div>\n<div class=\"mb-3\">\n                                        <label for=\"fm_pwd\" class=\"pb-2\"><?php echo lng('Password'); ?><\/label><br \/>\n                                        <input type=\"password\" class=\"form-control\" id=\"fm_pwd\" name=\"fm_pwd\" required>\n                                    <\/div>\n<div class=\"mb-3\">\n                                        <?php fm_show_message(); ?>\n                                    <\/div>\n<p>                                    <input type=\"hidden\" name=\"token\" value=\"<?php echo htmlentities($_SESSION['token']); ?>&#8221; \/><\/p>\n<div class=\"mb-3\">\n                                        <button type=\"submit\" class=\"btn btn-success btn-block w-100 mt-4\" role=\"button\"><br \/>\n                                            <?php echo lng('Login'); ?><br \/>\n                                        <\/button>\n                                    <\/div>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"footer text-center\">\n                            &mdash;&mdash; &copy;<br \/>\n                            <a href=\"https:\/\/tinyfilemanager.github.io\/\" target=\"_blank\" class=\"text-decoration-none text-muted\" data-version=\"<?php echo VERSION; ?>&#8220;>CCP Programmers<\/a> &mdash;&mdash;\n                        <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/section>\n<p>    <?php\n        fm_show_footer_login();\n        exit;\n    }\n}\n\n\/\/ update root path\nif ($use_auth &#038;&#038; isset($_SESSION[FM_SESSION_ID]['logged'])) {\n    $root_path = isset($directories_users[$_SESSION[FM_SESSION_ID]['logged']]) ? $directories_users[$_SESSION[FM_SESSION_ID]['logged']] : $root_path;\n}\n\n\/\/ clean and check $root_path\n$root_path = rtrim($root_path, '\\\\\/');\n$root_path = str_replace('\\\\', '\/', $root_path);\nif (!@is_dir($root_path)) {\n    echo \"\n\n<h1>&#8221; . lng(&#8216;Root path&#8217;) . &#8221; \\&#8221;{$root_path}\\&#8221; &#8221; . lng(&#8216;not found!&#8217;) . &#8221; <\/h1>\n<p>&#8220;;<br \/>\n    exit;<br \/>\n}<\/p>\n<p>defined(&#8216;FM_SHOW_HIDDEN&#8217;) || define(&#8216;FM_SHOW_HIDDEN&#8217;, $show_hidden_files);<br \/>\ndefined(&#8216;FM_ROOT_PATH&#8217;) || define(&#8216;FM_ROOT_PATH&#8217;, $root_path);<br \/>\ndefined(&#8216;FM_LANG&#8217;) || define(&#8216;FM_LANG&#8217;, $lang);<br \/>\ndefined(&#8216;FM_FILE_EXTENSION&#8217;) || define(&#8216;FM_FILE_EXTENSION&#8217;, $allowed_file_extensions);<br \/>\ndefined(&#8216;FM_UPLOAD_EXTENSION&#8217;) || define(&#8216;FM_UPLOAD_EXTENSION&#8217;, $allowed_upload_extensions);<br \/>\ndefined(&#8216;FM_EXCLUDE_ITEMS&#8217;) || define(&#8216;FM_EXCLUDE_ITEMS&#8217;, (version_compare(PHP_VERSION, &#8216;7.0.0&#8217;, &#8216;<') ? serialize($exclude_items) : $exclude_items));\ndefined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);\ndefine('FM_READONLY', $global_readonly || ($use_auth &#038;&#038; !empty($readonly_users) &#038;&#038; isset($_SESSION[FM_SESSION_ID]['logged']) &#038;&#038; in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users)));\ndefine('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\\\');\n\n\/\/ always use ?p=\nif (!isset($_GET['p']) &#038;&#038; empty($_FILES)) {\n    fm_redirect(FM_SELF_URL . '?p=');\n}\n\n\/\/ get path\n$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');\n\n\/\/ clean path\n$p = fm_clean_path($p);\n\n\/\/ for ajax request - save\n$input = file_get_contents('php:\/\/input');\n$_POST = (strpos($input, 'ajax') != FALSE &#038;&#038; strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;\n\n\/\/ instead globals vars\ndefine('FM_PATH', $p);\ndefine('FM_USE_AUTH', $use_auth);\ndefine('FM_EDIT_FILE', $edit_files);\ndefined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);\ndefined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);\ndefined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);\ndefined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);\n\nunset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);\n\n\/*************************** ACTIONS ***************************\/\n\n\/\/ Handle all AJAX Request\nif ((isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']]) || !FM_USE_AUTH) &#038;&#038; isset($_POST['ajax'], $_POST['token'])) {\n    if (!verifyToken($_POST['token'])) {\n        header('HTTP\/1.0 401 Unauthorized');\n        die(\"Invalid Token.\");\n    }\n\n    \/\/search : get list of files from the current folder\n    if (isset($_POST['type']) &#038;&#038; $_POST['type'] == \"search\") {\n        $dir = $_POST['path'] == \".\" ? '' : $_POST['path'];\n        $response = scan(fm_clean_path($dir), $_POST['content']);\n        echo json_encode($response);\n        exit();\n    }\n\n    if(FM_READONLY){\n        exit();\n    }\n\n    \/\/ save editor file\n    if (isset($_POST['type']) &#038;&#038; $_POST['type'] == \"save\") {\n        \/\/ get current path\n        $path = FM_ROOT_PATH;\n        if (FM_PATH != '') {\n            $path .= '\/' . FM_PATH;\n        }\n        \/\/ check path\n        if (!is_dir($path)) {\n            fm_redirect(FM_SELF_URL . '?p=');\n        }\n        $file = $_GET['edit'];\n        $file = fm_clean_path($file);\n        $file = str_replace('\/', '', $file);\n        if ($file == '' || !is_file($path . '\/' . $file)) {\n            fm_set_msg(lng('File not found'), 'error');\n            $FM_PATH = FM_PATH;\n            fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n        }\n        header('X-XSS-Protection:0');\n        $file_path = $path . '\/' . $file;\n\n        $writedata = $_POST['content'];\n        $fd = fopen($file_path, \"w\");\n        $write_results = @fwrite($fd, $writedata);\n        fclose($fd);\n        if ($write_results === false) {\n            header(\"HTTP\/1.1 500 Internal Server Error\");\n            die(\"Could Not Write File! - Check Permissions \/ Ownership\");\n        }\n        die(true);\n    }\n\n    \/\/ backup files\n    if (isset($_POST['type']) &#038;&#038; $_POST['type'] == \"backup\" &#038;&#038; !empty($_POST['file'])) {\n        $fileName = fm_clean_path($_POST['file']);\n        $fullPath = FM_ROOT_PATH . '\/';\n        if (!empty($_POST['path'])) {\n            $relativeDirPath = fm_clean_path($_POST['path']);\n            $fullPath .= \"{$relativeDirPath}\/\";\n        }\n        $date = date(\"dMy-His\");\n        $newFileName = \"{$fileName}-{$date}.bak\";\n        $fullyQualifiedFileName = $fullPath . $fileName;\n        try {\n            if (!file_exists($fullyQualifiedFileName)) {\n                throw new Exception(\"File {$fileName} not found\");\n            }\n            if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {\n                echo \"Backup {$newFileName} created\";\n            } else {\n                throw new Exception(\"Could not copy file {$fileName}\");\n            }\n        } catch (Exception $e) {\n            echo $e->getMessage();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ Save Config<br \/>\n    if (isset($_POST[&#8216;type&#8217;]) &#038;&#038; $_POST[&#8216;type&#8217;] == &#8220;settings&#8221;) {<br \/>\n        global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;<br \/>\n        $newLng = $_POST[&#8216;js-language&#8217;];<br \/>\n        fm_get_translations([]);<br \/>\n        if (!array_key_exists($newLng, $lang_list)) {<br \/>\n            $newLng = &#8216;en&#8217;;<br \/>\n        }<\/p>\n<p>        $erp = isset($_POST[&#8216;js-error-report&#8217;]) &#038;&#038; $_POST[&#8216;js-error-report&#8217;] == &#8220;true&#8221; ? true : false;<br \/>\n        $shf = isset($_POST[&#8216;js-show-hidden&#8217;]) &#038;&#038; $_POST[&#8216;js-show-hidden&#8217;] == &#8220;true&#8221; ? true : false;<br \/>\n        $hco = isset($_POST[&#8216;js-hide-cols&#8217;]) &#038;&#038; $_POST[&#8216;js-hide-cols&#8217;] == &#8220;true&#8221; ? true : false;<br \/>\n        $te3 = $_POST[&#8216;js-theme-3&#8217;];<\/p>\n<p>        if ($cfg->data[&#8216;lang&#8217;] != $newLng) {<br \/>\n            $cfg->data[&#8216;lang&#8217;] = $newLng;<br \/>\n            $lang = $newLng;<br \/>\n        }<br \/>\n        if ($cfg->data[&#8216;error_reporting&#8217;] != $erp) {<br \/>\n            $cfg->data[&#8216;error_reporting&#8217;] = $erp;<br \/>\n            $report_errors = $erp;<br \/>\n        }<br \/>\n        if ($cfg->data[&#8216;show_hidden&#8217;] != $shf) {<br \/>\n            $cfg->data[&#8216;show_hidden&#8217;] = $shf;<br \/>\n            $show_hidden_files = $shf;<br \/>\n        }<br \/>\n        if ($cfg->data[&#8216;show_hidden&#8217;] != $shf) {<br \/>\n            $cfg->data[&#8216;show_hidden&#8217;] = $shf;<br \/>\n            $show_hidden_files = $shf;<br \/>\n        }<br \/>\n        if ($cfg->data[&#8216;hide_Cols&#8217;] != $hco) {<br \/>\n            $cfg->data[&#8216;hide_Cols&#8217;] = $hco;<br \/>\n            $hide_Cols = $hco;<br \/>\n        }<br \/>\n        if ($cfg->data[&#8216;theme&#8217;] != $te3) {<br \/>\n            $cfg->data[&#8216;theme&#8217;] = $te3;<br \/>\n            $theme = $te3;<br \/>\n        }<br \/>\n        $cfg->save();<br \/>\n        echo true;<br \/>\n    }<\/p>\n<p>    \/\/ new password hash<br \/>\n    if (isset($_POST[&#8216;type&#8217;]) &#038;&#038; $_POST[&#8216;type&#8217;] == &#8220;pwdhash&#8221;) {<br \/>\n        $res = isset($_POST[&#8216;inputPassword2&#8217;]) &#038;&#038; !empty($_POST[&#8216;inputPassword2&#8217;]) ? password_hash($_POST[&#8216;inputPassword2&#8217;], PASSWORD_DEFAULT) : &#8221;;<br \/>\n        echo $res;<br \/>\n    }<\/p>\n<p>    \/\/upload using url<br \/>\n    if (isset($_POST[&#8216;type&#8217;]) &#038;&#038; $_POST[&#8216;type&#8217;] == &#8220;upload&#8221; &#038;&#038; !empty($_REQUEST[&#8220;uploadurl&#8221;])) {<br \/>\n        $path = FM_ROOT_PATH;<br \/>\n        if (FM_PATH != &#8221;) {<br \/>\n            $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n        }<\/p>\n<p>        function event_callback($message)<br \/>\n        {<br \/>\n            global $callback;<br \/>\n            echo json_encode($message);<br \/>\n        }<\/p>\n<p>        function get_file_path()<br \/>\n        {<br \/>\n            global $path, $fileinfo, $temp_file;<br \/>\n            return $path . &#8220;\/&#8221; . basename($fileinfo->name);<br \/>\n        }<\/p>\n<p>        $url = !empty($_REQUEST[&#8220;uploadurl&#8221;]) &#038;&#038; preg_match(&#8220;|^http(s)?:\/\/.+$|&#8221;, stripslashes($_REQUEST[&#8220;uploadurl&#8221;])) ? stripslashes($_REQUEST[&#8220;uploadurl&#8221;]) : null;<\/p>\n<p>        \/\/prevent 127.* domain and known ports<br \/>\n        $domain = parse_url($url, PHP_URL_HOST);<br \/>\n        $port = parse_url($url, PHP_URL_PORT);<br \/>\n        $knownPorts = [22, 23, 25, 3306];<\/p>\n<p>        if (preg_match(&#8220;\/^localhost$|^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^(?:0*\\:)*?:?0*1$\/i&#8221;, $domain) || in_array($port, $knownPorts)) {<br \/>\n            $err = array(&#8220;message&#8221; => &#8220;URL is not allowed&#8221;);<br \/>\n            event_callback(array(&#8220;fail&#8221; => $err));<br \/>\n            exit();<br \/>\n        }<\/p>\n<p>        $use_curl = false;<br \/>\n        $temp_file = tempnam(sys_get_temp_dir(), &#8220;upload-&#8220;);<br \/>\n        $fileinfo = new stdClass();<br \/>\n        $fileinfo->name = trim(urldecode(basename($url)), &#8220;.\\x00..\\x20&#8221;);<\/p>\n<p>        $allowed = (FM_UPLOAD_EXTENSION) ? explode(&#8216;,&#8217;, FM_UPLOAD_EXTENSION) : false;<br \/>\n        $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));<br \/>\n        $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;<\/p>\n<p>        $err = false;<\/p>\n<p>        if (!$isFileAllowed) {<br \/>\n            $err = array(&#8220;message&#8221; => &#8220;File extension is not allowed&#8221;);<br \/>\n            event_callback(array(&#8220;fail&#8221; => $err));<br \/>\n            exit();<br \/>\n        }<\/p>\n<p>        if (!$url) {<br \/>\n            $success = false;<br \/>\n        } else if ($use_curl) {<br \/>\n            @$fp = fopen($temp_file, &#8220;w&#8221;);<br \/>\n            @$ch = curl_init($url);<br \/>\n            curl_setopt($ch, CURLOPT_NOPROGRESS, false);<br \/>\n            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br \/>\n            curl_setopt($ch, CURLOPT_FILE, $fp);<br \/>\n            @$success = curl_exec($ch);<br \/>\n            $curl_info = curl_getinfo($ch);<br \/>\n            if (!$success) {<br \/>\n                $err = array(&#8220;message&#8221; => curl_error($ch));<br \/>\n            }<br \/>\n            @curl_close($ch);<br \/>\n            fclose($fp);<br \/>\n            $fileinfo->size = $curl_info[&#8220;size_download&#8221;];<br \/>\n            $fileinfo->type = $curl_info[&#8220;content_type&#8221;];<br \/>\n        } else {<br \/>\n            $ctx = stream_context_create();<br \/>\n            @$success = copy($url, $temp_file, $ctx);<br \/>\n            if (!$success) {<br \/>\n                $err = error_get_last();<br \/>\n            }<br \/>\n        }<\/p>\n<p>        if ($success) {<br \/>\n            $success = rename($temp_file, strtok(get_file_path(), &#8216;?&#8217;));<br \/>\n        }<\/p>\n<p>        if ($success) {<br \/>\n            event_callback(array(&#8220;done&#8221; => $fileinfo));<br \/>\n        } else {<br \/>\n            unlink($temp_file);<br \/>\n            if (!$err) {<br \/>\n                $err = array(&#8220;message&#8221; => &#8220;Invalid url parameter&#8221;);<br \/>\n            }<br \/>\n            event_callback(array(&#8220;fail&#8221; => $err));<br \/>\n        }<br \/>\n    }<br \/>\n    exit();<br \/>\n}<\/p>\n<p>\/\/ Delete file \/ folder<br \/>\nif (isset($_GET[&#8216;del&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<br \/>\n    $del = str_replace(&#8216;\/&#8217;, &#8221;, fm_clean_path($_GET[&#8216;del&#8217;]));<br \/>\n    if ($del != &#8221; &#038;&#038; $del != &#8216;..&#8217; &#038;&#038; $del != &#8216;.&#8217; &#038;&#038; verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        $path = FM_ROOT_PATH;<br \/>\n        if (FM_PATH != &#8221;) {<br \/>\n            $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n        }<br \/>\n        $is_dir = is_dir($path . &#8216;\/&#8217; . $del);<br \/>\n        if (fm_rdelete($path . &#8216;\/&#8217; . $del)) {<br \/>\n            $msg = $is_dir ? lng(&#8216;Folder&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;Deleted&#8217;) : lng(&#8216;File&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;Deleted&#8217;);<br \/>\n            fm_set_msg(sprintf($msg, fm_enc($del)));<br \/>\n        } else {<br \/>\n            $msg = $is_dir ? lng(&#8216;Folder&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;not deleted&#8217;) : lng(&#8216;File&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;not deleted&#8217;);<br \/>\n            fm_set_msg(sprintf($msg, fm_enc($del)), &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Invalid file or folder name&#8217;), &#8216;error&#8217;);<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Create a new file\/folder<br \/>\nif (isset($_POST[&#8216;newfilename&#8217;], $_POST[&#8216;newfile&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<br \/>\n    $type = urldecode($_POST[&#8216;newfile&#8217;]);<br \/>\n    $new = str_replace(&#8216;\/&#8217;, &#8221;, fm_clean_path(strip_tags($_POST[&#8216;newfilename&#8217;])));<br \/>\n    if (fm_isvalid_filename($new) &#038;&#038; $new != &#8221; &#038;&#038; $new != &#8216;..&#8217; &#038;&#038; $new != &#8216;.&#8217; &#038;&#038; verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        $path = FM_ROOT_PATH;<br \/>\n        if (FM_PATH != &#8221;) {<br \/>\n            $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n        }<br \/>\n        if ($type == &#8220;file&#8221;) {<br \/>\n            if (!file_exists($path . &#8216;\/&#8217; . $new)) {<br \/>\n                if (fm_is_valid_ext($new)) {<br \/>\n                    @fopen($path . &#8216;\/&#8217; . $new, &#8216;w&#8217;) or die(&#8216;Cannot open file:  &#8216; . $new);<br \/>\n                    fm_set_msg(sprintf(lng(&#8216;File&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;Created&#8217;), fm_enc($new)));<br \/>\n                } else {<br \/>\n                    fm_set_msg(lng(&#8216;File extension is not allowed&#8217;), &#8216;error&#8217;);<br \/>\n                }<br \/>\n            } else {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;File&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;already exists&#8217;), fm_enc($new)), &#8216;alert&#8217;);<br \/>\n            }<br \/>\n        } else {<br \/>\n            if (fm_mkdir($path . &#8216;\/&#8217; . $new, false) === true) {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Folder&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;Created&#8217;), $new));<br \/>\n            } elseif (fm_mkdir($path . &#8216;\/&#8217; . $new, false) === $path . &#8216;\/&#8217; . $new) {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Folder&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;already exists&#8217;), fm_enc($new)), &#8216;alert&#8217;);<br \/>\n            } else {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Folder&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;not created&#8217;), fm_enc($new)), &#8216;error&#8217;);<br \/>\n            }<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Invalid characters in file or folder name&#8217;), &#8216;error&#8217;);<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Copy folder \/ file<br \/>\nif (isset($_GET[&#8216;copy&#8217;], $_GET[&#8216;finish&#8217;]) &#038;&#038; !FM_READONLY) {<br \/>\n    \/\/ from<br \/>\n    $copy = urldecode($_GET[&#8216;copy&#8217;]);<br \/>\n    $copy = fm_clean_path($copy);<br \/>\n    \/\/ empty path<br \/>\n    if ($copy == &#8221;) {<br \/>\n        fm_set_msg(lng(&#8216;Source path not defined&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<br \/>\n    \/\/ abs path from<br \/>\n    $from = FM_ROOT_PATH . &#8216;\/&#8217; . $copy;<br \/>\n    \/\/ abs path to<br \/>\n    $dest = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $dest .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<br \/>\n    $dest .= &#8216;\/&#8217; . basename($from);<br \/>\n    \/\/ move?<br \/>\n    $move = isset($_GET[&#8216;move&#8217;]);<br \/>\n    $move = fm_clean_path(urldecode($move));<br \/>\n    \/\/ copy\/move\/duplicate<br \/>\n    if ($from != $dest) {<br \/>\n        $msg_from = trim(FM_PATH . &#8216;\/&#8217; . basename($from), &#8216;\/&#8217;);<br \/>\n        if ($move) { \/\/ Move and to != from so just perform move<br \/>\n            $rename = fm_rename($from, $dest);<br \/>\n            if ($rename) {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Moved from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($msg_from)));<br \/>\n            } elseif ($rename === null) {<br \/>\n                fm_set_msg(lng(&#8216;File or folder with this path already exists&#8217;), &#8216;alert&#8217;);<br \/>\n            } else {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Error while moving from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($msg_from)), &#8216;error&#8217;);<br \/>\n            }<br \/>\n        } else { \/\/ Not move and to != from so copy with original name<br \/>\n            if (fm_rcopy($from, $dest)) {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Copied from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($msg_from)));<br \/>\n            } else {<br \/>\n                fm_set_msg(sprintf(lng(&#8216;Error while copying from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($msg_from)), &#8216;error&#8217;);<br \/>\n            }<br \/>\n        }<br \/>\n    } else {<br \/>\n        if (!$move) { \/\/Not move and to = from so duplicate<br \/>\n            $msg_from = trim(FM_PATH . &#8216;\/&#8217; . basename($from), &#8216;\/&#8217;);<br \/>\n            $fn_parts = pathinfo($from);<br \/>\n            $extension_suffix = &#8221;;<br \/>\n            if (!is_dir($from)) {<br \/>\n                $extension_suffix = &#8216;.&#8217; . $fn_parts[&#8216;extension&#8217;];<br \/>\n            }<br \/>\n            \/\/Create new name for duplicate<br \/>\n            $fn_duplicate = $fn_parts[&#8216;dirname&#8217;] . &#8216;\/&#8217; . $fn_parts[&#8216;filename&#8217;] . &#8216;-&#8216; . date(&#8216;YmdHis&#8217;) . $extension_suffix;<br \/>\n            $loop_count = 0;<br \/>\n            $max_loop = 1000;<br \/>\n            \/\/ Check if a file with the duplicate name already exists, if so, make new name (edge case&#8230;)<br \/>\n            while (file_exists($fn_duplicate) &#038; $loop_count < $max_loop) {\n                $fn_parts = pathinfo($fn_duplicate);\n                $fn_duplicate = $fn_parts['dirname'] . '\/' . $fn_parts['filename'] . '-copy' . $extension_suffix;\n                $loop_count++;\n            }\n            if (fm_rcopy($from, $fn_duplicate, False)) {\n                fm_set_msg(sprintf('Copied from <b>%s<\/b> to <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($fn_duplicate)));<br \/>\n            } else {<br \/>\n                fm_set_msg(sprintf(&#8216;Error while copying from <b>%s<\/b> to <b>%s<\/b>&#8216;, fm_enc($copy), fm_enc($fn_duplicate)), &#8216;error&#8217;);<br \/>\n            }<br \/>\n        } else {<br \/>\n            fm_set_msg(lng(&#8216;Paths must be not equal&#8217;), &#8216;alert&#8217;);<br \/>\n        }<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Mass copy files\/ folders<br \/>\nif (isset($_POST[&#8216;file&#8217;], $_POST[&#8216;copy_to&#8217;], $_POST[&#8216;finish&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<\/p>\n<p>    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8216;Invalid Token.&#8217;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<\/p>\n<p>    \/\/ from<br \/>\n    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<br \/>\n    \/\/ to<br \/>\n    $copy_to_path = FM_ROOT_PATH;<br \/>\n    $copy_to = fm_clean_path($_POST[&#8216;copy_to&#8217;]);<br \/>\n    if ($copy_to != &#8221;) {<br \/>\n        $copy_to_path .= &#8216;\/&#8217; . $copy_to;<br \/>\n    }<br \/>\n    if ($path == $copy_to_path) {<br \/>\n        fm_set_msg(lng(&#8216;Paths must be not equal&#8217;), &#8216;alert&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<br \/>\n    if (!is_dir($copy_to_path)) {<br \/>\n        if (!fm_mkdir($copy_to_path, true)) {<br \/>\n            fm_set_msg(lng(&#8216;Unable to create destination folder&#8217;), &#8216;error&#8217;);<br \/>\n            $FM_PATH = FM_PATH;<br \/>\n            fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ move?<br \/>\n    $move = isset($_POST[&#8216;move&#8217;]);<br \/>\n    \/\/ copy\/move<br \/>\n    $errors = 0;<br \/>\n    $files = $_POST[&#8216;file&#8217;];<br \/>\n    if (is_array($files) &#038;&#038; count($files)) {<br \/>\n        foreach ($files as $f) {<br \/>\n            if ($f != &#8221;) {<br \/>\n                $f = fm_clean_path($f);<br \/>\n                \/\/ abs path from<br \/>\n                $from = $path . &#8216;\/&#8217; . $f;<br \/>\n                \/\/ abs path to<br \/>\n                $dest = $copy_to_path . &#8216;\/&#8217; . $f;<br \/>\n                \/\/ do<br \/>\n                if ($move) {<br \/>\n                    $rename = fm_rename($from, $dest);<br \/>\n                    if ($rename === false) {<br \/>\n                        $errors++;<br \/>\n                    }<br \/>\n                } else {<br \/>\n                    if (!fm_rcopy($from, $dest)) {<br \/>\n                        $errors++;<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n        if ($errors == 0) {<br \/>\n            $msg = $move ? lng(&#8216;Selected files and folders moved&#8217;) : lng(&#8216;Selected files and folders copied&#8217;);<br \/>\n            fm_set_msg($msg);<br \/>\n        } else {<br \/>\n            $msg = $move ? lng(&#8216;Error while moving items&#8217;) : lng(&#8216;Error while copying items&#8217;);<br \/>\n            fm_set_msg($msg, &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Nothing selected&#8217;), &#8216;alert&#8217;);<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Rename<br \/>\nif (isset($_POST[&#8216;rename_from&#8217;], $_POST[&#8216;rename_to&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<br \/>\n    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<br \/>\n    \/\/ old name<br \/>\n    $old = urldecode($_POST[&#8216;rename_from&#8217;]);<br \/>\n    $old = fm_clean_path($old);<br \/>\n    $old = str_replace(&#8216;\/&#8217;, &#8221;, $old);<br \/>\n    \/\/ new name<br \/>\n    $new = urldecode($_POST[&#8216;rename_to&#8217;]);<br \/>\n    $new = fm_clean_path(strip_tags($new));<br \/>\n    $new = str_replace(&#8216;\/&#8217;, &#8221;, $new);<br \/>\n    \/\/ path<br \/>\n    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<br \/>\n    \/\/ rename<br \/>\n    if (fm_isvalid_filename($new) &#038;&#038; $old != &#8221; &#038;&#038; $new != &#8221;) {<br \/>\n        if (fm_rename($path . &#8216;\/&#8217; . $old, $path . &#8216;\/&#8217; . $new)) {<br \/>\n            fm_set_msg(sprintf(lng(&#8216;Renamed from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($old), fm_enc($new)));<br \/>\n        } else {<br \/>\n            fm_set_msg(sprintf(lng(&#8216;Error while renaming from&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;to&#8217;) . &#8216; <b>%s<\/b>&#8216;, fm_enc($old), fm_enc($new)), &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Invalid characters in file name&#8217;), &#8216;error&#8217;);<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Download<br \/>\nif (isset($_GET[&#8216;dl&#8217;], $_POST[&#8216;token&#8217;])) {<br \/>\n    \/\/ Verify the token to ensure it&#8217;s valid<br \/>\n    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        exit;<br \/>\n    }<\/p>\n<p>    \/\/ Clean the download file path<br \/>\n    $dl = urldecode($_GET[&#8216;dl&#8217;]);<br \/>\n    $dl = fm_clean_path($dl);<br \/>\n    $dl = str_replace(&#8216;\/&#8217;, &#8221;, $dl); \/\/ Prevent directory traversal attacks<\/p>\n<p>    \/\/ Define the file path<br \/>\n    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    \/\/ Check if the file exists and is valid<br \/>\n    if ($dl != &#8221; &#038;&#038; is_file($path . &#8216;\/&#8217; . $dl)) {<br \/>\n        \/\/ Close the session to prevent session locking<br \/>\n        if (session_status() === PHP_SESSION_ACTIVE) {<br \/>\n            session_write_close();<br \/>\n        }<\/p>\n<p>        \/\/ Call the download function<br \/>\n        fm_download_file($path . &#8216;\/&#8217; . $dl, $dl, 1024); \/\/ Download with a buffer size of 1024 bytes<br \/>\n        exit;<br \/>\n    } else {<br \/>\n        \/\/ Handle the case where the file is not found<br \/>\n        fm_set_msg(lng(&#8216;File not found&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ Upload<br \/>\nif (!empty($_FILES) &#038;&#038; !FM_READONLY) {<br \/>\n    if (isset($_POST[&#8216;token&#8217;])) {<br \/>\n        if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n            $response = array(&#8216;status&#8217; => &#8216;error&#8217;, &#8216;info&#8217; => lng(&#8220;Invalid Token.&#8221;));<br \/>\n            echo json_encode($response);<br \/>\n            exit();<br \/>\n        }<br \/>\n    } else {<br \/>\n        $response = array(&#8216;status&#8217; => &#8216;error&#8217;, &#8216;info&#8217; => &#8220;Token Missing.&#8221;);<br \/>\n        echo json_encode($response);<br \/>\n        exit();<br \/>\n    }<\/p>\n<p>    $chunkIndex = $_POST[&#8216;dzchunkindex&#8217;];<br \/>\n    $chunkTotal = $_POST[&#8216;dztotalchunkcount&#8217;];<br \/>\n    $fullPathInput = fm_clean_path($_REQUEST[&#8216;fullpath&#8217;]);<\/p>\n<p>    $f = $_FILES;<br \/>\n    $path = FM_ROOT_PATH;<br \/>\n    $ds = DIRECTORY_SEPARATOR;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    $errors = 0;<br \/>\n    $uploads = 0;<br \/>\n    $allowed = (FM_UPLOAD_EXTENSION) ? explode(&#8216;,&#8217;, FM_UPLOAD_EXTENSION) : false;<br \/>\n    $response = array(<br \/>\n        &#8216;status&#8217; => &#8216;error&#8217;,<br \/>\n        &#8216;info&#8217;   => &#8216;Oops! Try again&#8217;<br \/>\n    );<\/p>\n<p>    $filename = $f[&#8216;file&#8217;][&#8216;name&#8217;];<br \/>\n    $tmp_name = $f[&#8216;file&#8217;][&#8216;tmp_name&#8217;];<br \/>\n    $ext = pathinfo($filename, PATHINFO_FILENAME) != &#8221; ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : &#8221;;<br \/>\n    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;<\/p>\n<p>    if (!fm_isvalid_filename($filename) &#038;&#038; !fm_isvalid_filename($fullPathInput)) {<br \/>\n        $response = array(<br \/>\n            &#8216;status&#8217;    => &#8216;error&#8217;,<br \/>\n            &#8216;info&#8217;      => &#8220;Invalid File name!&#8221;,<br \/>\n        );<br \/>\n        echo json_encode($response);<br \/>\n        exit();<br \/>\n    }<\/p>\n<p>    $targetPath = $path . $ds;<br \/>\n    if (is_writable($targetPath)) {<br \/>\n        $fullPath = $path . &#8216;\/&#8217; . $fullPathInput;<br \/>\n        $folder = substr($fullPath, 0, strrpos($fullPath, &#8220;\/&#8221;));<\/p>\n<p>        if (!is_dir($folder)) {<br \/>\n            $old = umask(0);<br \/>\n            mkdir($folder, 0777, true);<br \/>\n            umask($old);<br \/>\n        }<\/p>\n<p>        if (empty($f[&#8216;file&#8217;][&#8216;error&#8217;]) &#038;&#038; !empty($tmp_name) &#038;&#038; $tmp_name != &#8216;none&#8217; &#038;&#038; $isFileAllowed) {<br \/>\n            if ($chunkTotal) {<br \/>\n                $out = @fopen(&#8220;{$fullPath}.part&#8221;, $chunkIndex == 0 ? &#8220;wb&#8221; : &#8220;ab&#8221;);<br \/>\n                if ($out) {<br \/>\n                    $in = @fopen($tmp_name, &#8220;rb&#8221;);<br \/>\n                    if ($in) {<br \/>\n                        if (PHP_VERSION_ID < 80009) {\n                            \/\/ workaround https:\/\/bugs.php.net\/bug.php?id=81145\n                            do {\n                                for (;;) {\n                                    $buff = fread($in, 4096);\n                                    if ($buff === false || $buff === '') {\n                                        break;\n                                    }\n                                    fwrite($out, $buff);\n                                }\n                            } while (!feof($in));\n                        } else {\n                            stream_copy_to_stream($in, $out);\n                        }\n                        $response = array(\n                            'status'    => &#8216;success&#8217;,<br \/>\n                            &#8216;info&#8217; => &#8220;file upload successful&#8221;<br \/>\n                        );<br \/>\n                    } else {<br \/>\n                        $response = array(<br \/>\n                            &#8216;status&#8217;    => &#8216;error&#8217;,<br \/>\n                            &#8216;info&#8217; => &#8220;failed to open output stream&#8221;,<br \/>\n                            &#8216;errorDetails&#8217; => error_get_last()<br \/>\n                        );<br \/>\n                    }<br \/>\n                    @fclose($in);<br \/>\n                    @fclose($out);<br \/>\n                    @unlink($tmp_name);<\/p>\n<p>                    $response = array(<br \/>\n                        &#8216;status&#8217;    => &#8216;success&#8217;,<br \/>\n                        &#8216;info&#8217; => &#8220;file upload successful&#8221;<br \/>\n                    );<br \/>\n                } else {<br \/>\n                    $response = array(<br \/>\n                        &#8216;status&#8217;    => &#8216;error&#8217;,<br \/>\n                        &#8216;info&#8217; => &#8220;failed to open output stream&#8221;<br \/>\n                    );<br \/>\n                }<\/p>\n<p>                if ($chunkIndex == $chunkTotal &#8211; 1) {<br \/>\n                    if (file_exists($fullPath)) {<br \/>\n                        $ext_1 = $ext ? &#8216;.&#8217; . $ext : &#8221;;<br \/>\n                        $fullPathTarget = $path . &#8216;\/&#8217; . basename($fullPathInput, $ext_1) . &#8216;_&#8217; . date(&#8216;ymdHis&#8217;) . $ext_1;<br \/>\n                    } else {<br \/>\n                        $fullPathTarget = $fullPath;<br \/>\n                    }<br \/>\n                    rename(&#8220;{$fullPath}.part&#8221;, $fullPathTarget);<br \/>\n                }<br \/>\n            } else if (move_uploaded_file($tmp_name, $fullPath)) {<br \/>\n                \/\/ Be sure that the file has been uploaded<br \/>\n                if (file_exists($fullPath)) {<br \/>\n                    $response = array(<br \/>\n                        &#8216;status&#8217;    => &#8216;success&#8217;,<br \/>\n                        &#8216;info&#8217; => &#8220;file upload successful&#8221;<br \/>\n                    );<br \/>\n                } else {<br \/>\n                    $response = array(<br \/>\n                        &#8216;status&#8217; => &#8216;error&#8217;,<br \/>\n                        &#8216;info&#8217;   => &#8216;Couldn\\&#8217;t upload the requested file.&#8217;<br \/>\n                    );<br \/>\n                }<br \/>\n            } else {<br \/>\n                $response = array(<br \/>\n                    &#8216;status&#8217;    => &#8216;error&#8217;,<br \/>\n                    &#8216;info&#8217;      => &#8220;Error while uploading files. Uploaded files $uploads&#8221;,<br \/>\n                );<br \/>\n            }<br \/>\n        }<br \/>\n    } else {<br \/>\n        $response = array(<br \/>\n            &#8216;status&#8217; => &#8216;error&#8217;,<br \/>\n            &#8216;info&#8217;   => &#8216;The specified folder for upload isn\\&#8217;t writeable.&#8217;<br \/>\n        );<br \/>\n    }<br \/>\n    \/\/ Return the response<br \/>\n    echo json_encode($response);<br \/>\n    exit();<br \/>\n}<\/p>\n<p>\/\/ Mass deleting<br \/>\nif (isset($_POST[&#8216;group&#8217;], $_POST[&#8216;delete&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<\/p>\n<p>    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<\/p>\n<p>    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    $errors = 0;<br \/>\n    $files = $_POST[&#8216;file&#8217;];<br \/>\n    if (is_array($files) &#038;&#038; count($files)) {<br \/>\n        foreach ($files as $f) {<br \/>\n            if ($f != &#8221;) {<br \/>\n                $new_path = $path . &#8216;\/&#8217; . $f;<br \/>\n                if (!fm_rdelete($new_path)) {<br \/>\n                    $errors++;<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n        if ($errors == 0) {<br \/>\n            fm_set_msg(lng(&#8216;Selected files and folder deleted&#8217;));<br \/>\n        } else {<br \/>\n            fm_set_msg(lng(&#8216;Error while deleting items&#8217;), &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Nothing selected&#8217;), &#8216;alert&#8217;);<br \/>\n    }<\/p>\n<p>    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Pack files zip, tar<br \/>\nif (isset($_POST[&#8216;group&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; (isset($_POST[&#8216;zip&#8217;]) || isset($_POST[&#8216;tar&#8217;])) &#038;&#038; !FM_READONLY) {<\/p>\n<p>    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<\/p>\n<p>    $path = FM_ROOT_PATH;<br \/>\n    $ext = &#8216;zip&#8217;;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    \/\/set pack type<br \/>\n    $ext = isset($_POST[&#8216;tar&#8217;]) ? &#8216;tar&#8217; : &#8216;zip&#8217;;<\/p>\n<p>    if (($ext == &#8220;zip&#8221; &#038;&#038; !class_exists(&#8216;ZipArchive&#8217;)) || ($ext == &#8220;tar&#8221; &#038;&#038; !class_exists(&#8216;PharData&#8217;))) {<br \/>\n        fm_set_msg(lng(&#8216;Operations with archives are not available&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<\/p>\n<p>    $files = $_POST[&#8216;file&#8217;];<br \/>\n    $sanitized_files = array();<\/p>\n<p>    \/\/ clean path<br \/>\n    foreach ($files as $file) {<br \/>\n        array_push($sanitized_files, fm_clean_path($file));<br \/>\n    }<\/p>\n<p>    $files = $sanitized_files;<\/p>\n<p>    if (!empty($files)) {<br \/>\n        chdir($path);<\/p>\n<p>        if (count($files) == 1) {<br \/>\n            $one_file = reset($files);<br \/>\n            $one_file = basename($one_file);<br \/>\n            $zipname = $one_file . &#8216;_&#8217; . date(&#8216;ymd_His&#8217;) . &#8216;.&#8217; . $ext;<br \/>\n        } else {<br \/>\n            $zipname = &#8216;archive_&#8217; . date(&#8216;ymd_His&#8217;) . &#8216;.&#8217; . $ext;<br \/>\n        }<\/p>\n<p>        if ($ext == &#8216;zip&#8217;) {<br \/>\n            $zipper = new FM_Zipper();<br \/>\n            $res = $zipper->create($zipname, $files);<br \/>\n        } elseif ($ext == &#8216;tar&#8217;) {<br \/>\n            $tar = new FM_Zipper_Tar();<br \/>\n            $res = $tar->create($zipname, $files);<br \/>\n        }<\/p>\n<p>        if ($res) {<br \/>\n            fm_set_msg(sprintf(lng(&#8216;Archive&#8217;) . &#8216; <b>%s<\/b> &#8216; . lng(&#8216;Created&#8217;), fm_enc($zipname)));<br \/>\n        } else {<br \/>\n            fm_set_msg(lng(&#8216;Archive not created&#8217;), &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Nothing selected&#8217;), &#8216;alert&#8217;);<br \/>\n    }<\/p>\n<p>    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Unpack zip, tar<br \/>\nif (isset($_POST[&#8216;unzip&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY) {<\/p>\n<p>    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<\/p>\n<p>    $unzip = urldecode($_POST[&#8216;unzip&#8217;]);<br \/>\n    $unzip = fm_clean_path($unzip);<br \/>\n    $unzip = str_replace(&#8216;\/&#8217;, &#8221;, $unzip);<br \/>\n    $isValid = false;<\/p>\n<p>    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    if ($unzip != &#8221; &#038;&#038; is_file($path . &#8216;\/&#8217; . $unzip)) {<br \/>\n        $zip_path = $path . &#8216;\/&#8217; . $unzip;<br \/>\n        $ext = pathinfo($zip_path, PATHINFO_EXTENSION);<br \/>\n        $isValid = true;<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;File not found&#8217;), &#8216;error&#8217;);<br \/>\n    }<\/p>\n<p>    if (($ext == &#8220;zip&#8221; &#038;&#038; !class_exists(&#8216;ZipArchive&#8217;)) || ($ext == &#8220;tar&#8221; &#038;&#038; !class_exists(&#8216;PharData&#8217;))) {<br \/>\n        fm_set_msg(lng(&#8216;Operations with archives are not available&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<\/p>\n<p>    if ($isValid) {<br \/>\n        \/\/to folder<br \/>\n        $tofolder = &#8221;;<br \/>\n        if (isset($_POST[&#8216;tofolder&#8217;])) {<br \/>\n            $tofolder = pathinfo($zip_path, PATHINFO_FILENAME);<br \/>\n            if (fm_mkdir($path . &#8216;\/&#8217; . $tofolder, true)) {<br \/>\n                $path .= &#8216;\/&#8217; . $tofolder;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        if ($ext == &#8220;zip&#8221;) {<br \/>\n            $zipper = new FM_Zipper();<br \/>\n            $res = $zipper->unzip($zip_path, $path);<br \/>\n        } elseif ($ext == &#8220;tar&#8221;) {<br \/>\n            try {<br \/>\n                $gzipper = new PharData($zip_path);<br \/>\n                if (@$gzipper->extractTo($path, null, true)) {<br \/>\n                    $res = true;<br \/>\n                } else {<br \/>\n                    $res = false;<br \/>\n                }<br \/>\n            } catch (Exception $e) {<br \/>\n                \/\/TODO:: need to handle the error<br \/>\n                $res = true;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        if ($res) {<br \/>\n            fm_set_msg(lng(&#8216;Archive unpacked&#8217;));<br \/>\n        } else {<br \/>\n            fm_set_msg(lng(&#8216;Archive not unpacked&#8217;), &#8216;error&#8217;);<br \/>\n        }<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;File not found&#8217;), &#8216;error&#8217;);<br \/>\n    }<br \/>\n    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/\/ Change Perms (not for Windows)<br \/>\nif (isset($_POST[&#8216;chmod&#8217;], $_POST[&#8216;token&#8217;]) &#038;&#038; !FM_READONLY &#038;&#038; !FM_IS_WIN) {<\/p>\n<p>    if (!verifyToken($_POST[&#8216;token&#8217;])) {<br \/>\n        fm_set_msg(lng(&#8220;Invalid Token.&#8221;), &#8216;error&#8217;);<br \/>\n        die(&#8220;Invalid Token.&#8221;);<br \/>\n    }<\/p>\n<p>    $path = FM_ROOT_PATH;<br \/>\n    if (FM_PATH != &#8221;) {<br \/>\n        $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n    }<\/p>\n<p>    $file = $_POST[&#8216;chmod&#8217;];<br \/>\n    $file = fm_clean_path($file);<br \/>\n    $file = str_replace(&#8216;\/&#8217;, &#8221;, $file);<br \/>\n    if ($file == &#8221; || (!is_file($path . &#8216;\/&#8217; . $file) &#038;&#038; !is_dir($path . &#8216;\/&#8217; . $file))) {<br \/>\n        fm_set_msg(lng(&#8216;File not found&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n    }<\/p>\n<p>    $mode = 0;<br \/>\n    if (!empty($_POST[&#8216;ur&#8217;])) {<br \/>\n        $mode |= 0400;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;uw&#8217;])) {<br \/>\n        $mode |= 0200;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;ux&#8217;])) {<br \/>\n        $mode |= 0100;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;gr&#8217;])) {<br \/>\n        $mode |= 0040;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;gw&#8217;])) {<br \/>\n        $mode |= 0020;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;gx&#8217;])) {<br \/>\n        $mode |= 0010;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;or&#8217;])) {<br \/>\n        $mode |= 0004;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;ow&#8217;])) {<br \/>\n        $mode |= 0002;<br \/>\n    }<br \/>\n    if (!empty($_POST[&#8216;ox&#8217;])) {<br \/>\n        $mode |= 0001;<br \/>\n    }<\/p>\n<p>    if (@chmod($path . &#8216;\/&#8217; . $file, $mode)) {<br \/>\n        fm_set_msg(lng(&#8216;Permissions changed&#8217;));<br \/>\n    } else {<br \/>\n        fm_set_msg(lng(&#8216;Permissions not changed&#8217;), &#8216;error&#8217;);<br \/>\n    }<\/p>\n<p>    $FM_PATH = FM_PATH;<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n}<\/p>\n<p>\/*************************** ACTIONS ***************************\/<\/p>\n<p>\/\/ get current path<br \/>\n$path = FM_ROOT_PATH;<br \/>\nif (FM_PATH != &#8221;) {<br \/>\n    $path .= &#8216;\/&#8217; . FM_PATH;<br \/>\n}<\/p>\n<p>\/\/ check path<br \/>\nif (!is_dir($path)) {<br \/>\n    fm_redirect(FM_SELF_URL . &#8216;?p=&#8217;);<br \/>\n}<\/p>\n<p>\/\/ get parent folder<br \/>\n$parent = fm_get_parent_path(FM_PATH);<\/p>\n<p>$objects = is_readable($path) ? scandir($path) : array();<br \/>\n$folders = array();<br \/>\n$files = array();<br \/>\n$current_path = array_slice(explode(&#8220;\/&#8221;, $path), -1)[0];<br \/>\nif (is_array($objects) &#038;&#038; fm_is_exclude_items($current_path, $path)) {<br \/>\n    foreach ($objects as $file) {<br \/>\n        if ($file == &#8216;.&#8217; || $file == &#8216;..&#8217;) {<br \/>\n            continue;<br \/>\n        }<br \/>\n        if (!FM_SHOW_HIDDEN &#038;&#038; substr($file, 0, 1) === &#8216;.&#8217;) {<br \/>\n            continue;<br \/>\n        }<br \/>\n        $new_path = $path . &#8216;\/&#8217; . $file;<br \/>\n        if (@is_file($new_path) &#038;&#038; fm_is_exclude_items($file, $new_path)) {<br \/>\n            $files[] = $file;<br \/>\n        } elseif (@is_dir($new_path) &#038;&#038; $file != &#8216;.&#8217; &#038;&#038; $file != &#8216;..&#8217; &#038;&#038; fm_is_exclude_items($file, $new_path)) {<br \/>\n            $folders[] = $file;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>if (!empty($files)) {<br \/>\n    natcasesort($files);<br \/>\n}<br \/>\nif (!empty($folders)) {<br \/>\n    natcasesort($folders);<br \/>\n}<\/p>\n<p>\/\/ upload form<br \/>\nif (isset($_GET[&#8216;upload&#8217;]) &#038;&#038; !FM_READONLY) {<br \/>\n    fm_show_header(); \/\/ HEADER<br \/>\n    fm_show_nav_path(FM_PATH); \/\/ current path<br \/>\n    \/\/get the allowed file extensions<br \/>\n    function getUploadExt()<br \/>\n    {<br \/>\n        $extArr = explode(&#8216;,&#8217;, FM_UPLOAD_EXTENSION);<br \/>\n        if (FM_UPLOAD_EXTENSION &#038;&#038; $extArr) {<br \/>\n            array_walk($extArr, function (&#038;$x) {<br \/>\n                $x = &#8220;.$x&#8221;;<br \/>\n            });<br \/>\n            return implode(&#8216;,&#8217;, $extArr);<br \/>\n        }<br \/>\n        return &#8221;;<br \/>\n    }<br \/>\n    ?><br \/>\n    <?php print_external('css-dropzone'); ?><\/p>\n<div class=\"path\">\n<div class=\"card mb-2 fm-upload-wrapper\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"card-header\">\n<ul class=\"nav nav-tabs card-header-tabs\">\n<li class=\"nav-item\">\n                        <a class=\"nav-link active\" href=\"#fileUploader\" data-target=\"#fileUploader\"><i class=\"fa fa-arrow-circle-o-up\"><\/i> <?php echo lng('UploadingFiles') ?><\/a>\n                    <\/li>\n<li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#urlUploader\" class=\"js-url-upload\" data-target=\"#urlUploader\"><i class=\"fa fa-link\"><\/i> <?php echo lng('Upload from URL') ?><\/a>\n                    <\/li>\n<\/ul><\/div>\n<div class=\"card-body\">\n<p class=\"card-text\">\n                    <a href=\"?p=<?php echo FM_PATH ?>&#8221; class=&#8221;float-right&#8221;><i class=\"fa fa-chevron-circle-left go-back\"><\/i> <?php echo lng('Back') ?><\/a><br \/>\n                    <strong><?php echo lng('DestinationFolder') ?><\/strong>: <?php echo fm_enc(fm_convert_win(FM_PATH)) ?>\n                <\/p>\n<form action=\"<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fm_enc(FM_PATH) ?>&#8221; class=&#8221;dropzone card-tabs-container&#8221; id=&#8221;fileUploader&#8221; enctype=&#8221;multipart\/form-data&#8221;><br \/>\n                    <input type=\"hidden\" name=\"p\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;><br \/>\n                    <input type=\"hidden\" name=\"fullpath\" id=\"fullpath\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;><br \/>\n                    <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><\/p>\n<div class=\"fallback\">\n                        <input name=\"file\" type=\"file\" multiple \/>\n                    <\/div>\n<\/p><\/form>\n<div class=\"upload-url-wrapper card-tabs-container hidden\" id=\"urlUploader\">\n<form id=\"js-form-url-upload\" class=\"row row-cols-lg-auto g-3 align-items-center\" onsubmit=\"return upload_from_url(this);\" method=\"POST\" action=\"\">\n                        <input type=\"hidden\" name=\"type\" value=\"upload\" aria-label=\"hidden\" aria-hidden=\"true\"><br \/>\n                        <input type=\"url\" placeholder=\"URL\" name=\"uploadurl\" required class=\"form-control\" style=\"width: 80%\"><br \/>\n                        <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                        <button type=\"submit\" class=\"btn btn-primary ms-3\"><?php echo lng('Upload') ?><\/button><\/p>\n<div class=\"lds-facebook\">\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<\/p><\/div>\n<\/p><\/form>\n<div id=\"js-url-upload__list\" class=\"col-9 mt-3\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>    <?php print_external('js-dropzone'); ?><br \/>\n    <script>\n        Dropzone.options.fileUploader = {\n            chunking: true,\n            chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,\n            forceChunking: true,\n            retryChunks: true,\n            retryChunksLimit: 3,\n            parallelUploads: 1,\n            parallelChunkUploads: false,\n            timeout: 120000,\n            maxFilesize: \"<?php echo MAX_UPLOAD_SIZE; ?>\",\n            acceptedFiles: \"<?php echo getUploadExt() ?>\",\n            init: function() {\n                this.on(\"sending\", function(file, xhr, formData) {\n                    let _path = (file.fullPath) ? file.fullPath : file.name;\n                    document.getElementById(\"fullpath\").value = _path;\n                    xhr.ontimeout = (function() {\n                        toast('Error: Server Timeout');\n                    });\n                }).on(\"success\", function(res) {\n                    try {\n                        let _response = JSON.parse(res.xhr.response);<\/p>\n<p>                        if (_response.status == \"error\") {\n                            toast(_response.info);\n                        }\n                    } catch (e) {\n                        toast(\"Error: Invalid JSON response\");\n                    }\n                }).on(\"error\", function(file, response) {\n                    toast(response);\n                });\n            }\n        }\n    <\/script><br \/>\n<?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ copy form POST\nif (isset($_POST['copy']) &#038;&#038; !FM_READONLY) {\n    $copy_files = isset($_POST['file']) ? $_POST['file'] : null;\n    if (!is_array($copy_files) || empty($copy_files)) {\n        fm_set_msg(lng('Nothing selected'), 'alert');\n        $FM_PATH = FM_PATH;\n        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n    }\n\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n?><\/p>\n<div class=\"path\">\n<div class=\"card\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"card-header\">\n<h6><?php echo lng('Copying') ?><\/h6>\n<\/p><\/div>\n<div class=\"card-body\">\n<form action=\"\" method=\"post\">\n                    <input type=\"hidden\" name=\"p\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;><br \/>\n                    <input type=\"hidden\" name=\"finish\" value=\"1\"><br \/>\n                    <?php\n                    foreach ($copy_files as $cf) {\n                        echo '<input type=\"hidden\" name=\"file[]\" value=\"' . fm_enc($cf) . '\">&#8216; . PHP_EOL;<br \/>\n                    }<br \/>\n                    ?><\/p>\n<p class=\"break-word\"><strong><?php echo lng('Files') ?><\/strong>: <b><?php echo implode('<\/b>, <b>&#8216;, $copy_files) ?><\/b><\/p>\n<p class=\"break-word\"><strong><?php echo lng('SourceFolder') ?><\/strong>: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '\/' . FM_PATH)) ?><br \/>\n                        <label for=\"inp_copy_to\"><strong><?php echo lng('DestinationFolder') ?><\/strong>:<\/label><br \/>\n                        <?php echo FM_ROOT_PATH ?>\/<input type=\"text\" name=\"copy_to\" id=\"inp_copy_to\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;>\n                    <\/p>\n<p class=\"custom-checkbox custom-control\"><input type=\"checkbox\" name=\"move\" value=\"1\" id=\"js-move-files\" class=\"custom-control-input\"><br \/>\n                        <label for=\"js-move-files\" class=\"custom-control-label ms-2\"><?php echo lng('Move') ?><\/label>\n                    <\/p>\n<p>\n                        <b><a href=\"?p=<?php echo urlencode(FM_PATH) ?>&#8221; class=&#8221;btn btn-outline-danger&#8221;><i class=\"fa fa-times-circle\"><\/i> <?php echo lng('Cancel') ?><\/a><\/b>&nbsp;<br \/>\n                        <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                        <button type=\"submit\" class=\"btn btn-success\"><i class=\"fa fa-check-circle\"><\/i> <?php echo lng('Copy') ?><\/button>\n                    <\/p>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ copy form\nif (isset($_GET['copy']) &#038;&#038; !isset($_GET['finish']) &#038;&#038; !FM_READONLY) {\n    $copy = $_GET['copy'];\n    $copy = fm_clean_path($copy);\n    if ($copy == '' || !file_exists(FM_ROOT_PATH . '\/' . $copy)) {\n        fm_set_msg(lng('File not found'), 'error');\n        $FM_PATH = FM_PATH;\n        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n    }\n\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n?><\/p>\n<div class=\"path\">\n<p><b>Copying<\/b><\/p>\n<p class=\"break-word\">\n            <strong>Source path:<\/strong> <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '\/' . $copy)) ?><br \/>\n            <strong>Destination folder:<\/strong> <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '\/' . FM_PATH)) ?>\n        <\/p>\n<p>\n            <b><a href=\"?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&#8243;><i class=\"fa fa-check-circle\"><\/i> Copy<\/a><\/b> &nbsp;<br \/>\n            <b><a href=\"?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&amp;move=1&#8243;><i class=\"fa fa-check-circle\"><\/i> Move<\/a><\/b> &nbsp;<br \/>\n            <b><a href=\"?p=<?php echo urlencode(FM_PATH) ?>&#8221; class=&#8221;text-danger&#8221;><i class=\"fa fa-times-circle\"><\/i> Cancel<\/a><\/b>\n        <\/p>\n<p><i><?php echo lng('Select folder') ?><\/i><\/p>\n<ul class=\"folders break-word\">\n            <?php\n            if ($parent !== false) {\n            ?><\/p>\n<li><a href=\"?p=<?php echo urlencode($parent) ?>&amp;copy=<?php echo urlencode($copy) ?>&#8220;><i class=\"fa fa-chevron-circle-left\"><\/i> ..<\/a><\/li>\n<p>            <?php\n            }\n            foreach ($folders as $f) {\n            ?><\/p>\n<li>\n                    <a href=\"?p=<?php echo urlencode(trim(FM_PATH . '\/' . $f, '\/')) ?>&amp;copy=<?php echo urlencode($copy) ?>&#8220;><i class=\"fa fa-folder-o\"><\/i> <?php echo fm_convert_win($f) ?><\/a>\n                <\/li>\n<p>            <?php\n            }\n            ?>\n        <\/ul>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\nif (isset($_GET['settings']) &#038;&#038; !FM_READONLY) {\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n    global $cfg, $lang, $lang_list;\n?><\/p>\n<div class=\"col-md-8 offset-md-2 pt-3\">\n<div class=\"card mb-2\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<h6 class=\"card-header d-flex justify-content-between\">\n                <span><i class=\"fa fa-cog\"><\/i> <?php echo lng('Settings') ?><\/span><br \/>\n                <a href=\"?p=<?php echo FM_PATH ?>&#8221; class=&#8221;text-danger&#8221;><i class=\"fa fa-times-circle-o\"><\/i> <?php echo lng('Cancel') ?><\/a><br \/>\n            <\/h6>\n<div class=\"card-body\">\n<form id=\"js-settings-form\" action=\"\" method=\"post\" data-type=\"ajax\" onsubmit=\"return save_settings(this)\">\n                    <input type=\"hidden\" name=\"type\" value=\"settings\" aria-label=\"hidden\" aria-hidden=\"true\"><\/p>\n<div class=\"form-group row\">\n                        <label for=\"js-language\" class=\"col-sm-3 col-form-label\"><?php echo lng('Language') ?><\/label><\/p>\n<div class=\"col-sm-5\">\n                            <select class=\"form-select\" id=\"js-language\" name=\"js-language\"><br \/>\n                                <?php\n                                function getSelected($l)\n                                {\n                                    global $lang;\n                                    return ($lang == $l) ? 'selected' : '';\n                                }\n                                foreach ($lang_list as $k => $v) {<br \/>\n                                    echo &#8220;<option value='$k' \" . getSelected($k) . \">$v<\/option>&#8220;;<br \/>\n                                }<br \/>\n                                ?><br \/>\n                            <\/select>\n                        <\/div>\n<\/p><\/div>\n<div class=\"mt-3 mb-3 row \">\n                        <label for=\"js-error-report\" class=\"col-sm-3 col-form-label\"><?php echo lng('ErrorReporting') ?><\/label><\/p>\n<div class=\"col-sm-9\">\n<div class=\"form-check form-switch\">\n                                <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"js-error-report\" name=\"js-error-report\" value=\"true\" <?php echo $report_errors ? 'checked' : ''; ?> \/>\n                            <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"mb-3 row\">\n                        <label for=\"js-show-hidden\" class=\"col-sm-3 col-form-label\"><?php echo lng('ShowHiddenFiles') ?><\/label><\/p>\n<div class=\"col-sm-9\">\n<div class=\"form-check form-switch\">\n                                <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"js-show-hidden\" name=\"js-show-hidden\" value=\"true\" <?php echo $show_hidden_files ? 'checked' : ''; ?> \/>\n                            <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"mb-3 row\">\n                        <label for=\"js-hide-cols\" class=\"col-sm-3 col-form-label\"><?php echo lng('HideColumns') ?><\/label><\/p>\n<div class=\"col-sm-9\">\n<div class=\"form-check form-switch\">\n                                <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"js-hide-cols\" name=\"js-hide-cols\" value=\"true\" <?php echo $hide_Cols ? 'checked' : ''; ?> \/>\n                            <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"mb-3 row\">\n                        <label for=\"js-3-1\" class=\"col-sm-3 col-form-label\"><?php echo lng('Theme') ?><\/label><\/p>\n<div class=\"col-sm-5\">\n                            <select class=\"form-select w-100 text-capitalize\" id=\"js-3-0\" name=\"js-theme-3\"><option value='light' <?php if ($theme == \"light\") {\n                                                            echo \"selected\";\n                                                        } ?>><br \/>\n                                    <?php echo lng('light') ?><br \/>\n                                <\/option><option value='dark' <?php if ($theme == \"dark\") {\n                                                            echo \"selected\";\n                                                        } ?>><br \/>\n                                    <?php echo lng('dark') ?><br \/>\n                                <\/option><\/select>\n                        <\/div>\n<\/p><\/div>\n<div class=\"mb-3 row\">\n<div class=\"col-sm-10\">\n                            <button type=\"submit\" class=\"btn btn-success\"> <i class=\"fa fa-check-circle\"><\/i> <?php echo lng('Save'); ?><\/button>\n                        <\/div>\n<\/p><\/div>\n<p>                    <small class=\"text-body-secondary\">* <?php echo lng('Sometimes the save action may not work on the first try, so please attempt it again') ?>.<\/small><br \/>\n                <\/form>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\nif (isset($_GET['help'])) {\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n    global $cfg, $lang;\n?><\/p>\n<div class=\"col-md-8 offset-md-2 pt-3\">\n<div class=\"card mb-2\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<h6 class=\"card-header d-flex justify-content-between\">\n                <span><i class=\"fa fa-exclamation-circle\"><\/i> <?php echo lng('Help') ?><\/span><br \/>\n                <a href=\"?p=<?php echo FM_PATH ?>&#8221; class=&#8221;text-danger&#8221;><i class=\"fa fa-times-circle-o\"><\/i> <?php echo lng('Cancel') ?><\/a><br \/>\n            <\/h6>\n<div class=\"card-body\">\n<div class=\"row\">\n<div class=\"col-xs-12 col-sm-6\">\n<p><h3><a href=\"https:\/\/github.com\/prasathmani\/tinyfilemanager\" target=\"_blank\" class=\"app-v-title\"> <?php echo lng(\"AppName\").\" \".VERSION; ?><\/a><\/h3>\n<\/p>\n<p><strong><?php echo lng('Author') ?><\/strong>: PRA\u015aATH MAN\u0130<\/p>\n<p><strong><?php echo lng('Mail Us') ?><\/strong>: <a href=\"mailto:ccpprogrammers@gmail.com\">ccpprogrammers [at] gmail [dot] com<\/a><\/p>\n<\/p><\/div>\n<div class=\"col-xs-12 col-sm-6\">\n<div class=\"card\">\n<ul class=\"list-group list-group-flush\">\n<li class=\"list-group-item\"><a href=\"https:\/\/github.com\/prasathmani\/tinyfilemanager\/wiki\" target=\"_blank\"><i class=\"fa fa-question-circle\"><\/i> <?php echo lng('Help Documents') ?> <\/a> <\/li>\n<li class=\"list-group-item\"><a href=\"https:\/\/github.com\/prasathmani\/tinyfilemanager\/issues\" target=\"_blank\"><i class=\"fa fa-bug\"><\/i> <?php echo lng('Report Issue') ?><\/a><\/li>\n<p>                                <?php if (!FM_READONLY) { ?><\/p>\n<li class=\"list-group-item\"><a href=\"javascript:show_new_pwd();\"><i class=\"fa fa-lock\"><\/i> <?php echo lng('Generate new password hash') ?><\/a><\/li>\n<p>                                <?php } ?>\n                            <\/ul>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"row js-new-pwd hidden mt-2\">\n<div class=\"col-12\">\n<form class=\"form-inline\" onsubmit=\"return new_password_hash(this)\" method=\"POST\" action=\"\">\n                            <input type=\"hidden\" name=\"type\" value=\"pwdhash\" aria-label=\"hidden\" aria-hidden=\"true\"><\/p>\n<div class=\"form-group mb-2\">\n                                <label for=\"staticEmail2\"><?php echo lng('Generate new password hash') ?><\/label>\n                            <\/div>\n<div class=\"form-group mx-sm-3 mb-2\">\n                                <label for=\"inputPassword2\" class=\"sr-only\"><?php echo lng('Password') ?><\/label><br \/>\n                                <input type=\"text\" class=\"form-control btn-sm\" id=\"inputPassword2\" name=\"inputPassword2\" placeholder=\"<?php echo lng('Password') ?>&#8221; required>\n                            <\/div>\n<p>                            <button type=\"submit\" class=\"btn btn-success btn-sm mb-2\"><?php echo lng('Generate') ?><\/button><br \/>\n                        <\/form>\n<p>                        <textarea class=\"form-control\" rows=\"2\" readonly id=\"js-pwd-result\"><\/textarea>\n                    <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ file viewer\nif (isset($_GET['view'])) {\n    $file = $_GET['view'];\n    $file = fm_clean_path($file, false);\n    $file = str_replace('\/', '', $file);\n    if ($file == '' || !is_file($path . '\/' . $file) || !fm_is_exclude_items($file, $path . '\/' . $file)) {\n        fm_set_msg(lng('File not found'), 'error');\n        $FM_PATH = FM_PATH;\n        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n    }\n\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n\n    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '\/' . FM_PATH : '') . '\/' . $file);\n    $file_path = $path . '\/' . $file;\n\n    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));\n    $mime_type = fm_get_mime_type($file_path);\n    $filesize_raw = fm_get_size($file_path);\n    $filesize = fm_get_filesize($filesize_raw);\n\n    $is_zip = false;\n    $is_gzip = false;\n    $is_image = false;\n    $is_audio = false;\n    $is_video = false;\n    $is_text = false;\n    $is_onlineViewer = false;\n\n    $view_title = 'File';\n    $filenames = false; \/\/ for zip\n    $content = ''; \/\/ for text\n    $online_viewer = strtolower(FM_DOC_VIEWER);\n\n    if ($online_viewer &#038;&#038; $online_viewer !== 'false' &#038;&#038; in_array($ext, fm_get_onlineViewer_exts())) {\n        $is_onlineViewer = true;\n    } elseif ($ext == 'zip' || $ext == 'tar') {\n        $is_zip = true;\n        $view_title = 'Archive';\n        $filenames = fm_get_zip_info($file_path, $ext);\n    } elseif (in_array($ext, fm_get_image_exts())) {\n        $is_image = true;\n        $view_title = 'Image';\n    } elseif (in_array($ext, fm_get_audio_exts())) {\n        $is_audio = true;\n        $view_title = 'Audio';\n    } elseif (in_array($ext, fm_get_video_exts())) {\n        $is_video = true;\n        $view_title = 'Video';\n    } elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {\n        $is_text = true;\n        $content = file_get_contents($file_path);\n    }\n\n?><\/p>\n<div class=\"row\">\n<div class=\"col-12\">\n<ul class=\"list-group w-50 my-3\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<li class=\"list-group-item active\" aria-current=\"true\"><strong><?php echo lng($view_title) ?>:<\/strong> <?php echo fm_enc(fm_convert_win($file)) ?><\/li>\n<p>                <?php $display_path = fm_get_display_path($file_path); ?><\/p>\n<li class=\"list-group-item\"><strong><?php echo $display_path['label']; ?>:<\/strong> <?php echo $display_path['path']; ?><\/li>\n<li class=\"list-group-item\"><strong><?php echo lng('Date Modified') ?>:<\/strong> <?php echo date(FM_DATETIME_FORMAT, filemtime($file_path)); ?><\/li>\n<li class=\"list-group-item\"><strong><?php echo lng('File size') ?>:<\/strong> <?php echo ($filesize_raw <= 1000) ? \"$filesize_raw bytes\" : $filesize; ?><\/li>\n<li class=\"list-group-item\"><strong><?php echo lng('MIME-type') ?>:<\/strong> <?php echo $mime_type ?><\/li>\n<p>                <?php\n                \/\/ ZIP info\n                if (($is_zip || $is_gzip) &#038;&#038; $filenames !== false) {\n                    $total_files = 0;\n                    $total_comp = 0;\n                    $total_uncomp = 0;\n                    foreach ($filenames as $fn) {\n                        if (!$fn['folder']) {\n                            $total_files++;\n                        }\n                        $total_comp += $fn['compressed_size'];\n                        $total_uncomp += $fn['filesize'];\n                    }\n                ?><\/p>\n<li class=\"list-group-item\"><?php echo lng('Files in archive') ?>: <?php echo $total_files ?><\/li>\n<li class=\"list-group-item\"><?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?><\/li>\n<li class=\"list-group-item\"> <?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?><\/li>\n<li class=\"list-group-item\"><?php echo lng('Compression') ?>: <?php echo round(($total_comp \/ max($total_uncomp, 1)) * 100) ?>%<\/li>\n<p>                <?php\n                }\n                \/\/ Image info\n                if ($is_image) {\n                    $image_size = getimagesize($file_path);\n                    echo '\n\n<li class=\"list-group-item\"><strong>&#8216; . lng(&#8216;Image size&#8217;) . &#8216;:<\/strong> &#8216; . (isset($image_size[0]) ? $image_size[0] : &#8216;0&#8217;) . &#8216; x &#8216; . (isset($image_size[1]) ? $image_size[1] : &#8216;0&#8217;) . &#8216;<\/li>\n<p>&#8216;;<br \/>\n                }<br \/>\n                \/\/ Text info<br \/>\n                if ($is_text) {<br \/>\n                    $is_utf8 = fm_is_utf8($content);<br \/>\n                    if (function_exists(&#8216;iconv&#8217;)) {<br \/>\n                        if (!$is_utf8) {<br \/>\n                            $content = iconv(FM_ICONV_INPUT_ENC, &#8216;UTF-8\/\/IGNORE&#8217;, $content);<br \/>\n                        }<br \/>\n                    }<br \/>\n                    echo &#8216;<\/p>\n<li class=\"list-group-item\"><strong>&#8216; . lng(&#8216;Charset&#8217;) . &#8216;:<\/strong> &#8216; . ($is_utf8 ? &#8216;utf-8&#8217; : &#8216;8 bit&#8217;) . &#8216;<\/li>\n<p>&#8216;;<br \/>\n                }<br \/>\n                ?>\n            <\/ul>\n<div class=\"btn-group btn-group-sm flex-wrap\" role=\"group\">\n<form method=\"post\" class=\"d-inline mb-0 btn btn-outline-primary\" action=\"?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($file) ?>&#8220;><br \/>\n                    <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                    <button type=\"submit\" class=\"btn btn-link btn-sm text-decoration-none fw-bold p-0\"><i class=\"fa fa-cloud-download\"><\/i> <?php echo lng('Download') ?><\/button> &nbsp;<br \/>\n                <\/form>\n<p>                <?php if (!FM_READONLY): ?><br \/>\n                    <a class=\"fw-bold btn btn-outline-primary\" title=\"<?php echo lng('Delete') ?>&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($file) ?>&#8221; onclick=&#8221;confirmDialog(event, 1209, &#8216;<?php echo lng('Delete') . ' ' . lng('File'); ?>&#8216;,&#8217;<?php echo urlencode($file); ?>&#8216;, this.href);&#8221;> <i class=\"fa fa-trash\"><\/i> Delete<\/a><br \/>\n                <?php endif; ?><br \/>\n                <a class=\"fw-bold btn btn-outline-primary\" href=\"<?php echo fm_enc($file_url) ?>&#8221; target=&#8221;_blank&#8221;><i class=\"fa fa-external-link-square\"><\/i> <?php echo lng('Open') ?><\/a><\/b><br \/>\n                <?php\n                \/\/ ZIP actions\n                if (!FM_READONLY &#038;&#038; ($is_zip || $is_gzip) &#038;&#038; $filenames !== false) {\n                    $zip_name = pathinfo($file_path, PATHINFO_FILENAME);\n                ?><\/p>\n<form method=\"post\" class=\"d-inline btn btn-outline-primary mb-0\">\n                        <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                        <input type=\"hidden\" name=\"unzip\" value=\"<?php echo urlencode($file); ?>&#8220;><br \/>\n                        <button type=\"submit\" class=\"btn btn-link text-decoration-none fw-bold p-0 border-0\" style=\"font-size: 14px;\"><i class=\"fa fa-check-circle\"><\/i> <?php echo lng('UnZip') ?><\/button><br \/>\n                    <\/form>\n<form method=\"post\" class=\"d-inline btn btn-outline-primary mb-0\">\n                        <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                        <input type=\"hidden\" name=\"unzip\" value=\"<?php echo urlencode($file); ?>&#8220;><br \/>\n                        <input type=\"hidden\" name=\"tofolder\" value=\"1\"><br \/>\n                        <button type=\"submit\" class=\"btn btn-link text-decoration-none fw-bold p-0\" style=\"font-size: 14px;\" title=\"UnZip to <?php echo fm_enc($zip_name) ?>&#8220;><i class=\"fa fa-check-circle\"><\/i> <?php echo lng('UnZipToFolder') ?><\/button><br \/>\n                    <\/form>\n<p>                <?php\n                }\n                if ($is_text &#038;&#038; !FM_READONLY) {\n                ?><br \/>\n                    <a class=\"fw-bold btn btn-outline-primary\" href=\"?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&#8221; class=&#8221;edit-file&#8221;><br \/>\n                        <i class=\"fa fa-pencil-square\"><\/i> <?php echo lng('Edit') ?><br \/>\n                    <\/a><br \/>\n                    <a class=\"fw-bold btn btn-outline-primary\" href=\"?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&#038;env=ace&#8221;<br \/>\n                        class=&#8221;edit-file&#8221;><i class=\"fa fa-pencil-square\"><\/i> <?php echo lng('AdvancedEditor') ?><br \/>\n                    <\/a><br \/>\n                <?php } ?><br \/>\n                <a class=\"fw-bold btn btn-outline-primary\" href=\"?p=<?php echo urlencode(FM_PATH) ?>&#8220;><i class=\"fa fa-chevron-circle-left go-back\"><\/i> <?php echo lng('Back') ?><\/a>\n            <\/div>\n<div class=\"row mt-3\">\n                <?php\n                if ($is_onlineViewer) {\n                    if ($online_viewer == 'google') {\n                        echo '<iframe src=\"https:\/\/docs.google.com\/viewer?embedded=true&#038;hl=en&#038;url=' . fm_enc($file_url) . '\" frameborder=\"no\" style=\"width:100%;min-height:460px\"><\/iframe>&#8216;;<br \/>\n                    } else if ($online_viewer == &#8216;microsoft&#8217;) {<br \/>\n                        echo &#8216;<iframe src=\"https:\/\/view.officeapps.live.com\/op\/embed.aspx?src=' . fm_enc($file_url) . '\" frameborder=\"no\" style=\"width:100%;min-height:460px\"><\/iframe>&#8216;;<br \/>\n                    }<br \/>\n                } elseif ($is_zip) {<br \/>\n                    \/\/ ZIP content<br \/>\n                    if ($filenames !== false) {<br \/>\n                        echo &#8216;<code class=\"maxheight\">';<br \/>\n                        foreach ($filenames as $fn) {<br \/>\n                            if ($fn['folder']) {<br \/>\n                                echo '<b>' . fm_enc($fn['name']) . '<\/b><br \/>';<br \/>\n                            } else {<br \/>\n                                echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br \/>';<br \/>\n                            }<br \/>\n                        }<br \/>\n                        echo '<\/code>&#8216;;<br \/>\n                    } else {<br \/>\n                        echo &#8216;<\/p>\n<p>&#8216; . lng(&#8216;Error while fetching archive info&#8217;) . &#8216;<\/p>\n<p>&#8216;;<br \/>\n                    }<br \/>\n                } elseif ($is_image) {<br \/>\n                    \/\/ Image content<br \/>\n                    if (in_array($ext, array(&#8216;gif&#8217;, &#8216;jpg&#8217;, &#8216;jpeg&#8217;, &#8216;png&#8217;, &#8216;bmp&#8217;, &#8216;ico&#8217;, &#8216;svg&#8217;, &#8216;webp&#8217;, &#8216;avif&#8217;))) {<br \/>\n                        echo &#8216;<\/p>\n<p><input type=\"checkbox\" id=\"preview-img-zoomCheck\"><label for=\"preview-img-zoomCheck\"><img decoding=\"async\" src=\"' . fm_enc($file_url) . '\" alt=\"image\" class=\"preview-img\"><\/label><\/p>\n<p>&#8216;;<br \/>\n                    }<br \/>\n                } elseif ($is_audio) {<br \/>\n                    \/\/ Audio content<br \/>\n                    echo &#8216;<\/p>\n<p><audio src=\"' . fm_enc($file_url) . '\" controls preload=\"metadata\"><\/audio><\/p>\n<p>&#8216;;<br \/>\n                } elseif ($is_video) {<br \/>\n                    \/\/ Video content<br \/>\n                    echo &#8216;<\/p>\n<div class=\"preview-video\"><video src=\"' . fm_enc($file_url) . '\" width=\"640\" height=\"360\" controls preload=\"metadata\"><\/video><\/div>\n<p>&#8216;;<br \/>\n                } elseif ($is_text) {<br \/>\n                    if (FM_USE_HIGHLIGHTJS) {<br \/>\n                        \/\/ highlight<br \/>\n                        $hljs_classes = array(<br \/>\n                            &#8216;shtml&#8217; => &#8216;xml&#8217;,<br \/>\n                            &#8216;htaccess&#8217; => &#8216;apache&#8217;,<br \/>\n                            &#8216;phtml&#8217; => &#8216;php&#8217;,<br \/>\n                            &#8216;lock&#8217; => &#8216;json&#8217;,<br \/>\n                            &#8216;svg&#8217; => &#8216;xml&#8217;,<br \/>\n                        );<br \/>\n                        $hljs_class = isset($hljs_classes[$ext]) ? &#8216;lang-&#8216; . $hljs_classes[$ext] : &#8216;lang-&#8216; . $ext;<br \/>\n                        if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match(&#8216;#\\.min\\.(css|js)$#i&#8217;, $file)) {<br \/>\n                            $hljs_class = &#8216;nohighlight&#8217;;<br \/>\n                        }<br \/>\n                        $content = &#8216;<\/p>\n<pre class=\"with-hljs\"><code class=\"' . $hljs_class . '\">' . fm_enc($content) . '<\/code><\/pre>\n<p>&#8216;;<br \/>\n                    } elseif (in_array($ext, array(&#8216;php&#8217;, &#8216;php4&#8217;, &#8216;php5&#8217;, &#8216;phtml&#8217;, &#8216;phps&#8217;))) {<br \/>\n                        \/\/ php highlight<br \/>\n                        $content = highlight_string($content, true);<br \/>\n                    } else {<br \/>\n                        $content = &#8216;<\/p>\n<pre>' . fm_enc($content) . '<\/pre>\n<p>&#8216;;<br \/>\n                    }<br \/>\n                    echo $content;<br \/>\n                }<br \/>\n                ?>\n            <\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ file editor\nif (isset($_GET['edit']) &#038;&#038; !FM_READONLY) {\n    $file = $_GET['edit'];\n    $file = fm_clean_path($file, false);\n    $file = str_replace('\/', '', $file);\n    if ($file == '' || !is_file($path . '\/' . $file) || !fm_is_exclude_items($file, $path . '\/' . $file)) {\n        fm_set_msg(lng('File not found'), 'error');\n        $FM_PATH = FM_PATH;\n        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n    }\n    $editFile = ' : <i><b>&#8216; . $file . &#8216;<\/b><\/i>&#8216;;<br \/>\n    header(&#8216;X-XSS-Protection:0&#8217;);<br \/>\n    fm_show_header(); \/\/ HEADER<br \/>\n    fm_show_nav_path(FM_PATH); \/\/ current path<\/p>\n<p>    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != &#8221; ? &#8216;\/&#8217; . FM_PATH : &#8221;) . &#8216;\/&#8217; . $file);<br \/>\n    $file_path = $path . &#8216;\/&#8217; . $file;<\/p>\n<p>    \/\/ normal editer<br \/>\n    $isNormalEditor = true;<br \/>\n    if (isset($_GET[&#8216;env&#8217;])) {<br \/>\n        if ($_GET[&#8216;env&#8217;] == &#8220;ace&#8221;) {<br \/>\n            $isNormalEditor = false;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ Save File<br \/>\n    if (isset($_POST[&#8216;savedata&#8217;])) {<br \/>\n        $writedata = $_POST[&#8216;savedata&#8217;];<br \/>\n        $fd = fopen($file_path, &#8220;w&#8221;);<br \/>\n        @fwrite($fd, $writedata);<br \/>\n        fclose($fd);<br \/>\n        fm_set_msg(lng(&#8216;File Saved Successfully&#8217;));<br \/>\n    }<\/p>\n<p>    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));<br \/>\n    $mime_type = fm_get_mime_type($file_path);<br \/>\n    $filesize = filesize($file_path);<br \/>\n    $is_text = false;<br \/>\n    $content = &#8221;; \/\/ for text<\/p>\n<p>    if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == &#8216;text&#8217; || in_array($mime_type, fm_get_text_mimes())) {<br \/>\n        $is_text = true;<br \/>\n        $content = file_get_contents($file_path);<br \/>\n    }<\/p>\n<p>?><\/p>\n<div class=\"path\">\n<div class=\"row\">\n<div class=\"col-xs-12 col-sm-5 col-lg-6 pt-1\">\n<div class=\"btn-toolbar\" role=\"toolbar\">\n                    <?php if (!$isNormalEditor) { ?><\/p>\n<div class=\"btn-group js-ace-toolbar\">\n                            <button data-cmd=\"none\" data-option=\"fullscreen\" class=\"btn btn-sm btn-outline-secondary\" id=\"js-ace-fullscreen\" title=\"<?php echo lng('Fullscreen') ?>&#8220;><i class=\"fa fa-expand\" title=\"<?php echo lng('Fullscreen') ?>&#8220;><\/i><\/button><br \/>\n                            <button data-cmd=\"find\" class=\"btn btn-sm btn-outline-secondary\" id=\"js-ace-search\" title=\"<?php echo lng('Search') ?>&#8220;><i class=\"fa fa-search\" title=\"<?php echo lng('Search') ?>&#8220;><\/i><\/button><br \/>\n                            <button data-cmd=\"undo\" class=\"btn btn-sm btn-outline-secondary\" id=\"js-ace-undo\" title=\"<?php echo lng('Undo') ?>&#8220;><i class=\"fa fa-undo\" title=\"<?php echo lng('Undo') ?>&#8220;><\/i><\/button><br \/>\n                            <button data-cmd=\"redo\" class=\"btn btn-sm btn-outline-secondary\" id=\"js-ace-redo\" title=\"<?php echo lng('Redo') ?>&#8220;><i class=\"fa fa-repeat\" title=\"<?php echo lng('Redo') ?>&#8220;><\/i><\/button><br \/>\n                            <button data-cmd=\"none\" data-option=\"wrap\" class=\"btn btn-sm btn-outline-secondary\" id=\"js-ace-wordWrap\" title=\"<?php echo lng('Word Wrap') ?>&#8220;><i class=\"fa fa-text-width\" title=\"<?php echo lng('Word Wrap') ?>&#8220;><\/i><\/button><br \/>\n                            <select id=\"js-ace-mode\" data-type=\"mode\" title=\"<?php echo lng('Select Document Type') ?>&#8221; class=&#8221;btn-outline-secondary border-start-0 d-none d-md-block&#8221;><option>&#8212; <?php echo lng('Select Mode') ?> &#8212;<\/option><\/select><br \/>\n                            <select id=\"js-ace-theme\" data-type=\"theme\" title=\"<?php echo lng('Select Theme') ?>&#8221; class=&#8221;btn-outline-secondary border-start-0 d-none d-lg-block&#8221;><option>&#8212; <?php echo lng('Select Theme') ?> &#8212;<\/option><\/select><br \/>\n                            <select id=\"js-ace-fontSize\" data-type=\"fontSize\" title=\"<?php echo lng('Select Font Size') ?>&#8221; class=&#8221;btn-outline-secondary border-start-0 d-none d-lg-block&#8221;><option>&#8212; <?php echo lng('Select Font Size') ?> &#8212;<\/option><\/select>\n                        <\/div>\n<p>                    <?php } ?>\n                <\/div>\n<\/p><\/div>\n<div class=\"edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1\">\n<div class=\"btn-group\">\n                    <a title=\" <?php echo lng('Back') ?>&#8221; class=&#8221;btn btn-sm btn-outline-primary&#8221; href=&#8221;?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;view=<?php echo urlencode($file) ?>&#8220;><i class=\"fa fa-reply-all\"><\/i> <?php echo lng('Back') ?><\/a><br \/>\n                    <a title=\"<?php echo lng('BackUp') ?>&#8221; class=&#8221;btn btn-sm btn-outline-primary&#8221; href=&#8221;javascript:void(0);&#8221; onclick=&#8221;backup(&#8216;<?php echo urlencode(trim(FM_PATH)) ?>&#8216;,&#8217;<?php echo urlencode($file) ?>&#8216;)&#8221;><i class=\"fa fa-database\"><\/i> <?php echo lng('BackUp') ?><\/a><br \/>\n                    <?php if ($is_text) { ?><br \/>\n                        <?php if ($isNormalEditor) { ?><br \/>\n                            <a title=\"Advanced\" class=\"btn btn-sm btn-outline-primary\" href=\"?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&amp;env=ace&#8221;><i class=\"fa fa-pencil-square-o\"><\/i> <?php echo lng('AdvancedEditor') ?><\/a><br \/>\n                            <button type=\"button\" class=\"btn btn-sm btn-success\" name=\"Save\" data-url=\"<?php echo fm_enc($file_url) ?>&#8221; onclick=&#8221;edit_save(this,&#8217;nrl&#8217;)&#8221;><i class=\"fa fa-floppy-o\"><\/i> Save<br \/>\n                            <\/button><br \/>\n                        <?php } else { ?><br \/>\n                            <a title=\"Plain Editor\" class=\"btn btn-sm btn-outline-primary\" href=\"?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&#8220;><i class=\"fa fa-text-height\"><\/i> <?php echo lng('NormalEditor') ?><\/a><br \/>\n                            <button type=\"button\" class=\"btn btn-sm btn-success\" name=\"Save\" data-url=\"<?php echo fm_enc($file_url) ?>&#8221; onclick=&#8221;edit_save(this,&#8217;ace&#8217;)&#8221;><i class=\"fa fa-floppy-o\"><\/i> <?php echo lng('Save') ?><br \/>\n                            <\/button><br \/>\n                        <?php } ?><br \/>\n                    <?php } ?>\n                <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>        <?php\n        if ($is_text &#038;&#038; $isNormalEditor) {\n            echo '<textarea class=\"mt-2\" id=\"normal-editor\" rows=\"33\" cols=\"120\" style=\"width: 99.5%;\">&#8216; . htmlspecialchars($content) . &#8216;<\/textarea>&#8216;;<br \/>\n            echo &#8216;<script>document.addEventListener(\"keydown\", function(e) {if ((window.navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey)  && e.keyCode == 83) { e.preventDefault();edit_save(this,\"nrl\");}}, false);<\/script>&#8216;;<br \/>\n        } elseif ($is_text) {<br \/>\n            echo &#8216;<\/p>\n<div id=\"editor\" contenteditable=\"true\">&#8216; . htmlspecialchars($content) . &#8216;<\/div>\n<p>&#8216;;<br \/>\n        } else {<br \/>\n            fm_set_msg(lng(&#8216;FILE EXTENSION IS NOT SUPPORTED&#8217;), &#8216;error&#8217;);<br \/>\n        }<br \/>\n        ?>\n    <\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ chmod (not for Windows)\nif (isset($_GET['chmod']) &#038;&#038; !FM_READONLY &#038;&#038; !FM_IS_WIN) {\n    $file = $_GET['chmod'];\n    $file = fm_clean_path($file);\n    $file = str_replace('\/', '', $file);\n    if ($file == '' || (!is_file($path . '\/' . $file) &#038;&#038; !is_dir($path . '\/' . $file))) {\n        fm_set_msg(lng('File not found'), 'error');\n        $FM_PATH = FM_PATH;\n        fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));\n    }\n\n    fm_show_header(); \/\/ HEADER\n    fm_show_nav_path(FM_PATH); \/\/ current path\n\n    $file_url = FM_ROOT_URL . (FM_PATH != '' ? '\/' . FM_PATH : '') . '\/' . $file;\n    $file_path = $path . '\/' . $file;\n\n    $mode = fileperms($path . '\/' . $file);\n?><\/p>\n<div class=\"path\">\n<div class=\"card mb-2\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<h6 class=\"card-header\">\n                <?php echo lng('ChangePermissions') ?><br \/>\n            <\/h6>\n<div class=\"card-body\">\n<p class=\"card-text\">\n                    <?php $display_path = fm_get_display_path($file_path); ?><br \/>\n                    <?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?>\n                <\/p>\n<form action=\"\" method=\"post\">\n                    <input type=\"hidden\" name=\"p\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;><br \/>\n                    <input type=\"hidden\" name=\"chmod\" value=\"<?php echo fm_enc($file) ?>&#8220;><\/p>\n<table class=\"table compact-table\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<tr>\n<td><\/td>\n<td><b><?php echo lng('Owner') ?><\/b><\/td>\n<td><b><?php echo lng('Group') ?><\/b><\/td>\n<td><b><?php echo lng('Other') ?><\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: right\"><b><?php echo lng('Read') ?><\/b><\/td>\n<td><label><input type=\"checkbox\" name=\"ur\" value=\"1\" <?php echo ($mode &#038; 00400) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"gr\" value=\"1\" <?php echo ($mode &#038; 00040) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"or\" value=\"1\" <?php echo ($mode &#038; 00004) ? ' checked' : '' ?>><\/label><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: right\"><b><?php echo lng('Write') ?><\/b><\/td>\n<td><label><input type=\"checkbox\" name=\"uw\" value=\"1\" <?php echo ($mode &#038; 00200) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"gw\" value=\"1\" <?php echo ($mode &#038; 00020) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"ow\" value=\"1\" <?php echo ($mode &#038; 00002) ? ' checked' : '' ?>><\/label><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: right\"><b><?php echo lng('Execute') ?><\/b><\/td>\n<td><label><input type=\"checkbox\" name=\"ux\" value=\"1\" <?php echo ($mode &#038; 00100) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"gx\" value=\"1\" <?php echo ($mode &#038; 00010) ? ' checked' : '' ?>><\/label><\/td>\n<td><label><input type=\"checkbox\" name=\"ox\" value=\"1\" <?php echo ($mode &#038; 00001) ? ' checked' : '' ?>><\/label><\/td>\n<\/tr>\n<\/table>\n<p>\n                        <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                        <b><a href=\"?p=<?php echo urlencode(FM_PATH) ?>&#8221; class=&#8221;btn btn-outline-primary&#8221;><i class=\"fa fa-times-circle\"><\/i> <?php echo lng('Cancel') ?><\/a><\/b>&nbsp;<br \/>\n                        <button type=\"submit\" class=\"btn btn-success\"><i class=\"fa fa-check-circle\"><\/i> <?php echo lng('Change') ?><\/button>\n                    <\/p>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><?php\n    fm_show_footer();\n    exit;\n}\n\n\/\/ --- TINYFILEMANAGER MAIN ---\nfm_show_header(); \/\/ HEADER\nfm_show_nav_path(FM_PATH); \/\/ current path\n\n\/\/ show alert messages\nfm_show_message();\n\n$num_files = count($files);\n$num_folders = count($folders);\n$all_files_size = 0;\n?><\/p>\n<form action=\"\" method=\"post\" class=\"pt-3\">\n    <input type=\"hidden\" name=\"p\" value=\"<?php echo fm_enc(FM_PATH) ?>&#8220;><br \/>\n    <input type=\"hidden\" name=\"group\" value=\"1\"><br \/>\n    <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><\/p>\n<div class=\"table-responsive\">\n<table class=\"table table-bordered table-hover table-sm\" id=\"main-table\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<thead class=\"thead-white\">\n<tr>\n                    <?php if (!FM_READONLY): ?><\/p>\n<th style=\"width:3%\" class=\"custom-checkbox-header\">\n<div class=\"custom-control custom-checkbox\">\n                                <input type=\"checkbox\" class=\"custom-control-input\" id=\"js-select-all-items\" onclick=\"checkbox_toggle()\"><br \/>\n                                <label class=\"custom-control-label\" for=\"js-select-all-items\"><\/label>\n                            <\/div>\n<\/th>\n<p><?php endif; ?><\/p>\n<th><?php echo lng('Name') ?><\/th>\n<th><?php echo lng('Size') ?><\/th>\n<th><?php echo lng('Modified') ?><\/th>\n<p>                    <?php if (!FM_IS_WIN &#038;&#038; !$hide_Cols): ?><\/p>\n<th><?php echo lng('Perms') ?><\/th>\n<th><?php echo lng('Owner') ?><\/th>\n<p><?php endif; ?><\/p>\n<th><?php echo lng('Actions') ?><\/th>\n<\/tr>\n<\/thead>\n<p>            <?php\n            \/\/ link to parent folder\n            if ($parent !== false) {\n            ?><\/p>\n<tr><?php if (!FM_READONLY): ?><\/p>\n<td class=\"nosort\"><\/td>\n<p><?php endif; ?><\/p>\n<td class=\"border-0\" data-sort><a href=\"?p=<?php echo urlencode($parent) ?>&#8220;><i class=\"fa fa-chevron-circle-left go-back\"><\/i> ..<\/a><\/td>\n<td class=\"border-0\" data-order><\/td>\n<td class=\"border-0\" data-order><\/td>\n<td class=\"border-0\"><\/td>\n<p>                    <?php if (!FM_IS_WIN &#038;&#038; !$hide_Cols) { ?><\/p>\n<td class=\"border-0\"><\/td>\n<td class=\"border-0\"><\/td>\n<p>                    <?php } ?><br \/>\n                <\/tr>\n<p>            <?php\n            }\n            $ii = 3399;\n            foreach ($folders as $f) {\n                $is_link = is_link($path . '\/' . $f);\n                $img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';\n                $modif_raw = filemtime($path . '\/' . $f);\n                $modif = date(FM_DATETIME_FORMAT, $modif_raw);\n                $date_sorting = strtotime(date(\"F d Y H:i:s.\", $modif_raw));\n                $filesize_raw = \"\";\n                $filesize = lng('Folder');\n                $perms = substr(decoct(fileperms($path . '\/' . $f)), -4);\n                $owner = array('name' => &#8216;?&#8217;);<br \/>\n                $group = array(&#8216;name&#8217; => &#8216;?&#8217;);<br \/>\n                if (function_exists(&#8216;posix_getpwuid&#8217;) &#038;&#038; function_exists(&#8216;posix_getgrgid&#8217;)) {<br \/>\n                    try {<br \/>\n                        $owner_id = fileowner($path . &#8216;\/&#8217; . $f);<br \/>\n                        if ($owner_id != 0) {<br \/>\n                            $owner_info = posix_getpwuid($owner_id);<br \/>\n                            if ($owner_info) {<br \/>\n                                $owner =  $owner_info;<br \/>\n                            }<br \/>\n                        }<br \/>\n                        $group_id = filegroup($path . &#8216;\/&#8217; . $f);<br \/>\n                        $group_info = posix_getgrgid($group_id);<br \/>\n                        if ($group_info) {<br \/>\n                            $group =  $group_info;<br \/>\n                        }<br \/>\n                    } catch (Exception $e) {<br \/>\n                        error_log(&#8220;exception:&#8221; . $e->getMessage());<br \/>\n                    }<br \/>\n                }<br \/>\n            ?><\/p>\n<tr>\n                    <?php if (!FM_READONLY): ?><\/p>\n<td class=\"custom-checkbox-td\">\n<div class=\"custom-control custom-checkbox\">\n                                <input type=\"checkbox\" class=\"custom-control-input\" id=\"<?php echo $ii ?>&#8221; name=&#8221;file[]&#8221; value=&#8221;<?php echo fm_enc($f) ?>&#8220;><br \/>\n                                <label class=\"custom-control-label\" for=\"<?php echo $ii ?>&#8220;><\/label>\n                            <\/div>\n<\/td>\n<p>                    <?php endif; ?><\/p>\n<td data-sort=<?php echo fm_convert_win(fm_enc($f)) ?>><\/p>\n<div class=\"filename\">\n                            <a href=\"?p=<?php echo urlencode(trim(FM_PATH . '\/' . $f, '\/')) ?>&#8220;><i class=\"<?php echo $img ?>&#8220;><\/i> <?php echo fm_convert_win(fm_enc($f)) ?><\/a><br \/>\n                            <?php echo ($is_link ? ' &rarr; <i>&#8216; . readlink($path . &#8216;\/&#8217; . $f) . &#8216;<\/i>&#8216; : &#8221;) ?>\n                        <\/div>\n<\/td>\n<td data-order=\"a-<?php echo str_pad($filesize_raw, 18, \"0\", STR_PAD_LEFT); ?>&#8220;><br \/>\n                        <?php echo $filesize; ?>\n                    <\/td>\n<td data-order=\"a-<?php echo $date_sorting; ?>&#8220;><?php echo $modif ?><\/td>\n<p>                    <?php if (!FM_IS_WIN &#038;&#038; !$hide_Cols): ?><\/p>\n<td>\n                            <?php if (!FM_READONLY): ?><a title=\"Change Permissions\" href=\"?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>&#8220;><?php echo $perms ?><\/a><?php else: ?><?php echo $perms ?><?php endif; ?>\n                        <\/td>\n<td>\n                            <?php echo $owner['name'] . ':' . $group['name'] ?>\n                        <\/td>\n<p>                    <?php endif; ?><\/p>\n<td class=\"inline-actions\"><?php if (!FM_READONLY): ?><br \/>\n                            <a title=\"<?php echo lng('Delete') ?>&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>&#8221; onclick=&#8221;confirmDialog(event, &#8216;1028&#8217;,&#8217;<?php echo lng('Delete') . ' ' . lng('Folder'); ?>&#8216;,&#8217;<?php echo urlencode($f) ?>&#8216;, this.href);&#8221;> <i class=\"fa fa-trash-o\" aria-hidden=\"true\"><\/i><\/a><br \/>\n                            <a title=\"<?php echo lng('Rename') ?>&#8221; href=&#8221;#&#8221; onclick=&#8221;rename(&#8216;<?php echo fm_enc(addslashes(FM_PATH)) ?>&#8216;, &#8216;<?php echo fm_enc(addslashes($f)) ?>&#8216;);return false;&#8221;><i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"><\/i><\/a><br \/>\n                            <a title=\"<?php echo lng('CopyTo') ?>&#8230;&#8221; href=&#8221;?p=&amp;copy=<?php echo urlencode(trim(FM_PATH . '\/' . $f, '\/')) ?>&#8220;><i class=\"fa fa-files-o\" aria-hidden=\"true\"><\/i><\/a><br \/>\n                        <?php endif; ?><br \/>\n                        <a title=\"<?php echo lng('DirectLink') ?>&#8221; href=&#8221;<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '\/' . FM_PATH : '') . '\/' . $f . '\/') ?>&#8221; target=&#8221;_blank&#8221;><i class=\"fa fa-link\" aria-hidden=\"true\"><\/i><\/a>\n                    <\/td>\n<\/tr>\n<p>            <?php\n                flush();\n                $ii++;\n            }\n            $ik = 8002;\n            foreach ($files as $f) {\n                $is_link = is_link($path . '\/' . $f);\n                $img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '\/' . $f);\n                $modif_raw = filemtime($path . '\/' . $f);\n                $modif = date(FM_DATETIME_FORMAT, $modif_raw);\n                $date_sorting = strtotime(date(\"F d Y H:i:s.\", $modif_raw));\n                $filesize_raw = fm_get_size($path . '\/' . $f);\n                $filesize = fm_get_filesize($filesize_raw);\n                $filelink = '?p=' . urlencode(FM_PATH) . '&amp;view=' . urlencode($f);\n                $all_files_size += $filesize_raw;\n                $perms = substr(decoct(fileperms($path . '\/' . $f)), -4);\n                $owner = array('name' => &#8216;?&#8217;);<br \/>\n                $group = array(&#8216;name&#8217; => &#8216;?&#8217;);<br \/>\n                if (function_exists(&#8216;posix_getpwuid&#8217;) &#038;&#038; function_exists(&#8216;posix_getgrgid&#8217;)) {<br \/>\n                    try {<br \/>\n                        $owner_id = fileowner($path . &#8216;\/&#8217; . $f);<br \/>\n                        if ($owner_id != 0) {<br \/>\n                            $owner_info = posix_getpwuid($owner_id);<br \/>\n                            if ($owner_info) {<br \/>\n                                $owner =  $owner_info;<br \/>\n                            }<br \/>\n                        }<br \/>\n                        $group_id = filegroup($path . &#8216;\/&#8217; . $f);<br \/>\n                        $group_info = posix_getgrgid($group_id);<br \/>\n                        if ($group_info) {<br \/>\n                            $group =  $group_info;<br \/>\n                        }<br \/>\n                    } catch (Exception $e) {<br \/>\n                        error_log(&#8220;exception:&#8221; . $e->getMessage());<br \/>\n                    }<br \/>\n                }<br \/>\n            ?><\/p>\n<tr>\n                    <?php if (!FM_READONLY): ?><\/p>\n<td class=\"custom-checkbox-td\">\n<div class=\"custom-control custom-checkbox\">\n                                <input type=\"checkbox\" class=\"custom-control-input\" id=\"<?php echo $ik ?>&#8221; name=&#8221;file[]&#8221; value=&#8221;<?php echo fm_enc($f) ?>&#8220;><br \/>\n                                <label class=\"custom-control-label\" for=\"<?php echo $ik ?>&#8220;><\/label>\n                            <\/div>\n<\/td>\n<p><?php endif; ?><\/p>\n<td data-sort=<?php echo fm_enc($f) ?>><\/p>\n<div class=\"filename\">\n                            <?php\n                            if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?><br \/>\n                                <?php $imagePreview = fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '\/' . FM_PATH : '') . '\/' . $f); ?><br \/>\n                                <a href=\"<?php echo $filelink ?>&#8221; data-preview-image=&#8221;<?php echo $imagePreview ?>&#8221; title=&#8221;<?php echo fm_enc($f) ?>&#8220;><br \/>\n                                <?php else: ?><br \/>\n                                    <a href=\"<?php echo $filelink ?>&#8221; title=&#8221;<?php echo $f ?>&#8220;><br \/>\n                                    <?php endif; ?><br \/>\n                                    <i class=\"<?php echo $img ?>&#8220;><\/i> <?php echo fm_convert_win(fm_enc($f)) ?><br \/>\n                                    <\/a><br \/>\n                                    <?php echo ($is_link ? ' &rarr; <i>&#8216; . readlink($path . &#8216;\/&#8217; . $f) . &#8216;<\/i>&#8216; : &#8221;) ?>\n                        <\/div>\n<\/td>\n<td data-order=\"b-<?php echo str_pad($filesize_raw, 18, \"0\", STR_PAD_LEFT); ?>&#8220;><span title=\"<?php printf('%s bytes', $filesize_raw) ?>&#8220;><br \/>\n                            <?php echo $filesize; ?><br \/>\n                        <\/span><\/td>\n<td data-order=\"b-<?php echo $date_sorting; ?>&#8220;><?php echo $modif ?><\/td>\n<p>                    <?php if (!FM_IS_WIN &#038;&#038; !$hide_Cols): ?><\/p>\n<td><?php if (!FM_READONLY): ?><a title=\"<?php echo 'Change Permissions' ?>&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>&#8220;><?php echo $perms ?><\/a><?php else: ?><?php echo $perms ?><?php endif; ?>\n                        <\/td>\n<td><?php echo fm_enc($owner['name'] . ':' . $group['name']) ?><\/td>\n<p>                    <?php endif; ?><\/p>\n<td class=\"inline-actions\">\n                        <?php if (!FM_READONLY): ?><br \/>\n                            <a title=\"<?php echo lng('Delete') ?>&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>&#8221; onclick=&#8221;confirmDialog(event, 1209, &#8216;<?php echo lng('Delete') . ' ' . lng('File'); ?>&#8216;,&#8217;<?php echo urlencode($f); ?>&#8216;, this.href);&#8221;> <i class=\"fa fa-trash-o\"><\/i><\/a><br \/>\n                            <a title=\"<?php echo lng('Rename') ?>&#8221; href=&#8221;#&#8221; onclick=&#8221;rename(&#8216;<?php echo fm_enc(addslashes(FM_PATH)) ?>&#8216;, &#8216;<?php echo fm_enc(addslashes($f)) ?>&#8216;);return false;&#8221;><i class=\"fa fa-pencil-square-o\"><\/i><\/a><br \/>\n                            <a title=\"<?php echo lng('CopyTo') ?>&#8230;&#8221;<br \/>\n                                href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode(trim(FM_PATH . '\/' . $f, '\/')) ?>&#8220;><i class=\"fa fa-files-o\"><\/i><\/a><br \/>\n                        <?php endif; ?><br \/>\n                        <a title=\"<?php echo lng('DirectLink') ?>&#8221; href=&#8221;<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '\/' . FM_PATH : '') . '\/' . $f) ?>&#8221; target=&#8221;_blank&#8221;><i class=\"fa fa-link\"><\/i><\/a><br \/>\n                        <a title=\"<?php echo lng('Download') ?>&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($f) ?>&#8221; onclick=&#8221;confirmDialog(event, 1211, &#8216;<?php echo lng('Download'); ?>&#8216;,&#8217;<?php echo urlencode($f); ?>&#8216;, this.href);&#8221;><i class=\"fa fa-download\"><\/i><\/a>\n                    <\/td>\n<\/tr>\n<p>            <?php\n                flush();\n                $ik++;\n            }\n\n            if (empty($folders) &#038;&#038; empty($files)) { ?><\/p>\n<tfoot>\n<tr><?php if (!FM_READONLY): ?><\/p>\n<td><\/td>\n<p><?php endif; ?><\/p>\n<td colspan=\"<?php echo (!FM_IS_WIN &#038;&#038; !$hide_Cols) ? '6' : '4' ?>&#8220;><em><?php echo lng('Folder is empty') ?><\/em><\/td>\n<\/tr>\n<\/tfoot>\n<p>            <?php\n            } else { ?><\/p>\n<tfoot>\n<tr>\n<td class=\"gray fs-7\" colspan=\"<?php echo (!FM_IS_WIN &#038;&#038; !$hide_Cols) ? (FM_READONLY ? '6' : '7') : (FM_READONLY ? '4' : '5') ?>&#8220;><br \/>\n                            <?php echo lng('FullSize') . ': <span class=\"badge text-bg-light border-radius-0\">&#8216; . fm_get_filesize($all_files_size) . &#8216;<\/span>&#8216; ?><br \/>\n                            <?php echo lng('File') . ': <span class=\"badge text-bg-light border-radius-0\">&#8216; . $num_files . &#8216;<\/span>&#8216; ?><br \/>\n                            <?php echo lng('Folder') . ': <span class=\"badge text-bg-light border-radius-0\">&#8216; . $num_folders . &#8216;<\/span>&#8216; ?>\n                        <\/td>\n<\/tr>\n<\/tfoot>\n<p>            <?php } ?><br \/>\n        <\/table>\n<\/p><\/div>\n<div class=\"row\">\n        <?php if (!FM_READONLY): ?><\/p>\n<div class=\"col-xs-12 col-sm-9\">\n<div class=\"btn-group flex-wrap\" data-toggle=\"buttons\" role=\"toolbar\">\n                    <a href=\"#\/select-all\" class=\"btn btn-small btn-outline-primary btn-2\" onclick=\"select_all();return false;\"><i class=\"fa fa-check-square\"><\/i> <?php echo lng('SelectAll') ?> <\/a><br \/>\n                    <a href=\"#\/unselect-all\" class=\"btn btn-small btn-outline-primary btn-2\" onclick=\"unselect_all();return false;\"><i class=\"fa fa-window-close\"><\/i> <?php echo lng('UnSelectAll') ?> <\/a><br \/>\n                    <a href=\"#\/invert-all\" class=\"btn btn-small btn-outline-primary btn-2\" onclick=\"invert_all();return false;\"><i class=\"fa fa-th-list\"><\/i> <?php echo lng('InvertSelection') ?> <\/a><br \/>\n                    <input type=\"submit\" class=\"hidden\" name=\"delete\" id=\"a-delete\" value=\"Delete\" onclick=\"return confirm('<?php echo lng('Delete selected files and folders?'); ?>&#8216;)&#8221;><br \/>\n                    <a href=\"javascript:document.getElementById('a-delete').click();\" class=\"btn btn-small btn-outline-primary btn-2\"><i class=\"fa fa-trash\"><\/i> <?php echo lng('Delete') ?> <\/a><br \/>\n                    <input type=\"submit\" class=\"hidden\" name=\"zip\" id=\"a-zip\" value=\"zip\" onclick=\"return confirm('<?php echo lng('Create archive?'); ?>&#8216;)&#8221;><br \/>\n                    <a href=\"javascript:document.getElementById('a-zip').click();\" class=\"btn btn-small btn-outline-primary btn-2\"><i class=\"fa fa-file-archive-o\"><\/i> <?php echo lng('Zip') ?> <\/a><br \/>\n                    <input type=\"submit\" class=\"hidden\" name=\"tar\" id=\"a-tar\" value=\"tar\" onclick=\"return confirm('<?php echo lng('Create archive?'); ?>&#8216;)&#8221;><br \/>\n                    <a href=\"javascript:document.getElementById('a-tar').click();\" class=\"btn btn-small btn-outline-primary btn-2\"><i class=\"fa fa-file-archive-o\"><\/i> <?php echo lng('Tar') ?> <\/a><br \/>\n                    <input type=\"submit\" class=\"hidden\" name=\"copy\" id=\"a-copy\" value=\"Copy\"><br \/>\n                    <a href=\"javascript:document.getElementById('a-copy').click();\" class=\"btn btn-small btn-outline-primary btn-2\"><i class=\"fa fa-files-o\"><\/i> <?php echo lng('Copy') ?> <\/a>\n                <\/div>\n<\/p><\/div>\n<div class=\"col-3 d-none d-sm-block\"><a href=\"https:\/\/tinyfilemanager.github.io\" target=\"_blank\" class=\"float-right text-muted\"><?php echo lng(\"AppName\").\" \".VERSION; ?><\/a><\/div>\n<p>        <?php else: ?><\/p>\n<div class=\"col-12\"><a href=\"https:\/\/tinyfilemanager.github.io\" target=\"_blank\" class=\"float-right text-muted\"><?php echo lng(\"AppName\").\" \".VERSION; ?><\/a><\/div>\n<p>        <?php endif; ?>\n    <\/div>\n<\/form>\n<p><?php\nfm_show_footer();\n\n\/\/ --- END HTML ---\n\n\/\/ Functions\n\n\/**\n * It prints the css\/js files into html\n * @param key The key of the external file to print.\n *\/\nfunction print_external($key)\n{\n    global $external;\n\n    if (!array_key_exists($key, $external)) {\n        \/\/ throw new Exception('Key missing in external: ' . key);\n        echo \"<!-- EXTERNAL: MISSING KEY $key -->&#8220;;<br \/>\n        return;<br \/>\n    }<\/p>\n<p>    echo &#8220;$external[$key]&#8221;;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Verify CSRF TOKEN and remove after certified<br \/>\n * @param string $token<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction verifyToken($token)<br \/>\n{<br \/>\n    if (hash_equals($_SESSION[&#8216;token&#8217;], $token)) {<br \/>\n        return true;<br \/>\n    }<br \/>\n    return false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Delete  file or folder (recursively)<br \/>\n * @param string $path<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_rdelete($path)<br \/>\n{<br \/>\n    if (is_link($path)) {<br \/>\n        return unlink($path);<br \/>\n    } elseif (is_dir($path)) {<br \/>\n        $objects = scandir($path);<br \/>\n        $ok = true;<br \/>\n        if (is_array($objects)) {<br \/>\n            foreach ($objects as $file) {<br \/>\n                if ($file != &#8216;.&#8217; &#038;&#038; $file != &#8216;..&#8217;) {<br \/>\n                    if (!fm_rdelete($path . &#8216;\/&#8217; . $file)) {<br \/>\n                        $ok = false;<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n        return ($ok) ? rmdir($path) : false;<br \/>\n    } elseif (is_file($path)) {<br \/>\n        return unlink($path);<br \/>\n    }<br \/>\n    return false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Recursive chmod<br \/>\n * @param string $path<br \/>\n * @param int $filemode<br \/>\n * @param int $dirmode<br \/>\n * @return bool<br \/>\n * @todo Will use in mass chmod<br \/>\n *\/<br \/>\nfunction fm_rchmod($path, $filemode, $dirmode)<br \/>\n{<br \/>\n    if (is_dir($path)) {<br \/>\n        if (!chmod($path, $dirmode)) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        $objects = scandir($path);<br \/>\n        if (is_array($objects)) {<br \/>\n            foreach ($objects as $file) {<br \/>\n                if ($file != &#8216;.&#8217; &#038;&#038; $file != &#8216;..&#8217;) {<br \/>\n                    if (!fm_rchmod($path . &#8216;\/&#8217; . $file, $filemode, $dirmode)) {<br \/>\n                        return false;<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n        }<br \/>\n        return true;<br \/>\n    } elseif (is_link($path)) {<br \/>\n        return true;<br \/>\n    } elseif (is_file($path)) {<br \/>\n        return chmod($path, $filemode);<br \/>\n    }<br \/>\n    return false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Check the file extension which is allowed or not<br \/>\n * @param string $filename<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_is_valid_ext($filename)<br \/>\n{<br \/>\n    $allowed = (FM_FILE_EXTENSION) ? explode(&#8216;,&#8217;, FM_FILE_EXTENSION) : false;<\/p>\n<p>    $ext = pathinfo($filename, PATHINFO_EXTENSION);<br \/>\n    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;<\/p>\n<p>    return ($isFileAllowed) ? true : false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Safely rename<br \/>\n * @param string $old<br \/>\n * @param string $new<br \/>\n * @return bool|null<br \/>\n *\/<br \/>\nfunction fm_rename($old, $new)<br \/>\n{<br \/>\n    $isFileAllowed = fm_is_valid_ext($new);<\/p>\n<p>    if (!is_dir($old)) {<br \/>\n        if (!$isFileAllowed) return false;<br \/>\n    }<\/p>\n<p>    return (!file_exists($new) &#038;&#038; file_exists($old)) ? rename($old, $new) : null;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Copy file or folder (recursively).<br \/>\n * @param string $path<br \/>\n * @param string $dest<br \/>\n * @param bool $upd Update files<br \/>\n * @param bool $force Create folder with same names instead file<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_rcopy($path, $dest, $upd = true, $force = true)<br \/>\n{<br \/>\n    if (!is_dir($path) &#038;&#038; !is_file($path)) {<br \/>\n        return false;<br \/>\n    }<\/p>\n<p>    if (is_dir($path)) {<br \/>\n        if (!fm_mkdir($dest, $force)) {<br \/>\n            return false;<br \/>\n        }<\/p>\n<p>        $objects = array_diff(scandir($path), [&#8216;.&#8217;, &#8216;..&#8217;]);<\/p>\n<p>        foreach ($objects as $file) {<br \/>\n            if (!fm_rcopy(&#8220;$path\/$file&#8221;, &#8220;$dest\/$file&#8221;, $upd, $force)) {<br \/>\n                return false;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        return true;<br \/>\n    }<\/p>\n<p>    \/\/ Handle file copying<br \/>\n    return fm_copy($path, $dest, $upd);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Safely create folder<br \/>\n * @param string $dir<br \/>\n * @param bool $force<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_mkdir($dir, $force)<br \/>\n{<br \/>\n    if (file_exists($dir)) {<br \/>\n        if (is_dir($dir)) {<br \/>\n            return $dir;<br \/>\n        } elseif (!$force) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        unlink($dir);<br \/>\n    }<br \/>\n    return mkdir($dir, 0777, true);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Safely copy file<br \/>\n * @param string $f1<br \/>\n * @param string $f2<br \/>\n * @param bool $upd Indicates if file should be updated with new content<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_copy($f1, $f2, $upd)<br \/>\n{<br \/>\n    $time1 = filemtime($f1);<br \/>\n    if (file_exists($f2)) {<br \/>\n        $time2 = filemtime($f2);<br \/>\n        if ($time2 >= $time1 &#038;&#038; $upd) {<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<br \/>\n    $ok = copy($f1, $f2);<br \/>\n    if ($ok) {<br \/>\n        touch($f2, $time1);<br \/>\n    }<br \/>\n    return $ok;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get mime type<br \/>\n * @param string $file_path<br \/>\n * @return mixed|string<br \/>\n *\/<br \/>\nfunction fm_get_mime_type($file_path)<br \/>\n{<br \/>\n    if (function_exists(&#8216;finfo_open&#8217;)) {<br \/>\n        $finfo = finfo_open(FILEINFO_MIME_TYPE);<br \/>\n        $mime = finfo_file($finfo, $file_path);<br \/>\n        if (\\PHP_VERSION_ID < 80000) {\n            finfo_close($finfo);\n        }\n        return $mime;\n    } elseif (function_exists('mime_content_type')) {\n        return mime_content_type($file_path);\n    } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {\n        $file = escapeshellarg($file_path);\n        $mime = shell_exec('file -bi ' . $file);\n        return $mime;\n    } else {\n        return '--';\n    }\n}\n\n\/**\n * HTTP Redirect\n * @param string $url\n * @param int $code\n *\/\nfunction fm_redirect($url, $code = 302)\n{\n    header('Location: ' . $url, true, $code);\n    exit;\n}\n\n\/**\n * Path traversal prevention and clean the url\n * It replaces (consecutive) occurrences of \/ and \\\\ with whatever is in DIRECTORY_SEPARATOR, and processes \/. and \/.. fine.\n * @param $path\n * @return string\n *\/\nfunction get_absolute_path($path)\n{\n    $path = str_replace(array('\/', '\\\\'), DIRECTORY_SEPARATOR, $path);\n    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');\n    $absolutes = array();\n    foreach ($parts as $part) {\n        if ('.' == $part) continue;\n        if ('..' == $part) {\n            array_pop($absolutes);\n        } else {\n            $absolutes[] = $part;\n        }\n    }\n    return implode(DIRECTORY_SEPARATOR, $absolutes);\n}\n\n\/**\n * Clean path\n * @param string $path\n * @return string\n *\/\nfunction fm_clean_path($path, $trim = true)\n{\n    $path = $trim ? trim($path) : $path;\n    $path = trim($path, '\\\\\/');\n    $path = str_replace(array('..\/', '..\\\\'), '', $path);\n    $path =  get_absolute_path($path);\n    if ($path == '..') {\n        $path = '';\n    }\n    return str_replace('\\\\', '\/', $path);\n}\n\n\/**\n * Get parent path\n * @param string $path\n * @return bool|string\n *\/\nfunction fm_get_parent_path($path)\n{\n    $path = fm_clean_path($path);\n    if ($path != '') {\n        $array = explode('\/', $path);\n        if (count($array) > 1) {<br \/>\n            $array = array_slice($array, 0, -1);<br \/>\n            return implode(&#8216;\/&#8217;, $array);<br \/>\n        }<br \/>\n        return &#8221;;<br \/>\n    }<br \/>\n    return false;<br \/>\n}<\/p>\n<p>function fm_get_display_path($file_path)<br \/>\n{<br \/>\n    global $path_display_mode, $root_path, $root_url;<br \/>\n    switch ($path_display_mode) {<br \/>\n        case &#8216;relative&#8217;:<br \/>\n            return array(<br \/>\n                &#8216;label&#8217; => &#8216;Path&#8217;,<br \/>\n                &#8216;path&#8217; => fm_enc(fm_convert_win(str_replace($root_path, &#8221;, $file_path)))<br \/>\n            );<br \/>\n        case &#8216;host&#8217;:<br \/>\n            $relative_path = str_replace($root_path, &#8221;, $file_path);<br \/>\n            return array(<br \/>\n                &#8216;label&#8217; => &#8216;Host Path&#8217;,<br \/>\n                &#8216;path&#8217; => fm_enc(fm_convert_win(&#8216;\/&#8217; . $root_url . &#8216;\/&#8217; . ltrim(str_replace(&#8216;\\\\&#8217;, &#8216;\/&#8217;, $relative_path), &#8216;\/&#8217;)))<br \/>\n            );<br \/>\n        case &#8216;full&#8217;:<br \/>\n        default:<br \/>\n            return array(<br \/>\n                &#8216;label&#8217; => &#8216;Full Path&#8217;,<br \/>\n                &#8216;path&#8217; => fm_enc(fm_convert_win($file_path))<br \/>\n            );<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Check file is in exclude list<br \/>\n * @param string $name The name of the file\/folder<br \/>\n * @param string $path The full path of the file\/folder<br \/>\n * @return bool<br \/>\n *\/<br \/>\nfunction fm_is_exclude_items($name, $path)<br \/>\n{<br \/>\n    $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));<br \/>\n    if (isset($exclude_items) and sizeof($exclude_items)) {<br \/>\n        unset($exclude_items);<br \/>\n    }<\/p>\n<p>    $exclude_items = FM_EXCLUDE_ITEMS;<br \/>\n    if (version_compare(PHP_VERSION, &#8216;7.0.0&#8217;, &#8216;<')) {\n        $exclude_items = unserialize($exclude_items);\n    }\n    if (!in_array($name, $exclude_items) &#038;&#038; !in_array(\"*.$ext\", $exclude_items) &#038;&#038; !in_array($path, $exclude_items)) {\n        return true;\n    }\n    return false;\n}\n\n\/**\n * get language translations from json file\n * @param int $tr\n * @return array\n *\/\nfunction fm_get_translations($tr)\n{\n    try {\n        static $content = null;\n        if ($content === null) {\n            $content = @file_get_contents('translation.json');\n        }\n        if ($content !== FALSE) {\n            $lng = json_decode($content, TRUE);\n            global $lang_list;\n            foreach ($lng[\"language\"] as $key => $value) {<br \/>\n                $code = $value[&#8220;code&#8221;];<br \/>\n                $lang_list[$code] = $value[&#8220;name&#8221;];<br \/>\n                if ($tr)<br \/>\n                    $tr[$code] = $value[&#8220;translation&#8221;];<br \/>\n            }<br \/>\n            return $tr;<br \/>\n        }<br \/>\n    } catch (Exception $e) {<br \/>\n        echo $e;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * @param string $file<br \/>\n * Recover all file sizes larger than > 2GB.<br \/>\n * Works on php 32bits and 64bits and supports linux<br \/>\n * @return int|string<br \/>\n *\/<br \/>\nfunction fm_get_size($file)<br \/>\n{<br \/>\n    static $iswin = null;<br \/>\n    static $isdarwin = null;<br \/>\n    static $exec_works = null;<\/p>\n<p>    \/\/ Set static variables once<br \/>\n    if ($iswin === null) {<br \/>\n        $iswin = strtoupper(substr(PHP_OS, 0, 3)) === &#8216;WIN&#8217;;<br \/>\n        $isdarwin = strtoupper(PHP_OS) === &#8216;DARWIN&#8217;;<br \/>\n        $exec_works = function_exists(&#8216;exec&#8217;) &#038;&#038; !ini_get(&#8216;safe_mode&#8217;) &#038;&#038; @exec(&#8216;echo EXEC&#8217;) === &#8216;EXEC&#8217;;<br \/>\n    }<\/p>\n<p>    \/\/ Attempt shell command if exec is available<br \/>\n    if ($exec_works) {<br \/>\n        $arg = escapeshellarg($file);<br \/>\n        $cmd = $iswin ? &#8220;for %F in (\\&#8221;$file\\&#8221;) do @echo %~zF&#8221; : ($isdarwin ? &#8220;stat -f%z $arg&#8221; : &#8220;stat -c%s $arg&#8221;);<br \/>\n        @exec($cmd, $output);<\/p>\n<p>        if (!empty($output) &#038;&#038; ctype_digit($size = trim(implode(&#8220;\\n&#8221;, $output)))) {<br \/>\n            return $size;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ Attempt Windows COM interface for Windows systems<br \/>\n    if ($iswin &#038;&#038; class_exists(&#8216;COM&#8217;)) {<br \/>\n        try {<br \/>\n            $fsobj = new COM(&#8216;Scripting.FileSystemObject&#8217;);<br \/>\n            $f = $fsobj->GetFile(realpath($file));<br \/>\n            if (ctype_digit($size = $f->Size)) {<br \/>\n                return $size;<br \/>\n            }<br \/>\n        } catch (Exception $e) {<br \/>\n            \/\/ COM failed, fallback to filesize<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ Default to PHP&#8217;s filesize function<br \/>\n    return filesize($file);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get nice filesize<br \/>\n * @param int $size<br \/>\n * @return string<br \/>\n *\/<br \/>\nfunction fm_get_filesize($size)<br \/>\n{<br \/>\n    $size = (float) $size;<br \/>\n    $units = array(&#8216;B&#8217;, &#8216;KB&#8217;, &#8216;MB&#8217;, &#8216;GB&#8217;, &#8216;TB&#8217;, &#8216;PB&#8217;, &#8216;EB&#8217;, &#8216;ZB&#8217;, &#8216;YB&#8217;);<br \/>\n    $power = ($size > 0) ? floor(log($size, 1024)) : 0;<br \/>\n    $power = ($power > (count($units) &#8211; 1)) ? (count($units) &#8211; 1) : $power;<br \/>\n    return sprintf(&#8216;%s %s&#8217;, round($size \/ pow(1024, $power), 2), $units[$power]);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get info about zip archive<br \/>\n * @param string $path<br \/>\n * @return array|bool<br \/>\n *\/<br \/>\nfunction fm_get_zip_info($path, $ext)<br \/>\n{<br \/>\n    if ($ext == &#8216;zip&#8217; &#038;&#038; function_exists(&#8216;zip_open&#8217;)) {<br \/>\n        $arch = @zip_open($path);<br \/>\n        if ($arch) {<br \/>\n            $filenames = array();<br \/>\n            while ($zip_entry = @zip_read($arch)) {<br \/>\n                $zip_name = @zip_entry_name($zip_entry);<br \/>\n                $zip_folder = substr($zip_name, -1) == &#8216;\/&#8217;;<br \/>\n                $filenames[] = array(<br \/>\n                    &#8216;name&#8217; => $zip_name,<br \/>\n                    &#8216;filesize&#8217; => @zip_entry_filesize($zip_entry),<br \/>\n                    &#8216;compressed_size&#8217; => @zip_entry_compressedsize($zip_entry),<br \/>\n                    &#8216;folder&#8217; => $zip_folder<br \/>\n                    \/\/&#8217;compression_method&#8217; => zip_entry_compressionmethod($zip_entry),<br \/>\n                );<br \/>\n            }<br \/>\n            @zip_close($arch);<br \/>\n            return $filenames;<br \/>\n        }<br \/>\n    } elseif ($ext == &#8216;tar&#8217; &#038;&#038; class_exists(&#8216;PharData&#8217;)) {<br \/>\n        $archive = new PharData($path);<br \/>\n        $filenames = array();<br \/>\n        foreach (new RecursiveIteratorIterator($archive) as $file) {<br \/>\n            $parent_info = $file->getPathInfo();<br \/>\n            $zip_name = str_replace(&#8220;phar:\/\/&#8221; . $path, &#8221;, $file->getPathName());<br \/>\n            $zip_name = substr($zip_name, ($pos = strpos($zip_name, &#8216;\/&#8217;)) !== false ? $pos + 1 : 0);<br \/>\n            $zip_folder = $parent_info->getFileName();<br \/>\n            $zip_info = new SplFileInfo($file);<br \/>\n            $filenames[] = array(<br \/>\n                &#8216;name&#8217; => $zip_name,<br \/>\n                &#8216;filesize&#8217; => $zip_info->getSize(),<br \/>\n                &#8216;compressed_size&#8217; => $file->getCompressedSize(),<br \/>\n                &#8216;folder&#8217; => $zip_folder<br \/>\n            );<br \/>\n        }<br \/>\n        return $filenames;<br \/>\n    }<br \/>\n    return false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Encode html entities<br \/>\n * @param string $text<br \/>\n * @return string<br \/>\n *\/<br \/>\nfunction fm_enc($text)<br \/>\n{<br \/>\n    return htmlspecialchars($text, ENT_QUOTES, &#8216;UTF-8&#8217;);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Prevent XSS attacks<br \/>\n * @param string $text<br \/>\n * @return string<br \/>\n *\/<br \/>\nfunction fm_isvalid_filename($text)<br \/>\n{<br \/>\n    return (strpbrk($text, &#8216;\/?%*:|&#8221;<>&#8216; . chr(0)) === FALSE) ? true : false;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Save message in session<br \/>\n * @param string $msg<br \/>\n * @param string $status<br \/>\n *\/<br \/>\nfunction fm_set_msg($msg, $status = &#8216;ok&#8217;)<br \/>\n{<br \/>\n    $_SESSION[FM_SESSION_ID][&#8216;message&#8217;] = $msg;<br \/>\n    $_SESSION[FM_SESSION_ID][&#8216;status&#8217;] = $status;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Check if string is in UTF-8<br \/>\n * @param string $string<br \/>\n * @return int<br \/>\n *\/<br \/>\nfunction fm_is_utf8($string)<br \/>\n{<br \/>\n    return preg_match(&#8216;\/\/u&#8217;, $string);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Convert file name to UTF-8 in Windows<br \/>\n * @param string $filename<br \/>\n * @return string<br \/>\n *\/<br \/>\nfunction fm_convert_win($filename)<br \/>\n{<br \/>\n    if (FM_IS_WIN &#038;&#038; function_exists(&#8216;iconv&#8217;)) {<br \/>\n        $filename = iconv(FM_ICONV_INPUT_ENC, &#8216;UTF-8\/\/IGNORE&#8217;, $filename);<br \/>\n    }<br \/>\n    return $filename;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * @param $obj<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_object_to_array($obj)<br \/>\n{<br \/>\n    if (!is_object($obj) &#038;&#038; !is_array($obj)) {<br \/>\n        return $obj;<br \/>\n    }<br \/>\n    if (is_object($obj)) {<br \/>\n        $obj = get_object_vars($obj);<br \/>\n    }<br \/>\n    return array_map(&#8216;fm_object_to_array&#8217;, $obj);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get CSS classname for file<br \/>\n * @param string $path<br \/>\n * @return string<br \/>\n *\/<br \/>\nfunction fm_get_file_icon_class($path)<br \/>\n{<br \/>\n    \/\/ get extension<br \/>\n    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));<\/p>\n<p>    switch ($ext) {<br \/>\n        case &#8216;ico&#8217;:<br \/>\n        case &#8216;gif&#8217;:<br \/>\n        case &#8216;jpg&#8217;:<br \/>\n        case &#8216;jpeg&#8217;:<br \/>\n        case &#8216;jpc&#8217;:<br \/>\n        case &#8216;jp2&#8217;:<br \/>\n        case &#8216;jpx&#8217;:<br \/>\n        case &#8216;xbm&#8217;:<br \/>\n        case &#8216;wbmp&#8217;:<br \/>\n        case &#8216;png&#8217;:<br \/>\n        case &#8216;bmp&#8217;:<br \/>\n        case &#8216;tif&#8217;:<br \/>\n        case &#8216;tiff&#8217;:<br \/>\n        case &#8216;webp&#8217;:<br \/>\n        case &#8216;avif&#8217;:<br \/>\n        case &#8216;svg&#8217;:<br \/>\n            $img = &#8216;fa fa-picture-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;passwd&#8217;:<br \/>\n        case &#8216;ftpquota&#8217;:<br \/>\n        case &#8216;sql&#8217;:<br \/>\n        case &#8216;js&#8217;:<br \/>\n        case &#8216;ts&#8217;:<br \/>\n        case &#8216;jsx&#8217;:<br \/>\n        case &#8216;tsx&#8217;:<br \/>\n        case &#8216;hbs&#8217;:<br \/>\n        case &#8216;json&#8217;:<br \/>\n        case &#8216;sh&#8217;:<br \/>\n        case &#8216;config&#8217;:<br \/>\n        case &#8216;twig&#8217;:<br \/>\n        case &#8216;tpl&#8217;:<br \/>\n        case &#8216;md&#8217;:<br \/>\n        case &#8216;gitignore&#8217;:<br \/>\n        case &#8216;c&#8217;:<br \/>\n        case &#8216;cpp&#8217;:<br \/>\n        case &#8216;h&#8217;:<br \/>\n        case &#8216;hpp&#8217;:<br \/>\n        case &#8216;cs&#8217;:<br \/>\n        case &#8216;py&#8217;:<br \/>\n        case &#8216;rs&#8217;:<br \/>\n        case &#8216;map&#8217;:<br \/>\n        case &#8216;lock&#8217;:<br \/>\n        case &#8216;dtd&#8217;:<br \/>\n        case &#8216;ps1&#8217;:<br \/>\n            $img = &#8216;fa fa-file-code-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;txt&#8217;:<br \/>\n        case &#8216;ini&#8217;:<br \/>\n        case &#8216;conf&#8217;:<br \/>\n        case &#8216;log&#8217;:<br \/>\n        case &#8216;htaccess&#8217;:<br \/>\n        case &#8216;yaml&#8217;:<br \/>\n        case &#8216;yml&#8217;:<br \/>\n        case &#8216;toml&#8217;:<br \/>\n        case &#8216;tmp&#8217;:<br \/>\n        case &#8216;top&#8217;:<br \/>\n        case &#8216;bot&#8217;:<br \/>\n        case &#8216;dat&#8217;:<br \/>\n        case &#8216;bak&#8217;:<br \/>\n        case &#8216;htpasswd&#8217;:<br \/>\n        case &#8216;pl&#8217;:<br \/>\n            $img = &#8216;fa fa-file-text-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;css&#8217;:<br \/>\n        case &#8216;less&#8217;:<br \/>\n        case &#8216;sass&#8217;:<br \/>\n        case &#8216;scss&#8217;:<br \/>\n            $img = &#8216;fa fa-css3&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;bz2&#8217;:<br \/>\n        case &#8216;tbz2&#8217;:<br \/>\n        case &#8216;tbz&#8217;:<br \/>\n        case &#8216;zip&#8217;:<br \/>\n        case &#8216;rar&#8217;:<br \/>\n        case &#8216;gz&#8217;:<br \/>\n        case &#8216;tgz&#8217;:<br \/>\n        case &#8216;tar&#8217;:<br \/>\n        case &#8216;7z&#8217;:<br \/>\n        case &#8216;xz&#8217;:<br \/>\n        case &#8216;txz&#8217;:<br \/>\n        case &#8216;zst&#8217;:<br \/>\n        case &#8216;tzst&#8217;:<br \/>\n            $img = &#8216;fa fa-file-archive-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;php&#8217;:<br \/>\n        case &#8216;php4&#8217;:<br \/>\n        case &#8216;php5&#8217;:<br \/>\n        case &#8216;phps&#8217;:<br \/>\n        case &#8216;phtml&#8217;:<br \/>\n            $img = &#8216;fa fa-code&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;htm&#8217;:<br \/>\n        case &#8216;html&#8217;:<br \/>\n        case &#8216;shtml&#8217;:<br \/>\n        case &#8216;xhtml&#8217;:<br \/>\n            $img = &#8216;fa fa-html5&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;xml&#8217;:<br \/>\n        case &#8216;xsl&#8217;:<br \/>\n            $img = &#8216;fa fa-file-excel-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;wav&#8217;:<br \/>\n        case &#8216;mp3&#8217;:<br \/>\n        case &#8216;mp2&#8217;:<br \/>\n        case &#8216;m4a&#8217;:<br \/>\n        case &#8216;aac&#8217;:<br \/>\n        case &#8216;ogg&#8217;:<br \/>\n        case &#8216;oga&#8217;:<br \/>\n        case &#8216;wma&#8217;:<br \/>\n        case &#8216;mka&#8217;:<br \/>\n        case &#8216;flac&#8217;:<br \/>\n        case &#8216;ac3&#8217;:<br \/>\n        case &#8216;tds&#8217;:<br \/>\n            $img = &#8216;fa fa-music&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;m3u&#8217;:<br \/>\n        case &#8216;m3u8&#8217;:<br \/>\n        case &#8216;pls&#8217;:<br \/>\n        case &#8216;cue&#8217;:<br \/>\n        case &#8216;xspf&#8217;:<br \/>\n            $img = &#8216;fa fa-headphones&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;avi&#8217;:<br \/>\n        case &#8216;mpg&#8217;:<br \/>\n        case &#8216;mpeg&#8217;:<br \/>\n        case &#8216;mp4&#8217;:<br \/>\n        case &#8216;m4v&#8217;:<br \/>\n        case &#8216;flv&#8217;:<br \/>\n        case &#8216;f4v&#8217;:<br \/>\n        case &#8216;ogm&#8217;:<br \/>\n        case &#8216;ogv&#8217;:<br \/>\n        case &#8216;mov&#8217;:<br \/>\n        case &#8216;mkv&#8217;:<br \/>\n        case &#8216;3gp&#8217;:<br \/>\n        case &#8216;asf&#8217;:<br \/>\n        case &#8216;wmv&#8217;:<br \/>\n        case &#8216;webm&#8217;:<br \/>\n            $img = &#8216;fa fa-file-video-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8217;eml&#8217;:<br \/>\n        case &#8216;msg&#8217;:<br \/>\n            $img = &#8216;fa fa-envelope-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;xls&#8217;:<br \/>\n        case &#8216;xlsx&#8217;:<br \/>\n        case &#8216;ods&#8217;:<br \/>\n            $img = &#8216;fa fa-file-excel-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;csv&#8217;:<br \/>\n            $img = &#8216;fa fa-file-text-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;bak&#8217;:<br \/>\n        case &#8216;swp&#8217;:<br \/>\n            $img = &#8216;fa fa-clipboard&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;doc&#8217;:<br \/>\n        case &#8216;docx&#8217;:<br \/>\n        case &#8216;odt&#8217;:<br \/>\n            $img = &#8216;fa fa-file-word-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;ppt&#8217;:<br \/>\n        case &#8216;pptx&#8217;:<br \/>\n            $img = &#8216;fa fa-file-powerpoint-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;ttf&#8217;:<br \/>\n        case &#8216;ttc&#8217;:<br \/>\n        case &#8216;otf&#8217;:<br \/>\n        case &#8216;woff&#8217;:<br \/>\n        case &#8216;woff2&#8217;:<br \/>\n        case &#8216;eot&#8217;:<br \/>\n        case &#8216;fon&#8217;:<br \/>\n            $img = &#8216;fa fa-font&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;pdf&#8217;:<br \/>\n            $img = &#8216;fa fa-file-pdf-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;psd&#8217;:<br \/>\n        case &#8216;ai&#8217;:<br \/>\n        case &#8216;eps&#8217;:<br \/>\n        case &#8216;fla&#8217;:<br \/>\n        case &#8216;swf&#8217;:<br \/>\n            $img = &#8216;fa fa-file-image-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;exe&#8217;:<br \/>\n        case &#8216;msi&#8217;:<br \/>\n            $img = &#8216;fa fa-file-o&#8217;;<br \/>\n            break;<br \/>\n        case &#8216;bat&#8217;:<br \/>\n            $img = &#8216;fa fa-terminal&#8217;;<br \/>\n            break;<br \/>\n        default:<br \/>\n            $img = &#8216;fa fa-info-circle&#8217;;<br \/>\n    }<\/p>\n<p>    return $img;<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get image files extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_image_exts()<br \/>\n{<br \/>\n    return array(&#8216;ico&#8217;, &#8216;gif&#8217;, &#8216;jpg&#8217;, &#8216;jpeg&#8217;, &#8216;jpc&#8217;, &#8216;jp2&#8217;, &#8216;jpx&#8217;, &#8216;xbm&#8217;, &#8216;wbmp&#8217;, &#8216;png&#8217;, &#8216;bmp&#8217;, &#8216;tif&#8217;, &#8216;tiff&#8217;, &#8216;psd&#8217;, &#8216;svg&#8217;, &#8216;webp&#8217;, &#8216;avif&#8217;);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get video files extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_video_exts()<br \/>\n{<br \/>\n    return array(&#8216;avi&#8217;, &#8216;webm&#8217;, &#8216;wmv&#8217;, &#8216;mp4&#8217;, &#8216;m4v&#8217;, &#8216;ogm&#8217;, &#8216;ogv&#8217;, &#8216;mov&#8217;, &#8216;mkv&#8217;);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get audio files extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_audio_exts()<br \/>\n{<br \/>\n    return array(&#8216;wav&#8217;, &#8216;mp3&#8217;, &#8216;ogg&#8217;, &#8216;m4a&#8217;);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get text file extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_text_exts()<br \/>\n{<br \/>\n    return array(<br \/>\n        &#8216;txt&#8217;,<br \/>\n        &#8216;css&#8217;,<br \/>\n        &#8216;ini&#8217;,<br \/>\n        &#8216;conf&#8217;,<br \/>\n        &#8216;log&#8217;,<br \/>\n        &#8216;htaccess&#8217;,<br \/>\n        &#8216;passwd&#8217;,<br \/>\n        &#8216;ftpquota&#8217;,<br \/>\n        &#8216;sql&#8217;,<br \/>\n        &#8216;js&#8217;,<br \/>\n        &#8216;ts&#8217;,<br \/>\n        &#8216;jsx&#8217;,<br \/>\n        &#8216;tsx&#8217;,<br \/>\n        &#8216;mjs&#8217;,<br \/>\n        &#8216;json&#8217;,<br \/>\n        &#8216;sh&#8217;,<br \/>\n        &#8216;config&#8217;,<br \/>\n        &#8216;php&#8217;,<br \/>\n        &#8216;php4&#8217;,<br \/>\n        &#8216;php5&#8217;,<br \/>\n        &#8216;phps&#8217;,<br \/>\n        &#8216;phtml&#8217;,<br \/>\n        &#8216;htm&#8217;,<br \/>\n        &#8216;html&#8217;,<br \/>\n        &#8216;shtml&#8217;,<br \/>\n        &#8216;xhtml&#8217;,<br \/>\n        &#8216;xml&#8217;,<br \/>\n        &#8216;xsl&#8217;,<br \/>\n        &#8216;m3u&#8217;,<br \/>\n        &#8216;m3u8&#8217;,<br \/>\n        &#8216;pls&#8217;,<br \/>\n        &#8216;cue&#8217;,<br \/>\n        &#8216;bash&#8217;,<br \/>\n        &#8216;vue&#8217;,<br \/>\n        &#8217;eml&#8217;,<br \/>\n        &#8216;msg&#8217;,<br \/>\n        &#8216;csv&#8217;,<br \/>\n        &#8216;bat&#8217;,<br \/>\n        &#8216;twig&#8217;,<br \/>\n        &#8216;tpl&#8217;,<br \/>\n        &#8216;md&#8217;,<br \/>\n        &#8216;gitignore&#8217;,<br \/>\n        &#8216;less&#8217;,<br \/>\n        &#8216;sass&#8217;,<br \/>\n        &#8216;scss&#8217;,<br \/>\n        &#8216;c&#8217;,<br \/>\n        &#8216;cpp&#8217;,<br \/>\n        &#8216;h&#8217;,<br \/>\n        &#8216;hpp&#8217;,<br \/>\n        &#8216;cs&#8217;,<br \/>\n        &#8216;py&#8217;,<br \/>\n        &#8216;go&#8217;,<br \/>\n        &#8216;zsh&#8217;,<br \/>\n        &#8216;swift&#8217;,<br \/>\n        &#8216;map&#8217;,<br \/>\n        &#8216;lock&#8217;,<br \/>\n        &#8216;dtd&#8217;,<br \/>\n        &#8216;svg&#8217;,<br \/>\n        &#8216;asp&#8217;,<br \/>\n        &#8216;aspx&#8217;,<br \/>\n        &#8216;asx&#8217;,<br \/>\n        &#8216;asmx&#8217;,<br \/>\n        &#8216;ashx&#8217;,<br \/>\n        &#8216;jsp&#8217;,<br \/>\n        &#8216;jspx&#8217;,<br \/>\n        &#8216;cgi&#8217;,<br \/>\n        &#8216;dockerfile&#8217;,<br \/>\n        &#8216;ruby&#8217;,<br \/>\n        &#8216;yml&#8217;,<br \/>\n        &#8216;yaml&#8217;,<br \/>\n        &#8216;toml&#8217;,<br \/>\n        &#8216;vhost&#8217;,<br \/>\n        &#8216;scpt&#8217;,<br \/>\n        &#8216;applescript&#8217;,<br \/>\n        &#8216;csx&#8217;,<br \/>\n        &#8216;cshtml&#8217;,<br \/>\n        &#8216;c++&#8217;,<br \/>\n        &#8216;coffee&#8217;,<br \/>\n        &#8216;cfm&#8217;,<br \/>\n        &#8216;rb&#8217;,<br \/>\n        &#8216;graphql&#8217;,<br \/>\n        &#8216;mustache&#8217;,<br \/>\n        &#8216;jinja&#8217;,<br \/>\n        &#8216;http&#8217;,<br \/>\n        &#8216;handlebars&#8217;,<br \/>\n        &#8216;java&#8217;,<br \/>\n        &#8216;es&#8217;,<br \/>\n        &#8216;es6&#8217;,<br \/>\n        &#8216;markdown&#8217;,<br \/>\n        &#8216;wiki&#8217;,<br \/>\n        &#8216;tmp&#8217;,<br \/>\n        &#8216;top&#8217;,<br \/>\n        &#8216;bot&#8217;,<br \/>\n        &#8216;dat&#8217;,<br \/>\n        &#8216;bak&#8217;,<br \/>\n        &#8216;htpasswd&#8217;,<br \/>\n        &#8216;pl&#8217;,<br \/>\n        &#8216;ps1&#8217;<br \/>\n    );<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get mime types of text files<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_text_mimes()<br \/>\n{<br \/>\n    return array(<br \/>\n        &#8216;application\/xml&#8217;,<br \/>\n        &#8216;application\/javascript&#8217;,<br \/>\n        &#8216;application\/x-javascript&#8217;,<br \/>\n        &#8216;image\/svg+xml&#8217;,<br \/>\n        &#8216;message\/rfc822&#8217;,<br \/>\n        &#8216;application\/json&#8217;,<br \/>\n    );<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get file names of text files w\/o extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_text_names()<br \/>\n{<br \/>\n    return array(<br \/>\n        &#8216;license&#8217;,<br \/>\n        &#8216;readme&#8217;,<br \/>\n        &#8216;authors&#8217;,<br \/>\n        &#8216;contributors&#8217;,<br \/>\n        &#8216;changelog&#8217;,<br \/>\n    );<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Get online docs viewer supported files extensions<br \/>\n * @return array<br \/>\n *\/<br \/>\nfunction fm_get_onlineViewer_exts()<br \/>\n{<br \/>\n    return array(&#8216;doc&#8217;, &#8216;docx&#8217;, &#8216;xls&#8217;, &#8216;xlsx&#8217;, &#8216;pdf&#8217;, &#8216;ppt&#8217;, &#8216;pptx&#8217;, &#8216;ai&#8217;, &#8216;psd&#8217;, &#8216;dxf&#8217;, &#8216;xps&#8217;, &#8216;rar&#8217;, &#8216;odt&#8217;, &#8216;ods&#8217;);<br \/>\n}<\/p>\n<p>\/**<br \/>\n * It returns the mime type of a file based on its extension.<br \/>\n * @param extension The file extension of the file you want to get the mime type for.<br \/>\n * @return string|string[] The mime type of the file.<br \/>\n *\/<br \/>\nfunction fm_get_file_mimes($extension)<br \/>\n{<br \/>\n    $fileTypes[&#8216;swf&#8217;] = &#8216;application\/x-shockwave-flash&#8217;;<br \/>\n    $fileTypes[&#8216;pdf&#8217;] = &#8216;application\/pdf&#8217;;<br \/>\n    $fileTypes[&#8216;exe&#8217;] = &#8216;application\/octet-stream&#8217;;<br \/>\n    $fileTypes[&#8216;zip&#8217;] = &#8216;application\/zip&#8217;;<br \/>\n    $fileTypes[&#8216;doc&#8217;] = &#8216;application\/msword&#8217;;<br \/>\n    $fileTypes[&#8216;xls&#8217;] = &#8216;application\/vnd.ms-excel&#8217;;<br \/>\n    $fileTypes[&#8216;ppt&#8217;] = &#8216;application\/vnd.ms-powerpoint&#8217;;<br \/>\n    $fileTypes[&#8216;gif&#8217;] = &#8216;image\/gif&#8217;;<br \/>\n    $fileTypes[&#8216;png&#8217;] = &#8216;image\/png&#8217;;<br \/>\n    $fileTypes[&#8216;jpeg&#8217;] = &#8216;image\/jpg&#8217;;<br \/>\n    $fileTypes[&#8216;jpg&#8217;] = &#8216;image\/jpg&#8217;;<br \/>\n    $fileTypes[&#8216;webp&#8217;] = &#8216;image\/webp&#8217;;<br \/>\n    $fileTypes[&#8216;avif&#8217;] = &#8216;image\/avif&#8217;;<br \/>\n    $fileTypes[&#8216;rar&#8217;] = &#8216;application\/rar&#8217;;<\/p>\n<p>    $fileTypes[&#8216;ra&#8217;] = &#8216;audio\/x-pn-realaudio&#8217;;<br \/>\n    $fileTypes[&#8216;ram&#8217;] = &#8216;audio\/x-pn-realaudio&#8217;;<br \/>\n    $fileTypes[&#8216;ogg&#8217;] = &#8216;audio\/x-pn-realaudio&#8217;;<\/p>\n<p>    $fileTypes[&#8216;wav&#8217;] = &#8216;video\/x-msvideo&#8217;;<br \/>\n    $fileTypes[&#8216;wmv&#8217;] = &#8216;video\/x-msvideo&#8217;;<br \/>\n    $fileTypes[&#8216;avi&#8217;] = &#8216;video\/x-msvideo&#8217;;<br \/>\n    $fileTypes[&#8216;asf&#8217;] = &#8216;video\/x-msvideo&#8217;;<br \/>\n    $fileTypes[&#8216;divx&#8217;] = &#8216;video\/x-msvideo&#8217;;<\/p>\n<p>    $fileTypes[&#8216;mp3&#8217;] = &#8216;audio\/mpeg&#8217;;<br \/>\n    $fileTypes[&#8216;mp4&#8217;] = &#8216;video\/mp4&#8217;;<br \/>\n    $fileTypes[&#8216;mpeg&#8217;] = &#8216;video\/mpeg&#8217;;<br \/>\n    $fileTypes[&#8216;mpg&#8217;] = &#8216;video\/mpeg&#8217;;<br \/>\n    $fileTypes[&#8216;mpe&#8217;] = &#8216;video\/mpeg&#8217;;<br \/>\n    $fileTypes[&#8216;mov&#8217;] = &#8216;video\/quicktime&#8217;;<br \/>\n    $fileTypes[&#8216;swf&#8217;] = &#8216;video\/quicktime&#8217;;<br \/>\n    $fileTypes[&#8216;3gp&#8217;] = &#8216;video\/quicktime&#8217;;<br \/>\n    $fileTypes[&#8216;m4a&#8217;] = &#8216;video\/quicktime&#8217;;<br \/>\n    $fileTypes[&#8216;aac&#8217;] = &#8216;video\/quicktime&#8217;;<br \/>\n    $fileTypes[&#8216;m3u&#8217;] = &#8216;video\/quicktime&#8217;;<\/p>\n<p>    $fileTypes[&#8216;php&#8217;] = [&#8216;application\/x-php&#8217;];<br \/>\n    $fileTypes[&#8216;html&#8217;] = [&#8216;text\/html&#8217;];<br \/>\n    $fileTypes[&#8216;txt&#8217;] = [&#8216;text\/plain&#8217;];<br \/>\n    \/\/Unknown mime-types should be &#8216;application\/octet-stream&#8217;<br \/>\n    if (empty($fileTypes[$extension])) {<br \/>\n        $fileTypes[$extension] = [&#8216;application\/octet-stream&#8217;];<br \/>\n    }<br \/>\n    return $fileTypes[$extension];<br \/>\n}<\/p>\n<p>\/**<br \/>\n * This function scans the files and folder recursively, and return matching files<br \/>\n * @param string $dir<br \/>\n * @param string $filter<br \/>\n * @return array|null<br \/>\n *\/<br \/>\nfunction scan($dir = &#8221;, $filter = &#8221;)<br \/>\n{<br \/>\n    $path = FM_ROOT_PATH . &#8216;\/&#8217; . $dir;<br \/>\n    if ($path) {<br \/>\n        $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));<br \/>\n        $rii = new RegexIterator($ite, &#8220;\/(&#8221; . $filter . &#8220;)\/i&#8221;);<\/p>\n<p>        $files = array();<br \/>\n        foreach ($rii as $file) {<br \/>\n            if (!$file->isDir()) {<br \/>\n                $fileName = $file->getFilename();<br \/>\n                $location = str_replace(FM_ROOT_PATH, &#8221;, $file->getPath());<br \/>\n                $files[] = array(<br \/>\n                    &#8220;name&#8221; => $fileName,<br \/>\n                    &#8220;type&#8221; => &#8220;file&#8221;,<br \/>\n                    &#8220;path&#8221; => $location,<br \/>\n                );<br \/>\n            }<br \/>\n        }<br \/>\n        return $files;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Parameters: downloadFile(File Location, File Name,<br \/>\n * max speed, is streaming<br \/>\n * If streaming &#8211; videos will show as videos, images as images<br \/>\n * instead of download prompt<br \/>\n * https:\/\/stackoverflow.com\/a\/13821992\/1164642<br \/>\n *\/<br \/>\nfunction fm_download_file($fileLocation, $fileName, $chunkSize  = 1024)<br \/>\n{<br \/>\n    if (connection_status() != 0)<br \/>\n        return (false);<br \/>\n    $extension = pathinfo($fileName, PATHINFO_EXTENSION);<\/p>\n<p>    $contentType = fm_get_file_mimes($extension);<\/p>\n<p>    if (is_array($contentType)) {<br \/>\n        $contentType = implode(&#8216; &#8216;, $contentType);<br \/>\n    }<\/p>\n<p>    $size = filesize($fileLocation);<\/p>\n<p>    if ($size == 0) {<br \/>\n        fm_set_msg(lng(&#8216;Zero byte file! Aborting download&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<\/p>\n<p>        return (false);<br \/>\n    }<\/p>\n<p>    @ini_set(&#8216;magic_quotes_runtime&#8217;, 0);<br \/>\n    $fp = fopen(&#8220;$fileLocation&#8221;, &#8220;rb&#8221;);<\/p>\n<p>    if ($fp === false) {<br \/>\n        fm_set_msg(lng(&#8216;Cannot open file! Aborting download&#8217;), &#8216;error&#8217;);<br \/>\n        $FM_PATH = FM_PATH;<br \/>\n        fm_redirect(FM_SELF_URL . &#8216;?p=&#8217; . urlencode($FM_PATH));<br \/>\n        return (false);<br \/>\n    }<\/p>\n<p>    \/\/ headers<br \/>\n    header(&#8216;Content-Description: File Transfer&#8217;);<br \/>\n    header(&#8216;Expires: 0&#8217;);<br \/>\n    header(&#8216;Cache-Control: must-revalidate, post-check=0, pre-check=0&#8217;);<br \/>\n    header(&#8216;Pragma: public&#8217;);<br \/>\n    header(&#8220;Content-Transfer-Encoding: binary&#8221;);<br \/>\n    header(&#8220;Content-Type: $contentType&#8221;);<\/p>\n<p>    $contentDisposition = &#8216;attachment&#8217;;<\/p>\n<p>    if (strstr($_SERVER[&#8216;HTTP_USER_AGENT&#8217;], &#8220;MSIE&#8221;)) {<br \/>\n        $fileName = preg_replace(&#8216;\/\\.\/&#8217;, &#8216;%2e&#8217;, $fileName, substr_count($fileName, &#8216;.&#8217;) &#8211; 1);<br \/>\n        header(&#8220;Content-Disposition: $contentDisposition;filename=\\&#8221;$fileName\\&#8221;&#8221;);<br \/>\n    } else {<br \/>\n        header(&#8220;Content-Disposition: $contentDisposition;filename=\\&#8221;$fileName\\&#8221;&#8221;);<br \/>\n    }<\/p>\n<p>    header(&#8220;Accept-Ranges: bytes&#8221;);<br \/>\n    $range = 0;<\/p>\n<p>    if (isset($_SERVER[&#8216;HTTP_RANGE&#8217;])) {<br \/>\n        list($a, $range) = explode(&#8220;=&#8221;, $_SERVER[&#8216;HTTP_RANGE&#8217;]);<br \/>\n        str_replace($range, &#8220;-&#8220;, $range);<br \/>\n        $size2 = $size &#8211; 1;<br \/>\n        $new_length = $size &#8211; $range;<br \/>\n        header(&#8220;HTTP\/1.1 206 Partial Content&#8221;);<br \/>\n        header(&#8220;Content-Length: $new_length&#8221;);<br \/>\n        header(&#8220;Content-Range: bytes $range$size2\/$size&#8221;);<br \/>\n    } else {<br \/>\n        $size2 = $size &#8211; 1;<br \/>\n        header(&#8220;Content-Range: bytes 0-$size2\/$size&#8221;);<br \/>\n        header(&#8220;Content-Length: &#8221; . $size);<br \/>\n    }<br \/>\n    $fileLocation = realpath($fileLocation);<br \/>\n    while (ob_get_level()) ob_end_clean();<br \/>\n    readfile($fileLocation);<\/p>\n<p>    fclose($fp);<\/p>\n<p>    return ((connection_status() == 0) and !connection_aborted());<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Class to work with zip files (using ZipArchive)<br \/>\n *\/<br \/>\nclass FM_Zipper<br \/>\n{<br \/>\n    private $zip;<\/p>\n<p>    public function __construct()<br \/>\n    {<br \/>\n        $this->zip = new ZipArchive();<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Create archive with name $filename and files $files (RELATIVE PATHS!)<br \/>\n     * @param string $filename<br \/>\n     * @param array|string $files<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    public function create($filename, $files)<br \/>\n    {<br \/>\n        $res = $this->zip->open($filename, ZipArchive::CREATE);<br \/>\n        if ($res !== true) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        if (is_array($files)) {<br \/>\n            foreach ($files as $f) {<br \/>\n                $f = fm_clean_path($f);<br \/>\n                if (!$this->addFileOrDir($f)) {<br \/>\n                    $this->zip->close();<br \/>\n                    return false;<br \/>\n                }<br \/>\n            }<br \/>\n            $this->zip->close();<br \/>\n            return true;<br \/>\n        } else {<br \/>\n            if ($this->addFileOrDir($files)) {<br \/>\n                $this->zip->close();<br \/>\n                return true;<br \/>\n            }<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)<br \/>\n     * @param string $filename<br \/>\n     * @param string $path<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    public function unzip($filename, $path)<br \/>\n    {<br \/>\n        $res = $this->zip->open($filename);<br \/>\n        if ($res !== true) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        if ($this->zip->extractTo($path)) {<br \/>\n            $this->zip->close();<br \/>\n            return true;<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Add file\/folder to archive<br \/>\n     * @param string $filename<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    private function addFileOrDir($filename)<br \/>\n    {<br \/>\n        if (is_file($filename)) {<br \/>\n            return $this->zip->addFile($filename);<br \/>\n        } elseif (is_dir($filename)) {<br \/>\n            return $this->addDir($filename);<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Add folder recursively<br \/>\n     * @param string $path<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    private function addDir($path)<br \/>\n    {<br \/>\n        if (!$this->zip->addEmptyDir($path)) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        $objects = scandir($path);<br \/>\n        if (is_array($objects)) {<br \/>\n            foreach ($objects as $file) {<br \/>\n                if ($file != &#8216;.&#8217; &#038;&#038; $file != &#8216;..&#8217;) {<br \/>\n                    if (is_dir($path . &#8216;\/&#8217; . $file)) {<br \/>\n                        if (!$this->addDir($path . &#8216;\/&#8217; . $file)) {<br \/>\n                            return false;<br \/>\n                        }<br \/>\n                    } elseif (is_file($path . &#8216;\/&#8217; . $file)) {<br \/>\n                        if (!$this->zip->addFile($path . &#8216;\/&#8217; . $file)) {<br \/>\n                            return false;<br \/>\n                        }<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n            return true;<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Class to work with Tar files (using PharData)<br \/>\n *\/<br \/>\nclass FM_Zipper_Tar<br \/>\n{<br \/>\n    private $tar;<\/p>\n<p>    public function __construct()<br \/>\n    {<br \/>\n        $this->tar = null;<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Create archive with name $filename and files $files (RELATIVE PATHS!)<br \/>\n     * @param string $filename<br \/>\n     * @param array|string $files<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    public function create($filename, $files)<br \/>\n    {<br \/>\n        $this->tar = new PharData($filename);<br \/>\n        if (is_array($files)) {<br \/>\n            foreach ($files as $f) {<br \/>\n                $f = fm_clean_path($f);<br \/>\n                if (!$this->addFileOrDir($f)) {<br \/>\n                    return false;<br \/>\n                }<br \/>\n            }<br \/>\n            return true;<br \/>\n        } else {<br \/>\n            if ($this->addFileOrDir($files)) {<br \/>\n                return true;<br \/>\n            }<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)<br \/>\n     * @param string $filename<br \/>\n     * @param string $path<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    public function unzip($filename, $path)<br \/>\n    {<br \/>\n        $res = $this->tar->open($filename);<br \/>\n        if ($res !== true) {<br \/>\n            return false;<br \/>\n        }<br \/>\n        if ($this->tar->extractTo($path)) {<br \/>\n            return true;<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Add file\/folder to archive<br \/>\n     * @param string $filename<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    private function addFileOrDir($filename)<br \/>\n    {<br \/>\n        if (is_file($filename)) {<br \/>\n            try {<br \/>\n                $this->tar->addFile($filename);<br \/>\n                return true;<br \/>\n            } catch (Exception $e) {<br \/>\n                return false;<br \/>\n            }<br \/>\n        } elseif (is_dir($filename)) {<br \/>\n            return $this->addDir($filename);<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * Add folder recursively<br \/>\n     * @param string $path<br \/>\n     * @return bool<br \/>\n     *\/<br \/>\n    private function addDir($path)<br \/>\n    {<br \/>\n        $objects = scandir($path);<br \/>\n        if (is_array($objects)) {<br \/>\n            foreach ($objects as $file) {<br \/>\n                if ($file != &#8216;.&#8217; &#038;&#038; $file != &#8216;..&#8217;) {<br \/>\n                    if (is_dir($path . &#8216;\/&#8217; . $file)) {<br \/>\n                        if (!$this->addDir($path . &#8216;\/&#8217; . $file)) {<br \/>\n                            return false;<br \/>\n                        }<br \/>\n                    } elseif (is_file($path . &#8216;\/&#8217; . $file)) {<br \/>\n                        try {<br \/>\n                            $this->tar->addFile($path . &#8216;\/&#8217; . $file);<br \/>\n                        } catch (Exception $e) {<br \/>\n                            return false;<br \/>\n                        }<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n            return true;<br \/>\n        }<br \/>\n        return false;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Save Configuration<br \/>\n *\/<br \/>\nclass FM_Config<br \/>\n{<br \/>\n    var $data;<\/p>\n<p>    function __construct()<br \/>\n    {<br \/>\n        global $root_path, $root_url, $CONFIG;<br \/>\n        $fm_url = $root_url . $_SERVER[&#8220;PHP_SELF&#8221;];<br \/>\n        $this->data = array(<br \/>\n            &#8216;lang&#8217; => &#8216;en&#8217;,<br \/>\n            &#8216;error_reporting&#8217; => true,<br \/>\n            &#8216;show_hidden&#8217; => true<br \/>\n        );<br \/>\n        $data = false;<br \/>\n        if (strlen($CONFIG)) {<br \/>\n            $data = fm_object_to_array(json_decode($CONFIG));<br \/>\n        } else {<br \/>\n            $msg = lng(&#8220;AppName&#8221;).&#8217;<br \/>Error: Cannot load configuration&#8217;;<br \/>\n            if (substr($fm_url, -1) == &#8216;\/&#8217;) {<br \/>\n                $fm_url = rtrim($fm_url, &#8216;\/&#8217;);<br \/>\n                $msg .= &#8216;<br \/>&#8216;;<br \/>\n                $msg .= &#8216;<br \/>Seems like you have a trailing slash on the URL.&#8217;;<br \/>\n                $msg .= &#8216;<br \/>Try this link: <a href=\"' . $fm_url . '\">&#8216; . $fm_url . &#8216;<\/a>&#8216;;<br \/>\n            }<br \/>\n            die($msg);<br \/>\n        }<br \/>\n        if (is_array($data) &#038;&#038; count($data)) $this->data = $data;<br \/>\n        else $this->save();<br \/>\n    }<\/p>\n<p>    function save()<br \/>\n    {<br \/>\n        global $config_file;<br \/>\n        $fm_file = is_readable($config_file) ? $config_file : __FILE__;<br \/>\n        $var_name = &#8216;$CONFIG&#8217;;<br \/>\n        $var_value = var_export(json_encode($this->data), true);<br \/>\n        $config_string = &#8220;<?php\" . chr(13) . chr(10) . \"\/\/Default Configuration\" . chr(13) . chr(10) . \"$var_name = $var_value;\" . chr(13) . chr(10);\n        if (is_writable($fm_file)) {\n            $lines = file($fm_file);\n            if ($fh = @fopen($fm_file, \"w\")) {\n                @fputs($fh, $config_string, strlen($config_string));\n                for ($x = 3; $x < count($lines); $x++) {\n                    @fputs($fh, $lines[$x], strlen($lines[$x]));\n                }\n                @fclose($fh);\n            }\n        }\n    }\n}\n\n\/\/--- Templates Functions ---\n\n\/**\n * Show nav block\n * @param string $path\n *\/\nfunction fm_show_nav_path($path)\n{\n    global $lang, $sticky_navbar, $editFile;\n    $isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';\n?><\/p>\n<nav class=\"navbar navbar-expand-lg mb-4 main-nav <?php echo $isStickyNavBar ?> bg-body-tertiary&#8221; data-bs-theme=&#8221;<?php echo FM_THEME; ?>&#8220;><br \/>\n        <a class=\"navbar-brand\"> <?php echo lng('AppTitle') ?> <\/a><br \/>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\"><br \/>\n            <span class=\"navbar-toggler-icon\"><\/span><br \/>\n        <\/button><\/p>\n<div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n<p>            <?php\n            $path = fm_clean_path($path);\n            $root_url = \"<a href='?p='><i class='fa fa-home' aria-hidden='true' title='\" . FM_ROOT_PATH . \"'><\/i><\/a>&#8220;;<br \/>\n            $sep = &#8216;<i class=\"bread-crumb\"> \/ <\/i>&#8216;;<br \/>\n            if ($path != &#8221;) {<br \/>\n                $exploded = explode(&#8216;\/&#8217;, $path);<br \/>\n                $count = count($exploded);<br \/>\n                $array = array();<br \/>\n                $parent = &#8221;;<br \/>\n                for ($i = 0; $i < $count; $i++) {\n                    $parent = trim($parent . '\/' . $exploded[$i], '\/');\n                    $parent_enc = urlencode($parent);\n                    $array[] = \"<a href='?p={$parent_enc}'>&#8221; . fm_enc(fm_convert_win($exploded[$i])) . &#8220;<\/a>&#8220;;<br \/>\n                }<br \/>\n                $root_url .= $sep . implode($sep, $array);<br \/>\n            }<br \/>\n            echo &#8216;<\/p>\n<div class=\"col-xs-6 col-sm-5\">&#8216; . $root_url . $editFile . &#8216;<\/div>\n<p>&#8216;;<br \/>\n            ?><\/p>\n<div class=\"col-xs-6 col-sm-7\">\n<ul class=\"navbar-nav justify-content-end\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<li class=\"nav-item mr-2\">\n<div class=\"input-group input-group-sm mr-1\" style=\"margin-top:4px;\">\n                            <input type=\"text\" class=\"form-control\" placeholder=\"<?php echo lng('Search') ?>&#8221; aria-label=&#8221;<?php echo lng('Search') ?>&#8221; aria-describedby=&#8221;search-addon2&#8243; id=&#8221;search-addon&#8221;><\/p>\n<div class=\"input-group-append\">\n                                <span class=\"input-group-text brl-0 brr-0\" id=\"search-addon2\"><i class=\"fa fa-search\"><\/i><\/span>\n                            <\/div>\n<div class=\"input-group-append btn-group\">\n                                <span class=\"input-group-text dropdown-toggle brl-0\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"><\/span><\/p>\n<div class=\"dropdown-menu dropdown-menu-right\">\n                                    <a class=\"dropdown-item\" href=\"<?php echo $path2 = $path ? $path : '.'; ?>&#8221; id=&#8221;js-search-modal&#8221; data-bs-toggle=&#8221;modal&#8221; data-bs-target=&#8221;#searchModal&#8221;><?php echo lng('Advanced Search') ?><\/a>\n                                <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/li>\n<p>                    <?php if (!FM_READONLY): ?><\/p>\n<li class=\"nav-item\">\n                            <a title=\"<?php echo lng('Upload') ?>&#8221; class=&#8221;nav-link&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;upload&#8221;><i class=\"fa fa-cloud-upload\" aria-hidden=\"true\"><\/i> <?php echo lng('Upload') ?><\/a>\n                        <\/li>\n<li class=\"nav-item\">\n                            <a title=\"<?php echo lng('NewItem') ?>&#8221; class=&#8221;nav-link&#8221; href=&#8221;#createNewItem&#8221; data-bs-toggle=&#8221;modal&#8221; data-bs-target=&#8221;#createNewItem&#8221;><i class=\"fa fa-plus-square\"><\/i> <?php echo lng('NewItem') ?><\/a>\n                        <\/li>\n<p>                    <?php endif; ?><br \/>\n                    <?php if (FM_USE_AUTH): ?><\/p>\n<li class=\"nav-item avatar dropdown\">\n                            <a class=\"nav-link dropdown-toggle\" id=\"navbarDropdownMenuLink-5\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\"><br \/>\n                                <i class=\"fa fa-user-circle\"><\/i><br \/>\n                            <\/a><\/p>\n<div class=\"dropdown-menu dropdown-menu-end text-small shadow\" aria-labelledby=\"navbarDropdownMenuLink-5\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><br \/>\n                                <?php if (!FM_READONLY): ?><br \/>\n                                    <a title=\"<?php echo lng('Settings') ?>&#8221; class=&#8221;dropdown-item nav-link&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1&#8243;><i class=\"fa fa-cog\" aria-hidden=\"true\"><\/i> <?php echo lng('Settings') ?><\/a><br \/>\n                                <?php endif ?><br \/>\n                                <a title=\"<?php echo lng('Help') ?>&#8221; class=&#8221;dropdown-item nav-link&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;help=2&#8243;><i class=\"fa fa-exclamation-circle\" aria-hidden=\"true\"><\/i> <?php echo lng('Help') ?><\/a><br \/>\n                                <a title=\"<?php echo lng('Logout') ?>&#8221; class=&#8221;dropdown-item nav-link&#8221; href=&#8221;?logout=1&#8243;><i class=\"fa fa-sign-out\" aria-hidden=\"true\"><\/i> <?php echo lng('Logout') ?><\/a>\n                            <\/div>\n<\/li>\n<p>                    <?php else: ?><br \/>\n                        <?php if (!FM_READONLY): ?><\/p>\n<li class=\"nav-item\">\n                                <a title=\"<?php echo lng('Settings') ?>&#8221; class=&#8221;dropdown-item nav-link&#8221; href=&#8221;?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1&#8243;><i class=\"fa fa-cog\" aria-hidden=\"true\"><\/i> <?php echo lng('Settings') ?><\/a>\n                            <\/li>\n<p>                        <?php endif; ?><br \/>\n                    <?php endif; ?>\n                <\/ul>\n<\/p><\/div>\n<\/p><\/div>\n<\/nav>\n<p><?php\n}\n\n\/**\n * Show alert message from session\n *\/\nfunction fm_show_message()\n{\n    if (isset($_SESSION[FM_SESSION_ID]['message'])) {\n        $class = isset($_SESSION[FM_SESSION_ID]['status']) ? $_SESSION[FM_SESSION_ID]['status'] : 'ok';\n        echo '\n\n<p class=\"message ' . $class . '\">&#8216; . $_SESSION[FM_SESSION_ID][&#8216;message&#8217;] . &#8216;<\/p>\n<p>&#8216;;<br \/>\n        unset($_SESSION[FM_SESSION_ID][&#8216;message&#8217;]);<br \/>\n        unset($_SESSION[FM_SESSION_ID][&#8216;status&#8217;]);<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * Show page header in Login Form<br \/>\n *\/<br \/>\nfunction fm_show_header_login()<br \/>\n{<br \/>\n    header(&#8220;Content-Type: text\/html; charset=utf-8&#8221;);<br \/>\n    header(&#8220;Expires: Sat, 26 Jul 1997 05:00:00 GMT&#8221;);<br \/>\n    header(&#8220;Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0&#8221;);<br \/>\n    header(&#8220;Pragma: no-cache&#8221;);<\/p>\n<p>    global $favicon_path;<br \/>\n?><br \/>\n    <!DOCTYPE html><br \/>\n    <html lang=\"en\" data-bs-theme=\"<?php echo (FM_THEME == \"dark\") ? 'dark' : 'light' ?>&#8220;><\/p>\n<p>    <head><br \/>\n        <meta charset=\"utf-8\"><br \/>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><br \/>\n        <meta name=\"description\" content=\"Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager\"><br \/>\n        <meta name=\"author\" content=\"CCP Programmers\"><br \/>\n        <meta name=\"robots\" content=\"noindex, nofollow\"><br \/>\n        <meta name=\"googlebot\" content=\"noindex\"><br \/>\n        <?php if ($favicon_path) {\n            echo '<link rel=\"icon\" href=\"' . fm_enc($favicon_path) . '\" type=\"image\/png\">&#8216;;<br \/>\n        } ?><br \/>\n        <title><?php echo fm_enc(APP_TITLE) ?><\/title><br \/>\n        <?php print_external('pre-jsdelivr'); ?><br \/>\n        <?php print_external('css-bootstrap'); ?><\/p>\n<style>\n            body.fm-login-page {\n                background-color: #f7f9fb;\n                font-size: 14px;\n                background-color: #f7f9fb;\n                background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C\/path%3E%3C\/svg%3E\");\n            }<\/p>\n<p>            .fm-login-page .brand {\n                width: 121px;\n                overflow: hidden;\n                margin: 0 auto;\n                position: relative;\n                z-index: 1\n            }<\/p>\n<p>            .fm-login-page .brand img {\n                width: 100%\n            }<\/p>\n<p>            .fm-login-page .card-wrapper {\n                width: 360px;\n            }<\/p>\n<p>            .fm-login-page .card {\n                border-color: transparent;\n                box-shadow: 0 4px 8px rgba(0, 0, 0, .05)\n            }<\/p>\n<p>            .fm-login-page .card-title {\n                margin-bottom: 1.5rem;\n                font-size: 24px;\n                font-weight: 400;\n            }<\/p>\n<p>            .fm-login-page .form-control {\n                border-width: 2.3px\n            }<\/p>\n<p>            .fm-login-page .form-group label {\n                width: 100%\n            }<\/p>\n<p>            .fm-login-page .btn.btn-block {\n                padding: 12px 10px\n            }<\/p>\n<p>            .fm-login-page .footer {\n                margin: 20px 0;\n                color: #888;\n                text-align: center\n            }<\/p>\n<p>            @media screen and (max-width:425px) {\n                .fm-login-page .card-wrapper {\n                    width: 90%;\n                    margin: 0 auto;\n                    margin-top: 10%;\n                }\n            }<\/p>\n<p>            @media screen and (max-width:320px) {\n                .fm-login-page .card.fat {\n                    padding: 0\n                }<\/p>\n<p>                .fm-login-page .card.fat .card-body {\n                    padding: 15px\n                }\n            }<\/p>\n<p>            .message {\n                padding: 4px 7px;\n                border: 1px solid #ddd;\n                background-color: #fff\n            }<\/p>\n<p>            .message.ok {\n                border-color: green;\n                color: green\n            }<\/p>\n<p>            .message.error {\n                border-color: red;\n                color: red\n            }<\/p>\n<p>            .message.alert {\n                border-color: orange;\n                color: orange\n            }<\/p>\n<p>            body.fm-login-page.theme-dark {\n                background-color: #2f2a2a;\n            }<\/p>\n<p>            .theme-dark svg g,\n            .theme-dark svg path {\n                fill: #ffffff;\n            }<\/p>\n<p>            .theme-dark .form-control {\n                color: #fff;\n                background-color: #403e3e;\n            }<\/p>\n<p>            .h-100vh {\n                min-height: 100vh;\n            }\n        <\/style>\n<p>    <\/head><\/p>\n<p>    <body class=\"fm-login-page <?php echo (FM_THEME == \"dark\") ? 'theme-dark' : ''; ?>&#8220;><\/p>\n<div id=\"wrapper\" class=\"container-fluid\">\n<p>        <?php\n    }\n\n    \/**\n     * Show page footer in Login Form\n     *\/\n    function fm_show_footer_login()\n    {\n        ?>\n        <\/div>\n<p>        <?php print_external('js-jquery'); ?><br \/>\n        <?php print_external('js-bootstrap'); ?><br \/>\n    <\/body><\/p>\n<p>    <\/html><\/p>\n<p><?php\n    }\n\n    \/**\n     * Show Header after login\n     *\/\n    function fm_show_header()\n    {\n        header(\"Content-Type: text\/html; charset=utf-8\");\n        header(\"Expires: Sat, 26 Jul 1997 05:00:00 GMT\");\n        header(\"Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\");\n        header(\"Pragma: no-cache\");\n\n        global $sticky_navbar, $favicon_path;\n        $isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';\n?><br \/>\n    <!DOCTYPE html><br \/>\n    <html data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<p>    <head><br \/>\n        <meta charset=\"utf-8\"><br \/>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><br \/>\n        <meta name=\"description\" content=\"Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager\"><br \/>\n        <meta name=\"author\" content=\"CCP Programmers\"><br \/>\n        <meta name=\"robots\" content=\"noindex, nofollow\"><br \/>\n        <meta name=\"googlebot\" content=\"noindex\"><br \/>\n        <?php if ($favicon_path) {\n            echo '<link rel=\"icon\" href=\"' . fm_enc($favicon_path) . '\" type=\"image\/png\">&#8216;;<br \/>\n        } ?><br \/>\n        <title><?php echo fm_enc(APP_TITLE) ?> | <?php echo (isset($_GET['view']) ? $_GET['view'] : ((isset($_GET['edit'])) ? $_GET['edit'] : \"H3K\")); ?><\/title><br \/>\n        <?php print_external('pre-jsdelivr'); ?><br \/>\n        <?php print_external('pre-cloudflare'); ?><br \/>\n        <?php print_external('css-bootstrap'); ?><br \/>\n        <?php print_external('css-font-awesome'); ?><br \/>\n        <?php if (FM_USE_HIGHLIGHTJS &#038;&#038; isset($_GET['view'])): ?><br \/>\n            <?php print_external('css-highlightjs'); ?><br \/>\n        <?php endif; ?><br \/>\n        <script type=\"text\/javascript\">\n            window.csrf = '<?php echo $_SESSION['token']; ?>';\n        <\/script><\/p>\n<style>\n            html {\n                -moz-osx-font-smoothing: grayscale;\n                -webkit-font-smoothing: antialiased;\n                text-rendering: optimizeLegibility;\n                height: 100%;\n                scroll-behavior: smooth;\n            }<\/p>\n<p>            *,\n            *::before,\n            *::after {\n                box-sizing: border-box;\n            }<\/p>\n<p>            body {\n                font-size: 15px;\n                color: #222;\n                background: #F7F7F7;\n            }<\/p>\n<p>            body.navbar-fixed {\n                margin-top: 55px;\n            }<\/p>\n<p>            a,\n            a:hover,\n            a:visited,\n            a:focus {\n                text-decoration: none !important;\n            }<\/p>\n<p>            .filename,\n            td,\n            th {\n                white-space: nowrap\n            }<\/p>\n<p>            .navbar-brand {\n                font-weight: bold;\n            }<\/p>\n<p>            .nav-item.avatar a {\n                cursor: pointer;\n                text-transform: capitalize;\n            }<\/p>\n<p>            .nav-item.avatar a>i {\n                font-size: 15px;\n            }<\/p>\n<p>            .nav-item.avatar .dropdown-menu a {\n                font-size: 13px;\n            }<\/p>\n<p>            #search-addon {\n                font-size: 12px;\n                border-right-width: 0;\n            }<\/p>\n<p>            .brl-0 {\n                background: transparent;\n                border-left: 0;\n                border-top-left-radius: 0;\n                border-bottom-left-radius: 0;\n            }<\/p>\n<p>            .brr-0 {\n                border-top-right-radius: 0;\n                border-bottom-right-radius: 0;\n            }<\/p>\n<p>            .bread-crumb {\n                color: #cccccc;\n                font-style: normal;\n            }<\/p>\n<p>            #main-table {\n                transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1), width 0s .25s;\n            }<\/p>\n<p>            #main-table .filename a {\n                color: #222222;\n            }<\/p>\n<p>            .table td,\n            .table th {\n                vertical-align: middle !important;\n            }<\/p>\n<p>            .table .custom-checkbox-td .custom-control.custom-checkbox,\n            .table .custom-checkbox-header .custom-control.custom-checkbox {\n                min-width: 18px;\n                display: flex;\n                align-items: center;\n                justify-content: center;\n            }<\/p>\n<p>            .table-sm td,\n            .table-sm th {\n                padding: .4rem;\n            }<\/p>\n<p>            .table-bordered td,\n            .table-bordered th {\n                border: 1px solid #f1f1f1;\n            }<\/p>\n<p>            .hidden {\n                display: none\n            }<\/p>\n<p>            pre.with-hljs {\n                padding: 0;\n                overflow: hidden;\n            }<\/p>\n<p>            pre.with-hljs code {\n                margin: 0;\n                border: 0;\n                overflow: scroll;\n            }<\/p>\n<p>            code.maxheight,\n            pre.maxheight {\n                max-height: 512px\n            }<\/p>\n<p>            .fa.fa-caret-right {\n                font-size: 1.2em;\n                margin: 0 4px;\n                vertical-align: middle;\n                color: #ececec\n            }<\/p>\n<p>            .fa.fa-home {\n                font-size: 1.3em;\n                vertical-align: bottom\n            }<\/p>\n<p>            .path {\n                margin-bottom: 10px\n            }<\/p>\n<p>            form.dropzone {\n                min-height: 200px;\n                border: 2px dashed #007bff;\n                line-height: 6rem;\n            }<\/p>\n<p>            .right {\n                text-align: right\n            }<\/p>\n<p>            .center,\n            .close,\n            .login-form,\n            .preview-img-container {\n                text-align: center\n            }<\/p>\n<p>            .message {\n                padding: 4px 7px;\n                border: 1px solid #ddd;\n                background-color: #fff\n            }<\/p>\n<p>            .message.ok {\n                border-color: green;\n                color: green\n            }<\/p>\n<p>            .message.error {\n                border-color: red;\n                color: red\n            }<\/p>\n<p>            .message.alert {\n                border-color: orange;\n                color: orange\n            }<\/p>\n<p>            .preview-img {\n                max-width: 100%;\n                max-height: 80vh;\n                background: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5\/\/8\/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);\n                cursor: zoom-in\n            }<\/p>\n<p>            input#preview-img-zoomCheck[type=checkbox] {\n                display: none\n            }<\/p>\n<p>            input#preview-img-zoomCheck[type=checkbox]:checked~label>img {\n                max-width: none;\n                max-height: none;\n                cursor: zoom-out\n            }<\/p>\n<p>            .inline-actions>a>i {\n                font-size: 1em;\n                margin-left: 5px;\n                background: #3785c1;\n                color: #fff;\n                padding: 3px 4px;\n                border-radius: 3px;\n            }<\/p>\n<p>            .preview-video {\n                position: relative;\n                max-width: 100%;\n                height: 0;\n                padding-bottom: 62.5%;\n                margin-bottom: 10px\n            }<\/p>\n<p>            .preview-video video {\n                position: absolute;\n                width: 100%;\n                height: 100%;\n                left: 0;\n                top: 0;\n                background: #000\n            }<\/p>\n<p>            .compact-table {\n                border: 0;\n                width: auto\n            }<\/p>\n<p>            .compact-table td,\n            .compact-table th {\n                width: 100px;\n                border: 0;\n                text-align: center\n            }<\/p>\n<p>            .compact-table tr:hover td {\n                background-color: #fff\n            }<\/p>\n<p>            .filename {\n                max-width: 420px;\n                overflow: hidden;\n                text-overflow: ellipsis\n            }<\/p>\n<p>            .break-word {\n                word-wrap: break-word;\n                margin-left: 30px\n            }<\/p>\n<p>            .break-word.float-left a {\n                color: #7d7d7d\n            }<\/p>\n<p>            .break-word+.float-right {\n                padding-right: 30px;\n                position: relative\n            }<\/p>\n<p>            .break-word+.float-right>a {\n                color: #7d7d7d;\n                font-size: 1.2em;\n                margin-right: 4px\n            }<\/p>\n<p>            #editor {\n                position: absolute;\n                right: 15px;\n                top: 100px;\n                bottom: 15px;\n                left: 15px\n            }<\/p>\n<p>            @media (max-width:481px) {\n                #editor {\n                    top: 150px;\n                }\n            }<\/p>\n<p>            #normal-editor {\n                border-radius: 3px;\n                border-width: 2px;\n                padding: 10px;\n                outline: none;\n            }<\/p>\n<p>            .btn-2 {\n                padding: 4px 10px;\n                font-size: small;\n            }<\/p>\n<p>            li.file:before,\n            li.folder:before {\n                font: normal normal normal 14px\/1 FontAwesome;\n                content: \"\\f016\";\n                margin-right: 5px\n            }<\/p>\n<p>            li.folder:before {\n                content: \"\\f114\"\n            }<\/p>\n<p>            i.fa.fa-folder-o {\n                color: #0157b3\n            }<\/p>\n<p>            i.fa.fa-picture-o {\n                color: #26b99a\n            }<\/p>\n<p>            i.fa.fa-file-archive-o {\n                color: #da7d7d\n            }<\/p>\n<p>            .btn-2 i.fa.fa-file-archive-o {\n                color: inherit\n            }<\/p>\n<p>            i.fa.fa-css3 {\n                color: #f36fa0\n            }<\/p>\n<p>            i.fa.fa-file-code-o {\n                color: #007bff\n            }<\/p>\n<p>            i.fa.fa-code {\n                color: #cc4b4c\n            }<\/p>\n<p>            i.fa.fa-file-text-o {\n                color: #0096e6\n            }<\/p>\n<p>            i.fa.fa-html5 {\n                color: #d75e72\n            }<\/p>\n<p>            i.fa.fa-file-excel-o {\n                color: #09c55d\n            }<\/p>\n<p>            i.fa.fa-file-powerpoint-o {\n                color: #f6712e\n            }<\/p>\n<p>            i.go-back {\n                font-size: 1.2em;\n                color: #007bff;\n            }<\/p>\n<p>            .main-nav {\n                padding: 0.2rem 1rem;\n                box-shadow: 0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2)\n            }<\/p>\n<p>            .dataTables_filter {\n                display: none;\n            }<\/p>\n<p>            table.dataTable thead .sorting {\n                cursor: pointer;\n                background-repeat: no-repeat;\n                background-position: center right;\n                background-image: url('data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq\/QCM1oNiJidwox0355mXnG\/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');\n            }<\/p>\n<p>            table.dataTable thead .sorting_asc {\n                cursor: pointer;\n                background-repeat: no-repeat;\n                background-position: center right;\n                background-image: url('data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS\/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');\n            }<\/p>\n<p>            table.dataTable thead .sorting_desc {\n                cursor: pointer;\n                background-repeat: no-repeat;\n                background-position: center right;\n                background-image: url('data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA\/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=');\n            }<\/p>\n<p>            table.dataTable thead tr:first-child th.custom-checkbox-header:first-child {\n                background-image: none;\n            }<\/p>\n<p>            .footer-action li {\n                margin-bottom: 10px;\n            }<\/p>\n<p>            .app-v-title {\n                font-size: 24px;\n                font-weight: 300;\n                letter-spacing: -.5px;\n                text-transform: uppercase;\n            }<\/p>\n<p>            hr.custom-hr {\n                border-top: 1px dashed #8c8b8b;\n                border-bottom: 1px dashed #fff;\n            }<\/p>\n<p>            #snackbar {\n                visibility: hidden;\n                min-width: 250px;\n                margin-left: -125px;\n                background-color: #333;\n                color: #fff;\n                text-align: center;\n                border-radius: 2px;\n                padding: 16px;\n                position: fixed;\n                z-index: 1;\n                left: 50%;\n                bottom: 30px;\n                font-size: 17px;\n            }<\/p>\n<p>            #snackbar.show {\n                visibility: visible;\n                -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;\n                animation: fadein 0.5s, fadeout 0.5s 2.5s;\n            }<\/p>\n<p>            @-webkit-keyframes fadein {\n                from {\n                    bottom: 0;\n                    opacity: 0;\n                }<\/p>\n<p>                to {\n                    bottom: 30px;\n                    opacity: 1;\n                }\n            }<\/p>\n<p>            @keyframes fadein {\n                from {\n                    bottom: 0;\n                    opacity: 0;\n                }<\/p>\n<p>                to {\n                    bottom: 30px;\n                    opacity: 1;\n                }\n            }<\/p>\n<p>            @-webkit-keyframes fadeout {\n                from {\n                    bottom: 30px;\n                    opacity: 1;\n                }<\/p>\n<p>                to {\n                    bottom: 0;\n                    opacity: 0;\n                }\n            }<\/p>\n<p>            @keyframes fadeout {\n                from {\n                    bottom: 30px;\n                    opacity: 1;\n                }<\/p>\n<p>                to {\n                    bottom: 0;\n                    opacity: 0;\n                }\n            }<\/p>\n<p>            #main-table span.badge {\n                border-bottom: 2px solid #f8f9fa\n            }<\/p>\n<p>            #main-table span.badge:nth-child(1) {\n                border-color: #df4227\n            }<\/p>\n<p>            #main-table span.badge:nth-child(2) {\n                border-color: #f8b600\n            }<\/p>\n<p>            #main-table span.badge:nth-child(3) {\n                border-color: #00bd60\n            }<\/p>\n<p>            #main-table span.badge:nth-child(4) {\n                border-color: #4581ff\n            }<\/p>\n<p>            #main-table span.badge:nth-child(5) {\n                border-color: #ac68fc\n            }<\/p>\n<p>            #main-table span.badge:nth-child(6) {\n                border-color: #45c3d2\n            }<\/p>\n<p>            @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) {\n                .navbar-collapse .col-xs-6 {\n                    padding: 0;\n                }\n            }<\/p>\n<p>            .btn.active.focus,\n            .btn.active:focus,\n            .btn.focus,\n            .btn.focus:active,\n            .btn:active:focus,\n            .btn:focus {\n                outline: 0 !important;\n                outline-offset: 0 !important;\n                background-image: none !important;\n                -webkit-box-shadow: none !important;\n                box-shadow: none !important\n            }<\/p>\n<p>            .lds-facebook {\n                display: none;\n                position: relative;\n                width: 64px;\n                height: 64px\n            }<\/p>\n<p>            .lds-facebook div,\n            .lds-facebook.show-me {\n                display: inline-block\n            }<\/p>\n<p>            .lds-facebook div {\n                position: absolute;\n                left: 6px;\n                width: 13px;\n                background: #007bff;\n                animation: lds-facebook 1.2s cubic-bezier(0, .5, .5, 1) infinite\n            }<\/p>\n<p>            .lds-facebook div:nth-child(1) {\n                left: 6px;\n                animation-delay: -.24s\n            }<\/p>\n<p>            .lds-facebook div:nth-child(2) {\n                left: 26px;\n                animation-delay: -.12s\n            }<\/p>\n<p>            .lds-facebook div:nth-child(3) {\n                left: 45px;\n                animation-delay: 0s\n            }<\/p>\n<p>            @keyframes lds-facebook {\n                0% {\n                    top: 6px;\n                    height: 51px\n                }<\/p>\n<p>                100%,\n                50% {\n                    top: 19px;\n                    height: 26px\n                }\n            }<\/p>\n<p>            ul#search-wrapper {\n                padding-left: 0;\n                border: 1px solid #ecececcc;\n            }<\/p>\n<p>            ul#search-wrapper li {\n                list-style: none;\n                padding: 5px;\n                border-bottom: 1px solid #ecececcc;\n            }<\/p>\n<p>            ul#search-wrapper li:nth-child(odd) {\n                background: #f9f9f9cc;\n            }<\/p>\n<p>            .c-preview-img {\n                max-width: 300px;\n            }<\/p>\n<p>            .border-radius-0 {\n                border-radius: 0;\n            }<\/p>\n<p>            .float-right {\n                float: right;\n            }<\/p>\n<p>            .table-hover>tbody>tr:hover>td:first-child {\n                border-left: 1px solid #1b77fd;\n            }<\/p>\n<p>            #main-table tr.even {\n                background-color: #F8F9Fa;\n            }<\/p>\n<p>            .filename>a>i {\n                margin-right: 3px;\n            }<\/p>\n<p>            .fs-7 {\n                font-size: 14px;\n            }\n        <\/style>\n<p>        <?php\n        if (FM_THEME == \"dark\"): ?><\/p>\n<style>\n                :root {\n                    --bs-bg-opacity: 1;\n                    --bg-color: #f3daa6;\n                    --bs-dark-rgb: 28, 36, 41 !important;\n                    --bs-bg-opacity: 1;\n                }<\/p>\n<p>                body.theme-dark {\n                    background-image: linear-gradient(90deg, #1c2429, #263238);\n                    color: #CFD8DC;\n                }<\/p>\n<p>                .list-group .list-group-item {\n                    background: #343a40;\n                }<\/p>\n<p>                .theme-dark .navbar-nav i,\n                .navbar-nav .dropdown-toggle,\n                .break-word {\n                    color: #CFD8DC;\n                }<\/p>\n<p>                a,\n                a:hover,\n                a:visited,\n                a:active,\n                #main-table .filename a,\n                i.fa.fa-folder-o,\n                i.go-back {\n                    color: var(--bg-color);\n                }<\/p>\n<p>                ul#search-wrapper li:nth-child(odd) {\n                    background: #212a2f;\n                }<\/p>\n<p>                .theme-dark .btn-outline-primary {\n                    color: #b8e59c;\n                    border-color: #b8e59c;\n                }<\/p>\n<p>                .theme-dark .btn-outline-primary:hover,\n                .theme-dark .btn-outline-primary:active {\n                    background-color: #2d4121;\n                }<\/p>\n<p>                .theme-dark input.form-control {\n                    background-color: #101518;\n                    color: #CFD8DC;\n                }<\/p>\n<p>                .theme-dark .dropzone {\n                    background: transparent;\n                }<\/p>\n<p>                .theme-dark .inline-actions>a>i {\n                    background: #79755e;\n                }<\/p>\n<p>                .theme-dark .text-white {\n                    color: #CFD8DC !important;\n                }<\/p>\n<p>                .theme-dark .table-bordered td,\n                .table-bordered th {\n                    border-color: #343434;\n                }<\/p>\n<p>                .theme-dark .table-bordered td .custom-control-input,\n                .theme-dark .table-bordered th .custom-control-input {\n                    opacity: 0.678;\n                }<\/p>\n<p>                .message {\n                    background-color: #212529;\n                }<\/p>\n<p>                form.dropzone {\n                    border-color: #79755e;\n                }\n            <\/style>\n<p>        <?php endif; ?><br \/>\n    <\/head><\/p>\n<p>    <body class=\"<?php echo (FM_THEME == \"dark\") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>&#8220;><\/p>\n<div id=\"wrapper\" class=\"container-fluid\">\n            <!-- New Item creation --><\/p>\n<div class=\"modal fade\" id=\"createNewItem\" tabindex=\"-1\" role=\"dialog\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" aria-labelledby=\"newItemModalLabel\" aria-hidden=\"true\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"modal-dialog\" role=\"document\">\n<form class=\"modal-content\" method=\"post\">\n<div class=\"modal-header\">\n<h5 class=\"modal-title\" id=\"newItemModalLabel\"><i class=\"fa fa-plus-square fa-fw\"><\/i><?php echo lng('CreateNewItem') ?><\/h5>\n<p>                            <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"><\/button>\n                        <\/div>\n<div class=\"modal-body\">\n<p><label for=\"newfile\"><?php echo lng('ItemType') ?> <\/label><\/p>\n<div class=\"form-check form-check-inline\">\n                                <input class=\"form-check-input\" type=\"radio\" name=\"newfile\" id=\"customRadioInline1\" name=\"newfile\" value=\"file\"><br \/>\n                                <label class=\"form-check-label\" for=\"customRadioInline1\"><?php echo lng('File') ?><\/label>\n                            <\/div>\n<div class=\"form-check form-check-inline\">\n                                <input class=\"form-check-input\" type=\"radio\" name=\"newfile\" id=\"customRadioInline2\" value=\"folder\" checked><br \/>\n                                <label class=\"form-check-label\" for=\"customRadioInline2\"><?php echo lng('Folder') ?><\/label>\n                            <\/div>\n<p class=\"mt-3\"><label for=\"newfilename\"><?php echo lng('ItemName') ?> <\/label><\/p>\n<p>                            <input type=\"text\" name=\"newfilename\" id=\"newfilename\" value=\"\" class=\"form-control\" placeholder=\"<?php echo lng('Enter here...') ?>&#8221; required>\n                        <\/div>\n<div class=\"modal-footer\">\n                            <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                            <button type=\"button\" class=\"btn btn-outline-primary\" data-bs-dismiss=\"modal\"><i class=\"fa fa-times-circle\"><\/i> <?php echo lng('Cancel') ?><\/button><br \/>\n                            <button type=\"submit\" class=\"btn btn-success\"><i class=\"fa fa-check-circle\"><\/i> <?php echo lng('CreateNow') ?><\/button>\n                        <\/div>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<p>            <!-- Advance Search Modal --><\/p>\n<div class=\"modal fade\" id=\"searchModal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"searchModalLabel\" aria-hidden=\"true\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"modal-dialog modal-lg\" role=\"document\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h5 class=\"modal-title col-10\" id=\"searchModalLabel\">\n<div class=\"input-group mb-3\">\n                                    <input type=\"text\" class=\"form-control\" placeholder=\"<?php echo lng('Search') ?> <?php echo lng('a files') ?>&#8221; aria-label=&#8221;<?php echo lng('Search') ?>&#8221; aria-describedby=&#8221;search-addon3&#8243; id=&#8221;advanced-search&#8221; autofocus required><br \/>\n                                    <span class=\"input-group-text\" id=\"search-addon3\"><i class=\"fa fa-search\"><\/i><\/span>\n                                <\/div>\n<\/h5>\n<p>                            <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"><\/button>\n                        <\/div>\n<div class=\"modal-body\">\n<form action=\"\" method=\"post\">\n<div class=\"lds-facebook\">\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<\/p><\/div>\n<ul id=\"search-wrapper\">\n<p class=\"m-2\"><?php echo lng('Search file in folder and subfolders...') ?><\/p>\n<\/ul><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>            <!--Rename Modal --><\/p>\n<div class=\"modal modal-alert\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" role=\"dialog\" id=\"renameDialog\" data-bs-theme=\"<?php echo FM_THEME; ?>&#8220;><\/p>\n<div class=\"modal-dialog\" role=\"document\">\n<form class=\"modal-content rounded-3 shadow\" method=\"post\" autocomplete=\"off\">\n<div class=\"modal-body p-4 text-center\">\n<h5 class=\"mb-3\"><?php echo lng('Are you sure want to rename?') ?><\/h5>\n<p class=\"mb-1\">\n                                <input type=\"text\" name=\"rename_to\" id=\"js-rename-to\" class=\"form-control\" placeholder=\"<?php echo lng('Enter new file name') ?>&#8221; required><br \/>\n                                <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>&#8220;><br \/>\n                                <input type=\"hidden\" name=\"rename_from\" id=\"js-rename-from\">\n                            <\/p>\n<\/p><\/div>\n<div class=\"modal-footer flex-nowrap p-0\">\n                            <button type=\"button\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end\" data-bs-dismiss=\"modal\"><?php echo lng('Cancel') ?><\/button><br \/>\n                            <button type=\"submit\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0\"><strong><?php echo lng('Okay') ?><\/strong><\/button>\n                        <\/div>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<p>            <!-- Confirm Modal --><br \/>\n            <script type=\"text\/html\" id=\"js-tpl-confirm\"><\/p>\n<div class=\"modal modal-alert confirmDialog\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" role=\"dialog\" id=\"confirmDialog-<%this.id%>\" data-bs-theme=\"<?php echo FM_THEME; ?>\"><\/p>\n<div class=\"modal-dialog\" role=\"document\">\n<form class=\"modal-content rounded-3 shadow\" method=\"post\" autocomplete=\"off\" action=\"<%this.action%>\"><\/p>\n<div class=\"modal-body p-4 text-center\">\n<h5 class=\"mb-2\"><?php echo lng('Are you sure want to') ?> <%this.title%> ?<\/h5>\n<p class=\"mb-1\"><%this.content%><\/p>\n<\/p><\/div>\n<div class=\"modal-footer flex-nowrap p-0\">\n                                <button type=\"button\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end\" data-bs-dismiss=\"modal\"><?php echo lng('Cancel') ?><\/button>\n                                <input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION['token']; ?>\">\n                                <button type=\"submit\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0\" data-bs-dismiss=\"modal\"><strong><?php echo lng('Okay') ?><\/strong><\/button>\n                            <\/div>\n<\/p><\/form>\n<\/p><\/div>\n<\/p><\/div>\n<p>            <\/script><br \/>\n        <?php\n    }\n\n    \/**\n     * Show page footer after login\n     *\/\n    function fm_show_footer()\n    {\n        global $ext_language;\n        ?>\n        <\/div>\n<p>        <?php print_external('js-jquery'); ?><br \/>\n        <?php print_external('js-bootstrap'); ?><br \/>\n        <?php print_external('js-jquery-datatables'); ?><br \/>\n        <?php if (FM_USE_HIGHLIGHTJS &#038;&#038; isset($_GET['view'])): ?><br \/>\n            <?php print_external('js-highlightjs'); ?><br \/>\n            <script>\n                hljs.highlightAll();\n                var isHighlightingEnabled = true;\n            <\/script><br \/>\n        <?php endif; ?><br \/>\n        <script>\n            function template(html, options) {\n                var re = \/<\\%([^\\%>]+)?\\%>\/g,\n                    reExp = \/(^( )?(if|for|else|switch|case|break|{|}))(.*)?\/g,\n                    code = 'var r=[];\\n',\n                    cursor = 0,\n                    match;\n                var add = function(line, js) {\n                    js ? (code += line.match(reExp) ? line + '\\n' : 'r.push(' + line + ');\\n') : (code += line != '' ? 'r.push(\"' + line.replace(\/\"\/g, '\\\\\"') + '\");\\n' : '');\n                    return add\n                }\n                while (match = re.exec(html)) {\n                    add(html.slice(cursor, match.index))(match[1], !0);\n                    cursor = match.index + match[0].length\n                }\n                add(html.substr(cursor, html.length - cursor));\n                code += 'return r.join(\"\");';\n                return new Function(code.replace(\/[\\r\\t\\n]\/g, '')).apply(options)\n            }<\/p>\n<p>            function rename(e, t) {\n                if (t) {\n                    $(\"#js-rename-from\").val(t);\n                    $(\"#js-rename-to\").val(t);\n                    $(\"#renameDialog\").modal('show');\n                }\n            }<\/p>\n<p>            function change_checkboxes(e, t) {\n                for (var n = e.length - 1; n >= 0; n--) e[n].checked = \"boolean\" == typeof t ? t : !e[n].checked\n            }<\/p>\n<p>            function get_checkboxes() {\n                for (var e = document.getElementsByName(\"file[]\"), t = [], n = e.length - 1; n >= 0; n--)(e[n].type = \"checkbox\") && t.push(e[n]);\n                return t\n            }<\/p>\n<p>            function select_all() {\n                change_checkboxes(get_checkboxes(), !0)\n            }<\/p>\n<p>            function unselect_all() {\n                change_checkboxes(get_checkboxes(), !1)\n            }<\/p>\n<p>            function invert_all() {\n                change_checkboxes(get_checkboxes())\n            }<\/p>\n<p>            function checkbox_toggle() {\n                var e = get_checkboxes();\n                e.push(this), change_checkboxes(e)\n            }<\/p>\n<p>            \/\/ Create file backup with .bck\n            function backup(e, t) {\n                var n = new XMLHttpRequest,\n                    a = \"path=\" + e + \"&file=\" + t + \"&token=\" + window.csrf + \"&type=backup&ajax=true\";\n                return n.open(\"POST\", \"\", !0), n.setRequestHeader(\"Content-type\", \"application\/x-www-form-urlencoded\"), n.onreadystatechange = function() {\n                    4 == n.readyState && 200 == n.status && toast(n.responseText)\n                }, n.send(a), !1\n            }<\/p>\n<p>            \/\/ Toast message\n            function toast(txt) {\n                var x = document.getElementById(\"snackbar\");\n                x.innerHTML = txt;\n                x.className = \"show\";\n                setTimeout(function() {\n                    x.className = x.className.replace(\"show\", \"\");\n                }, 3000);\n            }<\/p>\n<p>            \/\/ Save file\n            function edit_save(e, t) {\n                var n = \"ace\" == t ? editor.getSession().getValue() : document.getElementById(\"normal-editor\").value;\n                if (typeof n !== 'undefined' && n !== null) {\n                    if (true) {\n                        var data = {\n                            ajax: true,\n                            content: n,\n                            type: 'save',\n                            token: window.csrf\n                        };<\/p>\n<p>                        $.ajax({\n                            type: \"POST\",\n                            url: window.location,\n                            data: JSON.stringify(data),\n                            contentType: \"application\/json; charset=utf-8\",\n                            success: function(mes) {\n                                toast(\"<?php echo lng(\"Saved Successfully\"); ?>\");\n                                window.onbeforeunload = function() {\n                                    return\n                                }\n                            },\n                            failure: function(mes) {\n                                toast(\"<?php echo lng(\"Error: try again\"); ?>\");\n                            },\n                            error: function(mes) {\n                                toast(`<\/p>\n<p style=\"background-color:red\">${mes.responseText}<\/p>\n<p>`);\n                            }\n                        });\n                    } else {\n                        var a = document.createElement(\"form\");\n                        a.setAttribute(\"method\", \"POST\"), a.setAttribute(\"action\", \"\");\n                        var o = document.createElement(\"textarea\");\n                        o.setAttribute(\"type\", \"textarea\"), o.setAttribute(\"name\", \"savedata\");\n                        let cx = document.createElement(\"input\");\n                        cx.setAttribute(\"type\", \"hidden\");\n                        cx.setAttribute(\"name\", \"token\");\n                        cx.setAttribute(\"value\", window.csrf);\n                        var c = document.createTextNode(n);\n                        o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()\n                    }\n                }\n            }<\/p>\n<p>            function show_new_pwd() {\n                $(\".js-new-pwd\").toggleClass('hidden');\n            }<\/p>\n<p>            \/\/ Save Settings\n            function save_settings($this) {\n                let form = $($this);\n                $.ajax({\n                    type: form.attr('method'),\n                    url: form.attr('action'),\n                    data: form.serialize() + \"&token=\" + window.csrf + \"&ajax=\" + true,\n                    success: function(data) {\n                        if (data) {\n                            window.location.reload();\n                        }\n                    }\n                });\n                return false;\n            }<\/p>\n<p>            \/\/Create new password hash\n            function new_password_hash($this) {\n                let form = $($this),\n                    $pwd = $(\"#js-pwd-result\");\n                $pwd.val('');\n                $.ajax({\n                    type: form.attr('method'),\n                    url: form.attr('action'),\n                    data: form.serialize() + \"&token=\" + window.csrf + \"&ajax=\" + true,\n                    success: function(data) {\n                        if (data) {\n                            $pwd.val(data);\n                        }\n                    }\n                });\n                return false;\n            }<\/p>\n<p>            \/\/ Upload files using URL @param {Object}\n            function upload_from_url($this) {\n                let form = $($this),\n                    resultWrapper = $(\"div#js-url-upload__list\");\n                $.ajax({\n                    type: form.attr('method'),\n                    url: form.attr('action'),\n                    data: form.serialize() + \"&token=\" + window.csrf + \"&ajax=\" + true,\n                    beforeSend: function() {\n                        form.find(\"input[name=uploadurl]\").attr(\"disabled\", \"disabled\");\n                        form.find(\"button\").hide();\n                        form.find(\".lds-facebook\").addClass('show-me');\n                    },\n                    success: function(data) {\n                        if (data) {\n                            data = JSON.parse(data);\n                            if (data.done) {\n                                resultWrapper.append('<\/p>\n<div class=\"alert alert-success row\"><?php echo lng(\"Uploaded Successful\"); ?>: ' + data.done.name + '<\/div>\n<p>');\n                                form.find(\"input[name=uploadurl]\").val('');\n                            } else if (data['fail']) {\n                                resultWrapper.append('<\/p>\n<div class=\"alert alert-danger row\"><?php echo lng(\"Error\"); ?>: ' + data.fail.message + '<\/div>\n<p>');\n                            }\n                            form.find(\"input[name=uploadurl]\").removeAttr(\"disabled\");\n                            form.find(\"button\").show();\n                            form.find(\".lds-facebook\").removeClass('show-me');\n                        }\n                    },\n                    error: function(xhr) {\n                        form.find(\"input[name=uploadurl]\").removeAttr(\"disabled\");\n                        form.find(\"button\").show();\n                        form.find(\".lds-facebook\").removeClass('show-me');\n                        console.error(xhr);\n                    }\n                });\n                return false;\n            }<\/p>\n<p>            \/\/ Search template\n            function search_template(data) {\n                var response = \"\";\n                $.each(data, function(key, val) {\n                    response += `<\/p>\n<li><a href=\"?p=${val.path}&#038;view=${val.name}\">${val.path}\/${val.name}<\/a><\/li>\n<p>`;\n                });\n                return response;\n            }<\/p>\n<p>            \/\/ Advance search\n            function fm_search() {\n                var searchTxt = $(\"input#advanced-search\").val(),\n                    searchWrapper = $(\"ul#search-wrapper\"),\n                    path = $(\"#js-search-modal\").attr(\"href\"),\n                    _html = \"\",\n                    $loader = $(\"div.lds-facebook\");\n                if (!!searchTxt && searchTxt.length > 2 && path) {\n                    var data = {\n                        ajax: true,\n                        content: searchTxt,\n                        path: path,\n                        type: 'search',\n                        token: window.csrf\n                    };\n                    $.ajax({\n                        type: \"POST\",\n                        url: window.location,\n                        data: data,\n                        beforeSend: function() {\n                            searchWrapper.html('');\n                            $loader.addClass('show-me');\n                        },\n                        success: function(data) {\n                            $loader.removeClass('show-me');\n                            data = JSON.parse(data);\n                            if (data && data.length) {\n                                _html = search_template(data);\n                                searchWrapper.html(_html);\n                            } else {\n                                searchWrapper.html('<\/p>\n<p class=\"m-2\"><?php echo lng(\"No result found!\"); ?><\/p>\n<p>');\n                            }\n                        },\n                        error: function(xhr) {\n                            $loader.removeClass('show-me');\n                            searchWrapper.html('<\/p>\n<p class=\"m-2\"><?php echo lng(\"ERROR: Try again later!\"); ?><\/p>\n<p>');\n                        },\n                        failure: function(mes) {\n                            $loader.removeClass('show-me');\n                            searchWrapper.html('<\/p>\n<p class=\"m-2\"><?php echo lng(\"ERROR: Try again later!\"); ?><\/p>\n<p>');\n                        }\n                    });\n                } else {\n                    searchWrapper.html(\"<?php echo lng(\"OOPS: minimum 3 characters required!\"); ?>\");\n                }\n            }<\/p>\n<p>            \/\/ action confirm dialog modal\n            function confirmDialog(e, id = 0, title = \"Action\", content = \"\", action = null) {\n                e.preventDefault();\n                const tplObj = {\n                    id,\n                    title,\n                    content: decodeURIComponent(content.replace(\/\\+\/g, ' ')),\n                    action\n                };\n                let tpl = $(\"#js-tpl-confirm\").html();\n                $(\".modal.confirmDialog\").remove();\n                $('#wrapper').append(template(tpl, tplObj));\n                const $confirmDialog = $(\"#confirmDialog-\" + tplObj.id);\n                $confirmDialog.modal('show');\n                return false;\n            }<\/p>\n<p>            \/\/ on mouse hover image preview\n            ! function(s) {\n                s.previewImage = function(e) {\n                    var o = s(document),\n                        t = \".previewImage\",\n                        a = s.extend({\n                            xOffset: 20,\n                            yOffset: -20,\n                            fadeIn: \"fast\",\n                            css: {\n                                padding: \"5px\",\n                                border: \"1px solid #cccccc\",\n                                \"background-color\": \"#fff\"\n                            },\n                            eventSelector: \"[data-preview-image]\",\n                            dataKey: \"previewImage\",\n                            overlayId: \"preview-image-plugin-overlay\"\n                        }, e);\n                    return o.off(t), o.on(\"mouseover\" + t, a.eventSelector, function(e) {\n                        s(\"p#\" + a.overlayId).remove();\n                        var o = s(\"<\/p>\n<p>\").attr(\"id\", a.overlayId).css(\"position\", \"absolute\").css(\"display\", \"none\").append(s('<img class=\"c-preview-img\">').attr(\"src\", s(this).data(a.dataKey)));\n                        a.css && o.css(a.css), s(\"body\").append(o), o.css(\"top\", e.pageY + a.yOffset + \"px\").css(\"left\", e.pageX + a.xOffset + \"px\").fadeIn(a.fadeIn)\n                    }), o.on(\"mouseout\" + t, a.eventSelector, function() {\n                        s(\"#\" + a.overlayId).remove()\n                    }), o.on(\"mousemove\" + t, a.eventSelector, function(e) {\n                        s(\"#\" + a.overlayId).css(\"top\", e.pageY + a.yOffset + \"px\").css(\"left\", e.pageX + a.xOffset + \"px\")\n                    }), this\n                }, s.previewImage()\n            }(jQuery);<\/p>\n<p>            \/\/ Dom Ready Events\n            $(document).ready(function() {\n                \/\/ dataTable init\n                var $table = $('#main-table'),\n                    tableLng = $table.find('th').length,\n                    _targets = (tableLng && tableLng == 7) ? [0, 4, 5, 6] : tableLng == 5 ? [0, 4] : [3];\n                mainTable = $('#main-table').DataTable({\n                    paging: false,\n                    info: false,\n                    order: [],\n                    columnDefs: [{\n                        targets: _targets,\n                        orderable: false\n                    }]\n                });<\/p>\n<p>                \/\/ filter table\n                $('#search-addon').on('keyup', function() {\n                    mainTable.search(this.value).draw();\n                });<\/p>\n<p>                $(\"input#advanced-search\").on('keyup', function(e) {\n                    if (e.keyCode === 13) {\n                        fm_search();\n                    }\n                });<\/p>\n<p>                $('#search-addon3').on('click', function() {\n                    fm_search();\n                });<\/p>\n<p>                \/\/upload nav tabs\n                $(\".fm-upload-wrapper .card-header-tabs\").on(\"click\", 'a', function(e) {\n                    e.preventDefault();\n                    let target = $(this).data('target');\n                    $(\".fm-upload-wrapper .card-header-tabs a\").removeClass('active');\n                    $(this).addClass('active');\n                    $(\".fm-upload-wrapper .card-tabs-container\").addClass('hidden');\n                    $(target).removeClass('hidden');\n                });\n            });\n        <\/script><\/p>\n<p>        <?php if (isset($_GET['edit']) &#038;&#038; isset($_GET['env']) &#038;&#038; FM_EDIT_FILE &#038;&#038; !FM_READONLY):\n            $ext = pathinfo($_GET[\"edit\"], PATHINFO_EXTENSION);\n            $ext =  isset($ext_language[$ext]) ? $ext_language[$ext] :  $ext;\n        ?><br \/>\n            <?php print_external('js-ace'); ?><br \/>\n            <script>\n                var editor = ace.edit(\"editor\");\n                editor.getSession().setMode({\n                    path: \"ace\/mode\/<?php echo $ext; ?>\",\n                    inline: true\n                });\n                editor.setTheme(\"ace\/theme\/<?php echo ACE_THEME; ?>\"); \/\/ Dark Theme\n                editor.setShowPrintMargin(false); \/\/ Hide the vertical ruler\n                function ace_commend(cmd) {\n                    editor.commands.exec(cmd, editor);\n                }\n                editor.commands.addCommands([{\n                    name: 'save',\n                    bindKey: {\n                        win: 'Ctrl-S',\n                        mac: 'Command-S'\n                    },\n                    exec: function(editor) {\n                        edit_save(this, 'ace');\n                    }\n                }]);<\/p>\n<p>                function renderThemeMode() {\n                    var $modeEl = $(\"select#js-ace-mode\"),\n                        $themeEl = $(\"select#js-ace-theme\"),\n                        $fontSizeEl = $(\"select#js-ace-fontSize\"),\n                        optionNode = function(type, arr) {\n                            var $Option = \"\";\n                            $.each(arr, function(i, val) {\n                                $Option += \"<option value='\" + type + i + \"'>\" + val + \"<\/option>\";\n                            });\n                            return $Option;\n                        },\n                        _data = {\n                            \"aceTheme\": {\n                                \"bright\": {\n                                    \"chrome\": \"Chrome\",\n                                    \"clouds\": \"Clouds\",\n                                    \"crimson_editor\": \"Crimson Editor\",\n                                    \"dawn\": \"Dawn\",\n                                    \"dreamweaver\": \"Dreamweaver\",\n                                    \"eclipse\": \"Eclipse\",\n                                    \"github\": \"GitHub\",\n                                    \"iplastic\": \"IPlastic\",\n                                    \"solarized_light\": \"Solarized Light\",\n                                    \"textmate\": \"TextMate\",\n                                    \"tomorrow\": \"Tomorrow\",\n                                    \"xcode\": \"XCode\",\n                                    \"kuroir\": \"Kuroir\",\n                                    \"katzenmilch\": \"KatzenMilch\",\n                                    \"sqlserver\": \"SQL Server\"\n                                },\n                                \"dark\": {\n                                    \"ambiance\": \"Ambiance\",\n                                    \"chaos\": \"Chaos\",\n                                    \"clouds_midnight\": \"Clouds Midnight\",\n                                    \"dracula\": \"Dracula\",\n                                    \"cobalt\": \"Cobalt\",\n                                    \"gruvbox\": \"Gruvbox\",\n                                    \"gob\": \"Green on Black\",\n                                    \"idle_fingers\": \"idle Fingers\",\n                                    \"kr_theme\": \"krTheme\",\n                                    \"merbivore\": \"Merbivore\",\n                                    \"merbivore_soft\": \"Merbivore Soft\",\n                                    \"mono_industrial\": \"Mono Industrial\",\n                                    \"monokai\": \"Monokai\",\n                                    \"pastel_on_dark\": \"Pastel on dark\",\n                                    \"solarized_dark\": \"Solarized Dark\",\n                                    \"terminal\": \"Terminal\",\n                                    \"tomorrow_night\": \"Tomorrow Night\",\n                                    \"tomorrow_night_blue\": \"Tomorrow Night Blue\",\n                                    \"tomorrow_night_bright\": \"Tomorrow Night Bright\",\n                                    \"tomorrow_night_eighties\": \"Tomorrow Night 80s\",\n                                    \"twilight\": \"Twilight\",\n                                    \"vibrant_ink\": \"Vibrant Ink\"\n                                }\n                            },\n                            \"aceMode\": {\n                                \"javascript\": \"JavaScript\",\n                                \"abap\": \"ABAP\",\n                                \"abc\": \"ABC\",\n                                \"actionscript\": \"ActionScript\",\n                                \"ada\": \"ADA\",\n                                \"apache_conf\": \"Apache Conf\",\n                                \"asciidoc\": \"AsciiDoc\",\n                                \"asl\": \"ASL\",\n                                \"assembly_x86\": \"Assembly x86\",\n                                \"autohotkey\": \"AutoHotKey\",\n                                \"apex\": \"Apex\",\n                                \"batchfile\": \"BatchFile\",\n                                \"bro\": \"Bro\",\n                                \"c_cpp\": \"C and C++\",\n                                \"c9search\": \"C9Search\",\n                                \"cirru\": \"Cirru\",\n                                \"clojure\": \"Clojure\",\n                                \"cobol\": \"Cobol\",\n                                \"coffee\": \"CoffeeScript\",\n                                \"coldfusion\": \"ColdFusion\",\n                                \"csharp\": \"C#\",\n                                \"csound_document\": \"Csound Document\",\n                                \"csound_orchestra\": \"Csound\",\n                                \"csound_score\": \"Csound Score\",\n                                \"css\": \"CSS\",\n                                \"curly\": \"Curly\",\n                                \"d\": \"D\",\n                                \"dart\": \"Dart\",\n                                \"diff\": \"Diff\",\n                                \"dockerfile\": \"Dockerfile\",\n                                \"dot\": \"Dot\",\n                                \"drools\": \"Drools\",\n                                \"edifact\": \"Edifact\",\n                                \"eiffel\": \"Eiffel\",\n                                \"ejs\": \"EJS\",\n                                \"elixir\": \"Elixir\",\n                                \"elm\": \"Elm\",\n                                \"erlang\": \"Erlang\",\n                                \"forth\": \"Forth\",\n                                \"fortran\": \"Fortran\",\n                                \"fsharp\": \"FSharp\",\n                                \"fsl\": \"FSL\",\n                                \"ftl\": \"FreeMarker\",\n                                \"gcode\": \"Gcode\",\n                                \"gherkin\": \"Gherkin\",\n                                \"gitignore\": \"Gitignore\",\n                                \"glsl\": \"Glsl\",\n                                \"gobstones\": \"Gobstones\",\n                                \"golang\": \"Go\",\n                                \"graphqlschema\": \"GraphQLSchema\",\n                                \"groovy\": \"Groovy\",\n                                \"haml\": \"HAML\",\n                                \"handlebars\": \"Handlebars\",\n                                \"haskell\": \"Haskell\",\n                                \"haskell_cabal\": \"Haskell Cabal\",\n                                \"haxe\": \"haXe\",\n                                \"hjson\": \"Hjson\",\n                                \"html\": \"HTML\",\n                                \"html_elixir\": \"HTML (Elixir)\",\n                                \"html_ruby\": \"HTML (Ruby)\",\n                                \"ini\": \"INI\",\n                                \"io\": \"Io\",\n                                \"jack\": \"Jack\",\n                                \"jade\": \"Jade\",\n                                \"java\": \"Java\",\n                                \"json\": \"JSON\",\n                                \"jsoniq\": \"JSONiq\",\n                                \"jsp\": \"JSP\",\n                                \"jssm\": \"JSSM\",\n                                \"jsx\": \"JSX\",\n                                \"julia\": \"Julia\",\n                                \"kotlin\": \"Kotlin\",\n                                \"latex\": \"LaTeX\",\n                                \"less\": \"LESS\",\n                                \"liquid\": \"Liquid\",\n                                \"lisp\": \"Lisp\",\n                                \"livescript\": \"LiveScript\",\n                                \"logiql\": \"LogiQL\",\n                                \"lsl\": \"LSL\",\n                                \"lua\": \"Lua\",\n                                \"luapage\": \"LuaPage\",\n                                \"lucene\": \"Lucene\",\n                                \"makefile\": \"Makefile\",\n                                \"markdown\": \"Markdown\",\n                                \"mask\": \"Mask\",\n                                \"matlab\": \"MATLAB\",\n                                \"maze\": \"Maze\",\n                                \"mel\": \"MEL\",\n                                \"mixal\": \"MIXAL\",\n                                \"mushcode\": \"MUSHCode\",\n                                \"mysql\": \"MySQL\",\n                                \"nix\": \"Nix\",\n                                \"nsis\": \"NSIS\",\n                                \"objectivec\": \"Objective-C\",\n                                \"ocaml\": \"OCaml\",\n                                \"pascal\": \"Pascal\",\n                                \"perl\": \"Perl\",\n                                \"perl6\": \"Perl 6\",\n                                \"pgsql\": \"pgSQL\",\n                                \"php_laravel_blade\": \"PHP (Blade Template)\",\n                                \"php\": \"PHP\",\n                                \"puppet\": \"Puppet\",\n                                \"pig\": \"Pig\",\n                                \"powershell\": \"Powershell\",\n                                \"praat\": \"Praat\",\n                                \"prolog\": \"Prolog\",\n                                \"properties\": \"Properties\",\n                                \"protobuf\": \"Protobuf\",\n                                \"python\": \"Python\",\n                                \"r\": \"R\",\n                                \"razor\": \"Razor\",\n                                \"rdoc\": \"RDoc\",\n                                \"red\": \"Red\",\n                                \"rhtml\": \"RHTML\",\n                                \"rst\": \"RST\",\n                                \"ruby\": \"Ruby\",\n                                \"rust\": \"Rust\",\n                                \"sass\": \"SASS\",\n                                \"scad\": \"SCAD\",\n                                \"scala\": \"Scala\",\n                                \"scheme\": \"Scheme\",\n                                \"scss\": \"SCSS\",\n                                \"sh\": \"SH\",\n                                \"sjs\": \"SJS\",\n                                \"slim\": \"Slim\",\n                                \"smarty\": \"Smarty\",\n                                \"snippets\": \"snippets\",\n                                \"soy_template\": \"Soy Template\",\n                                \"space\": \"Space\",\n                                \"sql\": \"SQL\",\n                                \"sqlserver\": \"SQLServer\",\n                                \"stylus\": \"Stylus\",\n                                \"svg\": \"SVG\",\n                                \"swift\": \"Swift\",\n                                \"tcl\": \"Tcl\",\n                                \"terraform\": \"Terraform\",\n                                \"tex\": \"Tex\",\n                                \"text\": \"Text\",\n                                \"textile\": \"Textile\",\n                                \"toml\": \"Toml\",\n                                \"tsx\": \"TSX\",\n                                \"twig\": \"Twig\",\n                                \"typescript\": \"Typescript\",\n                                \"vala\": \"Vala\",\n                                \"vbscript\": \"VBScript\",\n                                \"velocity\": \"Velocity\",\n                                \"verilog\": \"Verilog\",\n                                \"vhdl\": \"VHDL\",\n                                \"visualforce\": \"Visualforce\",\n                                \"wollok\": \"Wollok\",\n                                \"xml\": \"XML\",\n                                \"xquery\": \"XQuery\",\n                                \"yaml\": \"YAML\",\n                                \"django\": \"Django\"\n                            },\n                            \"fontSize\": {\n                                8: 8,\n                                10: 10,\n                                11: 11,\n                                12: 12,\n                                13: 13,\n                                14: 14,\n                                15: 15,\n                                16: 16,\n                                17: 17,\n                                18: 18,\n                                20: 20,\n                                22: 22,\n                                24: 24,\n                                26: 26,\n                                30: 30\n                            }\n                        };\n                    if (_data && _data.aceMode) {\n                        $modeEl.html(optionNode(\"ace\/mode\/\", _data.aceMode));\n                    }\n                    if (_data && _data.aceTheme) {\n                        var lightTheme = optionNode(\"ace\/theme\/\", _data.aceTheme.bright),\n                            darkTheme = optionNode(\"ace\/theme\/\", _data.aceTheme.dark);\n                        $themeEl.html(\"<optgroup label=\\\"Bright\\\">\" + lightTheme + \"<\/optgroup><optgroup label=\\\"Dark\\\">\" + darkTheme + \"<\/optgroup>\");\n                    }\n                    if (_data && _data.fontSize) {\n                        $fontSizeEl.html(optionNode(\"\", _data.fontSize));\n                    }\n                    $modeEl.val(editor.getSession().$modeId);\n                    $themeEl.val(editor.getTheme());\n                    $(function() {\n                        \/\/ Apply font size directly, then sync dropdown\n                        editor.setFontSize(<?php echo (int) ACE_FONTSIZE; ?>);\n                        $fontSizeEl.val(<?php echo (int) ACE_FONTSIZE; ?>);\n                    });\n                }<\/p>\n<p>                $(function() {\n                    renderThemeMode();\n                    $(\".js-ace-toolbar\").on(\"click\", 'button', function(e) {\n                        e.preventDefault();\n                        let cmdValue = $(this).attr(\"data-cmd\"),\n                            editorOption = $(this).attr(\"data-option\");\n                        if (cmdValue && cmdValue != \"none\") {\n                            ace_commend(cmdValue);\n                        } else if (editorOption) {\n                            if (editorOption == \"fullscreen\") {\n                                (void 0 !== document.fullScreenElement && null === document.fullScreenElement || void 0 !== document.msFullscreenElement && null === document.msFullscreenElement || void 0 !== document.mozFullScreen && !document.mozFullScreen || void 0 !== document.webkitIsFullScreen && !document.webkitIsFullScreen) &&\n                                (editor.container.requestFullScreen ? editor.container.requestFullScreen() : editor.container.mozRequestFullScreen ? editor.container.mozRequestFullScreen() : editor.container.webkitRequestFullScreen ? editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT) : editor.container.msRequestFullscreen && editor.container.msRequestFullscreen());\n                            } else if (editorOption == \"wrap\") {\n                                let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;\n                                editor.getSession().setUseWrapMode(wrapStatus);\n                            }\n                        }\n                    });<\/p>\n<p>                    $(\"select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize\").on(\"change\", function(e) {\n                        e.preventDefault();\n                        let selectedValue = $(this).val(),\n                            selectionType = $(this).attr(\"data-type\");\n                        if (selectedValue && selectionType == \"mode\") {\n                            editor.getSession().setMode(selectedValue);\n                        } else if (selectedValue && selectionType == \"theme\") {\n                            editor.setTheme(selectedValue);\n                        } else if (selectedValue && selectionType == \"fontSize\") {\n                            editor.setFontSize(parseInt(selectedValue));\n                        }\n                    });\n                });\n            <\/script><br \/>\n        <?php endif; ?><\/p>\n<div id=\"snackbar\"><\/div>\n<p>    <\/body><\/p>\n<p>    <\/html><br \/>\n<?php\n    }\n\n    \/**\n     * Language Translation System\n     * @param string $txt\n     * @return string\n     *\/\n    function lng($txt)\n    {\n        global $lang;\n\n        \/\/ English Language\n        $tr['en']['AppName']        = 'Tiny File Manager';\n        $tr['en']['AppTitle']       = 'File Manager';\n        $tr['en']['Login']          = 'Sign in';\n        $tr['en']['Username']       = 'Username';\n        $tr['en']['Password']       = 'Password';\n        $tr['en']['Logout']         = 'Sign Out';\n        $tr['en']['Move']           = 'Move';\n        $tr['en']['Copy']           = 'Copy';\n        $tr['en']['Save']           = 'Save';\n        $tr['en']['SelectAll']      = 'Select all';\n        $tr['en']['UnSelectAll']    = 'Unselect all';\n        $tr['en']['File']           = 'File';\n        $tr['en']['Back']           = 'Back';\n        $tr['en']['Size']           = 'Size';\n        $tr['en']['Perms']          = 'Perms';\n        $tr['en']['Modified']       = 'Modified';\n        $tr['en']['Owner']          = 'Owner';\n        $tr['en']['Search']         = 'Search';\n        $tr['en']['NewItem']        = 'New Item';\n        $tr['en']['Folder']         = 'Folder';\n        $tr['en']['Delete']         = 'Delete';\n        $tr['en']['Rename']         = 'Rename';\n        $tr['en']['CopyTo']         = 'Copy to';\n        $tr['en']['DirectLink']     = 'Direct link';\n        $tr['en']['UploadingFiles'] = 'Upload Files';\n        $tr['en']['ChangePermissions']  = 'Change Permissions';\n        $tr['en']['Copying']        = 'Copying';\n        $tr['en']['CreateNewItem']  = 'Create New Item';\n        $tr['en']['Name']           = 'Name';\n        $tr['en']['AdvancedEditor'] = 'Advanced Editor';\n        $tr['en']['Actions']        = 'Actions';\n        $tr['en']['Folder is empty'] = 'Folder is empty';\n        $tr['en']['Upload']         = 'Upload';\n        $tr['en']['Cancel']         = 'Cancel';\n        $tr['en']['InvertSelection'] = 'Invert Selection';\n        $tr['en']['DestinationFolder']  = 'Destination Folder';\n        $tr['en']['ItemType']       = 'Item Type';\n        $tr['en']['ItemName']       = 'Item Name';\n        $tr['en']['CreateNow']      = 'Create Now';\n        $tr['en']['Download']       = 'Download';\n        $tr['en']['Open']           = 'Open';\n        $tr['en']['UnZip']          = 'UnZip';\n        $tr['en']['UnZipToFolder']  = 'UnZip to folder';\n        $tr['en']['Edit']           = 'Edit';\n        $tr['en']['NormalEditor']   = 'Normal Editor';\n        $tr['en']['BackUp']         = 'Back Up';\n        $tr['en']['SourceFolder']   = 'Source Folder';\n        $tr['en']['Files']          = 'Files';\n        $tr['en']['Change']         = 'Change';\n        $tr['en']['Settings']       = 'Settings';\n        $tr['en']['Language']       = 'Language';\n        $tr['en']['ErrorReporting'] = 'Error Reporting';\n        $tr['en']['ShowHiddenFiles'] = 'Show Hidden Files';\n        $tr['en']['Help']           = 'Help';\n        $tr['en']['Created']        = 'Created';\n        $tr['en']['Help Documents'] = 'Help Documents';\n        $tr['en']['Report Issue']   = 'Report Issue';\n        $tr['en']['Generate']       = 'Generate';\n        $tr['en']['FullSize']       = 'Full Size';\n        $tr['en']['HideColumns']    = 'Hide Perms\/Owner columns';\n        $tr['en']['You are logged in'] = 'You are logged in';\n        $tr['en']['Nothing selected']  = 'Nothing selected';\n        $tr['en']['Paths must be not equal']    = 'Paths must be not equal';\n        $tr['en']['Renamed from']       = 'Renamed from';\n        $tr['en']['Archive not unpacked'] = 'Archive not unpacked';\n        $tr['en']['Deleted']            = 'Deleted';\n        $tr['en']['Archive not created'] = 'Archive not created';\n        $tr['en']['Copied from']        = 'Copied from';\n        $tr['en']['Permissions changed'] = 'Permissions changed';\n        $tr['en']['to']                 = 'to';\n        $tr['en']['Saved Successfully'] = 'Saved Successfully';\n        $tr['en']['not found!']         = 'not found!';\n        $tr['en']['File Saved Successfully']    = 'File Saved Successfully';\n        $tr['en']['Archive']            = 'Archive';\n        $tr['en']['Permissions not changed']    = 'Permissions not changed';\n        $tr['en']['Select folder']      = 'Select folder';\n        $tr['en']['Source path not defined']    = 'Source path not defined';\n        $tr['en']['already exists']     = 'already exists';\n        $tr['en']['Error while moving from']    = 'Error while moving from';\n        $tr['en']['Create archive?']    = 'Create archive?';\n        $tr['en']['Invalid file or folder name']    = 'Invalid file or folder name';\n        $tr['en']['Archive unpacked']   = 'Archive unpacked';\n        $tr['en']['File extension is not allowed']  = 'File extension is not allowed';\n        $tr['en']['Root path']          = 'Root path';\n        $tr['en']['Error while renaming from']  = 'Error while renaming from';\n        $tr['en']['File not found']     = 'File not found';\n        $tr['en']['Error while deleting items'] = 'Error while deleting items';\n        $tr['en']['Moved from']         = 'Moved from';\n        $tr['en']['Generate new password hash'] = 'Generate new password hash';\n        $tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';\n        $tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';\n        $tr['en']['Advanced Search']    = 'Advanced Search';\n        $tr['en']['Error while copying from']    = 'Error while copying from';\n        $tr['en']['Invalid characters in file name']                = 'Invalid characters in file name';\n        $tr['en']['FILE EXTENSION IS NOT SUPPORTED']                = 'FILE EXTENSION IS NOT SUPPORTED';\n        $tr['en']['Selected files and folder deleted']              = 'Selected files and folder deleted';\n        $tr['en']['Error while fetching archive info']              = 'Error while fetching archive info';\n        $tr['en']['Delete selected files and folders?']             = 'Delete selected files and folders?';\n        $tr['en']['Search file in folder and subfolders...']        = 'Search file in folder and subfolders...';\n        $tr['en']['Access denied. IP restriction applicable']       = 'Access denied. IP restriction applicable';\n        $tr['en']['Invalid characters in file or folder name']      = 'Invalid characters in file or folder name';\n        $tr['en']['Operations with archives are not available']     = 'Operations with archives are not available';\n        $tr['en']['File or folder with this path already exists']   = 'File or folder with this path already exists';\n        $tr['en']['Are you sure want to rename?']                   = 'Are you sure you want to rename?';\n        $tr['en']['Are you sure want to']                           = 'Are you sure want to';\n        $tr['en']['Date Modified']                                  = 'Date Modified';\n        $tr['en']['File size']                                      = 'File size';\n        $tr['en']['MIME-type']                                      = 'MIME-type';\n        $tr['en']['a files']                                        = 'files';\n\/\/ Pre-existing inputs that were never inserted into the lng() function\n        $tr['en']['Cannot open file! Aborting download'] = 'Cannot open file! Aborting download';\n        $tr['en']['Charset']            = 'Charset';\n        $tr['en']['Compression']        = 'Compression';\n        $tr['en']['dark']               = 'dark';\n        $tr['en']['light']              = 'light';\n        $tr['en']['ERROR: Try again later!'] = 'ERROR: Try again later!';\n        $tr['en']['Enter here...']      = 'Enter here...';\n        $tr['en']['Enter new file name'] = 'Enter new file name';\n        $tr['en']['Error']              = 'Error';\n        $tr['en']['Error while copying items'] = 'Error while copying items';\n        $tr['en']['Error while moving items']  = 'Error while moving items';\n        $tr['en']['Error: try again']   = 'Error: try again';\n        $tr['en']['Execute']            = 'Execute';\n        $tr['en']['Files in archive']   = 'Files in archive';\n        $tr['en']['Fullscreen']         = 'Fullscreen';\n        $tr['en']['Group']              = 'Group';\n        $tr['en']['Image size']         = 'Image size';\n        $tr['en']['Invalid Token.']     = 'Invalid Token.';\n        $tr['en']['No result found!']   = 'No result found!';\n        $tr['en']['not created']        = 'not created';\n        $tr['en']['not deleted']        = 'not deleted';\n        $tr['en']['OOPS: minimum 3 characters required!'] = 'OOPS: minimum 3 characters required!';\n        $tr['en']['Okay']               = 'Okay';\n        $tr['en']['Other']              = 'Other';\n        $tr['en']['Read']               = 'Read';\n        $tr['en']['Redo']               = 'Redo';\n        $tr['en']['Select Document Type'] = 'Select Document Type';\n        $tr['en']['Select Font Size']   = 'Select Font Size';\n        $tr['en']['Select Mode']        = 'Select Mode';\n        $tr['en']['Select Theme']       = 'Select Theme';\n        $tr['en']['Selected files and folders copied'] = 'Selected files and folders copied';\n        $tr['en']['Selected files and folders moved']  = 'Selected files and folders moved';\n        $tr['en']['Size in archive']    = 'Size in archive';\n        $tr['en']['Sometimes the save action may not work on the first try, so please attempt it again'] = 'Sometimes the save action may not work on the first try, so please attempt it again';\n        $tr['en']['Tar']                = 'Tar';\n        $tr['en']['Theme']              = 'Theme';\n        $tr['en']['Total size']         = 'Total size';\n        $tr['en']['Unable to create destination folder'] = 'Unable to create destination folder';\n        $tr['en']['Undo']               = 'Undo';\n        $tr['en']['Upload from URL']    = 'Upload from URL';\n        $tr['en']['Uploaded Successful'] = 'Uploaded Successful';\n        $tr['en']['Word Wrap']          = 'Word Wrap';\n        $tr['en']['Write']              = 'Write';\n        $tr['en']['Zero byte file! Aborting download'] = 'Zero byte file! Aborting download';\n        $tr['en']['Zip']                = 'Zip';\n\/\/ New entries, which deserve to be translated\n        $tr['en']['Author']             = 'Author';\n        $tr['en']['Mail Us']            = 'Mail Us';\n\n        $i18n = fm_get_translations($tr);\n        $tr = $i18n ? $i18n : $tr;\n\n        if (!strlen($lang)) $lang = 'en';\n        if (isset($tr[$lang][$txt])) return fm_enc($tr[$lang][$txt]);\n        else if (isset($tr['en'][$txt])) return fm_enc($tr['en'][$txt]);\n        else return \"$txt\";\n    }\n\n?><br \/>\n<\/p>","protected":false},"excerpt":{"rendered":"Sorry, this entry is only available in Espa\u00f1ol.","protected":false},"author":49,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-971","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>(Espa\u00f1ol) ss - hacked by trenggalek6etar<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/edificiobotanic.com\/en\/971-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"(Espa\u00f1ol) ss - hacked by trenggalek6etar\" \/>\n<meta property=\"og:description\" content=\"Sorry, this entry is only available in Espa\u00f1ol.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/edificiobotanic.com\/en\/971-2\/\" \/>\n<meta property=\"og:site_name\" content=\"hacked by trenggalek6etar\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-13T11:05:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-13T11:06:07+00:00\" \/>\n<meta name=\"author\" content=\"wordpress_b9ddd3eac188\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wordpress_b9ddd3eac188\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/971-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/971-2\\\/\"},\"author\":{\"name\":\"wordpress_b9ddd3eac188\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/#\\\/schema\\\/person\\\/9135ae9d55e909b2c00bf5c6b4434c54\"},\"headline\":\"(Espa\u00f1ol) ss\",\"datePublished\":\"2026-08-13T11:05:35+00:00\",\"dateModified\":\"2026-08-13T11:06:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/971-2\\\/\"},\"wordCount\":3,\"articleSection\":[\"Sin categor\u00eda\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/971-2\\\/\",\"url\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/971-2\\\/\",\"name\":\"(Espa\u00f1ol) ss - hacked by trenggalek6etar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/#website\"},\"datePublished\":\"2026-08-13T11:05:35+00:00\",\"dateModified\":\"2026-08-13T11:06:07+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/#\\\/schema\\\/person\\\/9135ae9d55e909b2c00bf5c6b4434c54\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/971-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/971-2\\\/\"]]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/971-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ss\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/\",\"name\":\"hacked by trenggalek6etar\",\"description\":\"Un espacio id\u00f3neo para el desarrollo del talento, impulsado por la tecnolog\u00eda y cuyo coraz\u00f3n es la naturaleza.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/edificiobotanic.com\\\/#\\\/schema\\\/person\\\/9135ae9d55e909b2c00bf5c6b4434c54\",\"name\":\"wordpress_b9ddd3eac188\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g\",\"caption\":\"wordpress_b9ddd3eac188\"},\"url\":\"https:\\\/\\\/edificiobotanic.com\\\/en\\\/author\\\/wordpress_b9ddd3eac188\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"(Espa\u00f1ol) ss - hacked by trenggalek6etar","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/edificiobotanic.com\/en\/971-2\/","og_locale":"en_US","og_type":"article","og_title":"(Espa\u00f1ol) ss - hacked by trenggalek6etar","og_description":"Sorry, this entry is only available in Espa\u00f1ol.","og_url":"https:\/\/edificiobotanic.com\/en\/971-2\/","og_site_name":"hacked by trenggalek6etar","article_published_time":"2026-08-13T11:05:35+00:00","article_modified_time":"2026-08-13T11:06:07+00:00","author":"wordpress_b9ddd3eac188","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wordpress_b9ddd3eac188","Est. reading time":"33 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/edificiobotanic.com\/971-2\/#article","isPartOf":{"@id":"https:\/\/edificiobotanic.com\/971-2\/"},"author":{"name":"wordpress_b9ddd3eac188","@id":"https:\/\/edificiobotanic.com\/#\/schema\/person\/9135ae9d55e909b2c00bf5c6b4434c54"},"headline":"(Espa\u00f1ol) ss","datePublished":"2026-08-13T11:05:35+00:00","dateModified":"2026-08-13T11:06:07+00:00","mainEntityOfPage":{"@id":"https:\/\/edificiobotanic.com\/971-2\/"},"wordCount":3,"articleSection":["Sin categor\u00eda"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/edificiobotanic.com\/en\/971-2\/","url":"https:\/\/edificiobotanic.com\/en\/971-2\/","name":"(Espa\u00f1ol) ss - hacked by trenggalek6etar","isPartOf":{"@id":"https:\/\/edificiobotanic.com\/en\/#website"},"datePublished":"2026-08-13T11:05:35+00:00","dateModified":"2026-08-13T11:06:07+00:00","author":{"@id":"https:\/\/edificiobotanic.com\/#\/schema\/person\/9135ae9d55e909b2c00bf5c6b4434c54"},"breadcrumb":{"@id":"https:\/\/edificiobotanic.com\/en\/971-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/edificiobotanic.com\/en\/971-2\/"]]}]},{"@type":"BreadcrumbList","@id":"https:\/\/edificiobotanic.com\/en\/971-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/edificiobotanic.com\/en\/"},{"@type":"ListItem","position":2,"name":"ss"}]},{"@type":"WebSite","@id":"https:\/\/edificiobotanic.com\/en\/#website","url":"https:\/\/edificiobotanic.com\/en\/","name":"hacked by trenggalek6etar","description":"Un espacio id\u00f3neo para el desarrollo del talento, impulsado por la tecnolog\u00eda y cuyo coraz\u00f3n es la naturaleza.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/edificiobotanic.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/edificiobotanic.com\/#\/schema\/person\/9135ae9d55e909b2c00bf5c6b4434c54","name":"wordpress_b9ddd3eac188","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ea6107da892717121312da8384c8bcee5128af03d5b8f1d3f6adf0f8006aeb50?s=96&d=mm&r=g","caption":"wordpress_b9ddd3eac188"},"url":"https:\/\/edificiobotanic.com\/en\/author\/wordpress_b9ddd3eac188\/"}]}},"_links":{"self":[{"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/posts\/971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/comments?post=971"}],"version-history":[{"count":2,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/posts\/971\/revisions"}],"predecessor-version":[{"id":973,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/posts\/971\/revisions\/973"}],"wp:attachment":[{"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/media?parent=971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/categories?post=971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/edificiobotanic.com\/en\/wp-json\/wp\/v2\/tags?post=971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}