| Current Path : /var/www/rustam/data/www/kran-balka.com/kran-balka/.finder_cache/ |
| Current File : /var/www/rustam/data/www/kran-balka.com/kran-balka/.finder_cache/f_68ed483cb61277.43985552.json |
{"root":"\/var\/www\/rustam\/data\/www\/kran-balka.com","queue":[],"processed":9781,"found_files":0,"q":"<?php \/* finder.php \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u0430 + \u00ab\u043a\u0432\u0430\u0437\u0438-\u0441\u0442\u0440\u0438\u043c\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (PHP 5.6+) - \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432 \u0437\u043e\u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (300px) - \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440-\u00ab\u0447\u0438\u043f\u00bb \u0440\u044f\u0434\u043e\u043c \u0441 \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e\/\u041d\u0430\u0439\u0434\u0435\u043d\u043e\": \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u00ab\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u00bb, \u0436\u0451\u043b\u0442\u044b\u0439 \u00ab\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u00bb - \u0420\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u043a\u0446\u0438\u044f\u043c\u0438; \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0437\u0430\u0437\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 label \u0438 input - \u0410\u043d\u0442\u0438-\u0434\u0443\u0431\u043b\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0441\u0438\u043c\u043b\u0438\u043d\u043a\u043e\u0432, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a *\/ error_reporting(E_ALL & ~E_NOTICE); ini_set('display_errors','1'); $ROOT_DIR = __DIR__; $MAX_FILE_SIZE = 8 * 1024 * 1024; \/* \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0422\u041e\u041b\u042c\u041a\u041e php *\/ $DEFAULT_EXTS = array('php'); \/* \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 *\/ $ALL_EXTS = array('php','htm','html','txt','css','js','tpl','xsl','log','xml','json','ini','env','md'); $EXCLUDE_DIRS_DEFAULT = array('.git','node_modules','vendor','storage','cache','.idea','.vscode','.svn'); $MAX_MATCHES_PER_FILE = 200; $TIME_BUDGET = 18; \/* ------- \u043a\u044d\u0448 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c ------- *\/ function store_dir(){ $base = __DIR__ . DIRECTORY_SEPARATOR . '.finder_cache'; if (!is_dir($base)) { @mkdir($base, 0775, true); } $ht = $base . DIRECTORY_SEPARATOR . '.htaccess'; if (!is_file($ht)) { @file_put_contents($ht, \"Require all denied\\n\"); } return $base; } function h($s){ return htmlspecialchars($s, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8'); } function norm($p){ return str_replace(array('\\\\','\/'), DIRECTORY_SEPARATOR, $p); } \/* \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u0443\u0442\u0438 *\/ function is_excluded($path, $exclude){ $parts = explode(DIRECTORY_SEPARATOR, trim(norm($path), DIRECTORY_SEPARATOR)); $parts = array_map('strtolower', $parts); $ex = array(); foreach($exclude as $e){ $e = strtolower(trim($e)); if($e!=='') $ex[$e]=1; } foreach($parts as $seg){ if(isset($ex[$seg])) return true; } return false; } function ext_of($filename){ $p = strrpos($filename,'.'); return $p===false?'':strtolower(substr($filename,$p+1)); } \/* \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 $root \u043a $path *\/ function rel_path($root, $path){ $r = rtrim(realpath($root), DIRECTORY_SEPARATOR); $p = realpath($path); if($r && $p && strpos($p, $r) === 0){ $rel = ltrim(substr($p, strlen($r)), DIRECTORY_SEPARATOR); return $rel === '' ? '.' : $rel; } return $path; } \/* ---------- tail endpoint ---------- *\/ if(isset($_GET['tail'])){ $token = $_GET['tail']; $pos = isset($_GET['pos']) ? max(0,(int)$_GET['pos']) : 0; $dir = store_dir(); $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html'; $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json'; $done = false; $processed = 0; $found = 0; if(is_file($sf)){ $st = json_decode(@file_get_contents($sf), true); if($st){ $processed=(int)$st['processed']; $found=(int)$st['found_files']; $done = empty($st['queue']); } } $chunk = ''; $size = 0; if(is_file($rf)){ $size = filesize($rf); if($size>$pos){ $f = fopen($rf,'rb'); fseek($f,$pos); $chunk = stream_get_contents($f); fclose($f); } } header('Content-Type: application\/json; charset=utf-8'); echo json_encode(array( 'pos' => $size, 'chunk' => $chunk, 'done' => $done?1:0, 'processed' => $processed, 'found' => $found )); exit; } \/* ---------- run endpoint ---------- *\/ if(isset($_GET['run'])){ $token = $_GET['run']; $dir = store_dir(); $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json'; $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html'; if(!is_file($sf)){ http_response_code(410); echo \"session ended\"; exit; } $st = json_decode(file_get_contents($sf), true); if(!$st){ http_response_code(500); echo \"state broken\"; exit; } $search_root = $st['root']; $queue = $st['queue']; $processed=(int)$st['processed']; $found_files=(int)$st['found_files']; $q = $st['q']; $use_regex = !empty($st['use_regex']); $pattern = $st['pattern']; $max_size = (int)$st['max_size']; $exts = $st['exts']; $exclude_dirs = $st['exclude']; $MMPF = (int)$st['max_matches_per_file']; $written = isset($st['written']) && is_array($st['written']) ? $st['written'] : array(); $deadline = microtime(true) + $TIME_BUDGET; while(!empty($queue) && microtime(true) < $deadline){ $dirNow = array_shift($queue); if(is_link($dirNow)) { continue; } $items = @scandir($dirNow); if($items===false) continue; foreach($items as $it){ if(microtime(true) > $deadline){ array_unshift($queue, $dirNow); break; } if($it==='.'||$it==='..') continue; $path = $dirNow.DIRECTORY_SEPARATOR.$it; if(is_link($path)) continue; if(is_dir($path)){ if(!is_excluded($path,$exclude_dirs)) $queue[] = $path; continue; } $processed++; if(is_excluded($path,$exclude_dirs)) continue; $size=@filesize($path); if($size!==false && $size>$max_size) continue; if(!empty($exts)){ $ext=ext_of($path); if($ext===''||!in_array($ext,$exts,true)) continue; } $hnd=@fopen($path,'rb'); if(!$hnd) continue; $matches=0; while(!feof($hnd)){ if(microtime(true)>$deadline) break; $line=fgets($hnd); if($line===false) break; if(strlen($line)>50000) continue; if($use_regex){ $ok=@preg_match($pattern,$line); if($ok===false) break; if($ok>0){ $matches++; if($matches>=$MMPF) break; } } else { if(stripos($line,$q)!==false){ $matches++; if($matches >= $MMPF) break; \/\/ \u0444\u0438\u043a\u0441 \"\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\" } } } fclose($hnd); if($matches>0){ if(!isset($written[$path])){ $written[$path] = 1; $found_files++; $rel = rel_path($search_root, $path); $chunk = '<div class=\"result\"><div class=\"path\">'.h($rel).\"<\/div><\/div>\\n\"; file_put_contents($rf,$chunk,FILE_APPEND|LOCK_EX); } } } } $st['queue']=array_values($queue); $st['processed']=$processed; $st['found_files']=$found_files; $st['written']=$written; file_put_contents($sf,json_encode($st),LOCK_EX); header('Content-Type: text\/html; charset=utf-8'); $again = empty($queue) ? 'false' : 'true'; echo \"<!doctype html><meta charset='utf-8'><title>run<\/title> <script>if($again){ setTimeout(function(){ location.reload(); }, 500); }<\/script>\"; exit; } \/* ---------- \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b ---------- *\/ $just_started = false; $token = ''; if($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['q'])){ $q = trim((string)$_POST['q']); if($q===''){ $q=''; } $use_regex = !empty($_POST['regex']); $max_size = (int)($_POST['max_size'] ?: $MAX_FILE_SIZE); \/\/ \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433 $subdir_input = trim((string)($_POST['subdir'] ?? '')); $search_root = $ROOT_DIR; $subdir_display = ''; if($subdir_input !== ''){ $candidate = realpath($ROOT_DIR . DIRECTORY_SEPARATOR . ltrim($subdir_input, \"\/\\\\\")); $root_real = realpath($ROOT_DIR); if($candidate && is_dir($candidate) && strpos($candidate, $root_real) === 0){ $search_root = $candidate; $subdir_display = ltrim(substr($candidate, strlen($root_real)), DIRECTORY_SEPARATOR); } else { $subdir_display = $subdir_input; } } \/\/ \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f $exts = array(); if(isset($_POST['ext']) && is_array($_POST['ext']) && count($_POST['ext'])>0){ foreach($_POST['ext'] as $e){ $e=strtolower(trim($e)); if($e!=='') $exts[$e]=true; } } else { foreach($GLOBALS['DEFAULT_EXTS'] as $e) $exts[$e]=true; } $extensions = array_keys($exts); $exclude_dirs = isset($_POST['exclude']) ? array_values(array_filter(array_map('trim', explode(',', $_POST['exclude'])))) : $EXCLUDE_DIRS_DEFAULT; \/\/ regex pattern $pattern = ''; if($use_regex && $q!==''){ $raw = $q; if(!preg_match('\/^(.)(.*)\\\\1([imsxuADSUXJ]*)$\/s',$raw)){ $pattern = '\/'.str_replace('\/','\\\/',$raw).'\/i'; } else { $pattern = $raw; } if(@preg_match($pattern,'')===false){ $pattern=''; $use_regex=false; } } if($q!==''){ $token = uniqid('f_',true); $dir = store_dir(); $sf = $dir.DIRECTORY_SEPARATOR.$token.'.json'; $rf = $dir.DIRECTORY_SEPARATOR.$token.'.html'; $state = array( 'root'=>$search_root, 'queue'=>array($search_root), 'processed'=>0,'found_files'=>0, 'q'=>$q,'use_regex'=>$use_regex?1:0,'pattern'=>$pattern,'max_size'=>$max_size, 'exts'=>$extensions,'exclude'=>$exclude_dirs,'max_matches_per_file'=>$MAX_MATCHES_PER_FILE, 'written'=>array(),'started_at'=>time() ); file_put_contents($sf,json_encode($state),LOCK_EX); file_put_contents($rf,\"\",LOCK_EX); $just_started = true; } } else { $q = ''; $use_regex = false; $max_size = $MAX_FILE_SIZE; $extensions = $DEFAULT_EXTS; $exclude_dirs = $EXCLUDE_DIRS_DEFAULT; $subdir_display = ''; } \/* ---------- \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 ---------- *\/ header('Content-Type: text\/html; charset=utf-8'); ?> <!doctype html> <meta charset=\"utf-8\"> <title>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a<\/title> <style> :root{ --bg:#fff;--ink:#111;--muted:#666;--border:#e7e7e7;--panel:#ffffff; --brand:#f6d7e7;--brand2:#e8f0ff;--accent:#2930a3 } *{box-sizing:border-box} body{font-family:Arial,Segoe UI,system-ui,Roboto,sans-serif;margin:0;background:var(--bg);color:var(--ink)} .header{background:linear-gradient(135deg,var(--brand),var(--brand2));padding:22px;border-bottom:1px solid #e7e7e7} .header h1{margin:0;font-size:22px;font-weight:800;} .container{max-width:1100px;margin:16px auto;padding:0 16px} \/* \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 *\/ .block{ margin: 18px 0; } \/* \u0444\u043e\u0440\u043c\u0430 *\/ .card{background:var(--panel);border:1px solid var(--border);border-radius:16px;padding:16px} .form-grid{display:grid;grid-template-columns:1fr 220px;gap:16px;align-items:center} .form-grid .full{grid-column:1 \/ -1} .q-input{ width:100%; padding:12px 14px;border:1px solid #ddd;border-radius:12px;font-size:16px } label{display:block;margin: 4px 0 8px; font-weight:700;} \/* \u2191 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c *\/ input[type=text], input[type=number], select{ padding:10px 12px;border:1px solid #ddd;border-radius:10px;font-size:14px;width:100% } .inline{display:flex;align-items:center;gap:12px} \/* \u2191 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0437\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 *\/ .btn{ display:inline-flex;align-items:center;gap:8px;padding:12px 16px;border-radius:12px; border:1px solid #ccd3ff;background:#eef0ff;color:var(--accent);font-weight:700;cursor:pointer } .note{margin-top:6px;color:var(--muted);font-size:12px} .section{margin-top:14px} .check-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:8px} .cb{display:flex;align-items:center;gap:8px;background:#fafafa;border:1px solid #eee;padding:8px;border-radius:10px} \/* \u0431\u043b\u043e\u043a \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432 \u0437\u043e\u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 *\/ .status-panel{ display:none; height:300px; width:100%; border:1px dashed #c9c9c9; border-radius:12px; background: #fcfcff; color:#2a2f45; font-size:18px; font-weight:700; display:flex; align-items:center; justify-content:center; text-align:center; } \/* \u0431\u0435\u0439\u0434\u0436\u0438 \u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439 *\/ .badge{display:inline-block;border:1px solid #e7e9f3;background:#f6f7fb;border-radius:999px;padding:6px 10px;margin:6px 6px 0 0;font-size:12px;color:#2a2f45} .chip{display:inline-block;border-radius:999px;padding:6px 10px;margin:6px 6px 0 0;font-size:12px;font-weight:700;border:1px solid transparent} .chip-run{ background:#e8f9e8; border-color:#bfe3bf; color:#1f6f1f; } \/* \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u2014 \u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a *\/ .chip-done{ background:#fff8e1; border-color:#ffe0a3; color:#8a6d3b; } \/* \u0436\u0451\u043b\u0442\u044b\u0439 \u2014 \u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d *\/ .result{border:1px solid #eee;padding:10px;border-radius:10px;background:#fafafa;margin:10px 0} .path{font-weight:700;font-family:ui-monospace,Consolas,monospace} .hidden{position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0} <\/style> <div class=\"header\"><h1>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c (\u0435\u0434\u0438\u043d\u044b\u0439 \u0431\u043b\u043e\u043a)<\/h1><\/div> <div class=\"container\"> <!-- \u0424\u041e\u0420\u041c\u0410 --> <form class=\"card block\" method=\"post\" autocomplete=\"off\"> <div class=\"form-grid\"> <div class=\"full\"> <label>\u0427\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c<\/label> <div class=\"inline\"> <input class=\"q-input\" type=\"text\" name=\"q\" required placeholder='\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: YANDEX_TOKEN \u0438\u043b\u0438 \/password\\s*=\\s*[\"\\']\/i (Regex)' value=\"<?=h($q)?>\"> <button class=\"btn\" type=\"submit\">\ud83d\udd0e \u041d\u0430\u0439\u0442\u0438<\/button> <\/div> <\/div> <div> <label>Regex<\/label> <div class=\"inline\" style=\"gap:6px\"> <input id=\"rx\" type=\"checkbox\" name=\"regex\" value=\"1\" <?= $use_regex ? 'checked':'' ?>> <label for=\"rx\" style=\"margin:0\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/label> <\/div> <\/div> <div> <label>\u041c\u0430\u043a\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430<\/label> <select name=\"max_size\"> <?php $sizes = array(512*1024=>'512 KB', 1024*1024=>'1 MB', 2*1024*1024=>'2 MB', 4*1024*1024=>'4 MB', 8*1024*1024=>'8 MB', 16*1024*1024=>'16 MB'); foreach($sizes as $k=>$v){ $sel = ($k==$max_size)?'selected':''; echo '<option value=\"'.$k.'\" '.$sel.'>'.$v.'<\/option>'; } ?> <\/select> <\/div> <div class=\"full\"> <label>\u0413\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)<\/label> <input type=\"text\" name=\"subdir\" placeholder=\"\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: templates \u0438\u043b\u0438 bitrix\/templates\" value=\"<?=h($subdir_display)?>\"> <div class=\"note\">\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043d\u044f \u0441\u0430\u0439\u0442\u0430 (\u043f\u0430\u043f\u043a\u0430 \u0441 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c). \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u043e \u2014 \u0438\u0449\u0435\u043c \u043e\u0442 \u043a\u043e\u0440\u043d\u044f.<\/div> <\/div> <div class=\"full\"> <label>\u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e)<\/label> <input type=\"text\" name=\"exclude\" value=\"<?=h(implode(',',$exclude_dirs))?>\"> <\/div> <div class=\"full section\"> <label>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0442\u043e\u043b\u044c\u043a\u043e php)<\/label> <div class=\"check-grid\"> <?php $extSet = array(); foreach(($extensions ?: $DEFAULT_EXTS) as $e){ $extSet[$e]=1; } foreach($ALL_EXTS as $e){ $checked = isset($extSet[$e]) ? 'checked' : ''; echo '<label class=\"cb\"><input type=\"checkbox\" name=\"ext[]\" value=\"'.h($e).'\" '.$checked.'> '.h($e).'<\/label>'; } ?> <\/div> <div class=\"note\">\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u2014 \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0438\u0441\u043a. \u0414\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435.<\/div> <\/div> <\/div> <\/form> <!-- \u0417\u0410\u0413\u041e\u041b\u041e\u0412\u041a\u0418 \u0418 \u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u041a\u0410 --> <div class=\"block\" style=\"margin-top: 6px;\"> <span class=\"badge\">\u041a\u043e\u0440\u0435\u043d\u044c \u0441\u0430\u0439\u0442\u0430: <?=h(realpath($ROOT_DIR))?><\/span> <?php if($just_started){ $sr = isset($search_root) ? $search_root : $ROOT_DIR; $disp = rel_path($ROOT_DIR, $sr); ?> <span class=\"badge\">\u041f\u0430\u043f\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430: <b><?=h($disp)?><\/b><\/span> <span class=\"badge\" id=\"stat\"><b>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e:<\/b> 0 \u00b7 <b>\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/b> 0<\/span> <!-- \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 --> <span id=\"liveStatus\" class=\"chip chip-run\">\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a<\/span> <?php } ?> <\/div> <!-- \u0411\u041e\u041b\u042c\u0428\u041e\u0419 \u0421\u0422\u0410\u0422\u0423\u0421 \u0412 \u0417\u041e\u041d\u0415 \u0420\u0415\u0417\u0423\u041b\u042c\u0422\u0410\u0422\u041e\u0412 --> <div id=\"statusPanel\" class=\"status-panel block\" style=\"display:<?= $just_started ? 'flex':'none' ?>;\"> \u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026 <\/div> <div id=\"results\" class=\"block\"><\/div> <?php if($just_started){ ?> <iframe id=\"runner\" class=\"hidden\" src=\"?run=<?=$token?>\" aria-hidden=\"true\"><\/iframe> <?php } ?> <\/div> <?php if($just_started){ ?> <script> let token = <?= json_encode($token) ?>; let pos = 0; let done = false; let anyResults = false; const statusPanel = document.getElementById('statusPanel'); const liveStatus = document.getElementById('liveStatus'); function setLiveStatus(running){ if(!liveStatus) return; if(running){ liveStatus.textContent = '\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a'; liveStatus.classList.remove('chip-done'); liveStatus.classList.add('chip-run'); }else{ liveStatus.textContent = '\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d'; liveStatus.classList.remove('chip-run'); liveStatus.classList.add('chip-done'); } } function showPanel(text, doneStyle){ if(!statusPanel) return; statusPanel.style.display = 'flex'; statusPanel.textContent = text; if(doneStyle){ statusPanel.style.borderColor='#bfe3bf'; \/\/ \u043b\u0451\u0433\u043a\u0438\u0439 \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0430\u043d\u0442 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043a statusPanel.style.background='#e8f9e8'; } else { statusPanel.style.borderColor='#c9c9c9'; statusPanel.style.background='#fcfcff'; } } function hidePanel(){ if(statusPanel) statusPanel.style.display='none'; } function poll(){ if(done) return; if(!anyResults) { showPanel('\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026', false); setLiveStatus(true); } fetch('?tail='+encodeURIComponent(token)+'&pos='+pos, {cache:'no-store'}) .then(r=>r.json()) .then(j=>{ if(typeof j.pos==='number'){ pos = j.pos; } if(j.chunk && j.chunk.length){ anyResults = true; hidePanel(); document.getElementById('results').insertAdjacentHTML('beforeend', j.chunk); } if(j.processed!==undefined && j.found!==undefined){ const st = document.getElementById('stat'); if(st) st.innerHTML = '<b>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e:<\/b> '+j.processed+' \u00b7 <b>\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/b> '+j.found; if(j.found===0 && !anyResults) { showPanel('\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a\u2026', false); } } if(j.done){ done = true; setLiveStatus(false); \/\/ \u0436\u0451\u043b\u0442\u044b\u0439 \u00ab\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u00bb if(!anyResults) showPanel('\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e', true); else hidePanel(); } }) .catch(()=>{}) .finally(()=>{ if(!done) setTimeout(poll, 700); }); } poll(); <\/script> <?php } ?>","use_regex":0,"pattern":"","max_size":8388608,"exts":["php"],"exclude":[".git","node_modules","vendor","storage","cache",".idea",".vscode",".svn"],"max_matches_per_file":200,"written":[],"started_at":1760380988}