Вход Регистрация
Файл: ai-bolit/ai-bolit.php
Строк: 3933
<?php
///////////////////////////////////////////////////////////////////////////
// Created and developed by Greg Zemskov, Revisium Company
// Email: ai@revisium.com, http://revisium.com/ai/, skype: greg_zemskov

// Commercial usage is not allowed without a license purchase or written permission of author
// Source code usage is not allowed without author's permission

// Certificated in Federal Institute of Industrial Property in 2012
// http://revisium.com/ai/i/mini_aibolit.jpg

////////////////////////////////////////////////////////////////////////////
// Запрещено использование скрипта в коммерческих целях без приобретения лицензии.
// Запрещено использование исходного кода скрипта без приобретения лицензии.
//
// По вопросам приобретения лицензии обращайтесь в компанию "Ревизиум": http://www.revisium.com
// ai@revisium.com
// На скрипт получено авторское свидетельство в Роспатенте
// http://revisium.com/ai/i/mini_aibolit.jpg
///////////////////////////////////////////////////////////////////////////

// put 1 for expert mode, 0 for basic check and 2 for paranoic mode
// установите 1 для режима "Эксперта", 0 для быстрой проверки и 2 для параноидальной проверки (для лечения сайта) 
define('AI_EXPERT'1); 

//define('LANG', 'EN');
define('LANG''RU');

// Put any strong password to open the script from web
// Впишите вместо put_any_strong_password_here сложный пароль     
define('PASS''put_any_strong_password_here'); 

define('REPORT_MASK_PHPSIGN'1);
define('REPORT_MASK_SPAMLINKS'2);
define('REPORT_MASK_DOORWAYS'4);
define('REPORT_MASK_SUSP'8);
define('REPORT_MASK_CANDI'16);
define('REPORT_MASK_WRIT'32);
define('REPORT_MASK_FULL'REPORT_MASK_PHPSIGN REPORT_MASK_SPAMLINKS REPORT_MASK_DOORWAYS REPORT_MASK_SUSP
/* <-- remove this line to enable "recommendations"  

| REPORT_MASK_CANDI | REPORT_MASK_WRIT

 remove this line to enable "recommendations" --> */
);

$defaults = array(
    
'path' => dirname(__FILE__),
    
'scan_all_files' => 0// full scan (rather than just a .js, .php, .html, .htaccess)
    
'scan_delay' => 1// delay in file scanning to reduce system load
    
'max_size_to_scan' => '512K',
    
'site_url' => ''// website url
    
'no_rw_dir' => 0,
    
'report_mask' =>  REPORT_MASK_FULL // full-featured report
);


define('DEBUG_MODE'0);

define('DIR_SEPARATOR''/');

define('DOUBLECHECK_FILE''AI-BOLIT-DOUBLECHECK.php');

if ((isset(
$_SERVER['OS']) && stripos('Win'$_SERVER['OS']) !== false)/* && stripos('CygWin', $_SERVER['OS']) === false)*/) {
   
define('DIR_SEPARATOR''\');
}


if (LANG == '
RU') {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RUSSIAN INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('
AI_STR_001', '<h3>AI-Болит v.%&mdashищет вредоносный код и вирусы в файлах.</h3><h5>Григорий Земсковкомпания "<a href="http://www.revisium.com/">Ревизиум</a>", 2012-2014, <a target=_blank href="http://revisium.com/ai/">Страница проекта на Revisium.com.</a> %s</h5>');
define('AI_STR_002''<div class="update">Проверьте обновление на сайте <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Возможно, ваша версия скрипта уже устарела.</div>');
define('AI_STR_003''ВНИМАНИЕ! Не оставляйте файл ai-bolit.php или файл отчета на сервере, и не давайте прямых ссылок с других сайтов на файл отчета или скрипта. Отчет содержит важную информацию о вашем сайте или сервере, сохраните его в надежном месте от посторонних глаз!');
define('AI_STR_004''Путь');
define('AI_STR_005''Дата создания');
define('AI_STR_006''Дата модификации');
define('AI_STR_007''Размер');
define('AI_STR_008''Конфигурация PHP');
define('AI_STR_009'"Вы установили слабый пароль на скрипт AI-BOLIT. Укажите пароль не менее 8 символов, содержащий латинские буквы в верхнем и нижнем регистре, а также цифры. Например, такой <b>%s</b>");
define('AI_STR_010'"Запустите скрипт с паролем, который установлен в переменной PASS (в начале файла). <br/>Например, так http://ваш_сайт_и_путь_до_скрипта/ai-bolit.php?p=<b>%s</b>");
define('AI_STR_011''Текущая директория не доступна для чтения скрипту. Пожалуйста, укажите права на доступ <b>rwxr-xr-x</b> или с помощью командной строки <b>chmod +r имя_директории</b>');
define('AI_STR_012'"<div class="rep">Текущая база скрипта содержит %s шелл-сигнатур, а также %s других вредоносных фрагментов. Затрачено времени: <b>%s</b>.<br/>Сканирование начато: %s. Сканирование завершено: %s</div> ");
define('AI_STR_013''<div class="rep">Всего проверено %s директорий и %s файлов.</div>');
define('AI_STR_014''<div class="rep" style="color: #0000A0">Внимание, скрипт выполнил быструю проверку сайта. Проверяются только наиболее критические файлы, но часть вредоносных скриптов может быть не обнаружена. Пожалуйста, запустите скрипт из командной строки для выполнения полного тестирования. Подробнее смотрите в <a href="http://revisium.com/ai/faq.php">FAQ вопрос №10</a>.</div>');
define('AI_STR_015''<div class="sec">Критические замечания</div>');
define('AI_STR_016''Найдены сигнатуры шелл-скрипта. Подозрение на вредоносный скрипт:');
define('AI_STR_017''Шелл-скрипты не найдены.');
define('AI_STR_018''Обнаружены сигнатуры javascript вирусов:');
define('AI_STR_019''Обнаружены сигнатуры исполняемых файлов unix. Они могут быть вредоносными файлами:');
define('AI_STR_020''Двойное расширение, зашифрованный контент или подозрение на вредоносный скрипт. Требуется дополнительный анализ:');
define('AI_STR_021''Подозрение на вредоносный скрипт:');
define('AI_STR_022''Список файловых ссылок (symlinks):');
define('AI_STR_023''Список скрытых файлов:');
define('AI_STR_024''Скорее всего этот файл лежит в каталоге с дорвеем:');
define('AI_STR_025''Не найдено директорий c дорвеями');
define('AI_STR_026''Предупреждения');
define('AI_STR_027''Опасный код в .htaccess (редирект на внешний сервер, подмена расширений или автовнедрение кода):');
define('AI_STR_028''В не .php файле содержится стартовая сигнатура PHP кода. Возможно, там вредоносный код:');
define('AI_STR_029''В этих файлах размещен код по продаже ссылок. Убедитесь, что размещали его вы:');
define('AI_STR_030''Непроверенные файлы - ошибка чтения');
define('AI_STR_031''В этих файлах размещены невидимые ссылки. Подозрение на ссылочный спам:');
define('AI_STR_032''Список невидимых ссылок:');
define('AI_STR_033''Отображены только первые ');
define('AI_STR_034''Найдены директории, в которых подозрительно много файлов .php или .html. Подозрение на дорвей:');
define('AI_STR_035''Скрипт использует код, который часто используются во вредоносных скриптах:');
define('AI_STR_036''Директории из файла .adirignore были пропущены при сканировании:');
define('AI_STR_037''Версии найденных CMS:');
define('AI_STR_038''Большие файлы (больше чем %s! Пропущено:');
define('AI_STR_039''Не найдено файлов больше чем %s');
define('AI_STR_040''Временные файлы или файлы(каталоги)-кандидаты на удаление по ряду причин:');
define('AI_STR_041''Потенциально небезопасно! Директории, доступные скрипту на запись:');
define('AI_STR_042''Не найдено директорий, доступных на запись скриптом');
define('AI_STR_043''Использовано памяти при сканировании: ');
define('AI_STR_044''<div id="igid" style="display: none;"><div class="sec">Добавить в список игнорируемых</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Скопируйте этот список и вставьте его в файл .aignore, чтобы исключить эти файлы из отчета.</div></div>');
define('AI_STR_045''<div class="notice"><span class="vir">[!]</span> В скрипте отключено полное сканирование файлов, проверяются только .php, .html, .htaccess. Чтобы выполнить более тщательное сканирование, <br/>поменяйте значение настройки на <b>'scan_all_files' => 1</b> в самом верху скрипта. Скрипт в этом случае может работать очень долго. Рекомендуется отключить на хостинге лимит по времени выполнения, либо запускать скрипт из командной строки.</div>');
define('AI_STR_046''[x] закрыть сообщение');
define('AI_STR_047''<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank"><b>Оперативное лечение сайта от вирусов. Защита от взлома. Гарантия на работы. </b></a></span><br/><p style="color: #D0FFD0; font-size: 13px;">Быстро и качественно вылечим Ваш сайт от вирусов, удалим вредоносный код с сайта, поставим уникальную защиту от взлома. <a href="http://www.revisium.com/ru/order/" target=_blank>Отправьте нам запрос</a> на сайте www.revisium.com &rarr;</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0">Также приглашаем в группу ВКонтакте<br/> <a href="http://vk.com/siteprotect" target="_blank">"Безопасность Веб-сайтов"</a>. А еще у нас есть твиттер <a href="http://twitter.com/revisium" target=_blank>@revisium</a> и страница <a href="http://www.facebook.com/Revisium" target=_blank>facebook.com/revisium</a>. Присоединяйтесь!</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0"><b style="color: yellow">[$$$]</b> Если Вы хостер, веб-студия, seo-специалист или вебмастер&nbsp;&mdash; напишите нам на ai@revisium.com, для Вас есть партнерская программа.</p>');
define('AI_STR_048''<p>Если у вас есть эккаунт ВКонтакте, приглашаем в <a href="http://vk.com/siteprotect" target=_blank>группу "Безопасность Веб-сайтов"</a>: там я делюсь опытом защиты веб-сайтов и поиска вредоносных скриптов.</p>');
define('AI_STR_049''Отказ от гарантий: даже если скрипт не нашел вредоносных скриптов на сайте, автор не гарантирует их полное отсутствие, а также не несет ответственности за возможные последствия работы скрипта ai-bolit.php или неоправданные ожидания пользователей относительно функциональности и возможностей.');
define('AI_STR_050''Замечания и предложения по работе скрипта и пропущенные вредоносные скрипты присылайте на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<p>Также будем чрезвычайно благодарны за любые упоминания скрипта AI-Bolit на вашем сайте, в блоге, среди друзей, знакомых и клиентов. Ссылочку можно поставить на <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. <p>Если будут вопросы - пишите <a href="mailto:ai@revisium.com">ai@revisium.com</a>. ');
define('AI_STR_051''Отчет по ');
define('AI_STR_052''Эвристический анализ обнаружил подозрительные файлы. Проверьте их на наличие вредоносного кода.');
define('AI_STR_053''Много косвенных вызовов функции');
define('AI_STR_054''Подозрение на обфусцированные переменные');
define('AI_STR_055''Подозрительное использование массива глобальных переменных');
define('AI_STR_056''Дробление строки на символы');
define('AI_STR_057''Сканирование выполнено в обычном режиме. Некоторые вредоносные скрипты могут быть не обнаружены.<br> Желательно проверить сайт в режиме "Эксперт". Подробно описано в <a href="http://www.revisium.com/ai/faq.php">FAQ</a> и инструкции к скрипту.');
define('AI_STR_058''Обнаружены фишинговые страницы:');

} else {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ENGLISH INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001''<h3>AI-BOLIT v.%s &mdash; Advanced Server-Side Scanner of Viruses, Malicious and Hacker's Scripts.</h3><h5>Greg Zemskov2012-2014, <a target=_blank href="http://revisium.com/aibo/">AI-BOLIT web site.</a>. Non-commercial use only.</h5>');
define('
AI_STR_002', '<div class="update">Check for updates on <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Probably your version is out-of-date.</div>');
define('AI_STR_003''Caution! Do not leave either ai-bolit.php or report file on server and do not provide direct links to the report file. Report file contains sensitive information about your website which could be used by hackers. So keep it in safe place and don't leave on website!');
define('
AI_STR_004', 'Path');
define('
AI_STR_005', 'Created');
define('
AI_STR_006', 'Modified');
define('
AI_STR_007', 'Size');
define('
AI_STR_008', 'PHP Info');
define('
AI_STR_009', "Your password for AI-BOLIT is weak. Password must be more than 8 character length, contain both latin letters in upper and lower case, and digits. E.g. <b>%s</b>");
define('
AI_STR_010', "Open AI-BOLIT with password specified in the beggining of file in PASS variable. <br/>E.g. http://you_website.com/ai-bolit.php?p=<b>%s</b>");
define('
AI_STR_011', 'Current folder is not readablePlease change permission for <b>rwxr-xr-x</b> or using command line <b>chmod +r folder_name</b>');
define('
AI_STR_012', "<div class="rep">%s malicious signatures known, %s virus signatures and other malicious code. Elapsed: <b>%s</b
>.<br/>Started: %s. Stopped: %s</div> ");
define('
AI_STR_013', '<div class="rep">Scanned %s folders and %s files.</div>');
define('
AI_STR_014', '<div class="rep" style="color: #0000A0">AttentionScript has performed quick scanIt scans only .html/.js/.php files  in quick scan mode so some of malicious scripts might not be detected. <br>Please launch script from a command line thru SSH to perform full scan.');
define('
AI_STR_015', '<div class="sec">Critical</div>');
define('
AI_STR_016', 'Shell script signatures detectedMight be a malicious or hacker's script:');
define('AI_STR_017''Shell scripts signatures not detected.');
define('AI_STR_018''Javascript virus signatures detected:');
define('AI_STR_019''Unix executables signatures detected. They might be a malicious binaries or rootkits:');
define('AI_STR_020''Suspicious encoded strings, extra .php extention or external includes detected in PHP files. Might be a malicious or hacker's script:');
define('
AI_STR_021', 'Might be a malicious or hacker's script:');
define('AI_STR_022''Symlinks:');
define('AI_STR_023''Hidden files:');
define('AI_STR_024''Files might be a part of doorway:');
define('AI_STR_025''Doorway folders not detected');
define('AI_STR_026''Warnings');
define('AI_STR_027''Malicious code in .htaccess (redirect to external server, extention handler replacement or malicious code auto-append):');
define('AI_STR_028''Non-PHP file has PHP signature. Check for malicious code:');
define('AI_STR_029''This script has black-SEO links or linkfarm. Check if it was installed by your:');
define('AI_STR_030''Reading error. Skipped.');
define('AI_STR_031''These files have invisible links, might be black-seo stuff:');
define('AI_STR_032''List of invisible links:');
define('AI_STR_033''Displayed first ');
define('AI_STR_034''Folders contained too many .php or .html files. Might be a doorway:');
define('AI_STR_035''Suspicious code detected. It's usually used in malicious scrips:');
define('
AI_STR_036', 'The following list of files specified in .adirignore has been skipped:');
define('
AI_STR_037', 'CMS found:');
define('
AI_STR_038', 'Large files (greater than %sSkipped:');
define('
AI_STR_039', 'Files greater than %s not found');
define('
AI_STR_040', 'Files recommended to be remove due to security reason:');
define('
AI_STR_041', 'Potentially unsafeFolders which are writable for scripts:');
define('
AI_STR_042', 'Writable folders not found');
define('
AI_STR_043', 'Memory used');
define('
AI_STR_044', '<div id="igid" style="display: none;"><div class="sec">Add to ignore list</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Copy and paste the following list into .aignore to eliminate these files from AI-BOLIT report.</div></div>');
define('
AI_STR_045', '<div class="notice"><span class="vir">[!]</spanAi-BOLIT is working in quick scan modeonly .php, .html, .htaccess files will be checkedChange the following setting 'scan_all_files' => 1 to perform full scanning.</b>. </div>');
define('
AI_STR_046', '[xclose window');
define('
AI_STR_047', '<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank">
We will protect your website against hackers and viruses with guarantee!</a></span><br/>
<
p>We completely remove malicious software and scripts from your websiteprotect website against hackerscheck servers for rootkits and suid-filesteach you how to keep your website secured. <a href="http://www.revisium.com/en/order/">Contact Us</a>');
define('
AI_STR_048', '');
define('
AI_STR_049', "Disclaimer: I'm not liable to you for any damagesincluding generalspecialincidental or consequential damages arising out of the use or inability to use the script (including but not limited to loss of data or report being rendered inaccurate or failure of the script). There's no warranty for the program. Use at your own risk. ");
define('
AI_STR_050', "I'm sincerely appreciate reports for any bugs you may found in the scriptPlease email me: <a href="mailto:audit@revisium.com">audit@revisium.com</a>.<pAlso I appriciate any reference to the script in your blog or forum postsThank you for the link to download page: <a href="http://revisium.com/aibo/">http://revisium.com/aibo/</a>");
define('AI_STR_051''Report for ');
define('AI_STR_052''Heuristic Analyzer has detected suspicious files. Check if they are malware.');
define('AI_STR_053''Function called by reference');
define('AI_STR_054''Suspected for obfuscated variables');
define('AI_STR_055''Suspected for $GLOBAL array usage');
define('AI_STR_056''Abnormal split of string');
define('AI_STR_057''Scanning has been done in simple mode. It is strongly recommended to perform scanning in "Expert" mode. See readme.txt for details.');
define('AI_STR_058''Phishing pages detected:');
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// This is signatures wrapped into base64. 
$g_DBShe unserialize(base64_decode("YTozMTI6e2k6MDtzOjg6IlpPQlVHVEVMIjtpOjE7czoxMzoiTWFnZWxhbmdDeWJlciI7aToyO3M6MTM6InByb2ZleG9yLmhlbGwiO2k6MztzOjIwOiI8IS0tQ09PS0lFIFVQREFURS0tPiI7aTo0O3M6OToiLy9yYXN0YS8vIjtpOjU7czo1NzoiJHBhcmFtMm1hc2suIilcPVtcPHFxPlwiXSguKj8pKD89W1w8cXE+XCJdIClbXDxxcT5cIl0vc2llIjtpOjY7czoxOToiKTsgJGkrKykkcmV0Lj1jaHIoJCI7aTo3O3M6Mjc6ImVyZWdfcmVwbGFjZSg8cT4mZW1haWwmPHE+LCI7aTo4O3M6MTM6Il1dKSk7fX1ldmFsKCQiO2k6OTtzOjMwOiJmd3JpdGUoZm9wZW4oZGlybmFtZShfX0ZJTEVfXykiO2k6MTA7czoxMToiQmFieV9EcmFrb24iO2k6MTE7czoyNDoiJGlzZXZhbGZ1bmN0aW9uYXZhaWxhYmxlIjtpOjEyO3M6MTU6Ik5ldEBkZHJlc3MgTWFpbCI7aToxMztzOjM0OiJQYXNzd29yZDo8cz4iLiRfUE9TVFs8cT5wYXNzd2Q8cT5dIjtpOjE0O3M6MTU6IkNyZWF0ZWQgQnkgRU1NQSI7aToxNTtzOjEyOiJHSUY4OUE7PD9waHAiO2k6MTY7czoyODoib1RhdDhEM0RzRTgnJn5oVTA2Q0NINTskZ1lTcSI7aToxNztzOjIwOiIkbWQ1PW1kNSgiJHJhbmRvbSIpOyI7aToxODtzOjY6IjN4cDFyMyI7aToxOTtzOjMyOiIkaW09c3Vic3RyKCR0eCwkcCsyLCRwMi0oJHArMikpOyI7aToyMDtzOjE1OiJOaW5qYVZpcnVzIEhlcmUiO2k6MjE7czoyMToiN1AxdGQrTldsaWFJL2hXa1o0Vlg5IjtpOjIyO3M6MTA6Ijxkb3Q+SXJJc1QiO2k6MjM7czoxMDoibmRyb2l8aHRjXyI7aToyNDtzOjEwOiJhbmRleHxvb2dsIjtpOjI1O3M6MTc6IkhhY2tlZCBCeSBFbkRMZVNzIjtpOjI2O3M6MTc6IigkX1BPU1RbImRpciJdKSk7IjtpOjI3O3M6NTU6IigkaW5kYXRhLCRiNjQ9MSl7aWYoJGI2ND09MSl7JGNkPWJhc2U2NF9kZWNvZGUoJGluZGF0YSkiO2k6Mjg7czo3NToiJGltPXN1YnN0cigkaW0sMCwkaSkuc3Vic3RyKCRpbSwkaTIrMSwkaTQtKCRpMisxKSkuc3Vic3RyKCRpbSwkaTQrMTIsc3RybGVuIjtpOjI5O3M6MTg6Ijw/cGhwIGVjaG8gIiMhISMiOyI7aTozMDtzOjEwOiJQdW5rZXIyQm90IjtpOjMxO3M6MTE6IiRzaDNsbENvbG9yIjtpOjMyO3M6NDc6IkBjaHIoKCRoWyRlWyRvXV08PDQpKygkaFskZVsrKyRvXV0pKTt9fWV2YWwoJGQpIjtpOjMzO3M6MzY6InBwY3xtaWRwfHdpbmRvd3MgY2V8bXRrfGoybWV8c3ltYmlhbiI7aTozNDtzOjQwOiJhYmFjaG98YWJpemRpcmVjdG9yeXxhYm91dHxhY29vbnxhbGV4YW5hIjtpOjM1O3M6NToiWmVkMHgiO2k6MzY7czo4OiJkYXJrbWlueiI7aTozNztzOjEzOiJSZWFMX1B1TmlTaEVyIjtpOjM4O3M6NzoiT29OX0JveSI7aTozOTtzOjIwOiJfX1ZJRVdTVEFURUVOQ1JZUFRFRCI7aTo0MDtzOjY6Ik00bGwzciI7aTo0MTtzOjI1OiJjcmVhdGVGaWxlc0ZvcklucHV0T3V0cHV0IjtpOjQyO3M6ODoiUGFzaGtlbGEiO2k6NDM7czoyMjoiXmNeYV5sXnBeZV5yXl9eZ15lXnJecCI7aTo0NDtzOjE0OiI9PSAiYmluZHNoZWxsIiI7aTo0NTtzOjE1OiJXZWJjb21tYW5kZXIgYXQiO2k6NDY7czoyNToiaXNzZXQoJF9QT1NUWydleGVjZ2F0ZSddKSI7aTo0NztzOjM3OiJmd3JpdGUoJGZwc2V0diwgZ2V0ZW52KCJIVFRQX0NPT0tJRSIpIjtpOjQ4O3M6MjA6Ii1JL3Vzci9sb2NhbC9iYW5kbWluIjtpOjQ5O3M6MjE6IiRPT08wMDAwMDA9dXJsZGVjb2RlKCI7aTo1MDtzOjg6IllFTkkzRVJJIjtpOjUxO3M6MTU6ImxldGFrc2VrYXJhbmcoKSI7aTo1MjtzOjY6ImQzbGV0ZSI7aTo1MztzOjQzOiJmdW5jdGlvbiB1cmxHZXRDb250ZW50cygkdXJsLCAkdGltZW91dCA9IDUpIjtpOjU0O3M6NDY6Im92ZXJmbG93LXk6c2Nyb2xsO1wiPiIuJGxpbmtzLiRodG1sX21mWydib2R5J10iO2k6NTU7czoxNjoiTWFkZSBieSBEZWxvcmVhbiI7aTo1NjtzOjc1OiJpZihlbXB0eSgkX0dFVFsnemlwJ10pIGFuZCBlbXB0eSgkX0dFVFsnZG93bmxvYWQnXSkgJiBlbXB0eSgkX0dFVFsnaW1nJ10pKXsiO2k6NTc7czo2NToic3RyX3JvdDEzKCRiYXNlYVsoJGRpbWVuc2lvbiokZGltZW5zaW9uLTEpIC0gKCRpKiRkaW1lbnNpb24rJGopXSkiO2k6NTg7czo2MDoiUjBsR09EbGhFd0FRQUxNQUFBQUFBUC8vLzV5Y0FNN09ZLy8vblAvL3p2L09uUGYzOS8vLy93QUFBQUFBIjtpOjU5O3M6NDU6InByZWdfbWF0Y2goJyFNSURQfFdBUHxXaW5kb3dzLkNFfFBQQ3xTZXJpZXM2MCI7aTo2MDtzOjQ3OiJwcmVnX21hdGNoKCcvKD88PVJld3JpdGVSdWxlKS4qKD89XFtMXCxSXD0zMDJcXSI7aTo2MTtzOjM3OiIkdXJsID0gJHVybHNbcmFuZCgwLCBjb3VudCgkdXJscyktMSldIjtpOjYyO3M6ODA6IndwX3Bvc3RzIFdIRVJFIHBvc3RfdHlwZSA9ICdwb3N0JyBBTkQgcG9zdF9zdGF0dXMgPSAncHVibGlzaCcgT1JERVIgQlkgYElEYCBERVNDIjtpOjYzO3M6NjU6Imh0dHA6Ly8nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS51cmxkZWNvZGUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIjtpOjY0O3M6MzY6ImZ3cml0ZSgkZixnZXRfZG93bmxvYWQoJF9HRVRbJ3VybCddKSI7aTo2NTtzOjc0OiIkcGFyYW0geCAkbi5zdWJzdHIgKCRwYXJhbSwgbGVuZ3RoKCRwYXJhbSkgLSBsZW5ndGgoJGNvZGUpJWxlbmd0aCgkcGFyYW0pKSI7aTo2NjtzOjQ3OiIkdGltZV9zdGFydGVkLiRzZWN1cmVfc2Vzc2lvbl91c2VyLnNlc3Npb25faWQoKSI7aTo2NztzOjQ4OiIkdGhpcy0+Ri0+R2V0Q29udHJvbGxlcigkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkiO2k6Njg7czoyMToibHVjaWZmZXJAbHVjaWZmZXIub3JnIjtpOjY5O3M6Mjc6ImJhc2U2NF9kZWNvZGUoJGNvZGVfc2NyaXB0KSI7aTo3MDtzOjIxOiJ1bmxpbmsoJHdyaXRhYmxlX2RpcnMiO2k6NzE7czo0MToiZmlsZV9nZXRfY29udGVudHModHJpbSgkZlskX0dFVFsnaWQnXV0pKTsiO2k6NzI7czoxMDoiQ3liZXN0ZXI5MCI7aTo3MztzOjI3OiIvaG9tZS9teWRpci9lZ2dkcm9wL2ZpbGVzeXMiO2k6NzQ7czoyOToiLS1EQ0NESVIgW2xpbmRleCAkVXNlcigkaSkgMl0iO2k6NzU7czoxMjoidW5iaW5kIFJBVyAtIjtpOjc2O3M6MTE6InB1dGJvdCAkYm90IjtpOjc3O3M6MTM6InByaXZtc2cgJG5pY2siO2k6Nzg7czoyNjoicHJvYyBodHRwOjpDb25uZWN0IHt0b2tlbn0iO2k6Nzk7czo0Mzoic2V0IGdvb2dsZShkYXRhKSBbaHR0cDo6ZGF0YSAkZ29vZ2xlKHBhZ2UpXSI7aTo4MDtzOjIyOiJiaW5kIGpvaW4gLSAqIGdvcF9qb2luIjtpOjgxO3M6MTM6InByaXZtc2cgJGNoYW4iO2k6ODI7czoyNDoicjRhVGMuZFBudEUvZnp0U0YxYkgzUkgwIjtpOjgzO3M6MTA6ImJpbmQgZGNjIC0iO2k6ODQ7czozNToia2lsbCAtQ0hMRCBcJGJvdHBpZCA+L2Rldi9udWxsIDI+JjEiO2k6ODU7czo1MDoicmVnc3ViIC1hbGwgLS0gLCBbc3RyaW5nIHRvbG93ZXIgJG93bmVyXSAiIiBvd25lcnMiO2k6ODY7czozMDoiYmluZCBmaWx0IC0gIlwwMDFBQ1RJT04gKlwwMDEiIjtpOjg3O3M6Mjc6ImF5dSBwcjEgcHIyIHByMyBwcjQgcHI1IHByNiI7aTo4ODtzOjIwOiJzZXQgcHJvdGVjdC10ZWxuZXQgMCI7aTo4OTtzOjMzOiIvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQgLURTU0wiO2k6OTA7czo3NjoiJHRzdTJbcmFuZCgwLGNvdW50KCR0c3UyKSAtIDEpXS4kdHN1MVtyYW5kKDAsY291bnQoJHRzdTEpIC0gMSldLiR0c3UyW3JhbmQoMCI7aTo5MTtzOjE5OiJmb3BlbignL2V0Yy9wYXNzd2QnIjtpOjkyO3M6MTE6ImYwVk1SZ0VCQVFBIjtpOjkzO3M6MzU6IjBkMGEwZDBhNjc2YzZmNjI2MTZjMjAyNDZkNzk1ZjczNmQ3IjtpOjk0O3M6OToiZXRhbGZuaXpnIjtpOjk1O3M6Mzc6IkpIWnBjMmwwWTI5MWJuUWdQU0FrU0ZSVVVGOURUMDlMU1VWZlYiO2k6OTY7czoxMzoiZWRvY2VkXzQ2ZXNhYiI7aTo5NztzOjU6ImUvKi4vIjtpOjk4O3M6Mjg6IkBzZXRjb29raWUoImhpdCIsIDEsIHRpbWUoKSsiO2k6OTk7czo0NjoiZmluZF9kaXJzKCRncmFuZHBhcmVudF9kaXIsICRsZXZlbCwgMSwgJGRpcnMpOyI7aToxMDA7czo2OToiQGNvcHkoJF9GSUxFU1tmaWxlTWFzc11bdG1wX25hbWVdLCRfUE9TVFtwYXRoXS4kX0ZJTEVTW2ZpbGVNYXNzXVtuYW1lIjtpOjEwMTtzOjc2OiJpbnQzMigoKCR6ID4+IDUgJiAweDA3ZmZmZmZmKSBeICR5IDw8IDIpICsgKCgkeSA+PiAzICYgMHgxZmZmZmZmZikgXiAkeiA8PCA0IjtpOjEwMjtzOjExOiJWT0JSQSBHQU5HTyI7aToxMDM7czo1OToiZWNobyB5IDsgc2xlZXAgMSA7IH0gfCB7IHdoaWxlIHJlYWQgOyBkbyBlY2hvIHokUkVQTFk7IGRvbmUiO2k6MTA0O3M6OToiPHN0ZGxpYi5oIjtpOjEwNTtzOjQ1OiJhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdfYmxvZ2luZm8nLCAxMDAwMSkiO2k6MTA2O3M6MTc6Iml0c29rbm9wcm9ibGVtYnJvIjtpOjEwNztzOjI4OiJpZiBzZWxmLmhhc2hfdHlwZSA9PSAncHdkdW1wIjtpOjEwODtzOjU5OiIkZnJhbWV3b3JrLnBsdWdpbnMubG9hZCgiI3tycGN0eXBlLmRvd25jYXNlfXJwYyIsIG9wdHMpLnJ1biI7aToxMDk7czo1Nzoic3VicHJvY2Vzcy5Qb3BlbignJXNnZGIgLXAgJWQgLWJhdGNoICVzJyAlIChnZGJfcHJlZml4LCBwIjtpOjExMDtzOjU3OiJhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1oZWxwLCBwcm9nPSJzY3R1bm5lbCIiO2k6MTExO3M6MzI6InJ1bGVfcmVxID0gcmF3X2lucHV0KCJTb3VyY2VGaXJlIjtpOjExMjtzOjUwOiJvcy5zeXN0ZW0oJ2VjaG8gYWxpYXMgbHM9Ii5scy5iYXNoIiA+PiB+Ly5iYXNocmMnKSI7aToxMTM7czo0MjoiY29ubmVjdGlvbi5zZW5kKCJzaGVsbCAiK3N0cihvcy5nZXRjd2QoKSkrIjtpOjExNDtzOjY3OiJwcmludCgiWyFdIEhvc3Q6ICIgKyBob3N0bmFtZSArICIgbWlnaHQgYmUgZG93biFcblshXSBSZXNwb25zZSBDb2RlIjtpOjExNTtzOjY5OiJkZWYgZGFlbW9uKHN0ZGluPScvZGV2L251bGwnLCBzdGRvdXQ9Jy9kZXYvbnVsbCcsIHN0ZGVycj0nL2Rldi9udWxsJykiO2k6MTE2O3M6ODM6InN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbCA9IFRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VIjtpOjExNztzOjQ3OiJpZihpc3NldCgkX0dFVFsnaG9zdCddKSYmaXNzZXQoJF9HRVRbJ3RpbWUnXSkpeyI7aToxMTg7czoxNToiTklHR0VSUy5OSUdHRVJTIjtpOjExOTtzOjI1OiJIVFRQIGZsb29kIGNvbXBsZXRlIGFmdGVyIjtpOjEyMDtzOjIxOiI4MCAtYiAkMSAtaSBldGgwIC1zIDgiO2k6MTIxO3M6MTM6ImV4cGxvaXRjb29raWUiO2k6MTIyO3M6MjY6InN5c3RlbSgicGhwIC1mIHhwbCAkaG9zdCIpIjtpOjEyMztzOjExOiJzaCBnbyAkMS4keCI7aToxMjQ7czoxMjoiYXo4OHBpeDAwcTk4IjtpOjEyNTtzOjMwOiJ1bmxlc3Mob3BlbihQRkQsJGdfdXBsb2FkX2RiKSkiO2k6MTI2O3M6MTE6Ind3dy50MHMub3JnIjtpOjEyNztzOjM5OiIkdmFsdWUgPX4gcy8lKC4uKS9wYWNrKCdjJyxoZXgoJDEpKS9lZzsiO2k6MTI4O3M6MTQ6IlRoZSBEYXJrIFJhdmVyIjtpOjEyOTtzOjYxOiJRM0psWkdsMElEb2dWVzVrWlhKbmNtOTFibVFnUkdWMmFXd2dKbTVpYzNBN0lDQjhEUW84WVNCb2NtVm1QIjtpOjEzMDtzOjI5OiJ9ZWxzZWlmKCRfR0VUWydwYWdlJ109PSdkZG9zJyI7aToxMzE7czoxNjoieyRfUE9TVFsncm9vdCddfSI7aToxMzI7czozOToiSS9nY1ovdlgwQTEwRERSRGc3RXprL2QrMys4cXZxcVMxSzArQVhZIjtpOjEzMztzOjY0OiJGSjNGa3VQS0ZrVS81M1dFQm1JYWlwa3RuTHdRVzh6NDlkYzFyYmJMcXN3OGU2OWw2dkpNKzMvMTI0eFZuKzdsIjtpOjEzNDtzOjEwMjoiXHUwMDNjXHUwMDY5XHUwMDZkXHUwMDY3XHUwMDIwXHUwMDczXHUwMDcyXHUwMDYzXHUwMDNkXHUwMDIyXHUwMDY4XHUwMDc0XHUwMDc0XHUwMDcwXHUwMDNhXHUwMDJmXHUwMDJmIjtpOjEzNTtzOjU1OiI0NjM4Mzk2MTBjMDAwYjAwODAwMTAwZmZmZmZmZmZmZmZmMjFmOTA0MDEwMDAwMDEwMDJjMDAwIjtpOjEzNjtzOjMwOiJmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWNoZXJvKSkiO2k6MTM3O3M6MjQ6IiRiYXNsaWs9JF9QT1NUWydiYXNsaWsnXSI7aToxMzg7czoxODoicHJvY19vcGVuKCdJSFN0ZWFtIjtpOjEzOTtzOjU2OiJceDMxXHhkYlx4ZjdceGUzXHg1M1x4NDNceDUzXHg2YVx4MDJceDg5XHhlMVx4YjBceDY2XHhjZCI7aToxNDA7czo1ODoiQUFBQUFBQUFNQUF3QUJBQUFBZUFVQUFEUUFBQURzQ1FBQUFBQUFBRFFBSUFBREFDZ0FGd0FVQUFFQSI7aToxNDE7czozMToiJGluaVsndXNlcnMnXSA9IGFycmF5KCdyb290JyA9PiI7aToxNDI7czo1ODoiSEozSGp1dGNrb1JmcFhmOUExelFPMkF3RFJyUmV5OXVHdlRlZXo3OXFBYW8xYTByZ3Vka1prUjhSYSI7aToxNDM7czo1MDoiY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIikiO2k6MTQ0O3M6NjQ6IjwlPSAiXCIgJiBvU2NyaXB0TmV0LkNvbXB1dGVyTmFtZSAmICJcIiAmIG9TY3JpcHROZXQuVXNlck5hbWUgJT4iO2k6MTQ1O3M6MTA0OiJzcWxDb21tYW5kLlBhcmFtZXRlcnMuQWRkKCgoVGFibGVDZWxsKWRhdGFHcmlkSXRlbS5Db250cm9sc1swXSkuVGV4dCwgU3FsRGJUeXBlLkRlY2ltYWwpLlZhbHVlID0gZGVjaW1hbCI7aToxNDY7czo5MDoiUmVzcG9uc2UuV3JpdGUoIjxicj4oICkgPGEgaHJlZj0/dHlwZT0xJmZpbGU9IiAmIHNlcnZlci5VUkxlbmNvZGUoaXRlbS5wYXRoKSAmICJcPiIgJiBpdGVtIjtpOjE0NztzOjExMToibmV3IEZpbGVTdHJlYW0oUGF0aC5Db21iaW5lKGZpbGVJbmZvLkRpcmVjdG9yeU5hbWUsIFBhdGguR2V0RmlsZU5hbWUoaHR0cFBvc3RlZEZpbGUuRmlsZU5hbWUpKSwgRmlsZU1vZGUuQ3JlYXRlIjtpOjE0ODtzOjcxOiJSZXNwb25zZS5Xcml0ZShTZXJ2ZXIuSHRtbEVuY29kZSh0aGlzLkV4ZWN1dGVDb21tYW5kKHR4dENvbW1hbmQuVGV4dCkpKSI7aToxNDk7czo4MzoiPCU9UmVxdWVzdC5TZXJ2ZXJ2YXJpYWJsZXMoIlNDUklQVF9OQU1FIiklPj90eHRwYXRoPTwlPVJlcXVlc3QuUXVlcnlTdHJpbmcoInR4dHBhdGgiO2k6MTUwO3M6NjA6Im91dHN0ciArPSBzdHJpbmcuRm9ybWF0KCI8YSBocmVmPSc/ZmRpcj17MH0nPnsxfS88L2E+Jm5ic3A7IiI7aToxNTE7czo2MToiUU9pS1dBZ1Y2MTNMdnN0S1krVUI5OEpaVFJHSWhZQmRIdUpDQXdtK1h0aDE2QXdROFg0dFBNY01WWlF0ZSI7aToxNTI7czozMzoicmUuZmluZGFsbChkaXJ0KycoLiopJyxwcm9nbm0pWzBdIjtpOjE1MztzOjQwOiJmaW5kIC8gLW5hbWUgLnNzaCA+ICRkaXIvc3Noa2V5cy9zc2hrZXlzIjtpOjE1NDtzOjYwOiJGU19jaGtfZnVuY19saWJjPSggJChyZWFkZWxmIC1zICRGU19saWJjIHwgZ3JlcCBfY2hrQEAgfCBhd2siO2k6MTU1O3M6NDk6Ikx5ODNNVGczT1dReU1USmtZemhqWW1ZMFpEUm1aREEwTkdFelpERTNaamszWm1JMk4iO2k6MTU2O3M6OTU6IiRmaWxlID0gJF9GSUxFU1siZmlsZW5hbWUiXVsibmFtZSJdOyBlY2hvICI8YSBocmVmPVwiJGZpbGVcIj4kZmlsZTwvYT4iO30gZWxzZSB7ZWNobygiZW1wdHkiKTt9IjtpOjE1NztzOjQ4OiJESjdWSVU3UklDWHI2c0VFVjJjQnRIRFNPZTluVmRwRUdoRW12UlZSTlVSZncxd1EiO2k6MTU4O3M6NTE6Ikx6OF9MeTh2RHg4ZV92Ny03dTd1M3M3dXpzN096cTZ1bnE3ZXJxNnV2cTUtam82dWpuNSI7aToxNTk7czo4MzoiaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUlDQVlBQUFEQS1tNjJBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVUiO2k6MTYwO3M6NTE6InNlcnZlci48L3A+XHJcbjwvYm9keT48L2h0bWw+IjtleGl0O31pZihwcmVnX21hdGNoKCI7aToxNjE7czo3NzoiJEZjaG1vZCwkRmRhdGEsJE9wdGlvbnMsJEFjdGlvbiwkaGRkYWxsLCRoZGRmcmVlLCRoZGRwcm9jLCR1bmFtZSwkaWRkKTpzaGFyZWQiO2k6MTYyO3M6MTU6InBocCAiLiR3c29fcGF0aCI7aToxNjM7czo2MToiJHByb2Q9InN5Ii4icyIuInRlbSI7JGlkPSRwcm9kKCRfUkVRVUVTVFsncHJvZHVjdCddKTskeydpZCd9OyI7aToxNjQ7czozMDoiQGFzc2VydCgkX1JFUVVFU1RbJ1BIUFNFU1NJRCddIjtpOjE2NTtzOjY4OiJQT1NUIHskcGF0aH17JGNvbm5lY3Rvcn0/Q29tbWFuZD1GaWxlVXBsb2FkJlR5cGU9RmlsZSZDdXJyZW50Rm9sZGVyPSI7aToxNjY7czo4NzoiImFkbWluMS5waHAiLCAiYWRtaW4xLmh0bWwiLCAiYWRtaW4yLnBocCIsICJhZG1pbjIuaHRtbCIsICJ5b25ldGltLnBocCIsICJ5b25ldGltLmh0bWwiIjtpOjE2NztzOjk3OiJAcGF0aDE9KCdhZG1pbi8nLCdhZG1pbmlzdHJhdG9yLycsJ21vZGVyYXRvci8nLCd3ZWJhZG1pbi8nLCdhZG1pbmFyZWEvJywnYmItYWRtaW4vJywnYWRtaW5Mb2dpbi8nIjtpOjE2ODtzOjM2OiJjYXQgJHtibGtsb2dbMl19IHwgZ3JlcCAicm9vdDp4OjA6MCIiO2k6MTY5O3M6NDY6Ij91cmw9Jy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10pLnVubGluayhST09UX0RJUi4iO2k6MTcwO3M6NDY6ImxvbmcgaW50OnQoMCwzKT1yKDAsMyk7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiO2k6MTcxO3M6NzU6ImNyZWF0ZV9mdW5jdGlvbigiJiQiLiJmdW5jdGlvbiIsIiQiLiJmdW5jdGlvbiA9IGNocihvcmQoJCIuImZ1bmN0aW9uKS0zKTsiKSI7aToxNzI7czo4NjoiZnVuY3Rpb24gZ29vZ2xlX2JvdCgpIHskc1VzZXJBZ2VudCA9IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKTtpZighKHN0cnAiO2k6MTczO3M6NzQ6ImNvcHkoJF9GSUxFU1sndXBrayddWyd0bXBfbmFtZSddLCJray8iLmJhc2VuYW1lKCRfRklMRVNbJ3Vwa2snXVsnbmFtZSddKSk7IjtpOjE3NDtzOjY3OiJmb3IgKCR2YWx1ZSkgeyBzLyYvJmFtcDsvZzsgcy88LyZsdDsvZzsgcy8+LyZndDsvZzsgcy8iLyZxdW90Oy9nOyB9IjtpOjE3NTtzOjQyOiIkZGJfZCA9IEBteXNxbF9zZWxlY3RfZGIoJGRhdGFiYXNlLCRjb24xKTsiO2k6MTc2O3M6NTE6IlNlbmQgdGhpcyBmaWxlOiA8SU5QVVQgTkFNRT0idXNlcmZpbGUiIFRZUEU9ImZpbGUiPiI7aToxNzc7czoyMjoiZndyaXRlICgkZnAsICIkeWF6aSIpOyI7aToxNzg7czo1MjoibWFwIHsgcmVhZF9zaGVsbCgkXykgfSAoJHNlbF9zaGVsbC0+Y2FuX3JlYWQoMC4wMSkpOyI7aToxNzk7czoyNzoiMj4mMSAxPiYyIiA6ICIgMT4mMSAyPiYxIik7IjtpOjE4MDtzOjU5OiJnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkb2xkX25hbWUsICRuYW1lLCI7aToxODE7czo2OToiX19hbGxfXyA9IFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJdIjtpOjE4MjtzOjI5OiJpZiAoaXNfZmlsZSgiL3RtcC8kZWtpbmNpIikpeyI7aToxODM7czozODoiaWYoJGNtZCAhPSAiIikgcHJpbnQgU2hlbGxfRXhlYygkY21kKTsiO2k6MTg0O3M6MjY6IiRjbWQgPSAoJF9SRVFVRVNUWydjbWQnXSk7IjtpOjE4NTtzOjU1OiIkdXBsb2FkZmlsZSA9ICRycGF0aC4iLyIgLiAkX0ZJTEVTWyd1c2VyZmlsZSddWyduYW1lJ107IjtpOjE4NjtzOjMzOiJpZiAoJGZ1bmNhcmcgPX4gL15wb3J0c2NhbiAoLiopLykiO2k6MTg3O3M6NDY6IjwlIEZvciBFYWNoIFZhcnMgSW4gUmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMgJT4iO2k6MTg4O3M6NDg6ImlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyI7aToxODk7czozODoiJGZpbGVuYW1lID0gJGJhY2t1cHN0cmluZy4iJGZpbGVuYW1lIjsiO2k6MTkwO3M6NTk6IjwlI0B+Xkh3QUFBQT09QCNAJkRua3dLeC9/Un9VTkAjQCZueDlQZDsoQCNAJnVnY0FBQT09XiN+QCU+IjtpOjE5MTtzOjI0OiIkZnVuY3Rpb24oJF9QT1NUWydjbWQnXSkiO2k6MTkyO3M6Mjk6ImVjaG8gIkZJTEUgVVBMT0FERUQgVE8gJGRleiI7IjtpOjE5MztzOjY4OiJpZiAoIUBpc19saW5rKCRmaWxlKSAmJiAoJHIgPSByZWFscGF0aCgkZmlsZSkpICE9IEZBTFNFKSAkZmlsZSA9ICRyOyI7aToxOTQ7czo4NzoiVU5JT04gU0VMRUNUICcwJyAsICc8PyBzeXN0ZW0oXCRfR0VUW2NwY10pO2V4aXQ7ID8+JyAsMCAsMCAsMCAsMCBJTlRPIE9VVEZJTEUgJyRvdXRmaWxlIjtpOjE5NTtzOjg5OiJpZihtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siZmljIl1bInRtcF9uYW1lIl0sZ29vZF9saW5rKCIuLyIuJF9GSUxFU1siZmljIl1bIm5hbWUiXSkpKSI7aToxOTY7czo3MjoiY29ubmVjdChTT0NLRVQsIHNvY2thZGRyX2luKCRBUkdWWzFdLCBpbmV0X2F0b24oJEFSR1ZbMF0pKSkgb3IgZGllIHByaW50IjtpOjE5NztzOjUyOiJlbHNlaWYoQGlzX3dyaXRhYmxlKCRGTikgJiYgQGlzX2ZpbGUoJEZOKSkgJHRtcE91dE1GIjtpOjE5ODtzOjY4OiJ3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsTVlTUUxfQVNTT0MpKSBwcmludF9yKCRyb3cpOyI7aToxOTk7czoxODoiJGZlKCIkY21kICAyPiYxIik7IjtpOjIwMDtzOjY5OiJzZW5kKFNPQ0s1LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3tvfSsrOzsiO2k6MjAxO3M6Njk6In0gZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pIFBSSVZNU0cgKC4rPykgXDooLispLykgeyI7aToyMDI7czozNzoiZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygic2hlbGxfZXhlYyIpKSI7aToyMDM7czo3MToic3lzdGVtKCIkY21kIDE+IC90bXAvY21kdGVtcCAyPiYxOyBjYXQgL3RtcC9jbWR0ZW1wOyBybSAvdG1wL2NtZHRlbXAiKTsiO2k6MjA0O3M6NTI6IiRfRklMRVNbJ3Byb2JlJ11bJ3NpemUnXSwgJF9GSUxFU1sncHJvYmUnXVsndHlwZSddKTsiO2k6MjA1O3M6ODc6IiRyYTQ0ICA9IHJhbmQoMSw5OTk5OSk7JHNqOTggPSAic2gtJHJhNDQiOyRtbCA9ICIkc2Q5OCI7JGE1ID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOyI7aToyMDY7czo2NjoibXlzcWxfcXVlcnkoIkNSRUFURSBUQUJMRSBgeHBsb2l0YCAoYHhwbG9pdGAgTE9OR0JMT0IgTk9UIE5VTEwpIik7IjtpOjIwNztzOjY2OiJwYXNzdGhydSggJGJpbmRpci4ibXlzcWxkdW1wIC0tdXNlcj0kVVNFUk5BTUUgLS1wYXNzd29yZD0kUEFTU1dPUkQiO2k6MjA4O3M6ODQ6IjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+U2NoZW1hPC9hPiI7aToyMDk7czo2MDoiaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkkc2hlbGxPdXQ9c3RyaXBzbGFzaGVzKCRzaGVsbE91dCk7IjtpOjIxMDtzOjQ3OiJpZiAoIWRlZmluZWQkcGFyYW17Y21kfSl7JHBhcmFte2NtZH09ImxzIC1sYSJ9OyI7aToyMTE7czoyMzoic2hlbGxfZXhlYygndW5hbWUgLWEnKTsiO2k6MjEyO3M6OTE6ImlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsYSddWyd0bXBfbmFtZSddLCAkY3VyZGlyLiIvIi4kX0ZJTEVTWydmaWxhJ11bJ25hbWUnXSkpIHsiO2k6MjEzO3M6ODM6ImlmIChlbXB0eSgkX1BPU1RbJ3dzZXInXSkpIHskd3NlciA9ICJ3aG9pcy5yaXBlLm5ldCI7fSBlbHNlICR3c2VyID0gJF9QT1NUWyd3c2VyJ107IjtpOjIxNDtzOjM2OiI8JT1lbnYucXVlcnlIYXNodGFibGUoInVzZXIubmFtZSIpJT4iO2k6MjE1O3M6NjE6IlB5U3lzdGVtU3RhdGUuaW5pdGlhbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydGllcygpLCBudWxsLCBhcmd2KTsiO2k6MjE2O3M6MzU6ImlmKCEkd2hvYW1pKSR3aG9hbWk9ZXhlYygid2hvYW1pIik7IjtpOjIxNztzOjM2OiJzaGVsbF9leGVjKCRfUE9TVFsnY21kJ10gLiAiIDI+JjEiKTsiO2k6MjE4O3M6NTM6IlBuVmxrV002MyFAI0AmZEt4fm5NRFdNfkR/L0Vzbn54fzZEQCNAJlB+fiw/blksV1B7UG9qIjtpOjIxOTtzOjI1OiIhJF9SRVFVRVNUWyJjOTlzaF9zdXJsIl0pIjtpOjIyMDtzOjYwOiIoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0qJCcsICRfUkVRVUVTVFsnY29tbWFuZCddKSkiO2k6MjIxO3M6MjM6IiRsb2dpbj1AcG9zaXhfZ2V0dWlkKCk7IjtpOjIyMjtzOjM4OiJzeXN0ZW0oInVuc2V0IEhJU1RGSUxFOyB1bnNldCBTQVZFSElTVCI7aToyMjM7czozMToiPEhUTUw+PEhFQUQ+PFRJVExFPmNnaS1zaGVsbC5weSI7aToyMjQ7czozNjoiZXhlY2woIi9iaW4vc2giLCJzaCIsIi1pIiwoY2hhciopMCk7IjtpOjIyNTtzOjI2OiJuY2Z0cHB1dCAtdSAkZnRwX3VzZXJfbmFtZSI7aToyMjY7czoyOToiJGFbaGl0c10nKTsgXHJcbiNlbmRxdWVyeVxyXG4iO2k6MjI3O3M6MjM6Inske3Bhc3N0aHJ1KCRjbWQpfX08YnI+IjtpOjIyODtzOjQyOiIkYmFja2Rvb3ItPmNjb3B5KCRjZmljaGllciwkY2Rlc3RpbmF0aW9uKTsiO2k6MjI5O3M6NTk6IiRpemlubGVyMj1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZuYW1lKSwxMCw4KSwtNCk7IjtpOjIzMDtzOjUwOiJmb3IoOyRwYWRkcj1hY2NlcHQoQ0xJRU5ULCBTRVJWRVIpO2Nsb3NlIENMSUVOVCkgeyI7aToyMzE7czo4OiJBc21vZGV1cyI7aToyMzI7czozNzoicGFzc3RocnUoZ2V0ZW52KCJIVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyMzM7czozOToiJF9fX189QGd6aW5mbGF0ZSgkX19fXykpe2lmKGlzc2V0KCRfUE9TIjtpOjIzNDtzOjg1OiIkc3Viaj11cmxkZWNvZGUoJF9HRVRbJ3N1J10pOyRib2R5PXVybGRlY29kZSgkX0dFVFsnYm8nXSk7JHNkcz11cmxkZWNvZGUoJF9HRVRbJ3NkJ10pIjtpOjIzNTtzOjMyOiIka2E9Jzw/Ly9CUkUnOyRrYWthPSRrYS4nQUNLLy8/PiI7aToyMzY7czozMToiQ2F1dGFtIGZpc2llcmVsZSBkZSBjb25maWd1cmFyZSI7aToyMzc7czoxMjoiQlJVVEVGT1JDSU5HIjtpOjIzODtzOjE4OiJwd2QgPiBHZW5lcmFzaS5kaXIiO2k6MjM5O3M6NTY6InhoIC1zICIvdXNyL2xvY2FsL2FwYWNoZS9zYmluL2h0dHBkIC1EU1NMIiAuL2h0dHBkIC1tICQxIjtpOjI0MDtzOjQ4OiIkYT0oc3Vic3RyKHVybGVuY29kZShwcmludF9yKGFycmF5KCksMSkpLDUsMSkuYykiO2k6MjQxO3M6MjE6IiFAJF9DT09LSUVbJHNlc3NkdF9rXSI7aToyNDI7czo1ODoiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSI7aToyNDM7czo0NDoiY29weSgkX0ZJTEVTW3hdW3RtcF9uYW1lXSwkX0ZJTEVTW3hdW25hbWVdKSkiO2k6MjQ0O3M6NTQ6IiRNZXNzYWdlU3ViamVjdCA9IGJhc2U2NF9kZWNvZGUoJF9QT1NUWyJtc2dzdWJqZWN0Il0pOyI7aToyNDU7czoxNzoicmVuYW1lKCJ3c28ucGhwIiwiO2k6MjQ2O3M6ODg6IiRyZWRpcmVjdFVSTD0naHR0cDovLycuJHJTaXRlLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddO2lmKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkiO2k6MjQ3O3M6NDA6IiRmaWxlcGF0aD1AcmVhbHBhdGgoJF9QT1NUWydmaWxlcGF0aCddKTsiO2k6MjQ4O3M6NDI6Ildvcmtlcl9HZXRSZXBseUNvZGUoJG9wRGF0YVsncmVjdkJ1ZmZlciddKSI7aToyNDk7czoyMToiRmFUYUxpc1RpQ3pfRnggRngyOVNoIjtpOjI1MDtzOjEzOiJ3NGNrMW5nIHNoZWxsIjtpOjI1MTtzOjIyOiJwcml2YXRlIFNoZWxsIGJ5IG00cmNvIjtpOjI1MjtzOjIwOiJTaGVsbCBieSBNYXdhcl9IaXRhbSI7aToyNTM7czoxMjoiUEhQU0hFTEwuUEhQIjtpOjI1NDtzOjQ2OiJyb3VuZCgwKzk4MzAuNCs5ODMwLjQrOTgzMC40Kzk4MzAuNCs5ODMwLjQpKT09IjtpOjI1NTtzOjExMDoidnp2NmQraU92dGtkMzhUbEh1OG1RYXZYZG5KQ2JwUWNwWGhOYmJMbVpPcU1vcERaZU5hbGIrVktsZWRoQ2pwVkFNUVNRbnhWSUVDUUFmTHU1S2dMbXdCNmVoUVFHTlNCWWpwZzlnNUdkQmloWG8iO2k6MjU2O3M6NjU6ImlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSsoW147XSspJCcsICRjb21tYW5kLCAkcmVncykpIjtpOjI1NztzOjc2OiJMUzBnUkhWdGNETmtJR0o1SUZCcGNuVnNhVzR1VUVoUUlGZGxZbk5vTTJ4c0lIWXhMakFnWXpCa1pXUWdZbmtnY2pCa2NqRWdPa3c9IjtpOjI1ODtzOjE0MjoiNWpiMjBpS1c5eUlITjBjbWx6ZEhJb0pISmxabVZ5WlhJc0ltRndiM0owSWlrZ2IzSWdjM1J5YVhOMGNpZ2tjbVZtWlhKbGNpd2libWxuYldFaUtTQnZjaUJ6ZEhKcGMzUnlLQ1J5WldabGNtVnlMQ0ozWldKaGJIUmhJaWtnYjNJZ2MzUnlhWE4wY2lnayI7aToyNTk7czoyMToiZXZhbChiYXNlNjRfZGVjb2RlKCRfIjtpOjI2MDtzOjQ4OiJ3c29FeCgndGFyIGNmenYgJyAuIGVzY2FwZXNoZWxsYXJnKCRfUE9TVFsncDInXSkiO2k6MjYxO3M6ODY6Ijxub2JyPjxiPiRjZGlyJGNmaWxlPC9iPiAoIi4kZmlsZVsic2l6ZV9zdHIiXS4iKTwvbm9icj48L3RkPjwvdHI+PGZvcm0gbmFtZT1jdXJyX2ZpbGU+IjtpOjI2MjtzOjE2OiJDb250ZW50LVR5cGU6ICRfIjtpOjI2MztzOjE0MToiPC90ZD48dGQgaWQ9ZmE+WyA8YSB0aXRsZT1cIkhvbWU6ICciLmh0bWxzcGVjaWFsY2hhcnMoc3RyX3JlcGxhY2UoIlwiLCAkc2VwLCBnZXRjd2QoKSkpLiInLlwiIGlkPWZhIGhyZWY9XCJqYXZhc2NyaXB0OlZpZXdEaXIoJyIucmF3dXJsZW5jb2RlIjtpOjI2NDtzOjEwNzoiQ1Fib0dsN2YreGNBeVV5c3hiNW1LUzZrQVdzblJMZFMrc0tnR29aV2Rzd0xGSlpWOHRWelhzcSttZVNQSE14VEkzblNVQjRmSjJ2UjNyM09udlh0TkFxTjZ3bi9EdFRUaStDdTFVT0p3TkwiO2k6MjY1O3M6Mzk6IldTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSI7aToyNjY7czoxMjY6IlgxTkZVMU5KVDA1YkozUjRkR0YxZEdocGJpZGRJRDBnZEhKMVpUc05DaUFnSUNCcFppQW9KRjlRVDFOVVd5ZHliU2RkS1NCN0RRb2dJQ0FnSUNCelpYUmpiMjlyYVdVb0ozUjRkR0YxZEdoZkp5NGtjbTFuY205MWNDd2diVyI7aToyNjc7czozOToiSkAhVnJAKiZSSFJ3fkpMdy5HfHhsaG5MSn4/MS5id09ieGJQfCFWIjtpOjI2ODtzOjExOiJ6ZWhpcmhhY2tlciI7aToyNjk7czoxNjE6IignIicsJyZxdW90OycsJGZuKSkuJyI7ZG9jdW1lbnQubGlzdC5zdWJtaXQoKTtcJz4nLmh0bWxzcGVjaWFsY2hhcnMoc3RybGVuKCRmbik+Zm9ybWF0P3N1YnN0cigkZm4sMCxmb3JtYXQtMykuJy4uLic6JGZuKS4nPC9hPicuc3RyX3JlcGVhdCgnICcsZm9ybWF0LXN0cmxlbigkZm4pIjtpOjI3MDtzOjE2MDoicHJpbnQoKGlzX3JlYWRhYmxlKCRmKSAmJiBpc193cml0ZWFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIudygxKS5mb250KCdyZWQnLCdSVycsMykpLncoMSk6KCgoaXNfcmVhZGFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIpLncoNCk6IiIpLigoaXNfd3JpdGFibCI7aToyNzE7czo3MzoiUjBsR09EbGhGQUFVQUtJQUFBQUFBUC8vLzkzZDNjREF3SWFHaGdRRUJQLy8vd0FBQUNINUJBRUFBQVlBTEFBQUFBQVVBQlFBQSI7aToyNzI7czo5MDoiPCU9UmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMoInNjcmlwdF9uYW1lIiklPj9Gb2xkZXJQYXRoPTwlPVNlcnZlci5VUkxQYXRoRW5jb2RlKEZvbGRlci5Ecml2IjtpOjI3MztzOjExMzoibTkxZEN3Z0pHVnZkWFFwT3cwS2MyVnNaV04wS0NSeWIzVjBJRDBnSkhKcGJpd2dkVzVrWldZc0lDUmxiM1YwSUQwZ0pISnBiaXdnTVRJd0tUc05DbWxtSUNnaEpISnZkWFFnSUNZbUlDQWhKR1Z2ZFgiO2k6Mjc0O3M6Mzg6IlJvb3RTaGVsbCEnKTtzZWxmLmxvY2F0aW9uLmhyZWY9J2h0dHA6IjtpOjI3NTtzOjc2OiJhIGhyZWY9Ijw/ZWNobyAiJGZpc3Rpay5waHA/ZGl6aW49JGRpemluLy4uLyI/PiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uIjtpOjI3NjtzOjEyNzoiQ0IyYVRacElERXdNalF0RFFvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRMEtJM0psY1hWcCI7aToyNzc7czozMToicygpLmcoKS5zKCkucygpLmcoKS5zKCkucygpLmcoKSI7aToyNzg7czoxMjI6Im50KShkaXNrX3RvdGFsX3NwYWNlKGdldGN3ZCgpKS8oMTAyNCoxMDI0KSkgLiAiTWIgIiAuICJGcmVlIHNwYWNlICIgLiAoaW50KShkaXNrX2ZyZWVfc3BhY2UoZ2V0Y3dkKCkpLygxMDI0KjEwMjQpKSAuICJNYiA8IjtpOjI3OTtzOjM3OiJrbGFzdmF5di5hc3A/eWVuaWRvc3lhPTwlPWFrdGlma2xhcyU+IjtpOjI4MDtzOjQ0OiJXVCtQe35FVzBFclBPdG5VQCNAJl5sXnNQMWxkbnlAI0AmbnNrK3IwLEdUKyI7aToyODE7czoxMTU6Im1wdHkoJF9QT1NUWyd1ciddKSkgJG1vZGUgfD0gMDQwMDsgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSAkbW9kZSB8PSAwMjAwOyBpZiAoIWVtcHR5KCRfUE9TVFsndXgnXSkpICRtb2RlIHw9IDAxMDAiO2k6MjgyO3M6MTA1OiIvMHRWU0cvU3V2MFVyL2hhVVlBZG4zak1Rd2Jib2NHZmZBZUMyOUJOOXRtQmlKZFYxbGsrallEVTkyQzk0amR0RGlmK3hPWWpHNkNMaHgzMVVvOXg5L2VBV2dzQks2MGtLMm1Md3F6cWQiO2k6MjgzO3M6ODY6ImNybGYuJ3VubGluaygkbmFtZSk7Jy4kY3JsZi4ncmVuYW1lKCJ+Ii4kbmFtZSwgJG5hbWUpOycuJGNybGYuJ3VubGluaygiZ3JwX3JlcGFpci5waHAiIjtpOjI4NDtzOjE1OiJEWF9IZWFkZXJfZHJhd24iO2k6Mjg1O3M6MzA6IltBdjRiZkNZQ1MseEtXayQrVGtVUyx4bkdkQXhbTyI7aToyODY7czoxMTE6IkJEQVFrSkNRd0xEQmdORFJneUlSd2hNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpML3dBQVJDQUFRQUJBREFTSUFBaEVCQSI7aToyODc7czoxMToiY3RzaGVsbC5waHAiO2k6Mjg4O3M6NDc6IkV4ZWN1dGVkIGNvbW1hbmQ6IDxiPjxmb250IGNvbG9yPSNkY2RjZGM+WyRjbWRdIjtpOjI4OTtzOjEzOiJXU0NSSVBULlNIRUxMIjtpOjI5MDtzOjc6ImNhc3VzMTUiO2k6MjkxO3M6NzY6IlIwbEdPRGxoSmdBV0FJQUFBQUFBQVAvLy95SDVCQVVVQUFFQUxBQUFBQUFtQUJZQUFBSXZqSStweSswUEY0aTBnVnZ6dVZ4WERub1EiO2k6MjkyO3M6MTc6ImFkbWluQHNweWdydXAub3JnIjtpOjI5MztzOjE0OiJ0ZW1wX3I1N190YWJsZSI7aToyOTQ7czoxNzoiJGM5OXNoX3VwZGF0ZWZ1cmwiO2k6Mjk1O3M6OToiQnkgUHN5Y2gwIjtpOjI5NjtzOjE2OiJjOTlmdHBicnV0ZWNoZWNrIjtpOjI5NztzOjg0OiI8dGV4dGFyZWEgbmFtZT1cInBocGV2XCIgcm93cz1cIjVcIiBjb2xzPVwiMTUwXCI+Ii5AJF9QT1NUWydwaHBldiddLiI8L3RleHRhcmVhPjxicj4iO2k6Mjk4O3M6OTQ6IiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/KCgkcGVybXMgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOigoJHBlcm1zICYgMHgwODAwKSA/ICdTJyA6ICctJykiO2k6Mjk5O3M6MzA6IiRyYW5kX3dyaXRhYmxlX2ZvbGRlcl9mdWxscGF0aCI7aTozMDA7czoxMDoiRHIuYWJvbGFsaCI7aTozMDE7czo2OiJLIUxMM3IiO2k6MzAyO3M6NzoiTXJIYXplbSI7aTozMDM7czoxMDoiQzBkZXJ6LmNvbSI7aTozMDQ7czoyNjoiT0xCOlBST0RVQ1Q6T05MSU5FX0JBTktJTkciO2k6MzA1O3M6MTA6IkJZIE1NTkJPQloiO2k6MzA2O3M6MTY6IkNvbm5lY3RCYWNrU2hlbGwiO2k6MzA3O3M6ODoiSGFja2VhZG8iO2k6MzA4O3M6NToiZDNiflgiO2k6MzA5O3M6NToicmFodWkiO2k6MzEwO3M6OToiTXIuSGlUbWFuIjtpOjMxMTtzOjEwOiJNcmxvb2wuZXhlIjt9"));
$gX_DBShe unserialize(base64_decode("YTo0OTp7aTowO3M6MTU6IkRhcmtDcmV3RnJpZW5kcyI7aToxO3M6MTE6IlNpbUF0dGFja2VyIjtpOjI7czoxMjoiXVtyb3VuZCgwKV0oIjtpOjM7czozMjoiPCEtLSNleGVjIGNtZD0iJEhUVFBfQUNDRVBUIiAtLT4iO2k6NDtzOjQ6IkFtIXIiO2k6NTtzOjU6IjZlc2FiIjtpOjY7czo4OiJbY29kZXJ6XSI7aTo3O3M6MTE6IlsgUGhwcm94eSBdIjtpOjg7czo2OiJTcGFtZXIiO2k6OTtzOjc6IkRlZmFjZXIiO2k6MTA7czoxMToiRGV2aWxIYWNrZXIiO2k6MTE7czo3OiJ3ZWJyMDB0IjtpOjEyO3M6NjoiazBkLmNjIjtpOjEzO3M6NTU6ImlzX2NhbGxhYmxlKCdleGVjJykgYW5kICFpbl9hcnJheSgnZXhlYycsICRkaXNhYmxlZnVuY3MiO2k6MTQ7czoxNDoiJEdMT0JBTFNbJ19fX18iO2k6MTU7czoyMzoiaXNfd3JpdGFibGUoIi92YXIvdG1wIikiO2k6MTY7czoyMzoiZXZhbChmaWxlX2dldF9jb250ZW50cygiO2k6MTc7czozNDoiL3Byb2Mvc3lzL2tlcm5lbC95YW1hL3B0cmFjZV9zY29wZSI7aToxODtzOjQ5OiInaHR0cGQuY29uZicsJ3Zob3N0cy5jb25mJywnY2ZnLnBocCcsJ2NvbmZpZy5waHAnIjtpOjE5O3M6NzoiYnIwd3MzciI7aToyMDtzOjc6Im1pbHcwcm0iO2k6MjE7czozNjoiaW5jbHVkZSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pIjtpOjIyO3M6MTA6ImRpciAvT0cgL1giO2k6MjM7czozNDoiaWYgKCgkcGVybXMgJiAweEMwMDApID09IDB4QzAwMCkgeyI7aToyNDtzOjU5OiJpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSI7aToyNTtzOjQwOiJzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fdXNlcm5hbWUiICk7IjtpOjI2O3M6MTk6InByaW50ICJTcGFtZWQnPjxicj4iO2k6Mjc7czo1MToiJG1lc3NhZ2UgPSBlcmVnX3JlcGxhY2UoIiU1QyUyMiIsICIlMjIiLCAkbWVzc2FnZSk7IjtpOjI4O3M6MTU6Ii9ldGMvbmFtZWQuY29uZiI7aToyOTtzOjEwOiIvZXRjL2h0dHBkIjtpOjMwO3M6MTE6Ii92YXIvY3BhbmVsIjtpOjMxO3M6MTg6Ik5lIHVkYWxvcyB6YWdydXppdCI7aTozMjtzOjE0OiJleGVjKCJybSAtciAtZiI7aTozMztzOjg6IlNoZWxsIE9rIjtpOjM0O3M6MTE6Im15c2hlbGxleGVjIjtpOjM1O3M6OToicm9vdHNoZWxsIjtpOjM2O3M6OToiYW50aXNoZWxsIjtpOjM3O3M6MTI6InI1N3NoZWxsLnBocCI7aTozODtzOjExOiJMb2N1czdTaGVsbCI7aTozOTtzOjExOiJTdG9ybTdTaGVsbCI7aTo0MDtzOjg6Ik4zdHNoZWxsIjtpOjQxO3M6MTE6ImRldmlselNoZWxsIjtpOjQyO3M6MTI6IldlYiBTaGVsbCBieSI7aTo0MztzOjc6IkZ4Yzk5c2giO2k6NDQ7czo4OiJjaWhzaGVsbCI7aTo0NTtzOjc6Ik5URGFkZHkiO2k6NDY7czo4OiJyNTdzaGVsbCI7aTo0NztzOjg6ImM5OXNoZWxsIjtpOjQ4O3M6NjI6IjxkaXYgY2xhc3M9ImJsb2NrIGJ0eXBlMSI+PGRpdiBjbGFzcz0iZHRvcCI+PGRpdiBjbGFzcz0iZGJ0bSI+Ijt9"));
$g_FlexDBShe unserialize(base64_decode("YToyNzY6e2k6MDtzOjc5OiJSZXdyaXRlUnVsZVxzK1xeXChcLlwqXCksXChcLlwqXClcJFxzK1wkMlwucGhwXD9yZXdyaXRlX3BhcmFtcz1cJDEmcGFnZV91cmw9XCQyIjtpOjE7czo1ODoiZnVuY3Rpb25ccytyZWFkX3BpY1woXHMqXCRBXHMqXClccyp7XHMqXCRhXHMqPVxzKlwkX1NFUlZFUiI7aToyO3M6NTI6ImZpbGVtdGltZVwoXCRiYXNlcGF0aFxzKlwuXHMqWyciXS9jb25maWd1cmF0aW9uXC5waHAiO2k6MztzOjYyOiJsaXN0XHMqXChccypcJGhvc3RccyosXHMqXCRwb3J0XHMqLFxzKlwkc2l6ZVxzKixccypcJGV4ZWNfdGltZSI7aTo0O3M6NDE6Imxpc3RpbmdfcGFnZVwoXHMqbm90aWNlXChccypbJyJdc3ltbGlua2VkIjtpOjU7czozNToibWFrZV9kaXJfYW5kX2ZpbGVcKFxzKlwkcGF0aF9qb29tbGEiO2k6NjtzOjIxOiJmdW5jdGlvblxzK2luRGlhcGFzb24iO2k6NztzOjQxOiImJlxzKiFlbXB0eVwoXHMqXCRfQ09PS0lFXFtbJyJdZmlsbFsnIl1cXSI7aTo4O3M6MzM6ImZpbGVfZXhpc3RzXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aTo5O3M6NTk6InN0cl9yZXBsYWNlXChcJGZpbmRccyosXHMqXCRmaW5kXHMqXC5ccypcJGh0bWxccyosXHMqXCR0ZXh0IjtpOjEwO3M6MzY6IlwkZGF0YW1hc2lpPWRhdGVcKCJEIE0gZCwgWSBnOmkgYSJcKSI7aToxMTtzOjM0OiJcJGFkZGRhdGU9ZGF0ZVwoIkQgTSBkLCBZIGc6aSBhIlwpIjtpOjEyO3M6MTg6ImZ1Y2tccyt5b3VyXHMrbWFtYSI7aToxMztzOjUwOiJHb29nbGVib3RbJyJdezAsMX1ccypcKVwpe2VjaG9ccytmaWxlX2dldF9jb250ZW50cyI7aToxNDtzOjM3OiJbJyJdezAsMX0uYy5bJyJdezAsMX1cLnN1YnN0clwoXCR2YmcsIjtpOjE1O3M6Mjg6ImFycmF5XChcJGVuLFwkZXMsXCRlZixcJGVsXCkiO2k6MTY7czo0NjoibG9jXHMqPVxzKlsnIl17MCwxfTxcP2VjaG9ccytcJHJlZGlyZWN0O1xzKlw/PiI7aToxNztzOjE3OiJLYXphbi9pbmRleFwuaHRtbCI7aToxODtzOjE4OiI9PTBcKXtqc29uUXVpdFwoXCQiO2k6MTk7czo0MDoiQHN0cmVhbV9zb2NrZXRfY2xpZW50XChbJyJdezAsMX10Y3A6Ly9cJCI7aToyMDtzOjMwOiI6OlsnIl1cLnBocHZlcnNpb25cKFwpXC5bJyJdOjoiO2k6MjE7czozODoicHJlZ19yZXBsYWNlXChbJyJdLlVURlxcLTg6XCguXCpcKS5Vc2UiO2k6MjI7czoxMzoiIj0+XCR7XCR7IlxceCI7aToyMztzOjQyOiJmc29ja29wZW5cKFwkbVxbMFxdLFwkbVxbMTBcXSxcJF8sXCRfXyxcJG0iO2k6MjQ7czozMzoiZVZhTFwoXHMqdHJpbVwoXHMqYmFTZTY0X2RlQ29EZVwoIjtpOjI1O3M6NDY6ImVjaG9ccyptZDVcKFwkX1BPU1RcW1snIl17MCwxfWNoZWNrWyciXXswLDF9XF0iO2k6MjY7czoyNToiaW1nIHNyYz1bJyJdb3BlcmEwMDBcLnBuZyI7aToyNztzOjM3OiJmdW5jdGlvbiByZWxvYWRcKFwpe2hlYWRlclwoIkxvY2F0aW9uIjtpOjI4O3M6NDA6InN1YnN0cl9jb3VudFwoZ2V0ZW52XChcXFsnIl1IVFRQX1JFRkVSRVIiO2k6Mjk7czozMToid2ViaVwucnUvd2ViaV9maWxlcy9waHBfbGlibWFpbCI7aTozMDtzOjY1OiJjaHIyPVwoXChlbmMyJjE1XCk8PDRcKVx8XChlbmMzPj4yXCk7Y2hyMz1cKFwoZW5jMyYzXCk8PDZcKVx8ZW5jNCI7aTozMTtzOjEyOiJSRVJFRkVSX1BUVEgiO2k6MzI7czo5OiJ0c29oX3B0dGgiO2k6MzM7czoxNToidG5lZ2FfcmVzdV9wdHRoIjtpOjM0O3M6NDc6Im1tY3J5cHRcKFwkZGF0YSwgXCRrZXksIFwkaXYsIFwkZGVjcnlwdCA9IEZBTFNFIjtpOjM1O3M6MTM6ImZvcG9cLmNvbVwuYXIiO2k6MzY7czoyMDoic3ByYXZvY2huaWstbm9tZXJvdi0iO2k6Mzc7czoxODoiaWNxLWRseWEtdGVsZWZvbmEtIjtpOjM4O3M6MTc6InRlbGVmb25uYXlhLWJhemEtIjtpOjM5O3M6MjY6InNsZXNoXCtzbGVzaFwrZG9tZW5cK3BvaW50IjtpOjQwO3M6MjI6InNyYz0iZmlsZXNfc2l0ZS9qc1wuanMiO2k6NDE7czo5NToiXCR0PVwkcztccypcJG9ccyo9XHMqWyciXVsnIl07XHMqZm9yXChcJGk9MDtcJGk8c3RybGVuXChcJHRcKTtcJGlcK1wrXCl7XHMqXCRvXHMqXC49XHMqXCR0e1wkaX0iO2k6NDI7czo4MDoiV0JTX0RJUlxzKlwuXHMqWyciXXswLDF9dGVtcC9bJyJdezAsMX1ccypcLlxzKlwkYWN0aXZlRmlsZVxzKlwuXHMqWyciXXswLDF9XC50bXAiO2k6NDM7czo1MToiQCptYWlsXChcJG1vc0NvbmZpZ19tYWlsZnJvbSwgXCRtb3NDb25maWdfbGl2ZV9zaXRlIjtpOjQ0O3M6NjY6IlwkW2EtekEtWjAtOV9dKz8vXCouezEsMTB9XCovXHMqXC5ccypcJFthLXpBLVowLTlfXSs/L1wqLnsxLDEwfVwqLyI7aTo0NTtzOjE3OiJAXCRfUE9TVFxbXChjaHJcKCI7aTo0NjtzOjMzOiI8XD9waHBccytyZW5hbWVcKFsnIl13c29cLnBocFsnIl0iO2k6NDc7czo1MjoiXCRzdHI9WyciXXswLDF9PGgxPjQwM1xzK0ZvcmJpZGRlbjwvaDE+PCEtLVxzKnRva2VuOiI7aTo0ODtzOjUwOiJjaHVua19zcGxpdFwoYmFzZTY0X2VuY29kZVwoZnJlYWRcKFwke1wke1snIl17MCwxfSI7aTo0OTtzOjYwOiJpbmlfZ2V0XChbJyJdezAsMX1maWx0ZXJcLmRlZmF1bHRfZmxhZ3NbJyJdezAsMX1cKVwpe2ZvcmVhY2giO2k6NTA7czozODoiZmlsZV9nZXRfY29udGVudHNcKHRyaW1cKFwkZlxbXCRfR0VUXFsiO2k6NTE7czoxMzM6Im1haWxcKFwkYXJyXFtbJyJdezAsMX10b1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1zdWJqWyciXXswLDF9XF0sXCRhcnJcW1snIl17MCwxfW1zZ1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1oZWFkWyciXXswLDF9XF1cKTsiO2k6NTI7czo1NDoiaWZcKGlzc2V0XChcJF9QT1NUXFtbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XF1cKVwpIjtpOjUzO3M6MzU6ImJhc2U2NF9kZWNvZGVcKFwkX1BPU1RcW1snIl17MCwxfV8tIjtpOjU0O3M6NTM6InJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uXChccypbJyJdezAsMX1yZWFkX2Fuc19jb2RlIjtpOjU1O3M6NzU6IlwkcGFyYW1ccyo9XHMqXCRwYXJhbVxzKnhccypcJG5cLnN1YnN0clxzKlwoXCRwYXJhbVxzKixccypsZW5ndGhcKFwkcGFyYW1cKSI7aTo1NjtzOjI0OiJiYXNlWyciXXswLDF9XC5cKDMyXCoyXCkiO2k6NTc7czo2NjoiaWZcKEBcJHZhcnNcKGdldF9tYWdpY19xdW90ZXNfZ3BjXChcKVxzKlw/XHMqc3RyaXBzbGFzaGVzXChcJHVyaVwpIjtpOjU4O3M6Mjk6IlwpXF07fWlmXChpc3NldFwoXCRfU0VSVkVSXFtfIjtpOjU5O3M6NDI6ImlmXChlbXB0eVwoXCRfQ09PS0lFXFtbJyJdeFsnIl1cXVwpXCl7ZWNobyI7aTo2MDtzOjUyOiJpc193cml0YWJsZVwoXCRkaXJcLlsnIl13cC1pbmNsdWRlcy92ZXJzaW9uXC5waHBbJyJdIjtpOjYxO3M6MjE6IkFwcGxlXHMrU3BBbVxzK1JlWnVsVCI7aTo2MjtzOjE3OiIjXHMqc3RlYWx0aFxzKmJvdCI7aTo2MztzOjIyOiIjXHMqc2VjdXJpdHlzcGFjZVwuY29tIjtpOjY0O3M6Mjg6IlVSTD08XD9lY2hvXHMrXCRpbmRleDtccytcPz4iO2k6NjU7czo5NToiPHNjcmlwdFxzK3R5cGU9WyciXXswLDF9dGV4dC9qYXZhc2NyaXB0WyciXXswLDF9XHMrc3JjPVsnIl17MCwxfWpxdWVyeS11XC5qc1snIl17MCwxfT48L3NjcmlwdD4iO2k6NjY7czo1NzoiY3JlYXRlX2Z1bmN0aW9uXChbJyJdWyciXSxccypcJG9wdFxbMVxdXHMqXC5ccypcJG9wdFxbNFxdIjtpOjY3O3M6NTA6ImZpbGVfcHV0X2NvbnRlbnRzXChTVkNfU0VMRlxzKlwuXHMqWyciXS9cLmh0YWNjZXNzIjtpOjY4O3M6NTE6IlwkYWxsZW1haWxzXHMqPVxzKkBzcGxpdFwoIlxcbiJccyosXHMqXCRlbWFpbGxpc3RcKSI7aTo2OTtzOjE4OiJKb29tbGFfYnJ1dGVfRm9yY2UiO2k6NzA7czozODoiXCRzeXNfcGFyYW1zXHMqPVxzKkAqZmlsZV9nZXRfY29udGVudHMiO2k6NzE7czozNToiZndyaXRlXHMqXChccypcJGZsd1xzKixccypcJGZsXHMqXCkiO2k6NzI7czo4NjoiZmlsZV9wdXRfY29udGVudHNccypcKFsnIl17MCwxfTFcLnR4dFsnIl17MCwxfVxzKixccypwcmludF9yXHMqXChccypcJF9QT1NUXHMqLFxzKnRydWUiO2k6NzM7czo4MDoiXCRoZWFkZXJzXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1oZWFkZXJzWyciXXswLDF9XF0iO2k6NzQ7czo0NDoiY3JlYXRlX2Z1bmN0aW9uXHMqXChbJyJdWyciXVxzKixccypzdHJfcm90MTMiO2k6NzU7czozMzoiZGllXHMqXChccypQSFBfT1NccypcLlxzKmNoclxzKlwoIjtpOjc2O3M6NTU6ImlmXHMqXChtZDVcKHRyaW1cKFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6Nzc7czo0NDoiZlxzKj1ccypcJHFccypcLlxzKlwkYVxzKlwuXHMqXCRiXHMqXC5ccypcJHgiO2k6Nzg7czo0MToiY29udGVudD1bJyJdezAsMX0xO1VSTD1jZ2ktYmluXC5odG1sXD9jbWQiO2k6Nzk7czo2MzoiXCR1cmxbJyJdezAsMX1ccypcLlxzKlwkc2Vzc2lvbl9pZFxzKlwuXHMqWyciXXswLDF9L2xvZ2luXC5odG1sIjtpOjgwO3M6NjQ6IlwkX1NFU1NJT05cW1snIl17MCwxfXNlc3Npb25fcGluWyciXXswLDF9XF1ccyo9XHMqWyciXXswLDF9XCRQSU4iO2k6ODE7czo0MjoiZnNvY2tvcGVuXHMqXChccypcJENvbm5lY3RBZGRyZXNzXHMqLFxzKjI1IjtpOjgyO3M6NDc6ImVjaG9ccytcJGlmdXBsb2FkPVsnIl17MCwxfVxzKkl0c09rXHMqWyciXXswLDF9IjtpOjgzO3M6Nzc6InByZWdfbWF0Y2hcKFsnIl0vXCh5YW5kZXhcfGdvb2dsZVx8Ym90XCkvaVsnIl0sXHMqZ2V0ZW52XChbJyJdSFRUUF9VU0VSX0FHRU5UIjtpOjg0O3M6NTI6IlwkbWFpbGVyXHMqPVxzKlwkX1BPU1RcW1snIl17MCwxfXhfbWFpbGVyWyciXXswLDF9XF0iO2k6ODU7czo1NzoiXCRPT08wTzBPMDA9X19GSUxFX187XHMqXCRPTzAwTzAwMDBccyo9XHMqMHgxYjU0MDtccypldmFsIjtpOjg2O3M6MTI6IkJ5XHMrV2ViUm9vVCI7aTo4NztzOjgwOiJoZWFkZXJcKFsnIl17MCwxfXM6XHMqWyciXXswLDF9XHMqXC5ccypwaHBfdW5hbWVccypcKFxzKlsnIl17MCwxfW5bJyJdezAsMX1ccypcKSI7aTo4ODtzOjczOiJtb3ZlX3VwbG9hZGVkX2ZpbGVcKFwkX0ZJTEVTXFtbJyJdezAsMX1lbGlmWyciXXswLDF9XF1cW1snIl17MCwxfXRtcF9uYW1lIjtpOjg5O3M6NjI6IlwkZ3ppcFxzKj1ccypAKmd6aW5mbGF0ZVxzKlwoXHMqQCpzdWJzdHJccypcKFxzKlwkZ3plbmNvZGVfYXJnIjtpOjkwO3M6ODM6ImlmXHMqXChccyptYWlsXHMqXChccypcJG1haWxzXFtcJGlcXVxzKixccypcJHRlbWFccyosXHMqYmFzZTY0X2VuY29kZVxzKlwoXHMqXCR0ZXh0IjtpOjkxO3M6ODQ6ImZ3cml0ZVxzKlwoXHMqXCRmaFxzKixccypzdHJpcHNsYXNoZXNccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5MjtzOjk0OiJlY2hvXHMrZmlsZV9nZXRfY29udGVudHNccypcKFxzKmJhc2U2NF91cmxfZGVjb2RlXHMqXChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjkzO3M6NjA6ImlmXHMqXChccypAKm1kNVxzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5NDtzOjk5OiJjaHJccypcKFxzKjEwMVxzKlwpXHMqXC5ccypjaHJccypcKFxzKjExOFxzKlwpXHMqXC5ccypjaHJccypcKFxzKjk3XHMqXClccypcLlxzKmNoclxzKlwoXHMqMTA4XHMqXCkiO2k6OTU7czoxNTI6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXChccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVxzKlwpIjtpOjk2O3M6NzU6IlwkcmVzdWx0RlVMXHMqPVxzKnN0cmlwY3NsYXNoZXNccypcKFxzKlwkX1BPU1RcW1snIl17MCwxfXJlc3VsdEZVTFsnIl17MCwxfSI7aTo5NztzOjE1OiIvdXNyL3NiaW4vaHR0cGQiO2k6OTg7czozMjoiUFJJVk1TR1wuXCo6XC5vd25lclxcc1wrXChcLlwqXCkiO2k6OTk7czo4MzoicHJpbnRccytcJHNvY2tccytbJyJdezAsMX1OSUNLIFsnIl17MCwxfVxzK1wuXHMrXCRuaWNrXHMrXC5ccytbJyJdezAsMX1cXG5bJyJdezAsMX0iO2k6MTAwO3M6ODA6IlwkdXJsXHMqPVxzKlwkdXJsXHMqXC5ccypbJyJdezAsMX1cP1snIl17MCwxfVxzKlwuXHMqaHR0cF9idWlsZF9xdWVyeVwoXCRxdWVyeVwpIjtpOjEwMTtzOjEyMzoicHJlZ19tYXRjaF9hbGxcKFsnIl17MCwxfS88YSBocmVmPSJcXC91cmxcXFw/cT1cKFwuXCtcP1wpXFsmXHwiXF1cKy9pc1snIl17MCwxfSwgXCRwYWdlXFtbJyJdezAsMX1leGVbJyJdezAsMX1cXSwgXCRsaW5rc1wpIjtpOjEwMjtzOjEwMToiPHNjcmlwdFxzK2xhbmd1YWdlPVsnIl17MCwxfUphdmFTY3JpcHRbJyJdezAsMX0+XHMqcGFyZW50XC53aW5kb3dcLm9wZW5lclwubG9jYXRpb25ccyo9XHMqWyciXWh0dHA6Ly8iO2k6MTAzO3M6Nzc6IlwkcFxzKj1ccypzdHJwb3NccypcKFxzKlwkdHhccyosXHMqWyciXXswLDF9eyNbJyJdezAsMX1ccyosXHMqXCRwMlxzKlwrXHMqMlwpIjtpOjEwNDtzOjE1OiJcKG1zaWVcfG9wZXJhXCkiO2k6MTA1O3M6NDk6IlJld3JpdGVDb25kXHMqJXtIVFRQX1VTRVJfQUdFTlR9XHMqXC5cKm5kcm9pZFwuXCoiO2k6MTA2O3M6OTk6ImlmXHMqXChccyppc19kaXJccypcKFxzKlwkRnVsbFBhdGhccypcKVxzKlwpXHMqQWxsRGlyXHMqXChccypcJEZ1bGxQYXRoXHMqLFxzKlwkRmlsZXNccypcKTtccyp9XHMqfSI7aToxMDc7czoxNjc6IlsnIl17MCwxfUZyb206XHMqWyciXXswLDF9XC5cJF9QT1NUXFtbJyJdezAsMX1yZWFsbmFtZVsnIl17MCwxfVxdXC5bJyJdezAsMX0gWyciXXswLDF9XC5bJyJdezAsMX0gPFsnIl17MCwxfVwuXCRfUE9TVFxbWyciXXswLDF9ZnJvbVsnIl17MCwxfVxdXC5bJyJdezAsMX0+XFxuWyciXXswLDF9IjtpOjEwODtzOjUzOiI8IS0tI2V4ZWNccytjbWQ9WyciXXswLDF9XCRIVFRQX0FDQ0VQVFsnIl17MCwxfVxzKi0tPiI7aToxMDk7czoyNjoiXFstXF1ccytDb25uZWN0aW9uXHMrZmFpbGQiO2k6MTEwO3M6NjM6ImlmXCgvXF5cXDpcJG93bmVyIVwuXCpcXEBcLlwqUFJJVk1TR1wuXCo6XC5tc2dmbG9vZFwoXC5cKlwpL1wpeyI7aToxMTE7czozNDoicHJpbnRccypcJHNvY2sgIlBSSVZNU0cgIlwuXCRvd25lciI7aToxMTI7czo2NDoiXF09WyciXXswLDF9aXBbJyJdezAsMX1ccyo7XHMqaWZccypcKFxzKmlzc2V0XHMqXChccypcJF9TRVJWRVJcWyI7aToxMTM7czo1MToiXF1ccyp9XHMqPVxzKnRyaW1ccypcKFxzKmFycmF5X3BvcFxzKlwoXHMqXCR7XHMqXCR7IjtpOjExNDtzOjMwOiJwcmludFwoIiNccytpbmZvXHMrT0tcXG5cXG4iXCkiO2k6MTE1O3M6MTEyOiJcJHVzZXJfYWdlbnRccyo9XHMqcHJlZ19yZXBsYWNlXHMqXChccypbJyJdXHxVc2VyXFxcLkFnZW50XFw6XFtcXHMgXF1cP1x8aVsnIl1ccyosXHMqWyciXVsnIl1ccyosXHMqXCR1c2VyX2FnZW50IjtpOjExNjtzOjcxOiJcJHBccyo9XHMqc3RycG9zXChcJHR4XHMqLFxzKlsnIl17MCwxfXsjWyciXXswLDF9XHMqLFxzKlwkcDJccypcK1xzKjJcKSI7aToxMTc7czo5MjoiY3JlYXRlX2Z1bmN0aW9uXHMqXChccypbJyJdXCRtWyciXVxzKixccypbJyJdaWZccypcKFxzKlwkbVxzKlxbXHMqMHgwMVxzKlxdXHMqPT1ccypbJyJdTFsnIl0iO2k6MTE4O3M6ODk6IlwkbGV0dGVyXHMqPVxzKnN0cl9yZXBsYWNlXHMqXChccypcJEFSUkFZXFswXF1cW1wkalxdXHMqLFxzKlwkYXJyXFtcJGluZFxdXHMqLFxzKlwkbGV0dGVyIjtpOjExOTtzOjk6IklySXNUXC5JciI7aToxMjA7czo0NjoiaWZccypcKGRldGVjdF9tb2JpbGVfZGV2aWNlXChcKVwpXHMqe1xzKmhlYWRlciI7aToxMjE7czozMjoiXCRwb3N0XHMqPVxzKlsnIl1cXHg3N1xceDY3XFx4NjUiO2k6MTIyO3M6Mjc6ImVjaG9ccypbJyJdYW5zd2VyPWVycm9yWyciXSI7aToxMjM7czozNDoidXJsPTxcP3BocFxzKmVjaG9ccypcJHJhbmRfdXJsO1w/PiI7aToxMjQ7czo0NToiaWZcKENoZWNrSVBPcGVyYXRvclwoXClccyomJlxzKiFpc01vZGVtXChcKVwpIjtpOjEyNTtzOjU5OiJzdHJwb3NcKFwkdWEsXHMqWyciXXswLDF9eWFuZGV4Ym90WyciXXswLDF9XClccyohPT1ccypmYWxzZSI7aToxMjY7czoxMzQ6ImlmXHMqXChcJGtleVxzKiE9XHMqWyciXXswLDF9bWFpbF90b1snIl17MCwxfVxzKiYmXHMqXCRrZXlccyohPVxzKlsnIl17MCwxfXNtdHBfc2VydmVyWyciXXswLDF9XHMqJiZccypcJGtleVxzKiE9XHMqWyciXXswLDF9c210cF9wb3J0IjtpOjEyNztzOjUyOiJlY2hvWyciXXswLDF9PGNlbnRlcj48Yj5Eb25lXHMqPT0+XHMqXCR1c2VyZmlsZV9uYW1lIjtpOjEyODtzOjE1OiJbJyJdZS9cKlwuL1snIl0iO2k6MTI5O3M6Mjg6ImFzc2VydFxzKlwoXHMqQCpzdHJpcHNsYXNoZXMiO2k6MTMwO3M6NTE6IlwpXHMqXC5ccypzdWJzdHJccypcKFxzKm1kNVxzKlwoXHMqc3RycmV2XHMqXChccypcJCI7aToxMzE7czo2NToiXCRmbFxzKj1ccyoiPG1ldGEgaHR0cC1lcXVpdj1cXCJSZWZyZXNoXFwiXHMrY29udGVudD1cXCIwO1xzKlVSTD0iO2k6MTMyO3M6OTA6IixccyphcnJheVxzKlwoJ1wuJywnXC5cLicsJ1RodW1ic1wuZGInXClccypcKVxzKlwpXHMqe1xzKmNvbnRpbnVlO1xzKn1ccyppZlxzKlwoXHMqaXNfZmlsZSI7aToxMzM7czo4MzoiaWZccypcKFxzKlwkZGF0YVNpemVccyo8XHMqQk9UQ1JZUFRfTUFYX1NJWkVccypcKVxzKnJjNFxzKlwoXHMqXCRkYXRhLFxzKlwkY3J5cHRrZXkiO2k6MTM0O3M6MTc4OiJpZlxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cGF0aFsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1bJyJdezAsMX1ccypcKVxzKntccypcJHVwbG9hZGZpbGVccyo9XHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9bmFtZVsnIl17MCwxfVxzKlxdIjtpOjEzNTtzOjk5OiJpZlxzKlwoXHMqZndyaXRlXHMqXChccypcJGhhbmRsZVxzKixccypmaWxlX2dldF9jb250ZW50c1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTM2O3M6ODk6ImFycmF5X2tleV9leGlzdHNccypcKFxzKlwkZmlsZVJhc1xzKixccypcJGZpbGVUeXBlXClccypcP1xzKlwkZmlsZVR5cGVcW1xzKlwkZmlsZVJhc1xzKlxdIjtpOjEzNztzOjY1OiJ1cmxlbmNvZGVcKHByaW50X3JcKGFycmF5XChcKSwxXClcKSw1LDFcKVwuY1wpLFwkY1wpO31ldmFsXChcJGRcKSI7aToxMzg7czo0NDoiaWZccypcKFxzKmZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqJ3BjbnRsX2ZvcmsiO2k6MTM5O3M6NDM6ImZpbmRccysvXHMrLXR5cGVccytmXHMrLXBlcm1ccystMDQwMDBccystbHMiO2k6MTQwO3M6NzE6ImV4ZWNsXChbJyJdL2Jpbi9zaFsnIl1ccyosXHMqWyciXS9iaW4vc2hbJyJdXHMqLFxzKlsnIl0taVsnIl1ccyosXHMqMFwpIjtpOjE0MTtzOjQxOiJmdW5jdGlvblxzK2luamVjdFwoXCRmaWxlLFxzKlwkaW5qZWN0aW9uPSI7aToxNDI7czozODoiZmNsb3NlXChcJGZcKTtccyplY2hvXHMqWyciXW9cLmtcLlsnIl0iO2k6MTQzO3M6OTI6InByZWdfcmVwbGFjZVxzKlwoXHMqXCRleGlmXFtccypcXFsnIl1NYWtlXFxbJyJdXHMqXF1ccyosXHMqXCRleGlmXFtccypcXFsnIl1Nb2RlbFxcWyciXVxzKlxdIjtpOjE0NDtzOjcyOiJcXmRvd25sb2Fkcy9cKFxbMC05XF1cKlwpL1woXFswLTlcXVwqXCkvXCRccytkb3dubG9hZHNcLnBocFw/Yz1cJDEmcD1cJDIiO2k6MTQ1O3M6ODE6IlwkcmVzPW15c3FsX3F1ZXJ5XChbJyJdezAsMX1TRUxFQ1RccytcKlxzK0ZST01ccytgd2F0Y2hkb2dfb2xkXzA1YFxzK1dIRVJFXHMrcGFnZSI7aToxNDY7czo1MjoiUmV3cml0ZVJ1bGVccytcLlwqXHMraW5kZXhcLnBocFw/dXJsPVwkMFxzK1xbTCxRU0FcXSI7aToxNDc7czoxMDA6IklPOjpTb2NrZXQ6OklORVQtPm5ld1woUHJvdG9ccyo9PlxzKiJ0Y3AiXHMqLFxzKkxvY2FsUG9ydFxzKj0+XHMqMzYwMDBccyosXHMqTGlzdGVuXHMqPT5ccypTT01BWENPTk4iO2k6MTQ4O3M6Mzk6ImV2YWxccypcKCpccypzdHJyZXZccypcKCpccypzdHJfcmVwbGFjZSI7aToxNDk7czoyMTM6IkAqbW92ZV91cGxvYWRlZF9maWxlXHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkc2VjdXJpdHlfY29kZVxzKlwuXHMqIi8iXHMqXC5ccypcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKSI7aToxNTA7czo4MjoiXCRVUkxccyo9XHMqXCR1cmxzXFtccypyYW5kXChccyowXHMqLFxzKmNvdW50XHMqXChccypcJHVybHNccypcKVxzKi1ccyoxXHMqXClccypcXSI7aToxNTE7czoyMzI6Imlzc2V0XHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9eFsnIl17MCwxfVxzKlxdXHMqXClccypcP1xzKlwoXHMqaXNfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfXhbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKlwpXHMqXD9ccypcKFxzKmNvcHlccypcKFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX14WyciXXswLDF9XHMqXF0iO2k6MTUyO3M6ODc6ImlmXHMqXChccypcJGlccyo8XHMqXChccypjb3VudFxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cVsnIl17MCwxfVxzKlxdXHMqXClccyotXHMqMSI7aToxNTM7czo3MDoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypBRE1JTl9SRURJUl9VUkxccyosXHMqZmFsc2VccyosXHMqXCRjdHhccypcKSI7aToxNTQ7czoxMjoidG1oYXBiemNlcmZmIjtpOjE1NTtzOjk3OiJjb250ZW50PVsnIl17MCwxfW5vLWNhY2hlWyciXXswLDF9O1xzKlwkY29uZmlnXFtbJyJdezAsMX1kZXNjcmlwdGlvblsnIl17MCwxfVxdXHMqXC49XHMqWyciXXswLDF9IjtpOjE1NjtzOjc0OiJjbGVhcnN0YXRjYWNoZVwoXHMqXCk7XHMqaWZccypcKFxzKiFpc19kaXJccypcKFxzKlwkZmxkXHMqXClccypcKVxzKnJldHVybiI7aToxNTc7czo5NzoiXCRyQnVmZkxlblxzKj1ccypvcmRccypcKFxzKlZDX0RlY3J5cHRccypcKFxzKmZyZWFkXHMqXChccypcJGlucHV0LFxzKjFccypcKVxzKlwpXHMqXClccypcKlxzKjI1NiI7aToxNTg7czo5OiJJclNlY1RlYW0iO2k6MTU5O3M6NzM6IkBoZWFkZXJcKFsnIl1Mb2NhdGlvbjpccypbJyJdXC5bJyJdaFsnIl1cLlsnIl10WyciXVwuWyciXXRbJyJdXC5bJyJdcFsnIl0iO2k6MTYwO3M6Njc6InNldF90aW1lX2xpbWl0XHMqXChccyowXHMqXCk7XHMqaWZccypcKCFTZWNyZXRQYWdlSGFuZGxlcjo6Y2hlY2tLZXkiO2k6MTYxO3M6MTA2OiJyZXR1cm5ccypcKFxzKnN0cnN0clxzKlwoXHMqXCRzXHMqLFxzKidlY2hvJ1xzKlwpXHMqPT1ccypmYWxzZVxzKlw/XHMqXChccypzdHJzdHJccypcKFxzKlwkc1xzKixccyoncHJpbnQnIjtpOjE2MjtzOjc1OiJ0aW1lXChcKVxzKlwrXHMqMTAwMDBccyosXHMqWyciXS9bJyJdXCk7XHMqZWNob1xzK1wkbV96ejtccypldmFsXHMqXChcJG1fenoiO2k6MTYzO3M6MTQ1OiJpZlwoIWVtcHR5XChcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKVxzK0FORFxzK1wobWQ1XChcJF9QT1NUXFtbJyJdezAsMX1uaWNrWyciXXswLDF9XF1cKVxzKj09XHMqWyciXXswLDF9IjtpOjE2NDtzOjQ3OiJzdHJfcm90MTNccypcKFxzKmd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNjU7czo1MDoiZ3p1bmNvbXByZXNzXHMqXChccypzdHJfcm90MTNccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTY2O3M6NTA6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2NztzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cl9yb3QxM1xzKlwoXHMqc3RycmV2IjtpOjE2ODtzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldlxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2OTtzOjQ0OiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldiI7aToxNzA7czo2ODoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTcxO3M6NTQ6ImJhc2U2NF9kZWNvZGVccypcKFxzKmd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNzI7czo0NzoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTczO3M6NDc6Imd6aW5mbGF0ZVxzKlwoXHMqc3RyX3JvdDEzXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjE3NDtzOjE3OiJCcmF6aWxccytIYWNrVGVhbSI7aToxNzU7czo2MDoiXCR0bGRccyo9XHMqYXJyYXlccypcKFxzKlsnIl1jb21bJyJdLFsnIl1vcmdbJyJdLFsnIl1uZXRbJyJdIjtpOjE3NjtzOjQ1OiJkZWZpbmVccypcKCpccypbJyJdU0JDSURfUkVRVUVTVF9GSUxFWyciXVxzKiwiO2k6MTc3O3M6MzQ6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl0vXC5cKy9lc2kiO2k6MTc4O3M6MTc6Ik15c3RlcmlvdXNccytXaXJlIjtpOjE3OTtzOjUxOiJcJGhlYWRlcnNccypcLj1ccypcJF9QT1NUXFtccypbJyJdZU1haWxBZGRbJyJdXHMqXF0iO2k6MTgwO3M6MzM6ImRlZmluZVxzKlwoXHMqWyciXURFRkNBTExCQUNLTUFJTCI7aToxODE7czo0NzoiZGVmYXVsdF9hY3Rpb25ccyo9XHMqWyciXXswLDF9RmlsZXNNYW5bJyJdezAsMX0iO2k6MTgyO3M6Mzg6ImVjaG9ccytAZmlsZV9nZXRfY29udGVudHNccypcKFxzKlwkZ2V0IjtpOjE4MztzOjE1NjoiaWZccypcKFxzKnN0cmlwb3NccypcKFxzKlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF1ccyosXHMqWyciXXswLDF9QW5kcm9pZFsnIl17MCwxfVwpXHMqIT09ZmFsc2VccyomJlxzKiFcJF9DT09LSUVcW1snIl17MCwxfWRsZV91c2VyX2lkIjtpOjE4NDtzOjYwOiJoZWFkZXJccypcKFsnIl1Mb2NhdGlvbjpccypbJyJdXHMqXC5ccypcJHRvXHMqXC5ccyp1cmxkZWNvZGUiO2k6MTg1O3M6MTA6IkRjMFJIYVsnIl0iO2k6MTg2O3M6MzY6IiF0b3VjaFwoWyciXXswLDF9XC5cLi9cLlwuL2xhbmd1YWdlLyI7aToxODc7czozODoiZXZhbFwoXHMqc3RyaXBzbGFzaGVzXChccypcXFwkX1JFUVVFU1QiO2k6MTg4O3M6Nzg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqWyciXXswLDF9PHNjcmlwdFxzK3NyYz1bJyJdezAsMX1odHRwOi8vPFw/PVwkZG9tYWluXD8+LyI7aToxODk7czo4NToiZXhpdFxzKlwoXHMqWyciXXswLDF9PHNjcmlwdD5ccypzZXRUaW1lb3V0XHMqXChccypcXFsnIl17MCwxfWRvY3VtZW50XC5sb2NhdGlvblwuaHJlZiI7aToxOTA7czoyNToiZnVuY3Rpb25ccytzcWwyX3NhZmVccypcKCI7aToxOTE7czo0MToiXCRwb3N0UmVzdWx0XHMqPVxzKmN1cmxfZXhlY1xzKlwoKlxzKlwkY2giO2k6MTkyO3M6ODc6IiYmXHMqZnVuY3Rpb25fZXhpc3RzXHMqXCgqXHMqWyciXXswLDF9Z2V0bXhyclsnIl17MCwxfVwpXHMqXClccyp7XHMqQGdldG14cnJccypcKCpccypcJCI7aToxOTM7czo1NzoiaXNfX3dyaXRhYmxlXHMqXCgqXHMqXCRwYXRoXHMqXC5ccyp1bmlxaWRccypcKCpccyptdF9yYW5kIjtpOjE5NDtzOjI4OiJmaWxlX3B1dF9jb250ZW50elxzKlwoKlxzKlwkIjtpOjE5NTtzOjU1OiJAKmd6aW5mbGF0ZVxzKlwoXHMqQCpiYXNlNjRfZGVjb2RlXHMqXChccypAKnN0cl9yZXBsYWNlIjtpOjE5NjtzOjEwNToiZm9wZW5ccypcKCpccypbJyJdaHR0cDovL1snIl1ccypcLlxzKlwkY2hlY2tfZG9tYWluXHMqXC5ccypbJyJdOjgwWyciXVxzKlwuXHMqXCRjaGVja19kb2NccyosXHMqWyciXXJbJyJdIjtpOjE5NztzOjQzOiJAXCRfQ09PS0lFXFtbJyJdezAsMX1zdGF0Q291bnRlclsnIl17MCwxfVxdIjtpOjE5ODtzOjM1OiJpZlxzKlwoKlxzKkAqcHJlZ19tYXRjaFxzKlwoKlxzKnN0ciI7aToxOTk7czo5NDoiYXJyYXlfcG9wXHMqXCgqXHMqXCR3b3JrUmVwbGFjZVxzKixccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKixccypcJGNvdW50S2V5c05ldyI7aToyMDA7czo1NDoiKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl1fX19bJyJdXHMqIjtpOjIwMTtzOjIzOiJcKFxzKlsnIl1JTlNIRUxMWyciXVxzKiI7aToyMDI7czo0NzoiXCRiXHMqXC5ccypcJHBccypcLlxzKlwkaFxzKlwuXHMqXCRrXHMqXC5ccypcJHYiO2k6MjAzO3M6ODg6Ij1ccypwcmVnX3NwbGl0XHMqXChccypbJyJdL1xcLFwoXFwgXCtcKVw/L1snIl0sXHMqQCppbmlfZ2V0XHMqXChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnMiO2k6MjA0O3M6MTAxOiJpZlxzKlwoIWZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqWyciXXBvc2l4X2dldHB3dWlkWyciXVxzKlwpXHMqJiZccyohaW5fYXJyYXlccypcKFxzKlsnIl1wb3NpeF9nZXRwd3VpZCI7aToyMDU7czoxMjM6InByZWdfcmVwbGFjZVxzKlwoXHMqWyciXS9cXlwod3d3XHxmdHBcKVxcXC4vaVsnIl1ccyosXHMqWyciXVsnIl0sXHMqQFwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XHMqXF1ccypcKSI7aToyMDY7czoyNjE6ImlmXHMqXCgqXHMqaXNzZXRccypcKCpccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9W2EtekEtWl8wLTldK1snIl17MCwxfVxzKlxdXHMqXCkqXHMqXClccyp7XHMqXCRbYS16QS1aXzAtOV0rXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1bYS16QS1aXzAtOV0rWyciXXswLDF9XHMqXF07XHMqZXZhbFxzKlwoKlxzKlwkW2EtekEtWl8wLTldK1xzKlwpKiI7aToyMDc7czo4MToiZXZhbFxzKlwoKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFwoKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjIwODtzOjEzOToiaWZccytcKFxzKnN0cnBvc1xzKlwoXHMqXCR1cmxccyosXHMqWyciXWpzL21vb3Rvb2xzXC5qc1snIl1ccypcKVxzKj09PVxzKmZhbHNlXHMrJiZccytzdHJwb3NccypcKFxzKlwkdXJsXHMqLFxzKlsnIl1qcy9jYXB0aW9uXC5qc1snIl17MCwxfSI7aToyMDk7czo2ODoiaWZccytcKCpccyptYWlsXHMqXChccypcJHJlY3BccyosXHMqXCRzdWJqXHMqLFxzKlwkc3R1bnRccyosXHMqXCRmcm0iO2k6MjEwO3M6NDM6IjxcP3BocFxzK1wkX0Zccyo9XHMqX19GSUxFX19ccyo7XHMqXCRfWFxzKj0iO2k6MjExO3M6Nzk6IlwkeFxkK1xzKj1ccypbJyJdLis/WyciXVxzKjtccypcJHhcZCtccyo9XHMqWyciXS4rP1snIl1ccyo7XHMqXCR4XGQrXHMqPVxzKlsnIl0iO2k6MjEyO3M6MTE1OiJcJGJlZWNvZGVccyo9QCpmaWxlX2dldF9jb250ZW50c1xzKlwoKlsnIl17MCwxfVxzKlwkdXJscHVyc1xzKlsnIl17MCwxfVwpKlxzKjtccyplY2hvXHMrWyciXXswLDF9XCRiZWVjb2RlWyciXXswLDF9IjtpOjIxMztzOjEwMToiXCRHTE9CQUxTXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxbXHMqXGQrXHMqXF1cKFxzKlwkX1xkK1xzKixccypfXGQrXHMqXChccypcZCtccypcKVxzKlwpXHMqXCkiO2k6MjE0O3M6NzM6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl17MCwxfS9cLlwqXFsuKz9cXVw/L2VbJyJdezAsMX1ccyosXHMqc3RyX3JlcGxhY2UiO2k6MjE1O3M6MTQ5OiJcJEdMT0JBTFNcW1snIl17MCwxfS4rP1snIl17MCwxfVxdPUFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKVxzKixccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKSI7aToyMTY7czoyMDA6IlVOSU9OXHMrU0VMRUNUXHMrWyciXXswLDF9MFsnIl17MCwxfVxzKixccypbJyJdezAsMX08XD8gc3lzdGVtXChcXFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtjcGNcXVwpO2V4aXQ7XHMqXD8+WyciXXswLDF9XHMqLFxzKjBccyosMFxzKixccyowXHMqLFxzKjBccytJTlRPXHMrT1VURklMRVxzK1snIl17MCwxfVwkWyciXXswLDF9IjtpOjIxNztzOjY2OiJpc3NldFxzKlwoKlxzKlwkX1BPU1RccypcW1xzKlsnIl17MCwxfWV4ZWNnYXRlWyciXXswLDF9XHMqXF1ccypcKSoiO2k6MjE4O3M6NzE6ImZ3cml0ZVxzKlwoKlxzKlwkZnBzZXR2XHMqLFxzKmdldGVudlxzKlwoXHMqWyciXUhUVFBfQ09PS0lFWyciXVxzKlwpXHMqIjtpOjIxOTtzOjI2OiJzeW1saW5rXHMqXCgqXHMqWyciXS9ob21lLyI7aToyMjA7czo3MDoiZnVuY3Rpb25ccyt1cmxHZXRDb250ZW50c1xzKlwoKlxzKlwkdXJsXHMqLFxzKlwkdGltZW91dFxzKj1ccypcZCtccypcKSI7aToyMjE7czo0OToic3RycmV2XCgqXHMqWyciXXswLDF9ZWRvY2VkXzQ2ZXNhYlsnIl17MCwxfVxzKlwpKiI7aToyMjI7czo0Mjoic3RycmV2XCgqXHMqWyciXXswLDF9dHJlc3NhWyciXXswLDF9XHMqXCkqIjtpOjIyMztzOjIwOiJleGVjXHMqXChccypbJyJdaXBmdyI7aToyMjQ7czoxMzY6IndwX3Bvc3RzXHMrV0hFUkVccytwb3N0X3R5cGVccyo9XHMqWyciXXswLDF9cG9zdFsnIl17MCwxfVxzK0FORFxzK3Bvc3Rfc3RhdHVzXHMqPVxzKlsnIl17MCwxfXB1Ymxpc2hbJyJdezAsMX1ccytPUkRFUlxzK0JZXHMrYElEYFxzK0RFU0MiO2k6MjI1O3M6MTEyOiJmaWxlX2dldF9jb250ZW50c1xzKlwoKlxzKnRyaW1ccypcKFxzKlwkLis/XFtcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9Lis/WyciXXswLDF9XF1cXVwpXCk7IjtpOjIyNjtzOjIxMzoiaXNfY2FsbGFibGVccypcKCpccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVwpKlxzK2FuZFxzKyFpbl9hcnJheVxzKlwoKlxzKlsnIl17MCwxfShmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pWyciXXswLDF9XHMqLFxzKlwkZGlzYWJsZWZ1bmNzIjtpOjIyNztzOjI0OiJcJEdMT0JBTFNcW1snIl17MCwxfV9fX18iO2k6MjI4O3M6NDM6ImZvcGVuXHMqXCgqXHMqWyciXXswLDF9L2V0Yy9wYXNzd2RbJyJdezAsMX0iO2k6MjI5O3M6NTk6ImV2YWxccypcKCpAKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFxzKlwoKlxzKkAqXCRfIjtpOjIzMDtzOjQxOiJldmFsXHMqXCgqQCpccypzdHJpcHNsYXNoZXNccypcKCpccypAKlwkXyI7aToyMzE7czo3NDoiQCpzZXRjb29raWVccypcKCpccypbJyJdezAsMX1oaXRbJyJdezAsMX0sXHMqMVxzKixccyp0aW1lXHMqXCgqXHMqXCkqXHMqXCsiO2k6MjMyO3M6MzY6ImV2YWxccypcKCpccypmaWxlX2dldF9jb250ZW50c1xzKlwoKiI7aToyMzM7czo0NjoicHJlZ19yZXBsYWNlXHMqXCgqXHMqWyciXXswLDF9L1wuXCovZVsnIl17MCwxfSI7aToyMzQ7czo4MToiXHMqe1xzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqXF1ccyp9IjtpOjIzNTtzOjEzNToiWyciXXswLDF9aHR0cGRcLmNvbmZbJyJdezAsMX1ccyosXHMqWyciXXswLDF9dmhvc3RzXC5jb25mWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNmZ1wucGhwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNvbmZpZ1wucGhwWyciXXswLDF9IjtpOjIzNjtzOjMzOiJwcm9jX29wZW5ccypcKFxzKlsnIl17MCwxfUlIU3RlYW0iO2k6MjM3O3M6ODg6IlwkaW5pXHMqXFtccypbJyJdezAsMX11c2Vyc1snIl17MCwxfVxzKlxdXHMqPVxzKmFycmF5XHMqXChccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqPT4iO2k6MjM4O3M6ODg6ImN1cmxfc2V0b3B0XHMqXChccypcJGNoXHMqLFxzKkNVUkxPUFRfVVJMXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly9cJGhvc3Q6XGQrWyciXXswLDF9XHMqXCkiO2k6MjM5O3M6NDU6InN5c3RlbVxzKlwoKlxzKlsnIl17MCwxfXdob2FtaVsnIl17MCwxfVxzKlwpKiI7aToyNDA7czo1MjoiZmluZFxzKy9ccystbmFtZVxzK1wuc3NoXHMrPlxzK1wkZGlyL3NzaGtleXMvc3Noa2V5cyI7aToyNDE7czo1MjoiYXNzZXJ0XHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyNDI7czo1MDoiZXZhbFxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MjQzO3M6MjU6InBocFxzKyJccypcLlxzKlwkd3NvX3BhdGgiO2k6MjQ0O3M6ODk6IkAqYXNzZXJ0XHMqXCgqXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfS4rP1snIl17MCwxfVxzKlxdXHMqIjtpOjI0NTtzOjIxOiJldmExW2EtekEtWjAtOV9dKz9TaXIiO2k6MjQ2O3M6OTM6IlwkY21kXHMqPVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9Lis/WyciXXswLDF9XHMqXF1ccypcKSI7aToyNDc7czo5NjoiXCRmdW5jdGlvblxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfWNtZFsnIl17MCwxfVxzKlxdXHMqXCkqIjtpOjI0ODtzOjIzOiJcJGZlXCgiXCRjbWRccysyPiYxIlwpOyI7aToyNDk7czoxNDE6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdXCRjbWRccysxPlxzKi90bXAvY21kdGVtcFxzKzI+JjE7XHMqY2F0XHMrL3RtcC9jbWR0ZW1wO1xzKnJtXHMrL3RtcC9jbWR0ZW1wWyciXVwpOyI7aToyNTA7czo1Mzoic2V0Y29va2llXCgqXHMqWyciXW15c3FsX3dlYl9hZG1pbl91c2VybmFtZVsnIl1ccypcKSoiO2k6MjUxO3M6ODY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXVuYW1lXHMrLWFbJyJdXHMqXCkqIjtpOjI1MjtzOjEyNDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypAKlwkX1BPU1RccypcW1xzKlsnIl0uKz9bJyJdXHMqXF1ccypcLlxzKiJccyoyXHMqPlxzKiYxXHMqWyciXSI7aToyNTM7czo0OToiIUAqXCRfUkVRVUVTVFxzKlxbXHMqWyciXWM5OXNoX3N1cmxbJyJdXHMqXF1ccypcKSI7aToyNTQ7czozNzoiXCRsb2dpblxzKj1ccypAKnBvc2l4X2dldHVpZFwoKlxzKlwpKiI7aToyNTU7czozMToibmNmdHBwdXRccyotdVxzKlwkZnRwX3VzZXJfbmFtZSI7aToyNTY7czo4MjoicnVuY29tbWFuZFxzKlwoXHMqWyciXXNoZWxsaGVscFsnIl1ccyosXHMqWyciXShHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpWyciXSI7aToyNTc7czo1NToie1xzKlwkXHMqe1xzKnBhc3N0aHJ1XHMqXCgqXHMqXCRjbWRccypcKVxzKn1ccyp9XHMqPGJyPiI7aToyNTg7czo1ODoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypcXFsnIl1IVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyNTk7czo1NjoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypbJyJdSFRUUF9BQ0NFUFRfTEFOR1VBR0UiO2k6MjYwO3M6ODc6IlNFTEVDVFxzKzFccytGUk9NXHMrbXlzcWxcLnVzZXJccytXSEVSRVxzK2NvbmNhdFwoXHMqYHVzZXJgXHMqLFxzKidAJ1xzKixccypgaG9zdGBccypcKSI7aToyNjE7czo5NzoiXCRNZXNzYWdlU3ViamVjdFxzKj1ccypiYXNlNjRfZGVjb2RlXHMqXChccypcJF9QT1NUXHMqXFtccypbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XHMqXF1ccypcKSI7aToyNjI7czo0NzoicmVuYW1lXHMqXChccypccypbJyJdezAsMX13c29cLnBocFsnIl17MCwxfVxzKiwiO2k6MjYzO3M6NzQ6ImZpbGVwYXRoXHMqPVxzKkAqcmVhbHBhdGhccypcKFxzKlwkX1BPU1RccypcW1xzKlsnIl1maWxlcGF0aFsnIl1ccypcXVxzKlwpIjtpOjI2NDtzOjc4OiJmaWxlcGF0aFxzKj1ccypAKnJlYWxwYXRoXHMqXChccypcJF9QT1NUXHMqXFtccypcXFsnIl1maWxlcGF0aFxcWyciXVxzKlxdXHMqXCkiO2k6MjY1O3M6NDA6ImV2YWxccypcKCpccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8iO2k6MjY2O3M6MTA3OiJ3c29FeFxzKlwoXHMqXFxbJyJdXHMqdGFyXHMqY2Z6dlxzKlxcWyciXVxzKlwuXHMqZXNjYXBlc2hlbGxhcmdccypcKFxzKlwkX1BPU1RcW1xzKlxcWyciXXAyXFxbJyJdXHMqXF1ccypcKSI7aToyNjc7czo3NDoiV1NPc2V0Y29va2llXHMqXChccyptZDVccypcKFxzKkAqXCRfU0VSVkVSXFtccypbJyJdSFRUUF9IT1NUWyciXVxzKlxdXHMqXCkiO2k6MjY4O3M6Nzg6IldTT3NldGNvb2tpZVxzKlwoXHMqbWQ1XHMqXChccypAKlwkX1NFUlZFUlxbXHMqXFxbJyJdSFRUUF9IT1NUXFxbJyJdXHMqXF1ccypcKSI7aToyNjk7czoxNzA6IlwkaW5mbyBcLj0gXChcKFwkcGVybXNccyomXHMqMHgwMDQwXClccypcP1woXChcJHBlcm1zXHMqJlxzKjB4MDgwMFwpXHMqXD9ccypcXFsnIl1zXFxbJyJdXHMqOlxzKlxcWyciXXhcXFsnIl1ccypcKVxzKjpcKFwoXCRwZXJtc1xzKiZccyoweDA4MDBcKVxzKlw/XHMqJ1MnXHMqOlxzKictJ1xzKlwpIjtpOjI3MDtzOjM1OiJkZWZhdWx0X2FjdGlvblxzKj1ccypcXFsnIl1GaWxlc01hbiI7aToyNzE7czozMzoic3lzdGVtXHMrZmlsZVxzK2RvXHMrbm90XHMrZGVsZXRlIjtpOjI3MjtzOjE5OiJoYWNrZWRccytieVxzK0htZWk3IjtpOjI3MztzOjExOiJieVxzK0dyaW5heSI7aToyNzQ7czoyMzoiQ2FwdGFpblxzK0NydW5jaFxzK1RlYW0iO2k6Mjc1O3M6OTY6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbJyJdezAsMX1wMlsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1jaG1vZFsnIl17MCwxfSI7fQ=="));
$gX_FlexDBShe unserialize(base64_decode("YToyNTI6e2k6MDtzOjIyOiJkaXNhYmxlX2Z1bmN0aW9ucz1OT05FIjtpOjE7czoyMToiJl9TRVNTSU9OXFtwYXlsb2FkXF09IjtpOjI7czoyNjoiPFw/XHMqPUBgXCRbYS16QS1aMC05X10rP2AiO2k6MztzOjE2OiJQSFBTSEVMTF9WRVJTSU9OIjtpOjQ7czo2OToidG91Y2hcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjU7czo4MToiZmlsZV9nZXRfY29udGVudHNcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjY7czo1NjoiQFwkX1NFUlZFUlxbXHMqSFRUUF9IT1NUXHMqXF0+WyciXVxzKlwuXHMqWyciXVxcclxcblsnIl0iO2k6NztzOjcxOiJ0cmltXChccypcJGhlYWRlcnNccypcKVxzKlwpXHMqYXNccypcJGhlYWRlclxzKlwpXHMqaGVhZGVyXChccypcJGhlYWRlciI7aTo4O3M6MTY6IkNvZGVkXHMrYnlccytFWEUiO2k6OTtzOjEyOiJCeVxzK1dlYlJvb1QiO2k6MTA7czoyMDoiaGVhZGVyXHMqXChccypfXGQrXCgiO2k6MTE7czo0MToiaWZccypcKGZ1bmN0aW9uX2V4aXN0c1woXHMqWyciXXBjbnRsX2ZvcmsiO2k6MTI7czoyOToiZG9fd29ya1woXHMqXCRpbmRleF9maWxlXHMqXCkiO2k6MTM7czo4MzoiXCRpZFxzKlwuXHMqWyciXVw/ZD1bJyJdXHMqXC5ccypiYXNlNjRfZW5jb2RlXChccypcJF9TRVJWRVJcW1xzKlsnIl1IVFRQX1VTRVJfQUdFTlQiO2k6MTQ7czoyNToibmV3XHMrY29uZWN0QmFzZVwoWyciXWFIUiI7aToxNTtzOjkwOiJmaWxlX2dldF9jb250ZW50c1woUk9PVF9ESVJcLlsnIl0vdGVtcGxhdGVzL1snIl1cLlwkY29uZmlnXFtbJyJdc2tpblsnIl1cXVwuWyciXS9tYWluXC50cGwiO2k6MTY7czo1OToiJTwhLS1cXHNcKlwkbWFya2VyXFxzXCotLT5cLlwrXD88IS0tXFxzXCovXCRtYXJrZXJcXHNcKi0tPiUiO2k6MTc7czoyNDoiZnVuY3Rpb25ccytnZXRmaXJzdHNodGFnIjtpOjE4O3M6MTg6InJlc3VsdHNpZ25fd2FybmluZyI7aToxOTtzOjI5OiJmaWxlX2V4aXN0c1woXHMqXCRGaWxlQmF6YVRYVCI7aToyMDtzOjE5OiI9PVxzKlsnIl1jc2hlbGxbJyJdIjtpOjIxO3M6NjE6IlwkX1NFUlZFUlxbWyciXXswLDF9UkVNT1RFX0FERFJbJyJdezAsMX1cXTtpZlwoXChwcmVnX21hdGNoXCgiO2k6MjI7czo2NzoiXCRmaWxlX2Zvcl90b3VjaFxzKj1ccypcJF9TRVJWRVJcW1snIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1cXSI7aToyMztzOjIzOiJcJGluZGV4X3BhdGhccyosXHMqMDQwNCI7aToyNDtzOjMwOiJyZWFkX2ZpbGVfbmV3XzJcKFwkcmVzdWx0X3BhdGgiO2k6MjU7czozODoiY2hyXChccypoZXhkZWNcKFxzKnN1YnN0clwoXHMqXCRtYWtldXAiO2k6MjY7czoyNzoiXGQrJkBwcmVnX21hdGNoXChccypzdHJ0clwoIjtpOjI3O3M6NzU6InZhbHVlPVsnIl08XD9ccysoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXSI7aToyODtzOjE4OiJBY2FkZW1pY29ccytSZXN1bHQiO2k6Mjk7czozMDoiU0VMRUNUXHMrXCpccytGUk9NXHMrZG9yX3BhZ2VzIjtpOjMwO3M6NDE6ImdfZGVsZXRlX29uX2V4aXRccyo9XHMqbmV3XHMrRGVsZXRlT25FeGl0IjtpOjMxO3M6NTI6ImlmXChwcmVnX21hdGNoXChbJyJdI3dvcmRwcmVzc19sb2dnZWRfaW5cfGFkbWluXHxwd2QiO2k6MzI7czo1MDoiWyciXVwuWyciXVsnIl1cLlsnIl1bJyJdXC5bJyJdWyciXVwuWyciXVsnIl1cLlsnIl0iO2k6MzM7czoyODoiXCk7ZnVuY3Rpb25ccytzdHJpbmdfY3B0XChcJCI7aTozNDtzOjI4OiJcJHNldGNvb2tcKTtzZXRjb29raWVcKFwkc2V0IjtpOjM1O3M6MzU6Ijxsb2M+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmw7IjtpOjM2O3M6NDA6IlwkYmFubmVkSVBccyo9XHMqYXJyYXlcKFxzKlsnIl1cXjY2XC4xMDIiO2k6Mzc7czo2MjoiXCRyZXN1bHQ9c21hcnRDb3B5XChccypcJHNvdXJjZVxzKlwuXHMqWyciXS9bJyJdXHMqXC5ccypcJGZpbGUiO2k6Mzg7czozODoiXCRmaWxsID0gXCRfQ09PS0lFXFtcXFsnIl1maWxsXFxbJyJdXF0iO2k6Mzk7czo4MzoiaWZcKFsnIl1zdWJzdHJfY291bnRcKFsnIl1cJF9TRVJWRVJcW1snIl1SRVFVRVNUX1VSSVsnIl1cXVxzKixccypbJyJdcXVlcnlcLnBocFsnIl0iO2k6NDA7czo4NToiaWZcKFxzKlwkX0dFVFxbXHMqWyciXWlkWyciXVxzKlxdIT1ccypbJyJdWyciXVxzKlwpXHMqXCRpZD1cJF9HRVRcW1xzKlsnIl1pZFsnIl1ccypcXSI7aTo0MTtzOjIyOiI8YVxzK2hyZWY9WyciXW9zaGlia2EtIjtpOjQyO3M6NzY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdY2RccysvdG1wO3dnZXQiO2k6NDM7czo1NToiZ2V0cHJvdG9ieW5hbWVcKFxzKlsnIl10Y3BbJyJdXHMqXClccytcfFx8XHMrZGllXHMrc2hpdCI7aTo0NDtzOjQ3OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRpbmRleF9wYXRoXHMqLFxzKlwkY29kZSI7aTo0NTtzOjY2OiIsXHMqWyciXS9pbmRleFxcXC5cKHBocFx8aHRtbFwpL2lbJyJdXHMqLFxzKlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3IiO2k6NDY7czoxMzoiQU9MXHMrRGV0YWlscyI7aTo0NztzOjIwOiJ0SEFOS3Nccyt0T1xzK1Nub3BweSI7aTo0ODtzOjIwOiJNYXNyMVxzK0N5YjNyXHMrVGU0bSI7aTo0OTtzOjE4OiJVczNccytZMHVyXHMrYnI0MW4iO2k6NTA7czoyMDoiTWFzcmlccytDeWJlclxzK1RlYW0iO2k6NTE7czo0OToiZndyaXRlXChcJGZwXHMqLFxzKnN0cnJldlwoXHMqXCRjb250ZXh0XHMqXClccypcKSI7aTo1MjtzOjk6Ii9wbXQvcmF2LyI7aTo1MztzOjM0OiJmaWxlX2dldF9jb250ZW50c1woXHMqWyciXS92YXIvdG1wIjtpOjU0O3M6MjM6IlwkaW5fUGVybXNccysmXHMrMHg0MDAwIjtpOjU1O3M6NDM6ImZvcGVuXChccypcJHJvb3RfZGlyXHMqXC5ccypbJyJdL1wuaHRhY2Nlc3MiO2k6NTY7czo2MjoiaW50MzJcKFwoXChcJHpccyo+PlxzKjVccyomXHMqMHgwN2ZmZmZmZlwpXHMqXF5ccypcJHlccyo8PFxzKjIiO2k6NTc7czozNToiPGd1aWQ+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmwiO2k6NTg7czoxOToiLWtseWNoLWstaWdyZVwuaHRtbCI7aTo1OTtzOjY2OiI8ZGl2XHMraWQ9WyciXWxpbmsxWyciXT48YnV0dG9uIG9uY2xpY2s9WyciXXByb2Nlc3NUaW1lclwoXCk7WyciXT4iO2k6NjA7czoxMToic2NvcGJpblsnIl0iO2k6NjE7czoxNDoiLUFwcGxlX1Jlc3VsdC0iO2k6NjI7czo0NzoidGFyXHMrLWN6ZlxzKyJccypcLlxzKlwkRk9STXt0YXJ9XHMqXC5ccyoiXC50YXIiO2k6NjM7czoxNDoiQ1ZWMjpccypcJENWVjIiO2k6NjQ7czo2MzoiXCRDVlYyQ1xzKj1ccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbXHMqWyciXUNWVjJDIjtpOjY1O3M6NzU6ImZ3cml0ZVwoXHMqXCRmXHMqLFxzKmdldF9kb3dubG9hZFwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo2NjtzOjMzOiJcW1xdXHMqPVxzKlsnIl1SZXdyaXRlRW5naW5lXHMrb24iO2k6Njc7czo5ODoic3Vic3RyXChccypcJHN0cmluZzJccyosXHMqc3RybGVuXChccypcJHN0cmluZzJccypcKVxzKi1ccyo5XHMqLFxzKjlcKVxzKj09XHMqWyciXXswLDF9XFtsLHI9MzAyXF0iO2k6Njg7czoxMzoiPWJ5XHMrRFJBR09OPSI7aTo2OTtzOjQwOiJfX2ZpbGVfZ2V0X3VybF9jb250ZW50c1woXHMqXCRyZW1vdGVfdXJsIjtpOjcwO3M6ODI6IlwkVVJMXHMqPVxzKlwkdXJsc1xbXHMqcmFuZFwoXHMqMFxzKixccypjb3VudFwoXHMqXCR1cmxzXHMqXClccyotXHMqMVwpXHMqXF1cLnJhbmQiO2k6NzE7czo0OToibWFpbFwoXHMqXCRyZXRvcm5vXHMqLFxzKlwkYXN1bnRvXHMqLFxzKlwkbWVuc2FqZSI7aTo3MjtzOjc4OiJjYWxsX3VzZXJfZnVuY1woXHMqWyciXWFjdGlvblsnIl1ccypcLlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6NzM7czozNToiZmlsZV9leGlzdHNcKFxzKlsnIl0vdG1wL3RtcC1zZXJ2ZXIiO2k6NzQ7czoyNzoiXChbJyJdXCR0bXBkaXIvc2Vzc19mY1wubG9nIjtpOjc1O3M6NTI6InRvdWNoXChccypbJyJdezAsMX1cJGJhc2VwYXRoL2NvbXBvbmVudHMvY29tX2NvbnRlbnQiO2k6NzY7czo0NjoiPVwkZmlsZVwoQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aTo3NztzOjcyOiJzZW5kX3NtdHBcKFxzKlwkZW1haWxcW1snIl17MCwxfWFkclsnIl17MCwxfVxdXHMqLFxzKlwkc3VialxzKixccypcJHRleHQiO2k6Nzg7czozNDoiX19MSU5LX188YVxzK2hyZWY9WyciXXswLDF9aHR0cDovLyI7aTo3OTtzOjQ0OiJzY3JpcHRzXFtccypnenVuY29tcHJlc3NcKFxzKmJhc2U2NF9kZWNvZGVcKCI7aTo4MDtzOjc4OiIhZmlsZV9wdXRfY29udGVudHNcKFxzKlwkZGJuYW1lXHMqLFxzKlwkdGhpcy0+Z2V0SW1hZ2VFbmNvZGVkVGV4dFwoXHMqXCRkYm5hbWUiO2k6ODE7czoxMTc6IlwkY29udGVudFxzKj1ccypodHRwX3JlcXVlc3RcKFsnIl17MCwxfWh0dHA6Ly9bJyJdezAsMX1ccypcLlxzKlwkX1NFUlZFUlxbWyciXXswLDF9U0VSVkVSX05BTUVbJyJdezAsMX1cXVwuWyciXXswLDF9LyI7aTo4MjtzOjYwOiJtYWlsXChccypcJE1haWxUb1xzKixccypcJE1lc3NhZ2VTdWJqZWN0XHMqLFxzKlwkTWVzc2FnZUJvZHkiO2k6ODM7czozNjoiZmlsZV9wdXRfY29udGVudHNcKFxzKlsnIl17MCwxfS9ob21lIjtpOjg0O3M6NzA6Im1haWxcKFxzKlwkYVxbXGQrXF1ccyosXHMqXCRhXFtcZCtcXVxzKixccypcJGFcW1xkK1xdXHMqLFxzKlwkYVxbXGQrXF0iO2k6ODU7czoyMzoiaXNfd3JpdGFibGU9aXNfd3JpdGFibGUiO2k6ODY7czoyMzoiZXhwbG9pdC1kYlwuY29tL3NlYXJjaC8iO2k6ODc7czoxNDoiRGF2aWRccypCbGFpbmUiO2k6ODg7czozMzoiY3JvbnRhYlxzKy1sXHxncmVwXHMrLXZccytjcm9udGFiIjtpOjg5O3M6ODA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdezAsMX1hdFxzK25vd1xzKy1mIjtpOjkwO3M6NjM6IiMhL2Jpbi9zaG5jZFxzK1snIl17MCwxfVsnIl17MCwxfVwuXCRTQ1BcLlsnIl17MCwxfVsnIl17MCwxfW5pZiI7aTo5MTtzOjQ0OiJmaWxlX3B1dF9jb250ZW50c1woWyciXXswLDF9XC4vbGlid29ya2VyXC5zbyI7aTo5MjtzOjM2OiJcJHVzZXJfYWdlbnRfdG9fZmlsdGVyXHMqPVxzKmFycmF5XCgiO2k6OTM7czoyMDoiZm9wZW5cKFxzKlsnIl0vaG9tZS8iO2k6OTQ7czoyMDoibWtkaXJcKFxzKlsnIl0vaG9tZS8iO2k6OTU7czozOToiI1VzZVsnIl17MCwxfVxzKixccypmaWxlX2dldF9jb250ZW50c1woIjtpOjk2O3M6Mjk6ImVyZWdpXChccypzcWxfcmVnY2FzZVwoXHMqXCRfIjtpOjk3O3M6NzE6IlwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrXHMqXF1cKFwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrIjtpOjk4O3M6MzY6ImV2YWxcKFxzKlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkPGFtYyI7aTo5OTtzOjMzOiJAXCRmdW5jXChcJGNmaWxlLCBcJGNkaXJcLlwkY25hbWUiO2k6MTAwO3M6NjI6InVuYW1lXF1bJyJdezAsMX1ccypcLlxzKnBocF91bmFtZVwoXClccypcLlxzKlsnIl17MCwxfVxbL3VuYW1lIjtpOjEwMTtzOjU0OiJcJEdMT0JBTFNcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF1cKFxzKk5VTEwiO2k6MTAyO3M6MjM6Il9fdXJsX2dldF9jb250ZW50c1woXCRsIjtpOjEwMztzOjI2OiJcJGRvcl9jb250ZW50PXByZWdfcmVwbGFjZSI7aToxMDQ7czo3MzoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1sc1xzKy92YXIvbWFpbCI7aToxMDU7czozMDoiaGVhZGVyXChbJyJdezAsMX1yOlxzKm5vXHMrY29tIjtpOjEwNjtzOjQ4OiJwcmVnX21hdGNoX2FsbFwoXHMqWyciXVx8XChcLlwqXCk8XFwhLS0ganMtdG9vbHMiO2k6MTA3O3M6Mzc6ImlmXHMqXChccyppbmlfZ2V0XChbJyJdezAsMX1zYWZlX21vZGUiO2k6MTA4O3M6NDk6IkAqZmlsZV9wdXRfY29udGVudHNcKFxzKlwkdGhpcy0+ZmlsZVxzKixccypzdHJyZXYiO2k6MTA5O3M6NDE6Ii9wbHVnaW5zL3NlYXJjaC9xdWVyeVwucGhwXD9fX19fcGdmYT1odHRwIjtpOjExMDtzOjkxOiJtYWlsXChccypzdHJpcHNsYXNoZXNcKFwkdG9cKVxzKixccypzdHJpcHNsYXNoZXNcKFwkc3ViamVjdFwpXHMqLFxzKnN0cmlwc2xhc2hlc1woXCRtZXNzYWdlIjtpOjExMTtzOjg1OiJcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9dXJbJyJdezAsMX1cXVwpXClccypcJG1vZGVccypcfD1ccyowNDAwIjtpOjExMjtzOjgyOiJlcmVnX3JlcGxhY2VcKFsnIl17MCwxfSU1QyUyMlsnIl17MCwxfVxzKixccypbJyJdezAsMX0lMjJbJyJdezAsMX1ccyosXHMqXCRtZXNzYWdlIjtpOjExMztzOjg4OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRuYW1lXHMqLFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExNDtzOjEyMjoid2luZG93XC5sb2NhdGlvbj1ifVxzKlwpXChccypuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKlx8XHxccypuYXZpZ2F0b3JcLnZlbmRvclxzKlx8XHxccyp3aW5kb3dcLm9wZXJhXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly8iO2k6MTE1O3M6ODk6Ilwkc2FwZV9vcHRpb25cW1xzKlsnIl17MCwxfWZldGNoX3JlbW90ZV90eXBlWyciXXswLDF9XHMqXF1ccyo9XHMqWyciXXswLDF9c29ja2V0WyciXXswLDF9IjtpOjExNjtzOjEwNToiXCRwYXRoXHMqPVxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdXHMqXC5ccypbJyJdezAsMX0vaW1hZ2VzL3N0b3JpZXMvWyciXXswLDF9IjtpOjExNztzOjgyOiJAKmFycmF5X2RpZmZfdWtleVwoXHMqQCphcnJheVwoXHMqXChzdHJpbmdcKVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExODtzOjIwOiJldmFsXHMqXChccypUUExfRklMRSI7aToxMTk7czozODoiSlJlc3BvbnNlOjpzZXRCb2R5XHMqXChccypwcmVnX3JlcGxhY2UiO2k6MTIwO3M6NDg6IlxzKlsnIl17MCwxfXNsdXJwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfW1zbmJvdCI7aToxMjE7czo1NDoiXHMqWyciXXswLDF9cm9va2VlWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfXdlYmVmZmVjdG9yIjtpOjEyMjtzOjExOiJDb3VwZGVncmFjZSI7aToxMjM7czoxMjoiU3VsdGFuSGFpa2FsIjtpOjEyNDtzOjYwOiJmaWxlX2dldF9jb250ZW50c1woYmFzZW5hbWVcKFwkX1NFUlZFUlxbWyciXXswLDF9U0NSSVBUX05BTUUiO2k6MTI1O3M6Mjc6Imh0dHBzOi8vYXBwbGVpZFwuYXBwbGVcLmNvbSI7aToxMjY7czoxOToiXCRia2V5d29yZF9iZXo9WyciXSI7aToxMjc7czozNDoiY3JjMzJcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfWNtZCI7aToxMjg7czoxOToiZ3JlcFxzKy12XHMrY3JvbnRhYiI7aToxMjk7czoyODoiWyciXVsnIl1ccypcLlxzKmd6VW5jb01wcmVTcyI7aToxMzA7czoyOToiWyciXVsnIl1ccypcLlxzKkJBc2U2NF9kZUNvRGUiO2k6MTMxO3M6MzI6ImV2YWxcKFsnIl1cPz5bJyJdXC5iYXNlNjRfZGVjb2RlIjtpOjEzMjtzOjI3OiJjdXJsX2luaXRcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTMzO3M6MTI6Im1pbHcwcm1cLmNvbSI7aToxMzQ7czo0NToiXCRmaWxlXChAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEzNTtzOjM2OiJyZXR1cm5ccytiYXNlNjRfZGVjb2RlXChcJGFcW1wkaVxdXCkiO2k6MTM2O3M6ODoiSGFyY2hhTGkiO2k6MTM3O3M6NjA6InBsdWdpbnMvc2VhcmNoL3F1ZXJ5XC5waHBcP19fX19wZ2ZhPWh0dHAlM0ElMkYlMkZ3d3dcLmdvb2dsZSI7aToxMzg7czozNjoiY3JlYXRlX2Z1bmN0aW9uXChzdWJzdHJcKDIsMVwpLFwkc1wpIjtpOjEzOTtzOjgxOiJ0eXBlb2ZccypcKGRsZV9hZG1pblwpXHMqPT1ccypbJyJdezAsMX11bmRlZmluZWRbJyJdezAsMX1ccypcfFx8XHMqZGxlX2FkbWluXHMqPT0iO2k6MTQwO3M6MzI6IlxbXCRvXF1cKTtcJG9cK1wrXCl7aWZcKFwkbzwxNlwpIjtpOjE0MTtzOjMyOiJcJFNcW1wkaVwrXCtcXVwoXCRTXFtcJGlcK1wrXF1cKCI7aToxNDI7czozNzoic2V0Y29va2llXChccypcJHpcWzBcXVxzKixccypcJHpcWzFcXSI7aToxNDM7czo4NjoiL2luZGV4XC5waHBcP29wdGlvbj1jb21famNlJnRhc2s9cGx1Z2luJnBsdWdpbj1pbWdtYW5hZ2VyJmZpbGU9aW1nbWFuYWdlciZ2ZXJzaW9uPTE1NzYiO2k6MTQ0O3M6MTU6ImNhdGF0YW5ccytzaXR1cyI7aToxNDU7czo0MToiaWZcKFxzKmlzc2V0XChccypcJF9SRVFVRVNUXFtbJyJdezAsMX1jaWQiO2k6MTQ2O3M6NDA6InN0cl9yZXBsYWNlXHMqXChccypbJyJdezAsMX0vcHVibGljX2h0bWwiO2k6MTQ3O3M6NTE6IkBhcnJheVwoXHMqXChzdHJpbmdcKVxzKnN0cmlwc2xhc2hlc1woXHMqXCRfUkVRVUVTVCI7aToxNDg7czo2MDoiaWZccypcKFxzKmZpbGVfcHV0X2NvbnRlbnRzXHMqXChccypcJGluZGV4X3BhdGhccyosXHMqXCRjb2RlIjtpOjE0OTtzOjk0OiJpZlwoaXNfZGlyXChcJHBhdGhcLlsnIl17MCwxfS93cC1jb250ZW50WyciXXswLDF9XClccytBTkRccytpc19kaXJcKFwkcGF0aFwuWyciXXswLDF9L3dwLWFkbWluIjtpOjE1MDtzOjI4OiJpZlwoXCRvPDE2XCl7XCRoXFtcJGVcW1wkb1xdIjtpOjE1MTtzOjk6ImJ5XHMrZzAwbiI7aToxNTI7czoxNToiQXV0b1xzKlhwbG9pdGVyIjtpOjE1MztzOjEwMjoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl17MCwxfVwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiIjtpOjE1NDtzOjcyOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXXswLDF9Y21kXC5leGUiO2k6MTU1O3M6OToiQnlccytEWjI3IjtpOjE1NjtzOjI3OiJFdGhuaWNccytBbGJhbmlhblxzK0hhY2tlcnMiO2k6MTU3O3M6MjA6IlZvbGdvZ3JhZGluZGV4XC5odG1sIjtpOjE1ODtzOjMyOiJcJF9Qb3N0XFtbJyJdezAsMX1TU05bJyJdezAsMX1cXSI7aToxNTk7czoxNToicGFja1xzKyJTbkE0eDgiIjtpOjE2MDtzOjE0OiJbJyJdezAsMX1EWmUxciI7aToxNjE7czoxMjoiVGVhTVxzK01vc1RhIjtpOjE2MjtzOjYzOiJpZlwobWFpbFwoXCRlbWFpbFxbXCRpXF0sXHMqXCRzdWJqZWN0LFxzKlwkbWVzc2FnZSxccypcJGhlYWRlcnMiO2k6MTYzO3M6MzY6InByaW50XHMrWyciXXswLDF9ZGxlX251bGxlZFsnIl17MCwxfSI7aToxNjQ7czozOToiaWZccypcKGNoZWNrX2FjY1woXCRsb2dpbixcJHBhc3MsXCRzZXJ2IjtpOjE2NTtzOjM4OiJwcmVnX3JlcGxhY2VcKFwpe3JldHVyblxzK19fRlVOQ1RJT05fXyI7aToxNjY7czozMzoiXCRvcHRccyo9XHMqXCRmaWxlXChAKlwkX0NPT0tJRVxbIjtpOjE2NztzOjM2OiJpZlwoQGZ1bmN0aW9uX2V4aXN0c1woWyciXXswLDF9ZnJlYWQiO2k6MTY4O3M6MTA4OiJmb3JcKFwkW2EtekEtWjAtOV9dKz89XGQrO1wkW2EtekEtWjAtOV9dKz88XGQrO1wkW2EtekEtWjAtOV9dKz8tPVxkK1wpe2lmXChcJFthLXpBLVowLTlfXSs/IT1cZCtcKVxzKmJyZWFrO30iO2k6MTY5O3M6MzU6IlwkY291bnRlclVybFxzKj1ccypbJyJdezAsMX1odHRwOi8vIjtpOjE3MDtzOjY3OiJhcnJheVwoXHMqWyciXWhbJyJdXHMqLFxzKlsnIl10WyciXVxzKixccypbJyJddFsnIl1ccyosXHMqWyciXXBbJyJdIjtpOjE3MTtzOjQyOiJpZlxzKlwoZnVuY3Rpb25fZXhpc3RzXChbJyJdc2Nhbl9kaXJlY3RvcnkiO2k6MTcyO3M6NjI6IlwkX1NFU1NJT05cW1snIl17MCwxfWRhdGFfYVsnIl17MCwxfVxdXFtcJG5hbWVcXVxzKj1ccypcJHZhbHVlIjtpOjE3MztzOjM4OiJaZW5kXHMrT3B0aW1pemF0aW9uXHMrdmVyXHMrMVwuMFwuMFwuMSI7aToxNzQ7czoyNjoiaW5kZXhcLnBocFw/aWQ9XCQxJiV7UVVFUlkiO2k6MTc1O3M6ODY6IkBpbmlfc2V0XHMqXChbJyJdezAsMX1pbmNsdWRlX3BhdGhbJyJdezAsMX0sWyciXXswLDF9aW5pX2dldFxzKlwoWyciXXswLDF9aW5jbHVkZV9wYXRoIjtpOjE3NjtzOjI4OiJpZlxzKlwoQGlzX3dyaXRhYmxlXChcJGluZGV4IjtpOjE3NztzOjI4OiJcJF9QT1NUXFtbJyJdezAsMX1zbXRwX2xvZ2luIjtpOjE3ODtzOjM3OiJfWyciXXswLDF9XF1cWzJcXVwoWyciXXswLDF9TG9jYXRpb246IjtpOjE3OTtzOjM0OiJpZlwoQHByZWdfbWF0Y2hcKHN0cnRyXChbJyJdezAsMX0vIjtpOjE4MDtzOjE1OiI8IS0tXHMranMtdG9vbHMiO2k6MTgxO3M6NzoidWdnYzovLyI7aToxODI7czo0NzoiaWYgXChkYXRlXChbJyJdezAsMX1qWyciXXswLDF9XClccyotXHMqXCRuZXdzaWQiO2k6MTgzO3M6MTY6IjxEYXZpZFxzK0JsYWluZT4iO2k6MTg0O3M6MjU6IlwkaXNldmFsZnVuY3Rpb25hdmFpbGFibGUiO2k6MTg1O3M6NDE6ImlmIFwoIXN0cnBvc1woXCRzdHJzXFswXF0sWyciXXswLDF9PFw/cGhwIjtpOjE4NjtzOjg1OiJcJHN0cmluZ1xzKj1ccypcJF9TRVNTSU9OXFtbJyJdezAsMX1kYXRhX2FbJyJdezAsMX1cXVxbWyciXXswLDF9bnV0emVybmFtZVsnIl17MCwxfVxdIjtpOjE4NztzOjU2OiJ3aGlsZVwoY291bnRcKFwkbGluZXNcKT5cJGNvbF96YXBcKSBhcnJheV9wb3BcKFwkbGluZXNcKSI7aToxODg7czoxMDQ6InNpdGVfZnJvbT1bJyJdezAsMX1cLlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XF1cLlsnIl17MCwxfSZzaXRlX2ZvbGRlcj1bJyJdezAsMX1cLlwkZlxbMVxdIjtpOjE4OTtzOjMxOiJcJGZpbGViXHMqPVxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjE5MDtzOjMzOiJwb3J0bGV0cy9mcmFtZXdvcmsvc2VjdXJpdHkvbG9naW4iO2k6MTkxO3M6Mjk6IlwkYlxzKj1ccyptZDVfZmlsZVwoXCRmaWxlYlwpIjtpOjE5MjtzOjUxOiJcJGRhdGFccyo9XHMqYXJyYXlcKFsnIl17MCwxfXRlcm1pbmFsWyciXXswLDF9XHMqPT4iO2k6MTkzO3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX1nb29nbGUiO2k6MTk0O3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX15YW5kZXgiO2k6MTk1O3M6Nzc6InN0cmlzdHJcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sXHMqWyciXXswLDF9WWFuZGV4Qm90IjtpOjE5NjtzOjUzOiJmb3BlblwoWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vWyciXXswLDF9XC5cJGZpbGVwYXRocyI7aToxOTc7czozNjoicHJlZ19yZXBsYWNlXChccypbJyJdZVsnIl0sWyciXXswLDF9IjtpOjE5ODtzOjQwOiIoW15cP1xzXSlcKHswLDF9XC5bXCtcKl1cKXswLDF9XDJbYS16XSplIjtpOjE5OTtzOjE3OiJteDJcLmhvdG1haWxcLmNvbSI7aToyMDA7czozNToicGhwX1snIl1cLlwkZXh0XC5bJyJdXC5kbGxbJyJdezAsMX0iO2k6MjAxO3M6MjA6Ii9lWyciXVxzKixccypbJyJdXFx4IjtpOjIwMjtzOjMyOiI8aDE+NDAzIEZvcmJpZGRlbjwvaDE+PCEtLSB0b2tlbiI7aToyMDM7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO2k6MjA0O3M6NDQ6ImFycmF5XChccypbJyJdR29vZ2xlWyciXVxzKixccypbJyJdU2x1cnBbJyJdIjtpOjIwNTtzOjEyOiJhbmRleFx8b29nbGUiO2k6MjA2O3M6MjQ6InBhZ2VfZmlsZXMvc3R5bGUwMDBcLmNzcyI7aToyMDc7czoyMToiPT1bJyJdXClcKTtyZXR1cm47XD8+IjtpOjIwODtzOjE2OiJTcGFtXHMrY29tcGxldGVkIjtpOjIwOTtzOjM1OiJlY2hvXHMrWyciXXswLDF9aW5zdGFsbF9va1snIl17MCwxfSI7aToyMTA7czo2MDoiXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl17MCwxfWN2dlsnIl17MCwxfVxdIjtpOjIxMTtzOjExOiJDVlY6XHMqXCRjdiI7aToyMTI7czozMDoiY3VybFwuaGF4eFwuc2UvcmZjL2Nvb2tpZV9zcGVjIjtpOjIxMztzOjEyOiJraWxsYWxsXHMrLTkiO2k6MjE0O3M6NTc6InByZWdfcmVwbGFjZVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMTU7czo1ODoiXCRtYWlsZXJccyo9XHMqXCRfUE9TVFxbXHMqWyciXXswLDF9eF9tYWlsZXJbJyJdezAsMX1ccypcXSI7aToyMTY7czozMDoicHJlZ19yZXBsYWNlXHMqXChccypbJyJdL1wuXCovIjtpOjIxNztzOjI5OiJFcnJvckRvY3VtZW50XHMrNDAwXHMraHR0cDovLyI7aToyMTg7czoyOToiRXJyb3JEb2N1bWVudFxzKzUwMFxzK2h0dHA6Ly8iO2k6MjE5O3M6Mjg6Imdvb2dsZVx8eWFuZGV4XHxib3RcfHJhbWJsZXIiO2k6MjIwO3M6MjE6ImV2YWxccypcKFxzKnN0cl9yb3QxMyI7aToyMjE7czozODoiZXZhbFxzKlwoXHMqZ3ppbmZsYXRlXHMqXChccypzdHJfcm90MTMiO2k6MjIyO3M6NDg6ImZ1bmN0aW9uXHMqY2htb2RfUlxzKlwoXHMqXCRwYXRoXHMqLFxzKlwkcGVybVxzKiI7aToyMjM7czozMzoic3ltYmlhblx8bWlkcFx8d2FwXHxwaG9uZVx8cG9ja2V0IjtpOjIyNDtzOjI4OiJlY2hvXHMrWyciXW9cLmtcLlsnIl07XHMqXD8+IjtpOjIyNTtzOjcyOiJAc2V0Y29va2llXChbJyJdbVsnIl0sXHMqWyciXVthLXpBLVowLTlfXSs/WyciXSxccyp0aW1lXChcKVxzKlwrXHMqODY0MDAiO2k6MjI2O3M6NzA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXdnZXQiO2k6MjI3O3M6MzM6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToyMjg7czozMDoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIyOTtzOjI1OiJldmFsXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIzMDtzOjMyOiJzdHJfaXJlcGxhY2VccypcKCpccypbJyJdPC9oZWFkPiI7aToyMzE7czozOToiaWZccypcKFxzKnByZWdfbWF0Y2hccypcKFxzKlsnIl0jeWFuZGV4IjtpOjIzMjtzOjMxOiI9XHMqYXJyYXlfbWFwXHMqXCgqXHMqc3RycmV2XHMqIjtpOjIzMztzOjk6IlwkX19fXHMqPSI7aToyMzQ7czo0OToiZ3p1bmNvbXByZXNzXHMqXCgqXHMqc3Vic3RyXHMqXCgqXHMqYmFzZTY0X2RlY29kZSI7aToyMzU7czoyMzoiQWRkSGFuZGxlclxzK3BocC1zY3JpcHQiO2k6MjM2O3M6MTQ1OiJcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpIjtpOjIzNztzOjM4OiJzdHJlYW1fc29ja2V0X2NsaWVudFxzKlwoXHMqWyciXXRjcDovLyI7aToyMzg7czo5NToiaXNzZXRcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVwpXHMqb3JccypkaWVcKCouKj9cKSoiO2k6MjM5O3M6NTc6Ik9wdGlvbnNccytGb2xsb3dTeW1MaW5rc1xzK011bHRpVmlld3NccytJbmRleGVzXHMrRXhlY0NHSSI7aToyNDA7czozMjoiaXNfd3JpdGFibGVccypcKCpccypbJyJdL3Zhci90bXAiO2k6MjQxO3M6OTU6ImFkZF9maWx0ZXJccypcKCpccypbJyJdezAsMX10aGVfY29udGVudFsnIl17MCwxfVxzKixccypbJyJdezAsMX1fYmxvZ2luZm9bJyJdezAsMX1ccyosXHMqLis/XCkqIjtpOjI0MjtzOjI5OiJldmFsXHMqXCgqXHMqZ2V0X29wdGlvblxzKlwoKiI7aToyNDM7czoxMDQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbIjtpOjI0NDtzOjEwNzoiaWZccypcKFxzKmlzX2NhbGxhYmxlXHMqXCgqXHMqWyciXXswLDF9KGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilbJyJdezAsMX1ccypcKSoiO2k6MjQ1O3M6MTE0OiJpZlxzKlwoXHMqZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVxzKlwpXHMqXCkiO2k6MjQ2O3M6NzQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXJtXHMqLWZyIjtpOjI0NztzOjc0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlwoKlxzKlsnIl1ybVxzKi1yZiI7aToyNDg7czo3ODoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypbJyJdcm1ccyotclxzKi1mIjtpOjI0OTtzOjQwOiJldmFsXHMqXCgqXHMqZ3ppbmZsYXRlXHMqXCgqXHMqc3RyX3JvdDEzIjtpOjI1MDtzOjE5OiJyb3VuZFxzKlwoXHMqMFxzKlwrIjtpOjI1MTtzOjE5OiJDb250ZW50LVR5cGU6XHMqXCRfIjt9"));
$gXX_FlexDBShe unserialize(base64_decode("YToyMDg6e2k6MDtzOjQ4OiJwYXJzZV9xdWVyeV9zdHJpbmdcKFxzKlwkRU5We1xzKlsnIl1RVUVSWV9TVFJJTkciO2k6MTtzOjQ0OiJAXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpOyI7aToyO3M6Mzk6IlthLXpBLVowLTlfXSs/XChccypbYS16QS1aMC05X10rPz1ccypcKSI7aTozO3M6MTI6IlsnIl1yaW55WyciXSI7aTo0O3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjU7czoxNToiWyciXW9mbmlwaHBbJyJdIjtpOjY7czoxNzoiWyciXTMxdG9yX3J0c1snIl0iO2k6NztzOjE0OiJbJyJddHJlc3NhWyciXSI7aTo4O3M6MTM6ImVkb2NlZF80NmVzYWIiO2k6OTtzOjEyOiJzc2VycG1vY251emciO2k6MTA7czo5OiJldGFsZm5pemciO2k6MTE7czoxMjoiWyciXXJpbnlbJyJdIjtpOjEyO3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjEzO3M6NzoiY3VjdmFzYiI7aToxNDtzOjk6ImZnZV9lYmcxMyI7aToxNTtzOjE0OiJbJyJdbmZmcmVnWyciXSI7aToxNjtzOjEzOiJvbmZyNjRfcXJwYnFyIjtpOjE3O3M6MTI6InRtaGFwYnpjZXJmZiI7aToxODtzOjk6InRtdmFzeW5nciI7aToxOTtzOjQ4OiI8XD9ccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXCkiO2k6MjA7czoyMToiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0IjtpOjIxO3M6MTM6Im51bGxfZXhwbG9pdHMiO2k6MjI7czoxMzA6ImlmXChpc3NldFwoXCRfUkVRVUVTVFxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClcKVxzKntccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkX1JFUVVFU1RcW1snIl1bYS16QS1aMC05X10rP1snIl1cXTtccypleGl0XChcKTsiO2k6MjM7czo1NjoibWFpbFwoXHMqXCRhcnJcW1snIl10b1snIl1cXVxzKixccypcJGFyclxbWyciXXN1YmpbJyJdXF0iO2k6MjQ7czoyNDoidW5saW5rXChccypfX0ZJTEVfX1xzKlwpIjtpOjI1O3M6MjE6Ii1JL3Vzci9sb2NhbC9iYW5kbWFpbiI7aToyNjtzOjQzOiJuYW1lPVsnIl11cGxvYWRlclsnIl1ccytpZD1bJyJddXBsb2FkZXJbJyJdIjtpOjI3O3M6MzE6ImVjaG9ccypbJyJdPGI+VXBsb2FkPHNzPlN1Y2Nlc3MiO2k6Mjg7czozNzoiaGVhZGVyXChccypbJyJdTG9jYXRpb246XHMqXCRsaW5rWyciXSI7aToyOTtzOjUxOiJ0eXBlPVsnIl1zdWJtaXRbJyJdXHMqdmFsdWU9WyciXVVwbG9hZCBmaWxlWyciXVxzKj4iO2k6MzA7czozMDoiZWxzZVxzKntccyplY2hvXHMqWyciXWZhaWxbJyJdIjtpOjMxO3M6NDQ6IlxzKj1ccyppbmlfZ2V0XChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnNbJyJdIjtpOjMyO3M6NTc6IkBlcnJvcl9yZXBvcnRpbmdcKFxzKjBccypcKTtccyppZlxzKlwoXHMqIWlzc2V0XHMqXChccypcJCI7aTozMztzOjU4OiJyb3VuZFxzKlwoXHMqXChccypcJHBhY2tldHNccypcKlxzKjY1XClccyovXHMqMTAyNFxzKixccyoyIjtpOjM0O3M6MTI6Ilplcm9EYXlFeGlsZSI7aTozNTtzOjExOiJTX1xdQF9cXlVcXiI7aTozNjtzOjUwOiI8aW5wdXRccyt0eXBlPXN1Ym1pdFxzK3ZhbHVlPVVwbG9hZFxzKi8+XHMqPC9mb3JtPiI7aTozNztzOjEwODoiaWZcKFxzKiFzb2NrZXRfc2VuZHRvXChccypcJHNvY2tldFxzKixccypcJGRhdGFccyosXHMqc3RybGVuXChccypcJGRhdGFccypcKVxzKixccyowXHMqLFxzKlwkaXBccyosXHMqXCRwb3J0IjtpOjM4O3M6NTQ6InN1YnN0clwoXHMqXCRyZXNwb25zZVxzKixccypcJGluZm9cW1xzKlsnIl1oZWFkZXJfc2l6ZSI7aTozOTtzOjE5OiJkaWVcKFxzKlsnIl1ubyBjdXJsIjtpOjQwO3M6NzQ6IlwkcmV0ID0gXCR0aGlzLT5fZGItPnVwZGF0ZU9iamVjdFwoIFwkdGhpcy0+X3RibCwgXCR0aGlzLCBcJHRoaXMtPl90Ymxfa2V5IjtpOjQxO3M6NDQ6Im9wZW5ccypcKFxzKk1ZRklMRVxzKixccypbJyJdXHMqPlxzKnRhclwudG1wIjtpOjQyO3M6MTg6Ii1cKi1ccypjb25mXHMqLVwqLSI7aTo0MztzOjQ5OiJAdG91Y2hccypcKFxzKlwkY3VyZmlsZVxzKixccypcJHRpbWVccyosXHMqXCR0aW1lIjtpOjQ0O3M6MzM6InRvdWNoXHMqXChccypkaXJuYW1lXChccypfX0ZJTEVfXyI7aTo0NTtzOjI3OiJcLlwuL1wuXC4vXC5cLi9cLlwuL21vZHVsZXMiO2k6NDY7czoyOToiZXhlY1woXHMqWyciXS9iaW4vc2hbJyJdXHMqXCkiO2k6NDc7czoxNToiL3RtcC9cLklDRS11bml4IjtpOjQ4O3M6MTU6Ii90bXAvdG1wLXNlcnZlciI7aTo0OTtzOjI2OiI9XHMqWyciXXNlbmRtYWlsXHMqLXRccyotZiI7aTo1MDtzOjI0OiJwcm9jX2Nsb3NlXChccypcJHByb2Nlc3MiO2k6NTE7czoxNjoiO1xzKi9iaW4vc2hccyotaSI7aTo1MjtzOjIzOiJbJyJdXHMqXHxccyovYmluL3NoWyciXSI7aTo1MztzOjQyOiJAdW1hc2tcKFxzKjA3NzdccyomXHMqflxzKlwkZmlsZXBlcm1pc3Npb24iO2k6NTQ7czo1MjoiY2htb2RcKFxzKlwkW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9ccyosXHMqMDc1NSI7aTo1NTtzOjUyOiJjaG1vZFwoXHMqXCRbXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1xzKixccyowNDA0IjtpOjU2O3M6NDc6InN0cnRvbG93ZXJcKFxzKnN1YnN0clwoXHMqXCR1c2VyX2FnZW50XHMqLFxzKjAsIjtpOjU3O3M6OToiTDNaaGNpOTNkIjtpOjU4O3M6NTU6Ilwkb3V0XHMqXC49XHMqXCR0ZXh0e1xzKlwkaVxzKn1ccypcXlxzKlwka2V5e1xzKlwkalxzKn0iO2k6NTk7czo4NDoiL2luZGV4XC5waHBcP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9WyciXVwuXCRwb3N0XFtbJyJdezAsMX1pZFsnIl17MCwxfVxdIjtpOjYwO3M6Mjc6IkBjaGRpclwoXHMqXCRfUE9TVFxbXHMqWyciXSI7aTo2MTtzOjY0OiJpc3NldFwoXHMqXCRfQ09PS0lFXFtccyptZDVcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9IT1NUIjtpOjYyO3M6Mjc6InN0cmxlblwoXHMqXCRwYXRoVG9Eb3JccypcKSI7aTo2MztzOjI5OiJmb3BlblwoXHMqWyciXVwuXC4vXC5odGFjY2VzcyI7aTo2NDtzOjQzOiJcJF9QT1NUXFtccypbJyJdezAsMX1lTWFpbEFkZFsnIl17MCwxfVxzKlxdIjtpOjY1O3M6NzI6Im1haWxcKFxzKlwkcmVjaXBpZW50XHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJccypcKSI7aTo2NjtzOjY4OiJtYWlsXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnNccypcKSI7aTo2NztzOjUzOiJtYWlsXChccypcJHRvXHMqLFxzKlwkc3ViaixccypcJG1zZ1xzKixccypcJGZyb21ccypcKSI7aTo2ODtzOjQzOiJjb250ZW50PSJcZCs7VVJMPWh0dHBzOi8vZG9jc1wuZ29vZ2xlXC5jb20vIjtpOjY5O3M6NDI6Ilwka2V5XHMqPVxzKlwkX0dFVFxbWyciXXswLDF9cVsnIl17MCwxfVxdOyI7aTo3MDtzOjE5OiIvaW5zdHJ1a3RzaXlhLWRseWEtIjtpOjcxO3M6MTQ6Ii9cP2RvPW9zaGlia2EtIjtpOjcyO3M6MTc6Ii9cP2RvPWthay11ZGFsaXQtIjtpOjczO3M6MTU6Imd6aW5mbGF0ZVwoXChcKCI7aTo3NDtzOjIzOiIwXHMqXChccypnenVuY29tcHJlc3NcKCI7aTo3NTtzOjIwOiJcJF9SRVFVRVNUXFtbJyJdbGFsYSI7aTo3NjtzOjQzOiJzdHJwb3NcKFwkaW1ccyosXHMqWyciXTxcP1snIl1ccyosXHMqXCRpXCsxIjtpOjc3O3M6NjM6Imh0dHA6Ly93d3dcLmdvb2dsZVwuY29tL3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5XC5bJyJdJmhsPVwkbGFuZyI7aTo3ODtzOjQzOiJodHRwOi8vZ29cLm1haWxcLnJ1L3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5IjtpOjc5O3M6NTA6Imh0dHA6Ly93d3dcLmJpbmdcLmNvbS9zZWFyY2hcP3E9XCRxdWVyeSZwcT1cJHF1ZXJ5IjtpOjgwO3M6Mzg6InNldFRpbWVvdXRcKFxzKlsnIl1sb2NhdGlvblwucmVwbGFjZVwoIjtpOjgxO3M6MTIwOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXVtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/L1tccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XC5naWYiO2k6ODI7czoxMjA6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypbJyJdW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz8vW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9cLmpwZyI7aTo4MztzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg0O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg1O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuZ2lmIjtpOjg2O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuanBnIjtpOjg3O3M6MTA2OiJ1bmxpbmtcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxdXHMqXC5ccypbJyJdezAsMX0vYXNzZXRzL2NhY2hlL3RlbXAvRmlsZVNldHRpbmdzIjtpOjg4O3M6NDg6ImlmXChccypzdHJwb3NcKFxzKlwkdmFsdWVccyosXHMqXCRtYXNrXHMqXClccypcKSI7aTo4OTtzOjg6ImFiYWtvL0FPIjtpOjkwO3M6NTU6IlwqL1xzKihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccyovXCoiO2k6OTE7czozNDoiZ3JvdXBfY29uY2F0XCgweDIxN2UscGFzc3dvcmQsMHgzYSI7aTo5MjtzOjM3OiJjb25jYXRcKDB4MjE3ZSxwYXNzd29yZCwweDNhLHVzZXJuYW1lIjtpOjkzO3M6MjM6IlwrdW5pb25cK3NlbGVjdFwrMCwwLDAsIjtpOjk0O3M6OToic2V4c2V4c2V4IjtpOjk1O3M6MzU6IlwkYmFzZV9kb21haW5ccyo9XHMqZ2V0X2Jhc2VfZG9tYWluIjtpOjk2O3M6MzE6IiFlcmVnXChbJyJdXF5cKHVuc2FmZV9yYXdcKVw/XCQiO2k6OTc7czo5MToiXCRbYS16QS1aMC05X10rPz1cJFthLXpBLVowLTlfXSs/XChcJFthLXpBLVowLTlfXSs/LFwkW2EtekEtWjAtOV9dKz9cKFsnIl17XCRbYS16QS1aMC05X10rPyI7aTo5ODtzOjE5OiJsbXBfY2xpZW50XChzdHJjb2RlIjtpOjk5O3M6MTY6ImV2YWxcKFsnIl1ccyovXCoiO2k6MTAwO3M6MTU6ImV2YWxcKFsnIl1ccyovLyI7aToxMDE7czozNDoiXCRxdWVyeVxzKyxccytbJyJdZnJvbSUyMGpvc191c2VycyI7aToxMDI7czo3OToiXCRbYS16QS1aMC05X10rP1xbXCRbYS16QS1aMC05X10rP1xdXFtcJFthLXpBLVowLTlfXSs/XFtcZCtcXVwuXCRbYS16QS1aMC05X10rPyI7aToxMDM7czoyOToiXClcKSxQSFBfVkVSU0lPTixtZDVfZmlsZVwoXCQiO2k6MTA0O3M6ODM6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdezAsMX1jdXJsXHMrLU9ccytodHRwOi8vIjtpOjEwNTtzOjE5OiJjb2Rlc1wubWFpbmxpbmtcLnJ1IjtpOjEwNjtzOjM2OiJjaG1vZFwoZGlybmFtZVwoX19GSUxFX19cKSxccyowNTExXCkiO2k6MTA3O3M6Mzk6ImxvY2F0aW9uXC5yZXBsYWNlXChcXFsnIl1cJHVybF9yZWRpcmVjdCI7aToxMDg7czoyODoiTW90aGVyWyciXXNccytNYWlkZW5ccytOYW1lOiI7aToxMDk7czo5MDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1teXNxbGR1bXBccystaFxzK2xvY2FsaG9zdFxzKy11IjtpOjExMDtzOjc3OiJhcnJheV9tZXJnZVwoXCRleHRccyosXHMqYXJyYXlcKFsnIl13ZWJzdGF0WyciXSxbJyJdYXdzdGF0c1snIl0sWyciXXRlbXBvcmFyeSI7aToxMTE7czozMzoiQ29tZmlybVxzK1RyYW5zYWN0aW9uXHMrUGFzc3dvcmQ6IjtpOjExMjtzOjIyOiJ4cnVtZXJfc3BhbV9saW5rc1wudHh0IjtpOjExMztzOjY6IlNFb0RPUiI7aToxMTQ7czo3MDoiPFw/cGhwXHMrKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoXHMqWyciXS9ob21lLyI7aToxMTU7czoyMjoiLFsnIl08XD9waHBcXG5bJyJdXC5cJCI7aToxMTY7czo1MDoiPGlmcmFtZVxzK3NyYz1bJyJdaHR0cHM6Ly9kb2NzXC5nb29nbGVcLmNvbS9mb3Jtcy8iO2k6MTE3O3M6MzY6ImV4ZWNccyt7WyciXS9iaW4vc2hbJyJdfVxzK1snIl0tYmFzaCI7aToxMTg7czo0NToiaWZcKGZpbGVfcHV0X2NvbnRlbnRzXChcJGluZGV4X3BhdGgsXHMqXCRjb2RlIjtpOjExOTtzOjMxOiI9XHMqbmV3XHMrRGlyZWN0b3J5SXRlcmF0b3JcKFwkIjtpOjEyMDtzOjUzOiJcJFthLXpBLVowLTlfXSs/ID0gXCRbYS16QS1aMC05X10rP1woWyciXXswLDF9aHR0cDovLyI7aToxMjE7czo1MjoiY1wubGVuZ3RoXCk7fXJldHVyblxzKlxcWyciXVxcWyciXTt9aWZcKCFnZXRDb29raWVcKCI7aToxMjI7czo4OiIjdPpJN/bf0CI7aToxMjM7czozMToic2VsZWN0IGxhbmd1YWdlc19pZCwgbmFtZSwgY29kZSI7aToxMjQ7czo0NDoidXBkYXRlIGNvbmZpZ3VyYXRpb24gc2V0IGNvbmZpZ3VyYXRpb25fdmFsdWUiO2k6MTI1O3M6NjU6InNlbGVjdCBjb25maWd1cmF0aW9uX2lkLCBjb25maWd1cmF0aW9uX3RpdGxlLCBjb25maWd1cmF0aW9uX3ZhbHVlIjtpOjEyNjtzOjM2OiIvYWRtaW4vY29uZmlndXJhdGlvblwucGhwL2xvZ2luXC5waHAiO2k6MTI3O3M6MTAxOiJzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZSI7aToxMjg7czoxMjoiZG1sbGQwUmhkR0U9IjtpOjEyOTtzOjgxOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXWx3cC1kb3dubG9hZFxzK2h0dHA6Ly8iO2k6MTMwO3M6Njg6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlsnIl1bJyJdXHMqLFxzKmV2YWxcKFwkW2EtekEtWjAtOV9dKz9ccypcKVxzKlwpIjtpOjEzMTtzOjY3OiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXClccyosIjtpOjEzMjtzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XFsiO2k6MTMzO3M6Mzk6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkW2EtekEtWjAtOV9dKz9cWyI7aToxMzQ7czo1OToiXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnMiO2k6MTM1O3M6MTc6Ij1ccypbJyJdL3Zhci90bXAvIjtpOjEzNjtzOjY1OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aToxMzc7czoyNjoiZXhpdFwoXCk6ZXhpdFwoXCk6ZXhpdFwoXCkiO2k6MTM4O3M6Mzg6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLWNnaVxzK1wuIjtpOjEzOTtzOjM4OiJAbW92ZV91cGxvYWRlZF9maWxlXChccypcJHVzZXJmaWxlX3RtcCI7aToxNDA7czoyMjoiZGlzYWJsZV9mdW5jdGlvbnM9bm9uZSI7aToxNDE7czoxNTU6IlwkW2EtekEtWjAtOV9dKz9cW1xzKlwkW2EtekEtWjAtOV9dKz9ccypcXVxbXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuIjtpOjE0MjtzOjIyMjoiXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqIjtpOjE0MztzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XCgiO2k6MTQ0O3M6NDI6Ij1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl17MCwxfVwkYVsnIl17MCwxfSI7aToxNDU7czo5OiJcJGJcKFsnIl0iO2k6MTQ2O3M6MzE6IlwkYlxzKj1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl0iO2k6MTQ3O3M6MzY6IlgtTWFpbGVyOlxzKk1pY3Jvc29mdCBPZmZpY2UgT3V0bG9vayI7aToxNDg7czo1NjoiQCpmaWxlX3B1dF9jb250ZW50c1woXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTQ5O3M6MTk6IlsnIl0vXGQrL1xbYS16XF1cKmUiO2k6MTUwO3M6NjQ6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbYS16QS1aMC05X10rP1xzKlxdXCgiO2k6MTUxO3M6MTM6IkBleHRyYWN0XHMqXCQiO2k6MTUyO3M6MTM6IkBleHRyYWN0XHMqXCgiO2k6MTUzO3M6Nzc6Im1haWxccypcKFwkZW1haWxccyosXHMqWyciXXswLDF9PVw/VVRGLThcP0JcP1snIl17MCwxfVwuYmFzZTY0X2VuY29kZVwoXCRmcm9tIjtpOjE1NDtzOjgxOiJtYWlsXChcJF9QT1NUXFtbJyJdezAsMX1lbWFpbFsnIl17MCwxfVxdLFxzKlwkX1BPU1RcW1snIl17MCwxfXN1YmplY3RbJyJdezAsMX1cXSwiO2k6MTU1O3M6ODQ6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVxbWyciXXRtcF9uYW1lWyciXVxdXHMqLCI7aToxNTY7czo0NToiTW96aWxsYS81XC4wXHMqXChjb21wYXRpYmxlO1xzKkdvb2dsZWJvdC8yXC4xIjtpOjE1NztzOjE0OiJyb290QGxvY2FsaG9zdCI7aToxNTg7czo0MzoiKFxcWzAtOV1bMC05XVswLTldfFxceFswLTlhLWZdWzAtOWEtZl0pezcsfSI7aToxNTk7czoxNzoiPC9ib2R5PlxzKjxzY3JpcHQiO2k6MTYwO3M6NDM6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXXByZWdfcmVwbGFjZVsnIl0iO2k6MTYxO3M6Mzc6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWFzc2VydFsnIl0iO2k6MTYyO3M6NDY6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6MTYzO3M6NDQ6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjE2NDtzOjM1OiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlsnIl1ldmFsWyciXSI7aToxNjU7czoyODoiQ3JlZGl0XHMqQ2FyZFxzKlZlcmlmaWNhdGlvbiI7aToxNjY7czo2NjoiUmV3cml0ZUNvbmRccyole0hUVFA6QWNjZXB0LUxhbmd1YWdlfVxzKlwocnVcfHJ1LXJ1XHx1a1wpXHMqXFtOQ1xdIjtpOjE2NztzOjQyOiJSZXdyaXRlQ29uZFxzKiV7SFRUUDp4LW9wZXJhbWluaS1waG9uZS11YX0iO2k6MTY4O3M6MzQ6IlJld3JpdGVDb25kXHMqJXtIVFRQOngtd2FwLXByb2ZpbGUiO2k6MTY5O3M6MjI6ImV2YWxccypcKFxzKmdldF9vcHRpb24iO2k6MTcwO3M6Mjk6ImVjaG9ccytbJyJdezAsMX1nb29kWyciXXswLDF9IjtpOjE3MTtzOjUxOiJDVVJMT1BUX1JFRkVSRVIsXHMqWyciXXswLDF9aHR0cHM6Ly93d3dcLmdvb2dsZVwuY28iO2k6MTcyO3M6MTU6IlwkYXV0aF9wYXNzXHMqPSI7aToxNzM7czo2NDoiPVxzKlwkR0xPQkFMU1xbXHMqWyciXV8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVsnIl1ccypcXSI7aToxNzQ7czo2NDoiZWNob1xzK3N0cmlwc2xhc2hlc1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToxNzU7czoyMjoiPGgxPkxvYWRpbmdcLlwuXC48L2gxPiI7aToxNzY7czoxMjoicGhwaW5mb1woXCk7IjtpOjE3NztzOjE4NzoiKGV2YWx8YmFzZTY0X2RlY29kZXxnemluZmxhdGV8Z3p1bmNvbXByZXNzfHN0cl9yb3QxM3xtZDUpXHMqXChccyooZXZhbHxiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8c3RyX3JvdDEzfG1kNSlccypcKFxzKihldmFsfGJhc2U2NF9kZWNvZGV8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xzdHJfcm90MTN8bWQ1KSI7aToxNzg7czoxMToiSGFja2VkXHMrQnkiO2k6MTc5O3M6MTU6IlsnIl0vXC5cKi9lWyciXSI7aToxODA7czoyODoiZWNob1xzKlwoKlxzKlsnIl1OTyBGSUxFWyciXSI7aToxODE7czoxOTA6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoKlxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX1uYW1lWyciXXswLDF9XHMqXF0iO2k6MTgyO3M6MjM6ImNvcHlccypcKFxzKlsnIl1odHRwOi8vIjtpOjE4MztzOjgyOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9UmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKlVSTD1odHRwOi8vIjtpOjE4NDtzOjgxOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9cmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKnVybD08XD9waHAiO2k6MTg1O3M6MTA6IlsnIl1hSFIwY0QiO2k6MTg2O3M6Njc6InN0cmNoclxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg3O3M6Njc6InN0cnN0clxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg4O3M6Njc6InN0cnBvc1xzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg5O3M6MzM6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLXBocCI7aToxOTA7czoxMDoicGNudGxfZXhlYyI7aToxOTE7czo2OToiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKCpbJyJdY2RccysvdG1wIjtpOjE5MjtzOjI3OiJcJE9PTy4rPz1ccyp1cmxkZWNvZGVccypcKCoiO2k6MTkzO3M6MTI6InJtXHMrLWZccystciI7aToxOTQ7czoxMjoicm1ccystclxzKy1mIjtpOjE5NTtzOjg6InJtXHMrLWZyIjtpOjE5NjtzOjg6InJtXHMrLXJmIjtpOjE5NztzOjYzOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXWltYWdlcy8iO2k6MTk4O3M6ODk6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjE5OTtzOjU5OiJiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMDA7czo1MToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZVxzKlwoXHMqWyciXXswLDF9JTNDIjtpOjIwMTtzOjg6Ii8vTk9uYU1FIjtpOjIwMjtzOjg6ImxzXHMrLWxhIjtpOjIwMztzOjM3OiJpbmlfc2V0XChccypbJyJdezAsMX1tYWdpY19xdW90ZXNfZ3BjIjtpOjIwNDtzOjI4OiJhbmRyb2lkXHxhdmFudGdvXHxibGFja2JlcnJ5IjtpOjIwNTtzOjQxOiJmaW5kXHMrL1xzKy10eXBlXHMrZlxzKy1uYW1lXHMrXC5odHBhc3N3ZCI7aToyMDY7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wMjAwMCI7aToyMDc7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wNDAwMCI7fQ=="));
$g_ExceptFlex unserialize(base64_decode("YToxMDc6e2k6MDtzOjM3OiJlY2hvICI8c2NyaXB0PiBhbGVydFwoJyJcLlwkZGItPmdldEVyIjtpOjE7czo0MDoiZWNobyAiPHNjcmlwdD4gYWxlcnRcKCciXC5cJG1vZGVsLT5nZXRFciI7aToyO3M6ODoic29ydFwoXCkiO2k6MztzOjEwOiJtdXN0LXJldmFsIjtpOjQ7czo2OiJyaWV2YWwiO2k6NTtzOjk6ImRvdWJsZXZhbCI7aTo2O3M6NjY6InJlcXVpcmVccypcKCpccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1ccypcXSI7aTo3O3M6NzE6InJlcXVpcmVfb25jZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjg7czo2NjoiaW5jbHVkZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjk7czo3MToiaW5jbHVkZV9vbmNlXHMqXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XHMqXF0iO2k6MTA7czoxNzoiXCRzbWFydHktPl9ldmFsXCgiO2k6MTE7czozMDoicHJlcFxzK3JtXHMrLXJmXHMrJXtidWlsZHJvb3R9IjtpOjEyO3M6MjI6IlRPRE86XHMrcm1ccystcmZccyt0aGUiO2k6MTM7czoyNzoia3Jzb3J0XChcJHdwc21pbGllc3RyYW5zXCk7IjtpOjE0O3M6NjM6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCIlM0NzY3JpcHQgc3JjPSciIFwrIGdhSnNIb3N0IFwrICJnbyI7aToxNTtzOjY6IlwuZXhlYyI7aToxNjtzOjg6ImV4ZWNcKFwpIjtpOjE3O3M6MjQ6IlwkeDEgPSBcJHRoaXMtPncgLSBcJHgxOyI7aToxODtzOjMxOiJhc29ydFwoXCRDYWNoZURpck9sZEZpbGVzQWdlXCk7IjtpOjE5O3M6MTM6IlwoJ3I1N3NoZWxsJywiO2k6MjA7czoyNToiZXZhbFwoImxpc3RlbmVyID0gIlwrbGlzdCI7aToyMTtzOjg6ImV2YWxcKFwpIjtpOjIyO3M6MzM6InByZWdfcmVwbGFjZV9jYWxsYmFja1woJy9cXHtcKGltYSI7aToyMztzOjIxOiJldmFsIFwoX2N0TWVudUluaXRTdHIiO2k6MjQ7czoyOToiYmFzZTY0X2RlY29kZVwoXCRhY2NvdW50S2V5XCkiO2k6MjU7czozOToiYmFzZTY0X2RlY29kZVwoXCRkYXRhXClcKTsgXCRhcGktPnNldFJlIjtpOjI2O3M6NDg6InJlcXVpcmVcKFwkX1NFUlZFUlxbXFwiRE9DVU1FTlRfUk9PVFxcIlxdXC5cXCIvYiI7aToyNztzOjY1OiJiYXNlNjRfZGVjb2RlXChcJF9SRVFVRVNUXFsncGFyYW1ldGVycydcXVwpOyBpZlwoQ2hlY2tTZXJpYWxpemVkRCI7aToyODtzOjYzOiJwY250bF9leGVjJyA9PiBBcnJheVwoQXJyYXlcKDFcKSwgXCRhclJlc3VsdFxbJ1NFQ1VSSU5HX0ZVTkNUSU8iO2k6Mjk7czozOToiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkNVdGlsOjpKU0VzY2FwIjtpOjMwO3M6Njg6ImJhc2U2NF9kZWNvZGVcKFwkX1JFUVVFU1RcWyd0aXRsZV9jaGFuZ2VyX2xpbmsnXF1cKTsgaWYgXChzdHJsZW5cKFwkIjtpOjMxO3M6NTE6ImV2YWxcKCdcJGhleGR0aW1lID0gIicgXC4gXCRoZXhkdGltZSBcLiAnIjsnXCk7IFwkZiI7aTozMjtzOjUyOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnXCRyb3ctPnRpdGxlIC0gIlwuX01PRFVMRV9JU19FIjtpOjMzO3M6Mzc6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCdcJGNpZHMgIlwuX0NBTk4iO2k6MzQ7czo0MToiaWZcKDFcKSB7IFwkdl9ob3VyID0gXChcJHBfaGVhZGVyXFsnbXRpbWUiO2k6MzU7czo3MDoiZG9jdW1lbnRcLndyaXRlXCh1bmVzY2FwZVwoIiUzQ3NjcmlwdCUyMHNyYz0lMjJodHRwIiBcKyBcKFwoImh0dHBzOiIgPSI7aTozNjtzOjU3OiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nIiBcKyBwa0Jhc2VVUkwiO2k6Mzc7czozMjoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjoiO2k6Mzg7czoyNToiJ2ZpbGVuYW1lJ1wpLCBcKCdyNTdzaGVsbCI7aTozOTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIiBcLiBcJGVyck1zZyBcLiAiJ1wpIjtpOjQwO3M6NDI6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKFxcIkVycm9yIHdoZW4gbG9hZGluZyI7aTo0MTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIlwuSlRleHQ6Ol9cKCdWQUxJRF9FIjtpOjQyO3M6ODoiZXZhbFwoXCkiO2k6NDM7czo4OiInc3lzdGVtJyI7aTo0NDtzOjY6IidldmFsJyI7aTo0NTtzOjY6IiJldmFsIiI7aTo0NjtzOjY6ImNvcHlcKCI7aTo0NztzOjc6Il9zeXN0ZW0iO2k6NDg7czo5OiJzYXZlMmNvcHkiO2k6NDk7czoxMDoiZmlsZXN5c3RlbSI7aTo1MDtzOjg6InNlbmRtYWlsIjtpOjUxO3M6ODoiY2FuQ2htb2QiO2k6NTI7czoxMzoiL2V0Yy9wYXNzd2RcKSI7aTo1MztzOjI0OiJ1ZHA6Ly8nXC5zZWxmOjpcJF9jX2FkZHIiO2k6NTQ7czozNDoiZWRvY2VkXzQ2ZXNhYlwoJydcfCJcKVxcXCknLCAncmVnZSI7aTo1NTtzOjk6ImRvdWJsZXZhbCI7aTo1NjtzOjE2OiJvcGVyYXRpbmcgc3lzdGVtIjtpOjU3O3M6MTA6Imdsb2JhbGV2YWwiO2k6NTg7czoyMToid2l0aCAwLzAvMCBpZiBcKDFcKSB7IjtpOjU5O3M6NDg6IlwkeDIgPSBcJHBhcmFtXFtbJyJdezAsMX14WyciXXswLDF9XF0gXCsgXCR3aWR0aCI7aTo2MDtzOjExOiJzcGVjaWFsaXNlZCI7aTo2MTtzOjE5OiJ3cF9nZXRfY3VycmVudF91c2VyIjtpOjYyO3M6NzoiLT5jaG1vZCI7aTo2MztzOjc6Il9tYWlsXCgiO2k6NjQ7czo3OiJfY29weVwoIjtpOjY1O3M6NDY6InN0cnBvc1woXCRfU0VSVkVSXFsnSFRUUF9VU0VSX0FHRU5UJ1xdLCAnRHJ1cGEiO2k6NjY7czo0NToic3RycG9zXChcJF9TRVJWRVJcWydIVFRQX1VTRVJfQUdFTlQnXF0sICdNU0lFIjtpOjY3O3M6NDU6InN0cnBvc1woXCRfU0VSVkVSXFsiSFRUUF9VU0VSX0FHRU5UIlxdLCAnTVNJRSI7aTo2ODtzOjE3OiJldmFsIFwoY2xhc3NTdHJcKSI7aTo2OTtzOjMxOiJmdW5jdGlvbl9leGlzdHNcKCdiYXNlNjRfZGVjb2RlIjtpOjcwO3M6NDQ6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCciXC5KVGV4dDo6X1woJ1ZBTElEX0VNIjtpOjcxO3M6NTI6IlwkeDEgPSBcJG1pbl94OyBcJHgyID0gXCRtYXhfeDsgXCR5MSA9IFwkbWluX3k7IFwkeTIiO2k6NzI7czo1NToiXCRjdG1cWydhJ1xdXClcKSB7IFwkeCA9IFwkeCBcKiBcJHRoaXMtPms7IFwkeSA9IFwoXCR0aCI7aTo3MztzOjYwOiJbJyJdezAsMX1jcmVhdGVfZnVuY3Rpb25bJyJdezAsMX0sIFsnIl17MCwxfWdldF9yZXNvdXJjZV90eXAiO2k6NzQ7czo0OToiWyciXXswLDF9Y3JlYXRlX2Z1bmN0aW9uWyciXXswLDF9LCBbJyJdezAsMX1jcnlwdCI7aTo3NTtzOjY5OiJzdHJwb3NcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sIFsnIl17MCwxfUx5bngiO2k6NzY7czo2ODoic3Ryc3RyXChcJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfVVNFUl9BR0VOVFsnIl17MCwxfVxdLCBbJyJdezAsMX1NU0kiO2k6Nzc7czoyNToic29ydFwoXCREaXN0cmlidXRpb25cW1wkayI7aTo3ODtzOjI1OiJzb3J0XChmdW5jdGlvblwoYSxiXCl7cmV0IjtpOjc5O3M6MjU6Imh0dHA6Ly93d3dcLmZhY2Vib29rXC5jb20iO2k6ODA7czoyNToiaHR0cDovL21hcHNcLmdvb2dsZVwuY29tLyI7aTo4MTtzOjUyOiJ1ZHA6Ly8nXC5zZWxmOjpcJGNfYWRkciwgODAsIFwkZXJybm8sIFwkZXJyc3RyLCAxNTAwIjtpOjgyO3M6MjA6IlwoXC5cKlwodmlld1wpXD9cLlwqIjtpOjgzO3M6NDQ6ImVjaG8gWyciXXswLDF9PHNjcmlwdD5hbGVydFwoWyciXXswLDF9XCR0ZXh0IjtpOjg0O3M6MTc6InNvcnRcKFwkdl9saXN0XCk7IjtpOjg1O3M6Nzc6Im1vdmVfdXBsb2FkZWRfZmlsZVwoIFwkX0ZJTEVTXFsndXBsb2FkZWRfcGFja2FnZSdcXVxbJ3RtcF9uYW1lJ1xdLCBcJG1vc0NvbmZpIjtpOjg2O3M6MzE6IkNyZWRpdCBDYXJkIFZlcmlmaWNhdGlvbiBDb2RlJzsiO2k6ODc7czoxMjoiZmFsc2VcKSBcKTsjIjtpOjg4O3M6MTU6Im5jeV9uYW1lYCcgXCk7IyI7aTo4OTtzOjQ3OiJzdHJwb3NcKFwkX1NFUlZFUlxbJ0hUVFBfVVNFUl9BR0VOVCdcXSwgJ01hYyBPUyI7aTo5MDtzOjIwOiIvL25vbmFtZTogJzxcPz1DVXRpbCI7aTo5MTtzOjUwOiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nL2JpdHJpeCI7aTo5MjtzOjI1OiJcJF9TRVJWRVIgXFsiUkVNT1RFX0FERFIiIjtpOjkzO3M6MTc6ImFIUjBjRG92TDJOeWJETXVaIjtpOjk0O3M6NTU6IkpSZXNwb25zZTo6c2V0Qm9keVwocHJlZ19yZXBsYWNlXChcJHBhdHRlcm5zLCBcJHJlcGxhY2UiO2k6OTU7czo0MDoiXFx4MWZcXHg4YlxceDA4XFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCI7aTo5NjtzOjQwOiJcXHg1MFxceDRiXFx4MDVcXHgwNlxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjk3O3M6NDY6IlxceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceDJGXFx4M0VcXVxbXF4iO2k6OTg7czo0MDoiXFx4ODlcXHg1MFxceDRFXFx4NDdcXHgwRFxceDBBXFx4MUFcXHgwQSI7aTo5OTtzOjEwOiJcKTsjaScsICcmIjtpOjEwMDtzOjE3OiJcKTsjbWlzJywgJyAnLCBcJCI7aToxMDE7czoyMDoiXCk7I2knLCBcJGRhdGEsIFwkbWEiO2k6MTAyO3M6MzU6IlwkZnVuY1woIFwkcGFyYW1zXFtcJHR5cGVcXS0+cGFyYW1zIjtpOjEwMztzOjQwOiJcXHgxZlxceDhiXFx4MDhcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjEwNDtzOjQ1OiJcXHgwMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFx4MDgiO2k6MTA1O3M6NDA6IlxceDIxXFx4MjNcXHgyNFxceDI1XFx4MjZcXHgyN1xceDJhXFx4MmIiO2k6MTA2O3M6MzU6IlxceDgzXFx4OEJcXHg4RFxceDlCXFx4OUVcXHg5RlxceEExIjt9"));
$g_SusDB unserialize(base64_decode("YToxMzE6e2k6MDtzOjE0OiJAKmV4dHJhY3RccypcKCI7aToxO3M6MTQ6IkAqZXh0cmFjdFxzKlwkIjtpOjI7czoxMjoiWyciXWV2YWxbJyJdIjtpOjM7czoyMToiWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjQ7czoyMzoiWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6NTtzOjE0OiJbJyJdYXNzZXJ0WyciXSI7aTo2O3M6NDM6ImZvcmVhY2hccypcKFxzKlwkZW1haWxzXHMrYXNccytcJGVtYWlsXHMqXCkiO2k6NztzOjc6IlNwYW1tZXIiO2k6ODtzOjE1OiJldmFsXHMqWyciXChcJF0iO2k6OTtzOjE3OiJhc3NlcnRccypbJyJcKFwkXSI7aToxMDtzOjI4OiJzcnBhdGg6Ly9cLlwuL1wuXC4vXC5cLi9cLlwuIjtpOjExO3M6MTI6InBocGluZm9ccypcKCI7aToxMjtzOjE2OiJTSE9XXHMrREFUQUJBU0VTIjtpOjEzO3M6MTI6IlxicG9wZW5ccypcKCI7aToxNDtzOjk6ImV4ZWNccypcKCI7aToxNTtzOjEzOiJcYnN5c3RlbVxzKlwoIjtpOjE2O3M6MTU6IlxicGFzc3RocnVccypcKCI7aToxNztzOjE2OiJcYnByb2Nfb3BlblxzKlwoIjtpOjE4O3M6MTU6InNoZWxsX2V4ZWNccypcKCI7aToxOTtzOjE2OiJpbmlfcmVzdG9yZVxzKlwoIjtpOjIwO3M6OToiXGJkbFxzKlwoIjtpOjIxO3M6MTQ6Ilxic3ltbGlua1xzKlwoIjtpOjIyO3M6MTI6IlxiY2hncnBccypcKCI7aToyMztzOjE0OiJcYmluaV9zZXRccypcKCI7aToyNDtzOjEzOiJcYnB1dGVudlxzKlwoIjtpOjI1O3M6MTM6ImdldG15dWlkXHMqXCgiO2k6MjY7czoxNDoiZnNvY2tvcGVuXHMqXCgiO2k6Mjc7czoxNzoicG9zaXhfc2V0dWlkXHMqXCgiO2k6Mjg7czoxNzoicG9zaXhfc2V0c2lkXHMqXCgiO2k6Mjk7czoxODoicG9zaXhfc2V0cGdpZFxzKlwoIjtpOjMwO3M6MTU6InBvc2l4X2tpbGxccypcKCI7aTozMTtzOjI3OiJhcGFjaGVfY2hpbGRfdGVybWluYXRlXHMqXCgiO2k6MzI7czoxMjoiXGJjaG1vZFxzKlwoIjtpOjMzO3M6MTI6IlxiY2hkaXJccypcKCI7aTozNDtzOjE1OiJwY250bF9leGVjXHMqXCgiO2k6MzU7czoxNDoiXGJ2aXJ0dWFsXHMqXCgiO2k6MzY7czoxNToicHJvY19jbG9zZVxzKlwoIjtpOjM3O3M6MjA6InByb2NfZ2V0X3N0YXR1c1xzKlwoIjtpOjM4O3M6MTk6InByb2NfdGVybWluYXRlXHMqXCgiO2k6Mzk7czoxNDoicHJvY19uaWNlXHMqXCgiO2k6NDA7czoxMzoiZ2V0bXlnaWRccypcKCI7aTo0MTtzOjE5OiJwcm9jX2dldHN0YXR1c1xzKlwoIjtpOjQyO3M6MTU6InByb2NfY2xvc2VccypcKCI7aTo0MztzOjE5OiJlc2NhcGVzaGVsbGNtZFxzKlwoIjtpOjQ0O3M6MTk6ImVzY2FwZXNoZWxsYXJnXHMqXCgiO2k6NDU7czoxNjoic2hvd19zb3VyY2VccypcKCI7aTo0NjtzOjEzOiJcYnBjbG9zZVxzKlwoIjtpOjQ3O3M6MTM6InNhZmVfZGlyXHMqXCgiO2k6NDg7czoxNjoiaW5pX3Jlc3RvcmVccypcKCI7aTo0OTtzOjEwOiJjaG93blxzKlwoIjtpOjUwO3M6MTA6ImNoZ3JwXHMqXCgiO2k6NTE7czoxNzoic2hvd25fc291cmNlXHMqXCgiO2k6NTI7czoxOToibXlzcWxfbGlzdF9kYnNccypcKCI7aTo1MztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTQ7czoxMjoiZ2V0bXlpZFxzKlwoIjtpOjU1O3M6MTE6IlxibGVha1xzKlwoIjtpOjU2O3M6MTU6InBmc29ja29wZW5ccypcKCI7aTo1NztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTg7czoxMToic3lzbG9nXHMqXCgiO2k6NTk7czoxODoiXCRkZWZhdWx0X3VzZV9hamF4IjtpOjYwO3M6MjE6ImV2YWxccypcKCpccyp1bmVzY2FwZSI7aTo2MTtzOjc6IkZMb29kZVIiO2k6NjI7czozMToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZSI7aTo2MztzOjExOiJcYmNvcHlccypcKCI7aTo2NDtzOjIzOiJtb3ZlX3VwbG9hZGVkX2ZpbGVccypcKCI7aTo2NTtzOjg6IlwuMzMzMzMzIjtpOjY2O3M6ODoiXC42NjY2NjYiO2k6Njc7czoyMToicm91bmRccypcKCpccyowXHMqXCkqIjtpOjY4O3M6MTExOiJjb3B5XHMqXCgqXHMqXCRfRklMRVNccypcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKixccypcJHVwbG9hZGZpbGUiO2k6Njk7czoxMjY6Im1vdmVfdXBsb2FkZWRfZmlsZXNccypcKCpccypcJF9GSUxFU1xzKlxbXHMqWyciXXswLDF9ZmlsZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkdXBsb2FkZmlsZSI7aTo3MDtzOjUwOiJpbmlfZ2V0XHMqXChccypbJyJdezAsMX1kaXNhYmxlX2Z1bmN0aW9uc1snIl17MCwxfSI7aTo3MTtzOjM2OiJVTklPTlxzK1NFTEVDVFxzK1snIl17MCwxfTBbJyJdezAsMX0iO2k6NzI7czoxMDoiMlxzKj5ccyomMSI7aTo3MztzOjU3OiJlY2hvXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF0iO2k6NzQ7czozNzoiPVxzKkFycmF5XHMqXCgqXHMqYmFzZTY0X2RlY29kZVxzKlwoKiI7aTo3NTtzOjE0OiJraWxsYWxsXHMrLVxkKyI7aTo3NjtzOjc6ImVyaXVxZXIiO2k6Nzc7czoxMDoidG91Y2hccypcKCI7aTo3ODtzOjc6InNzaGtleXMiO2k6Nzk7czo4OiJAaW5jbHVkZSI7aTo4MDtzOjg6IkByZXF1aXJlIjtpOjgxO3M6NjI6ImlmXHMqXChtYWlsXHMqXChccypcJHRvLFxzKlwkc3ViamVjdCxccypcJG1lc3NhZ2UsXHMqXCRoZWFkZXJzIjtpOjgyO3M6Mzg6IkBpbmlfc2V0XHMqXCgqWyciXXswLDF9YWxsb3dfdXJsX2ZvcGVuIjtpOjgzO3M6MTg6IkBmaWxlX2dldF9jb250ZW50cyI7aTo4NDtzOjE3OiJmaWxlX3B1dF9jb250ZW50cyI7aTo4NTtzOjQ2OiJhbmRyb2lkXHMqXHxccyptaWRwXHMqXHxccypqMm1lXHMqXHxccypzeW1iaWFuIjtpOjg2O3M6Mjg6IkBzZXRjb29raWVccypcKCpbJyJdezAsMX1oaXQiO2k6ODc7czoxMDoiQGZpbGVvd25lciI7aTo4ODtzOjY6IjxrdWt1PiI7aTo4OTtzOjU6InN5cGV4IjtpOjkwO3M6OToiXCRiZWVjb2RlIjtpOjkxO3M6ODoiQmFja2Rvb3IiO2k6OTI7czoxNDoicGhwX3VuYW1lXHMqXCgiO2k6OTM7czo1NToibWFpbFxzKlwoKlxzKlwkdG9ccyosXHMqXCRzdWJqXHMqLFxzKlwkbXNnXHMqLFxzKlwkZnJvbSI7aTo5NDtzOjI5OiJlY2hvXHMqWyciXTxzY3JpcHQ+XHMqYWxlcnRcKCI7aTo5NTtzOjY3OiJtYWlsXHMqXCgqXHMqXCRzZW5kXHMqLFxzKlwkc3ViamVjdFxzKixccypcJGhlYWRlcnNccyosXHMqXCRtZXNzYWdlIjtpOjk2O3M6NjU6Im1haWxccypcKCpccypcJHRvXHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJzIjtpOjk3O3M6MTIwOiJzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9SFRUUF9bJyJdezAsMX1ccypcKSpccyohPT1ccyowXHMqJiZccypzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9UkVRVUVTVF8iO2k6OTg7czo1MzoiaXNfZnVuY3Rpb25fZW5hYmxlZFxzKlwoXHMqWyciXXswLDF9aWdub3JlX3VzZXJfYWJvcnQiO2k6OTk7czozMDoiZWNob1xzKlwoKlxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjEwMDtzOjI2OiJlY2hvXHMqXCgqWyciXXswLDF9PHNjcmlwdCI7aToxMDE7czozMToicHJpbnRccypcKCpccypmaWxlX2dldF9jb250ZW50cyI7aToxMDI7czoyNzoicHJpbnRccypcKCpbJyJdezAsMX08c2NyaXB0IjtpOjEwMztzOjg1OiI8bWFycXVlZVxzK3N0eWxlXHMqPVxzKlsnIl17MCwxfXBvc2l0aW9uXHMqOlxzKmFic29sdXRlXHMqO1xzKndpZHRoXHMqOlxzKlxkK1xzKnB4XHMqIjtpOjEwNDtzOjQyOiI9XHMqWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vd3AtY29uZmlnXC5waHAiO2k6MTA1O3M6NzoiZWdnZHJvcCI7aToxMDY7czo5OiJyd3hyd3hyd3giO2k6MTA3O3M6MTU6ImVycm9yX3JlcG9ydGluZyI7aToxMDg7czoxNzoiXGJjcmVhdGVfZnVuY3Rpb24iO2k6MTA5O3M6NDM6Intccypwb3NpdGlvblxzKjpccyphYnNvbHV0ZTtccypsZWZ0XHMqOlxzKi0iO2k6MTEwO3M6MTU6IjxzY3JpcHRccythc3luYyI7aToxMTE7czo2NjoiX1snIl17MCwxfVxzKlxdXHMqPVxzKkFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqWyciXXswLDF9IjtpOjExMjtzOjMzOiJBZGRUeXBlXHMrYXBwbGljYXRpb24veC1odHRwZC1jZ2kiO2k6MTEzO3M6NDQ6ImdldGVudlxzKlwoKlxzKlsnIl17MCwxfUhUVFBfQ09PS0lFWyciXXswLDF9IjtpOjExNDtzOjQ1OiJpZ25vcmVfdXNlcl9hYm9ydFxzKlwoKlxzKlsnIl17MCwxfTFbJyJdezAsMX0iO2k6MTE1O3M6MjE6IlwkX1JFUVVFU1RccypcW1xzKiUyMiI7aToxMTY7czo1MToidXJsXHMqXChbJyJdezAsMX1kYXRhXHMqOlxzKmltYWdlL3BuZztccypiYXNlNjRccyosIjtpOjExNztzOjUxOiJ1cmxccypcKFsnIl17MCwxfWRhdGFccyo6XHMqaW1hZ2UvZ2lmO1xzKmJhc2U2NFxzKiwiO2k6MTE4O3M6MzA6Ijpccyp1cmxccypcKFxzKlsnIl17MCwxfTxcP3BocCI7aToxMTk7czoxNzoiPC9odG1sPi4rPzxzY3JpcHQiO2k6MTIwO3M6MTc6IjwvaHRtbD4uKz88aWZyYW1lIjtpOjEyMTtzOjY0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlsnIlwoXCRdIjtpOjEyMjtzOjExOiJcYm1haWxccypcKCI7aToxMjM7czo0NjoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypbJyJdezAsMX1waHA6Ly9pbnB1dCI7aToxMjQ7czoxMTg6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdezAsMX1Db250ZW50LXR5cGVbJyJdezAsMX1ccytjb250ZW50PVsnIl17MCwxfXRleHQvaHRtbDtccypjaGFyc2V0PXdpbmRvd3MtMTI1MVsnIl17MCwxfT48Ym9keT4iO2k6MTI1O3M6NjI6Ij1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoXHMqWyciXXswLDF9c2NyaXB0WyciXXswLDF9XHMqXCk7IjtpOjEyNjtzOjY5OiJkb2N1bWVudFwuYm9keVwuaW5zZXJ0QmVmb3JlXChkaXYsXHMqZG9jdW1lbnRcLmJvZHlcLmNoaWxkcmVuXFswXF1cKTsiO2k6MTI3O3M6Nzc6IjxzY3JpcHRccyt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXHMrc3JjPSJodHRwOi8vW2EtekEtWjAtOV9dKz9cLnBocCI+PC9zY3JpcHQ+IjtpOjEyODtzOjI3OiJlY2hvXHMrWyciXXswLDF9b2tbJyJdezAsMX0iO2k6MTI5O3M6MTg6Ii91c3Ivc2Jpbi9zZW5kbWFpbCI7aToxMzA7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO30="));
$g_SusDBPrio unserialize(base64_decode("YToxMjE6e2k6MDtpOjA7aToxO2k6MDtpOjI7aTowO2k6MztpOjA7aTo0O2k6MDtpOjU7aTowO2k6NjtpOjA7aTo3O2k6MDtpOjg7aToxO2k6OTtpOjE7aToxMDtpOjA7aToxMTtpOjA7aToxMjtpOjA7aToxMztpOjA7aToxNDtpOjA7aToxNTtpOjA7aToxNjtpOjA7aToxNztpOjA7aToxODtpOjA7aToxOTtpOjA7aToyMDtpOjA7aToyMTtpOjA7aToyMjtpOjA7aToyMztpOjA7aToyNDtpOjA7aToyNTtpOjA7aToyNjtpOjA7aToyNztpOjA7aToyODtpOjA7aToyOTtpOjE7aTozMDtpOjE7aTozMTtpOjA7aTozMjtpOjA7aTozMztpOjA7aTozNDtpOjA7aTozNTtpOjA7aTozNjtpOjA7aTozNztpOjA7aTozODtpOjA7aTozOTtpOjA7aTo0MDtpOjA7aTo0MTtpOjA7aTo0MjtpOjA7aTo0MztpOjA7aTo0NDtpOjA7aTo0NTtpOjA7aTo0NjtpOjA7aTo0NztpOjA7aTo0ODtpOjA7aTo0OTtpOjA7aTo1MDtpOjA7aTo1MTtpOjA7aTo1MjtpOjA7aTo1MztpOjA7aTo1NDtpOjA7aTo1NTtpOjA7aTo1NjtpOjE7aTo1NztpOjA7aTo1ODtpOjA7aTo1OTtpOjI7aTo2MDtpOjE7aTo2MTtpOjA7aTo2MjtpOjA7aTo2MztpOjA7aTo2NDtpOjI7aTo2NTtpOjI7aTo2NjtpOjA7aTo2NztpOjA7aTo2ODtpOjA7aTo2OTtpOjI7aTo3MDtpOjE7aTo3MTtpOjA7aTo3MjtpOjA7aTo3MztpOjE7aTo3NDtpOjA7aTo3NTtpOjE7aTo3NjtpOjE7aTo3NztpOjI7aTo3ODtpOjE7aTo3OTtpOjM7aTo4MDtpOjI7aTo4MTtpOjA7aTo4MjtpOjI7aTo4MztpOjA7aTo4NDtpOjA7aTo4NTtpOjI7aTo4NjtpOjA7aTo4NztpOjA7aTo4ODtpOjA7aTo4OTtpOjE7aTo5MDtpOjE7aTo5MTtpOjE7aTo5MjtpOjE7aTo5MztpOjA7aTo5NDtpOjI7aTo5NTtpOjI7aTo5NjtpOjI7aTo5NztpOjI7aTo5ODtpOjI7aTo5OTtpOjE7aToxMDA7aToxO2k6MTAxO2k6MztpOjEwMjtpOjM7aToxMDM7aToxO2k6MTA0O2k6MztpOjEwNTtpOjM7aToxMDY7aToyO2k6MTA3O2k6MDtpOjEwODtpOjM7aToxMDk7aToxO2k6MTEwO2k6MTtpOjExMTtpOjM7aToxMTI7aTozO2k6MTEzO2k6MztpOjExNDtpOjE7aToxMTU7aToxO2k6MTE2O2k6MTtpOjExNztpOjQ7aToxMTg7aToxO2k6MTE5O2k6MztpOjEyMDtpOjA7fQ=="));
$g_AdwareSig unserialize(base64_decode("YTozMzp7aTowO3M6MTk6Il9fbGlua2ZlZWRfcm9ib3RzX18iO2k6MTtzOjEzOiJMSU5LRkVFRF9VU0VSIjtpOjI7czoxNDoiTGlua2ZlZWRDbGllbnQiO2k6MztzOjE4OiJfX3NhcGVfZGVsaW1pdGVyX18iO2k6NDtzOjI5OiJkaXNwZW5zZXJcLmFydGljbGVzXC5zYXBlXC5ydSI7aTo1O3M6MTE6IkxFTktfY2xpZW50IjtpOjY7czoxMToiU0FQRV9jbGllbnQiO2k6NztzOjE2OiJfX2xpbmtmZWVkX2VuZF9fIjtpOjg7czoxNjoiU0xBcnRpY2xlc0NsaWVudCI7aTo5O3M6MTc6Ii0+R2V0TGlua3NccypcKFwpIjtpOjEwO3M6MTc6ImRiXC50cnVzdGxpbmtcLnJ1IjtpOjExO3M6Mzc6ImNsYXNzXHMrQ01fY2xpZW50XHMrZXh0ZW5kc1xzKkNNX2Jhc2UiO2k6MTI7czoxOToibmV3XHMrQ01fY2xpZW50XChcKSI7aToxMztzOjE2OiJ0bF9saW5rc19kYl9maWxlIjtpOjE0O3M6MjA6ImNsYXNzXHMrbG1wX2Jhc2Vccyt7IjtpOjE1O3M6MTU6IlRydXN0bGlua0NsaWVudCI7aToxNjtzOjEzOiItPlxzKlNMQ2xpZW50IjtpOjE3O3M6MTY2OiJpc3NldFxzKlwoKlxzKlwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF1ccypcKVxzKiYmXHMqXCgqXHMqXCRfU0VSVkVSXHMqXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXVxzKj09XHMqWyciXXswLDF9TE1QX1JvYm90IjtpOjE4O3M6NDM6IlwkbGlua3MtPlxzKnJldHVybl9saW5rc1xzKlwoKlxzKlwkbGliX3BhdGgiO2k6MTk7czo0NDoiXCRsaW5rc19jbGFzc1xzKj1ccypuZXdccytHZXRfbGlua3NccypcKCpccyoiO2k6MjA7czo1MjoiWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfVwuWyciXXswLDF9XHMqXCkqXHMqO1xzKlw/PiI7aToyMTtzOjc6Imxldml0cmEiO2k6MjI7czoxMDoiZGFwb3hldGluZSI7aToyMztzOjY6InZpYWdyYSI7aToyNDtzOjY6ImNpYWxpcyI7aToyNTtzOjg6InByb3ZpZ2lsIjtpOjI2O3M6MTk6ImNsYXNzXHMrVFdlZmZDbGllbnQiO2k6Mjc7czoxODoibmV3XHMrU0xDbGllbnRcKFwpIjtpOjI4O3M6MjQ6Il9fbGlua2ZlZWRfYmVmb3JlX3RleHRfXyI7aToyOTtzOjE2OiJfX3Rlc3RfdGxfbGlua19fIjtpOjMwO3M6MTg6InM6MTE6ImxtcF9jaGFyc2V0IiI7aTozMTtzOjIwOiI9XHMrbmV3XHMrTUxDbGllbnRcKCI7aTozMjtzOjQ3OiJlbHNlXHMraWZccypcKFxzKlwoXHMqc3RycG9zXChccypcJGxpbmtzX2lwXHMqLCI7fQ=="));
$g_JSVirSig unserialize(base64_decode("YToxMTM6e2k6MDtzOjcwOiJ1c2VyQWdlbnRcfHBwXHxodHRwXHxkYXphbHl6WyciXXswLDF9XC5zcGxpdFwoWyciXXswLDF9XHxbJyJdezAsMX1cKSwwIjtpOjE7czo0MToiZj0nZidcKydyJ1wrJ28nXCsnbSdcKydDaCdcKydhckMnXCsnb2RlJzsiO2k6MjtzOjIyOiJcLnByb3RvdHlwZVwuYX1jYXRjaFwoIjtpOjM7czozNzoidHJ5e0Jvb2xlYW5cKFwpXC5wcm90b3R5cGVcLnF9Y2F0Y2hcKCI7aTo0O3M6MzQ6ImlmXChSZWZcLmluZGV4T2ZcKCdcLmdvb2dsZVwuJ1wpIT0iO2k6NTtzOjg2OiJpbmRleE9mXHxpZlx8cmNcfGxlbmd0aFx8bXNuXHx5YWhvb1x8cmVmZXJyZXJcfGFsdGF2aXN0YVx8b2dvXHxiaVx8aHBcfHZhclx8YW9sXHxxdWVyeSI7aTo2O3M6NTQ6IkFycmF5XC5wcm90b3R5cGVcLnNsaWNlXC5jYWxsXChhcmd1bWVudHNcKVwuam9pblwoIiJcKSI7aTo3O3M6ODI6InE9ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKCJkIlwrImkiXCsidiJcKTtxXC5hcHBlbmRDaGlsZFwocVwrIiJcKTt9Y2F0Y2hcKHF3XCl7aD0iO2k6ODtzOjc5OiJcK3p6O3NzPVxbXF07Zj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7dz10aGlzO2U9d1xbZlxbInN1YnN0ciJcXVwoIjtpOjk7czoxMTU6InM1XChxNVwpe3JldHVybiBcK1wrcTU7fWZ1bmN0aW9uIHlmXChzZix3ZVwpe3JldHVybiBzZlwuc3Vic3RyXCh3ZSwxXCk7fWZ1bmN0aW9uIHkxXCh3Ylwpe2lmXCh3Yj09MTY4XCl3Yj0xMDI1O2Vsc2UiO2k6MTA7czo2NDoiaWZcKG5hdmlnYXRvclwudXNlckFnZW50XC5tYXRjaFwoL1woYW5kcm9pZFx8bWlkcFx8ajJtZVx8c3ltYmlhbiI7aToxMTtzOjEwNjoiZG9jdW1lbnRcLndyaXRlXCgnPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IidcK2RvbWFpblwrJyI+PC9zY3InXCsnaXB0PidcKSI7aToxMjtzOjMxOiJodHRwOi8vcGhzcFwucnUvXy9nb1wucGhwXD9zaWQ9IjtpOjEzO3M6MTc6IjwvaHRtbD5ccyo8c2NyaXB0IjtpOjE0O3M6MTc6IjwvaHRtbD5ccyo8aWZyYW1lIjtpOjE1O3M6NjY6Ij1uYXZpZ2F0b3JcW2FwcFZlcnNpb25fdmFyXF1cLmluZGV4T2ZcKCJNU0lFIlwpIT0tMVw/JzxpZnJhbWUgbmFtZSI7aToxNjtzOjc6IlxceDY1QXQiO2k6MTc7czo5OiJcXHg2MXJDb2QiO2k6MTg7czoyMjoiImZyIlwrIm9tQyJcKyJoYXJDb2RlIiI7aToxOTtzOjExOiI9ImV2IlwrImFsIiI7aToyMDtzOjc4OiJcW1woXChlXClcPyJzIjoiIlwpXCsicCJcKyJsaXQiXF1cKCJhXCQiXFtcKFwoZVwpXD8ic3UiOiIiXClcKyJic3RyIlxdXCgxXClcKTsiO2k6MjE7czozOToiZj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7IjtpOjIyO3M6MjA6ImZcKz1cKGhcKVw/J29kZSc6IiI7IjtpOjIzO3M6NDE6ImY9J2YnXCsncidcKydvJ1wrJ20nXCsnQ2gnXCsnYXJDJ1wrJ29kZSc7IjtpOjI0O3M6NTA6ImY9J2Zyb21DaCc7ZlwrPSdhckMnO2ZcKz0ncWdvZGUnXFsic3Vic3RyIlxdXCgyXCk7IjtpOjI1O3M6MTY6InZhclxzK2Rpdl9jb2xvcnMiO2k6MjY7czo5OiJ2YXJccytfMHgiO2k6Mjc7czoyMDoiQ29yZUxpYnJhcmllc0hhbmRsZXIiO2k6Mjg7czo3OiJwaW5nbm93IjtpOjI5O3M6ODoic2VyY2hib3QiO2k6MzA7czoxMDoia20wYWU5Z3I2bSI7aTozMTtzOjY6ImMzMjg0ZCI7aTozMjtzOjg6IlxceDY4YXJDIjtpOjMzO3M6ODoiXFx4NmRDaGEiO2k6MzQ7czo3OiJcXHg2ZmRlIjtpOjM1O3M6NzoiXFx4NmZkZSI7aTozNjtzOjg6IlxceDQzb2RlIjtpOjM3O3M6NzoiXFx4NzJvbSI7aTozODtzOjc6IlxceDQzaGEiO2k6Mzk7czo3OiJcXHg3MkNvIjtpOjQwO3M6ODoiXFx4NDNvZGUiO2k6NDE7czoxMDoiXC5keW5kbnNcLiI7aTo0MjtzOjk6IlwuZHluZG5zLSI7aTo0MztzOjc5OiJ9XHMqZWxzZVxzKntccypkb2N1bWVudFwud3JpdGVccypcKFxzKlsnIl17MCwxfVwuWyciXXswLDF9XClccyp9XHMqfVxzKlJcKFxzKlwpIjtpOjQ0O3M6NDU6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCclM0NkaXYlMjBpZCUzRCUyMiI7aTo0NTtzOjE4OiJcLmJpdGNvaW5wbHVzXC5jb20iO2k6NDY7czo0MToiXC5zcGxpdFwoIiYmIlwpO2g9MjtzPSIiO2lmXChtXClmb3JcKGk9MDsiO2k6NDc7czo0MToiPGlmcmFtZVxzK3NyYz0iaHR0cDovL2RlbHV4ZXNjbGlja3NcLnByby8iO2k6NDg7czo0NToiM0Jmb3JcfGZyb21DaGFyQ29kZVx8MkMyN1x8M0RcfDJDODhcfHVuZXNjYXBlIjtpOjQ5O3M6NTg6Ijtccypkb2N1bWVudFwud3JpdGVcKFsnIl17MCwxfTxpZnJhbWVccypzcmM9Imh0dHA6Ly95YVwucnUiO2k6NTA7czoxMTA6IndcLmRvY3VtZW50XC5ib2R5XC5hcHBlbmRDaGlsZFwoc2NyaXB0XCk7XHMqY2xlYXJJbnRlcnZhbFwoaVwpO1xzKn1ccyp9XHMqLFxzKlxkK1xzKlwpXHMqO1xzKn1ccypcKVwoXHMqd2luZG93IjtpOjUxO3M6MTEwOiJpZlwoIWdcKFwpJiZ3aW5kb3dcLm5hdmlnYXRvclwuY29va2llRW5hYmxlZFwpe2RvY3VtZW50XC5jb29raWU9IjE9MTtleHBpcmVzPSJcK2VcLnRvR01UU3RyaW5nXChcKVwrIjtwYXRoPS8iOyI7aTo1MjtzOjcwOiJubl9wYXJhbV9wcmVsb2FkZXJfY29udGFpbmVyXHw1MDAxXHxoaWRkZW5cfGlubmVySFRNTFx8aW5qZWN0XHx2aXNpYmxlIjtpOjUzO3M6MzE6IjwhLS0gW2EtekEtWjAtOV9dKz9cfFx8c3RhdCAtLT4iO2k6NTQ7czo4NToiJnBhcmFtZXRlcj1cJGtleXdvcmQmc2U9XCRzZSZ1cj0xJkhUVFBfUkVGRVJFUj0nXCtlbmNvZGVVUklDb21wb25lbnRcKGRvY3VtZW50XC5VUkxcKSI7aTo1NTtzOjQ4OiJ3aW5kb3dzXHxzZXJpZXNcfDYwXHxzeW1ib3NcfGNlXHxtb2JpbGVcfHN5bWJpYW4iO2k6NTY7czozNToiXFtbJyJdZXZhbFsnIl1cXVwoc1wpO319fX08L3NjcmlwdD4iO2k6NTc7czo1OToia0M3MEZNYmx5SmtGV1pvZENLbDFXWU9kV1lVbG5RelJuYmwxV1pzVkVkbGRtTDA1V1p0VjNZdlJHSTkiO2k6NTg7czo1NToie2s9aTtzPXNcLmNvbmNhdFwoc3NcKGV2YWxcKGFzcVwoXClcKS0xXClcKTt9ej1zO2V2YWxcKCI7aTo1OTtzOjEzMDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hcKG5ld1xzK1JlZ0V4cFwoXHMqIlwoXD86XF5cfDsgXCkiXHMqXCtccypuYW1lXC5yZXBsYWNlXCgvXChcW1xcXC5cJFw/XCpcfHt9XFxcKFxcXClcXFxbXFxcXVxcL1xcXCtcXlxdXCkvZyI7aTo2MDtzOjg2OiJzZXRDb29raWVccypcKCpccyoiYXJ4X3R0IlxzKixccyoxXHMqLFxzKmR0XC50b0dNVFN0cmluZ1woXClccyosXHMqWyciXXswLDF9L1snIl17MCwxfSI7aTo2MTtzOjE0NDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hccypcKFxzKm5ld1xzK1JlZ0V4cFxzKlwoXHMqIlwoXD86XF5cfDtccypcKSJccypcK1xzKm5hbWVcLnJlcGxhY2VccypcKC9cKFxbXFxcLlwkXD9cKlx8e31cXFwoXFxcKVxcXFtcXFxdXFwvXFxcK1xeXF1cKS9nIjtpOjYyO3M6OTg6InZhclxzK2R0XHMrPVxzK25ld1xzK0RhdGVcKFwpLFxzK2V4cGlyeVRpbWVccys9XHMrZHRcLnNldFRpbWVcKFxzK2R0XC5nZXRUaW1lXChcKVxzK1wrXHMrOTAwMDAwMDAwIjtpOjYzO3M6MTA1OiJpZlxzKlwoXHMqbnVtXHMqPT09XHMqMFxzKlwpXHMqe1xzKnJldHVyblxzKjE7XHMqfVxzKmVsc2Vccyp7XHMqcmV0dXJuXHMrbnVtXHMqXCpccypyRmFjdFwoXHMqbnVtXHMqLVxzKjEiO2k6NjQ7czo0MToiXCs9U3RyaW5nXC5mcm9tQ2hhckNvZGVcKHBhcnNlSW50XCgwXCsneCciO2k6NjU7czo4MzoiPHNjcmlwdFxzK2xhbmd1YWdlPSJKYXZhU2NyaXB0Ij5ccypwYXJlbnRcLndpbmRvd1wub3BlbmVyXC5sb2NhdGlvbj0iaHR0cDovL3ZrXC5jb20iO2k6NjY7czo0NDoibG9jYXRpb25cLnJlcGxhY2VcKFsnIl17MCwxfWh0dHA6Ly92NWs0NVwucnUiO2k6Njc7czoxMjk6Ijt0cnl7XCtcK2RvY3VtZW50XC5ib2R5fWNhdGNoXChxXCl7YWE9ZnVuY3Rpb25cKGZmXCl7Zm9yXChpPTA7aTx6XC5sZW5ndGg7aVwrXCtcKXt6YVwrPVN0cmluZ1xbZmZcXVwoZVwodlwrXCh6XFtpXF1cKVwpLTEyXCk7fX07fSI7aTo2ODtzOjE0MjoiZG9jdW1lbnRcLndyaXRlXHMqXChbJyJdezAsMX08WyciXXswLDF9XHMqXCtccyp4XFswXF1ccypcK1xzKlsnIl17MCwxfSBbJyJdezAsMX1ccypcK1xzKnhcWzRcXVxzKlwrXHMqWyciXXswLDF9PlwuWyciXXswLDF9XHMqXCt4XHMqXFsyXF1ccypcKyI7aTo2OTtzOjYwOiJpZlwodFwubGVuZ3RoPT0yXCl7elwrPVN0cmluZ1wuZnJvbUNoYXJDb2RlXChwYXJzZUludFwodFwpXCsiO2k6NzA7czo3NDoid2luZG93XC5vbmxvYWRccyo9XHMqZnVuY3Rpb25cKFwpXHMqe1xzKmlmXHMqXChkb2N1bWVudFwuY29va2llXC5pbmRleE9mXCgiO2k6NzE7czo5NzoiXC5zdHlsZVwuaGVpZ2h0XHMqPVxzKlsnIl17MCwxfTBweFsnIl17MCwxfTt3aW5kb3dcLm9ubG9hZFxzKj1ccypmdW5jdGlvblwoXClccyp7ZG9jdW1lbnRcLmNvb2tpZSI7aTo3MjtzOjEyMjoiXC5zcmM9XChbJyJdezAsMX1odHBzOlsnIl17MCwxfT09ZG9jdW1lbnRcLmxvY2F0aW9uXC5wcm90b2NvbFw/WyciXXswLDF9aHR0cHM6Ly9zc2xbJyJdezAsMX06WyciXXswLDF9aHR0cDovL1snIl17MCwxfVwpXCsiO2k6NzM7czozMDoiNDA0XC5waHBbJyJdezAsMX0+XHMqPC9zY3JpcHQ+IjtpOjc0O3M6NzY6InByZWdfbWF0Y2hcKFsnIl17MCwxfS9zYXBlL2lbJyJdezAsMX1ccyosXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVIiO2k6NzU7czo3NDoiZGl2XC5pbm5lckhUTUxccypcKz1ccypbJyJdezAsMX08ZW1iZWRccytpZD0iZHVtbXkyIlxzK25hbWU9ImR1bW15MiJccytzcmMiO2k6NzY7czo3Mzoic2V0VGltZW91dFwoWyciXXswLDF9YWRkTmV3T2JqZWN0XChcKVsnIl17MCwxfSxcZCtcKTt9fX07YWRkTmV3T2JqZWN0XChcKSI7aTo3NztzOjUxOiJcKGI9ZG9jdW1lbnRcKVwuaGVhZFwuYXBwZW5kQ2hpbGRcKGJcLmNyZWF0ZUVsZW1lbnQiO2k6Nzg7czozMDoiQ2hyb21lXHxpUGFkXHxpUGhvbmVcfElFTW9iaWxlIjtpOjc5O3M6MTk6IlwkOlwoe31cKyIiXClcW1wkXF0iO2k6ODA7czo1Mzoie3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O308L3N0eWxlPjxkaXZccytjbGFzcz0iO2k6ODE7czoxMjg6ImlmXHMqXChcKHVhXC5pbmRleE9mXChbJyJdezAsMX1jaHJvbWVbJyJdezAsMX1cKVxzKj09XHMqLTFccyomJlxzKnVhXC5pbmRleE9mXCgid2luIlwpXHMqIT1ccyotMVwpXHMqJiZccypuYXZpZ2F0b3JcLmphdmFFbmFibGVkIjtpOjgyO3M6NTg6InBhcmVudFwud2luZG93XC5vcGVuZXJcLmxvY2F0aW9uPVsnIl17MCwxfWh0dHA6Ly92a1wuY29tXC4iO2k6ODM7czo0MToiXF1cLnN1YnN0clwoMCwxXClcKTt9fXJldHVybiB0aGlzO30sXFx1MDAiO2k6ODQ7czo2ODoiamF2YXNjcmlwdFx8aGVhZFx8dG9Mb3dlckNhc2VcfGNocm9tZVx8d2luXHxqYXZhRW5hYmxlZFx8YXBwZW5kQ2hpbGQiO2k6ODU7czoyMToibG9hZFBOR0RhdGFcKHN0ckZpbGUsIjtpOjg2O3M6MjA6IlwpO2lmXCghflwoWyciXXswLDF9IjtpOjg3O3M6MjM6Ii8vXHMqU29tZVwuZGV2aWNlc1wuYXJlIjtpOjg4O3M6NTU6InN0cmlwb3NccypcKFxzKmZfaGF5c3RhY2tccyosXHMqZl9uZWVkbGVccyosXHMqZl9vZmZzZXQiO2k6ODk7czozMjoid2luZG93XC5vbmVycm9yXHMqPVxzKmtpbGxlcnJvcnMiO2k6OTA7czoxMDU6ImNoZWNrX3VzZXJfYWdlbnQ9XFtccypbJyJdezAsMX1MdW5hc2NhcGVbJyJdezAsMX1ccyosXHMqWyciXXswLDF9aVBob25lWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfU1hY2ludG9zaCI7aTo5MTtzOjE1MzoiZG9jdW1lbnRcLndyaXRlXChbJyJdezAsMX08WyciXXswLDF9XCtbJyJdezAsMX1pWyciXXswLDF9XCtbJyJdezAsMX1mWyciXXswLDF9XCtbJyJdezAsMX1yWyciXXswLDF9XCtbJyJdezAsMX1hWyciXXswLDF9XCtbJyJdezAsMX1tWyciXXswLDF9XCtbJyJdezAsMX1lIjtpOjkyO3M6MTc6InNleGZyb21pbmRpYVwuY29tIjtpOjkzO3M6MTE6ImZpbGVreFwuY29tIjtpOjk0O3M6MTM6InN0dW1tYW5uXC5uZXQiO2k6OTU7czoxNDoiaHR0cDovL3h6eFwucG0iO2k6OTY7czoxODoiXC5ob3B0b1wubWUvanF1ZXJ5IjtpOjk3O3M6MTE6Im1vYmktZ29cLmluIjtpOjk4O3M6MTg6ImJhbmtvZmFtZXJpY2FcLmNvbSI7aTo5OTtzOjE2OiJteWZpbGVzdG9yZVwuY29tIjtpOjEwMDtzOjE3OiJmaWxlc3RvcmU3MlwuaW5mbyI7aToxMDE7czoxNjoiZmlsZTJzdG9yZVwuaW5mbyI7aToxMDI7czoxNToidXJsMnNob3J0XC5pbmZvIjtpOjEwMztzOjE4OiJmaWxlc3RvcmUxMjNcLmluZm8iO2k6MTA0O3M6MTI6InVybDEyM1wuaW5mbyI7aToxMDU7czoxNDoiZG9sbGFyYWRlXC5jb20iO2k6MTA2O3M6MTE6InNlY2NsaWtcLnJ1IjtpOjEwNztzOjExOiJtb2J5LWFhXC5ydSI7aToxMDg7czoxMjoic2VydmxvYWRcLnJ1IjtpOjEwOTtzOjQ4OiJzdHJpcG9zXChuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKixccypsaXN0X2RhdGFcW2kiO2k6MTEwO3M6MjY6ImlmXHMqXCghc2VlX3VzZXJfYWdlbnRcKFwpIjtpOjExMTtzOjQ2OiJjXC5sZW5ndGhcKTt9cmV0dXJuXHMqWyciXVsnIl07fWlmXCghZ2V0Q29va2llIjtpOjExMjtzOjcwOiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9ZnRwOi8vIjt9"));
$gX_JSVirSig unserialize(base64_decode("YToxNTp7aTowO3M6NDg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKFsnIl17MCwxfSUzYyI7aToxO3M6Njk6ImRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoWyciXWhlYWRbJyJdXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGFcKSI7aToyO3M6Mjg6ImlwXChob25lXHxvZFwpXHxpcmlzXHxraW5kbGUiO2k6MztzOjQ4OiJzbWFydHBob25lXHxibGFja2JlcnJ5XHxtdGtcfGJhZGFcfHdpbmRvd3MgcGhvbmUiO2k6NDtzOjQwOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi1cZCtweDt0b3A6LVxkK3B4IjtpOjU7czozMDoiY29tcGFsXHxlbGFpbmVcfGZlbm5lY1x8aGlwdG9wIjtpOjY7czo1NjoiO2M9MX07d2hpbGVcKGMtLVwpe2lmXChrXFtjXF1cKXtwPXBcLnJlcGxhY2VcKG5ldyBSZWdFeHAiO2k6NztzOjM3OiJkb2N1bWVudFwud3JpdGVcKFsnIl08c2NyWyciXVwrWyciXWlwIjtpOjg7czo0OToiaWZyYW1lXC5zdHlsZVwud2lkdGhccyo9XHMqWyciXXswLDF9MHB4WyciXXswLDF9OyI7aTo5O3M6MTAxOiJkb2N1bWVudFwuY2FwdGlvbj1udWxsO3dpbmRvd1wuYWRkRXZlbnRcKFsnIl17MCwxfWxvYWRbJyJdezAsMX0sZnVuY3Rpb25cKFwpe3ZhciBjYXB0aW9uPW5ldyBKQ2FwdGlvbiI7aToxMDtzOjEyOiJodHRwOi8vZnRwXC4iO2k6MTE7czo3OiJubm5cLnBtIjtpOjEyO3M6Nzoibm5tXC5wbSI7aToxMztzOjc4OiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9aHR0cDovL2dvb1wuZ2wiO2k6MTQ7czo2NzoiIlxzKlwrXHMqbmV3IERhdGVcKFwpXC5nZXRUaW1lXChcKTtccypkb2N1bWVudFwuYm9keVwuYXBwZW5kQ2hpbGRcKCI7fQ=="));
$g_PhishingSig unserialize(base64_decode("YToyNjp7aTowO3M6MjE6Ii1ccypQYXlQYWxccyo8L3RpdGxlPiI7aToxO3M6MTY6Ijx0aXRsZT5QYXlccypQYWwiO2k6MjtzOjIyOiItXHMqUHJpdmF0aVxzKjwvdGl0bGU+IjtpOjM7czoxOToiPHRpdGxlPlxzKlVuaUNyZWRpdCI7aTo0O3M6MTk6IkJhbmtccytvZlxzK0FtZXJpY2EiO2k6NTtzOjI1OiJBbGliYWJhJm5ic3A7TWFudWZhY3R1cmVyIjtpOjY7czoyMDoiVmVyaWZpZWRccytieVxzK1Zpc2EiO2k6NztzOjIxOiJIb25nXHMrTGVvbmdccytPbmxpbmUiO2k6ODtzOjMwOiJZb3VyXHMrYWNjb3VudFxzK1x8XHMrTG9nXHMraW4iO2k6OTtzOjE2OiJPbmxpbmVccytCYW5raW5nIjtpOjEwO3M6MTQ6Ik9ubGluZS1CYW5raW5nIjtpOjExO3M6MjI6IlNpZ25ccytpblxzK3RvXHMrWWFob28iO2k6MTI7czoxMToiQkFOQ09MT01CSUEiO2k6MTM7czoxNjoiPHRpdGxlPlxzKkFtYXpvbiI7aToxNDtzOjE1OiI8dGl0bGU+XHMqQXBwbGUiO2k6MTU7czoyMjoiPHRpdGxlPkdvb2dsZVxzK1NlY3VyZSI7aToxNjtzOjI4OiI8dGl0bGU+TWVyYWtccytNYWlsXHMrU2VydmVyIjtpOjE3O3M6MjM6Ijx0aXRsZT5Tb2NrZXRccytXZWJtYWlsIjtpOjE4O3M6MTg6Ijx0aXRsZT5cW0xfUVVFUllcXSI7aToxOTtzOjMxOiI8dGl0bGU+QU5aXHMrSW50ZXJuZXRccytCYW5raW5nIjtpOjIwO3M6MzM6ImNvbVwud2Vic3RlcmJhbmtcLnNlcnZsZXRzXC5Mb2dpbiI7aToyMTtzOjE1OiI8dGl0bGU+XHMqR21haWwiO2k6MjI7czoyNjoiU29jaWFsXHMrU2VjdXJpdHlccytOdW1iZXIiO2k6MjM7czozNjoiXGQrO1VSTD1odHRwczovL3d3d1wud2VsbHNmYXJnb1wuY29tIjtpOjI0O3M6MTg6Ijx0aXRsZT5XZWxscyBGYXJnbyI7aToyNTtzOjQ5OiJwcm9wZXJ0eT0ib2c6c2l0ZV9uYW1lIlxzKmNvbnRlbnQ9IkZhY2Vib29rIlxzKi8+Ijt9"));

//var_dump($g_FlexDBShe);
//exit;


$g_UnsafeFilesArray = array('td*.php''a{1,}.php''zd*.php''123.php''testd*.php''asd.php''info.php''CHANGELOG.php'
                           
'COPYRIGHT.php''CREDITS.php''LICENSE.php''LICENSES.php''backup.+?.zip'
                           
'backup.+?.tar.gz''backup.+?.tgz'
                           
'phpinfo.php''changelog.txt''readme.txt''INSTALLATION.php''dump.sql''changelog.log');

$g_UnsafeDirArray = array('install''backup''webalizer''awstats');

////////////////////////////////////////////////////////////////////////////
if (!isCli() && !isset($_SERVER['HTTP_USER_AGENT'])) {
  echo 
"#####################################################n";
  echo 
"# Error: cannot run on php-cgi. Requires php as cli #n";
  echo 
"#                                                   #n";
  echo 
"# See FAQ: http://revisium.com/ai/faq.php           #n";
  echo 
"#####################################################n";
  exit;
}

define('AI_VERSION''20140813');

define('INFO_M'base64_decode('PGZvbnQgY29sb3I9I0UwNjA2MD7QotC+0LvRjNC60L4g0LTQu9GPINC90LXQutC+0LzQvNC10YDRh9C10YHQutC+0LPQviDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyE8L2ZvbnQ+PC9oNT4='));


////////////////////////////////////////////////////////////////////////////

$l_Res '';

$g_Structure = array();
$g_Counter 0;

$g_NotRead = array();
$g_FileInfo = array();
$g_Iframer = array();
$g_PHPCodeInside = array();
$g_CriticalJS = array();
$g_Phishing = array();
$g_HeuristicDetected = array();
$g_HeuristicType = array();
$g_UnixExec = array();
$g_SkippedFolders = array();
$g_UnsafeFilesFound = array();
$g_CMS = array();
$g_SymLinks = array();
$g_HiddenFiles = array();

$g_TotalFolder 0;
$g_TotalFiles 0;

$g_FoundTotalDirs 0;
$g_FoundTotalFiles 0;

if (!
isCli()) {
   
$defaults['site_url'] = 'http://' $_SERVER['HTTP_HOST'] . '/'
}

define('CRC32_LIMIT'pow(231) - 1);
define('CRC32_DIFF'CRC32_LIMIT -2);

error_reporting(E_ALL E_NOTICE E_WARNING);
srand(time());

set_time_limit(0);
ini_set('max_execution_time''90000');
ini_set('memory_limit','256M');

if (!
function_exists('stripos')) {
    function 
stripos($par_Str$par_Entry$Offset 0) {
        return 
strpos(strtolower($par_Str), strtolower($par_Entry), $Offset);
    }
}

define('CMS_BITRIX''Bitrix');
define('CMS_WORDPRESS''Wordpress');
define('CMS_JOOMLA''Joomla');
define('CMS_DLE''Data Life Engine');
define('CMS_IPB''Invision Power Board');
define('CMS_WEBASYST''WebAsyst');
define('CMS_OSCOMMERCE''OsCommerce');
define('CMS_DRUPAL''Drupal');
define('CMS_MODX''MODX');
define('CMS_INSTANTCMS''Instant CMS');
define('CMS_PHPBB''PhpBB');
define('CMS_VBULLETIN''vBulletin');
define('CMS_SHOPSCRIPT''PHP ShopScript Premium');

define('CMS_VERSION_UNDEFINED''0.0');

class 
CmsVersionDetector {
    private 
$root_path;
    private 
$versions;
    private 
$types;

    public function 
__construct($root_path '.') {

        
$this->root_path $root_path;
        
$this->versions = array();
        
$this->types = array();

        
$version '';

        if (
$this->checkBitrix($version)) {
           
$this->addCms(CMS_BITRIX$version);
        }

        if (
$this->checkWordpress($version)) {
           
$this->addCms(CMS_WORDPRESS$version);
        }

        if (
$this->checkJoomla($version)) {
           
$this->addCms(CMS_JOOMLA$version);
        }

        if (
$this->checkDle($version)) {
           
$this->addCms(CMS_DLE$version);
        }

        if (
$this->checkIpb($version)) {
           
$this->addCms(CMS_IPB$version);
        }

        if (
$this->checkWebAsyst($version)) {
           
$this->addCms(CMS_WEBASYST$version);
        }

        if (
$this->checkOsCommerce($version)) {
           
$this->addCms(CMS_OSCOMMERCE$version);
        }

        if (
$this->checkDrupal($version)) {
           
$this->addCms(CMS_DRUPAL$version);
        }

        if (
$this->checkMODX($version)) {
           
$this->addCms(CMS_MODX$version);
        }

        if (
$this->checkInstantCms($version)) {
           
$this->addCms(CMS_INSTANTCMS$version);
        }

        if (
$this->checkPhpBb($version)) {
           
$this->addCms(CMS_PHPBB$version);
        }

        if (
$this->checkVBulletin($version)) {
           
$this->addCms(CMS_VBULLETIN$version);
        }

        if (
$this->checkPhpShopScript($version)) {
           
$this->addCms(CMS_SHOPSCRIPT$version);
        }

    }

    function 
getCmsList() {
      return 
$this->types;
    }

    function 
getCmsVersions() {
      return 
$this->versions;
    }

    function 
getCmsNumber() {
      return 
count($this->types);
    }

    function 
getCmsName($index 0) {
      return 
$this->types[$index];
    }

    function 
getCmsVersion($index 0) {
      return 
$this->versions[$index];
    }

    private function 
addCms($type$version) {
       
$this->types[] = $type;
       
$this->versions[] = $version;
    }

    private function 
checkBitrix(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/bitrix')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/bitrix/modules/main/classes/general/version.php'));
          if (
preg_match('|define("SM_VERSION","(.+?)")|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkWordpress(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/wp-admin')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/wp-includes/version.php'));
          if (
preg_match('|$wp_versions*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }
       }

       return 
$res;
    }

    private function 
checkJoomla(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/libraries/joomla')) {
          
$res true;

          
// for 1.5.x
          
$tmp_content = @implode('', @file($this->root_path .'/libraries/joomla/version.php'));
          if (
preg_match('|vars+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|vars+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

          
// for 1.7.x
          
$tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
          if (
preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

          
// for 2.5.x and 3.x
          
$tmp_content = @implode('', @file($this->root_path .'/libraries/cms/version/version.php'));
          if (
preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];

             if (
preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi'$tmp_content$tmp_ver)) {
                
$version .= '.' $tmp_ver[1];
             }
          }

       }

       return 
$res;
    }

    private function 
checkDle(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/engine/engine.php')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/engine/data/config.php'));
          if (
preg_match('|'version_id's*=>s*"(.+?)"|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

          
$tmp_content = @implode('', @file($this->root_path .'/install.php'));
          if (
preg_match('|'version_id's*=>s*"(.+?)"|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkIpb(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/ips_kernel')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/ips_kernel/class_xml.php'));
          if (
preg_match('|IP.Boards+v([0-9.]+)|si'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkWebAsyst(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/wbs/installer')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/license.txt'));
          if (
preg_match('|v([0-9.]+)|si'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkOsCommerce(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/includes/version.php')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
          if (
preg_match('|([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkDrupal(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/sites/all')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/CHANGELOG.txt'));
          if (
preg_match('|Drupals+([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkMODX(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/manager/assets')) {
          
$res true;

          
// no way to pick up version
       
}

       return 
$res;
    }

    private function 
checkInstantCms(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/plugins/p_usertab')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/index.php'));
          if (
preg_match('|InstantCMSs+v([0-9.]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkPhpBb(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/includes/acp')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/config.php'));
          if (
preg_match('|phpBBs+([0-9.x]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkVBulletin(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/core/admincp')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/core/api.php'));
          if (
preg_match('|vBulletins+([0-9.x]+)|smi'$tmp_content$tmp_ver)) {
             
$version $tmp_ver[1];
          }

       }

       return 
$res;
    }

    private function 
checkPhpShopScript(&$version) {
       
$version CMS_VERSION_UNDEFINED;
       
$res false;

       if (
file_exists($this->root_path .'/install/consts.php')) {
          
$res true;

          
$tmp_content = @implode('', @file($this->root_path .'/install/consts.php'));
          if (
preg_match('|STRING_VERSION',s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
             $version = $tmp_ver[1];
          }

       }

       return $res;
    }
}

/**
 * Print file
*/
function printFile() {
    $l_FileName = $_GET['
fn'];
    $l_CRC = isset($_GET['
c']) ? (int)$_GET['c'] : 0;
    $l_Content = implode('', file($l_FileName));
    $l_FileCRC = realCRC($l_Content);
    if ($l_FileCRC != $l_CRC) {
        echo '
Доступ запрещен.';
        exit;
    }
    
    echo '
<pre>' . htmlspecialchars($l_Content) . '</pre>';
}

/**
 *
 */
function realCRC($str_in, $full = false)
{
        $in = crc32( $full ? normal($str_in) : $str_in );
        return ($in > CRC32_LIMIT) ? ($in - CRC32_DIFF) : $in;
}


/**
 * Determine php script is called from the command line interface
 * @return bool
 */
function isCli()
{
    return php_sapi_name() == '
cli';
}

function myCheckSum($str) {
  return str_replace('
-', 'x', crc32($str));
}

/*
 *
 */
function shanonEntropy($par_Str)
{
    $dic = array();

    $len = strlen($par_Str);
    for ($i = 0; $i < $len; $i++) {
        $dic[$par_Str[$i]]++;
    } 

    $result = 0.0;
    $frequency = 0.0;
    foreach ($dic as $item)
    {
        $frequency = (float)$item / (float)$len;
        $result -= $frequency * (log($frequency) / log(2));
    }

    return $result;
}

 function generatePassword ($length = 9)
  {

    // start with a blank password
    $password = "";

    // define possible characters - any character in this string can be
    // picked for use in the password, so if you want to put vowels back in
    // or add special characters such as exclamation marks, this is where
    // you should do it
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";

    // we refer to the length of $possible a few times, so let'
s grab it now
    $maxlength 
strlen($possible);
  
    
// check for length overflow and truncate if necessary
    
if ($length $maxlength) {
      
$length $maxlength;
    }
    
    
// set up a counter for how many characters are in the password so far
    
$i 0
    
    
// add random characters to $password until $length is reached
    
while ($i $length) { 

      
// pick a random character from the possible ones
      
$char substr($possiblemt_rand(0$maxlength-1), 1);
        
      
// have we already used this character in $password?
      
if (!strstr($password$char)) { 
        
// no, so it's OK to add it onto the end of whatever we've already got...
        
$password .= $char;
        
// ... and increase the counter by one
        
$i++;
      }

    }

    
// done!
    
return $password;

  }

/**
 * Print to console
 * @param mixed $text
 * @param bool $add_lb Add line break
 * @return void
 */
function stdOut($text$add_lb true)
{
    global 
$BOOL_RESULT;

    if (!
isCli())
        return;
        
    if (
is_bool($text))
    {
        
$text $text 'true' 'false';
    }
    else if (
is_null($text))
    {
        
$text 'null';
    }
    if (!
is_scalar($text))
    {
        
$text print_r($texttrue);
    }

     if (!
$BOOL_RESULT)
     {
         @
fwrite(STDOUT$text . ($add_lb "n" ''));
     }
}

/**
 * Print progress
 * @param int $num Current file
 */
function printProgress($num, &$par_File)
{
    global 
$g_CriticalPHP$g_Base64$g_Phishing$g_CriticalJS$g_Iframer;
    
$total_files $GLOBALS['g_FoundTotalFiles'];
    
$elapsed_time microtime(true) - START_TIME;
    
$stat '';
    if (
$elapsed_time >= 1)
    {
        
$elapsed_seconds round($elapsed_time0);
        
$fs floor($num $elapsed_seconds);
        
$left_files $total_files $num;
        if (
$fs 0
        {
           
$left_time = ($left_files $fs); //ceil($left_files / $fs);
           
$stat '. [Avg: ' round($fs,2) . ' files/s' . ($left_time 0  ' Left: ' seconds2Human($left_time) : '') . '] [Mlw:' . (count($g_CriticalPHP) + count($g_Base64))  . '|' . (count($g_CriticalJS) + count($g_Iframer) + count($g_Phishing)) . ']';
        }
    }

    
$l_FN substr($par_File, -60);

    
$text "[$l_FN$num of {$total_files}$stat;
    
$text str_pad($text160' 'STR_PAD_RIGHT);
    
stdOut(str_repeat(chr(8), 160) . $textfalse);
}

/**
 * Seconds to human readable
 * @param int $seconds
 * @return string
 */
function seconds2Human($seconds)
{
    
$r '';
    
$_seconds floor($seconds);
    
$ms $seconds $_seconds;
    
$seconds $_seconds;
    if (
$hours floor($seconds 3600))
    {
        
$r .= $hours . (isCli() ? ' h ' ' час ');
        
$seconds $seconds 3600;
    }

    if (
$minutes floor($seconds 60))
    {
        
$r .= $minutes . (isCli() ? ' m ' ' мин ');
        
$seconds $seconds 60;
    }

    if (
$minutes<3$r .= ' ' $seconds + ($ms round($ms5) : 0) . (isCli() ? ' s' ' сек'); //' сек' - not good for shell

    
return $r;
}

if (
isCli())
{

    
$cli_options = array(
        
'm:' => 'memory:',
        
's:' => 'size:',
        
'a' => 'all',
        
'd:' => 'delay:',
        
'l:' => 'list:',
        
'r:' => 'report:',
        
'f' => 'fast',
        
'j:' => 'file',
        
'p:' => 'path:',
        
'q' => 'quite',
        
'h' => 'help'
    
);

    
$options getopt(implode(''array_keys($cli_options)), array_values($cli_options));

    if (isset(
$options['h']) OR isset($options['help']))
    {
        
$memory_limit ini_get('memory_limit');
        echo <<<HELP
AI-Bolit - Script to search for shells and other malicious software.

Usage: php 
{$_SERVER['PHP_SELF']} [OPTIONS] [PATH]
Current default path is: 
{$defaults['path']}

  -j, --file=FILE      Specified path and filename to scan the only file
  -l, --list=FILE      Full path and filename to create plain text file with a list of found malware
  -p, --path=PATH      Directory path to scan, by default the file directory is used
                       Current path: 
{$defaults['path']}
  -m, --memory=SIZE    Maximum amount of memory a script may consume. Current value: 
$memory_limit
                       Can take shorthand byte values (1M, 1G...)
  -s, --size=SIZE      Scan files are smaller than SIZE. 0 - All files. Current value: 
{$defaults['max_size_to_scan']}
  -a, --all            Scan all files (by default scan. js,. php,. html,. htaccess)
  -d, --delay=INT      delay in milliseconds when scanning files to reduce load on the file system (Default: 1)
  -r, --report=PATH/EMAILS
                       Full path to create report or email address to send report to.
                       You can also specify multiple email separated by commas.
  -q,                Use only with -j. Quiet result check of file, 1=Infected 
      --help           Display this help and exit

* Mandatory arguments listed below are required for both full and short way of usage.

HELP;
        exit;
    }

    
$l_FastCli false;
    
    if (
        (isset(
$options['memory']) AND !empty($options['memory']) AND ($memory $options['memory']))
        OR (isset(
$options['m']) AND !empty($options['m']) AND ($memory $options['m']))
    )
    {
        
$memory getBytes($memory);
        if (
$memory 0)
        {
            
$defaults['memory_limit'] = $memory;
        }
    }

    if (
        (isset(
$options['file']) AND !empty($options['file']) AND ($file $options['file']) !== false)
        OR (isset(
$options['j']) AND !empty($options['j']) AND ($file $options['j']) !== false)
    )
    {
        
define('SCAN_FILE'$file);
    }


    if (
        (isset(
$options['list']) AND !empty($options['list']) AND ($file $options['list']) !== false)
        OR (isset(
$options['l']) AND !empty($options['l']) AND ($file $options['l']) !== false)
    )
    {

        
define('PLAIN_FILE'$file);
    }
    if (
        (isset(
$options['size']) AND !empty($options['size']) AND ($size $options['size']) !== false)
        OR (isset(
$options['s']) AND !empty($options['s']) AND ($size $options['s']) !== false)
    )
    {
        
$size getBytes($size);
        
$defaults['max_size_to_scan'] = $size $size 0;
    }

     if (
         (isset(
$options['file']) AND !empty($options['file']) AND ($file $options['file']) !== false)
         OR (isset(
$options['j']) AND !empty($options['j']) AND ($file $options['j']) !== false)
         AND (isset(
$options['q'])) 
     
     )
     {
         
$BOOL_RESULT true;
     }
 
    if (isset(
$options['f'])) 
     {
       
$l_FastCli true;
     }
        
    if (
        (isset(
$options['delay']) AND !empty($options['delay']) AND ($delay $options['delay']) !== false)
        OR (isset(
$options['d']) AND !empty($options['d']) AND ($delay $options['d']) !== false)
    )
    {
        
$delay = (int) $delay;
        if (!(
$delay 0))
        {
            
$defaults['scan_delay'] = $delay;
        }
    }

    if (isset(
$options['all']) OR isset($options['a']))
    {
        
$defaults['scan_all_files'] = 1;
    }



    if (
        (isset(
$options['report']) AND ($report $options['report']) !== false)
        OR (isset(
$options['r']) AND ($report $options['r']) !== false)
    )
    {
        
define('REPORT'$report);
    }

    
defined('REPORT') OR define('REPORT''AI-BOLIT-REPORT-' date('d-m-Y_H-i') . '-' rand(1999999) . '.html');

    
$last_arg max(1sizeof($_SERVER['argv']) - 1);
    if (isset(
$_SERVER['argv'][$last_arg]))
    {
        
$path $_SERVER['argv'][$last_arg];
        if (
            
substr($path01) != '-'
            
AND (substr($_SERVER['argv'][$last_arg 1], 01) != '-' OR array_key_exists(substr($_SERVER['argv'][$last_arg 1], -1), $cli_options)))
        {
            
$defaults['path'] = $path;
        }
    }    
    
    if (
        (isset(
$options['path']) AND !empty($options['path']) AND ($path $options['path']) !== false)
        OR (isset(
$options['p']) AND !empty($options['p']) AND ($path $options['p']) !== false)
    )
    {
        
$defaults['path'] = $path;
    }

}

if (!
defined('PLAIN_FILE')) { define('PLAIN_FILE'''); }

// Init
define('MAX_ALLOWED_PHP_HTML_IN_DIR'100);
define('BASE64_LENGTH'69);
define('MAX_PREVIEW_LEN'80);
define('MAX_EXT_LINKS'1001);

// Perform full scan when running from command line
if (isCli() || isset($_GET['full'])) {
  
$defaults['scan_all_files'] = 1;
}

if (
$l_FastCli) {
  
$defaults['scan_all_files'] = 0
}

define('SCAN_ALL_FILES', (bool) $defaults['scan_all_files']);
define('SCAN_DELAY', (int) $defaults['scan_delay']);
define('MAX_SIZE_TO_SCAN'getBytes($defaults['max_size_to_scan']));

if (
$defaults['memory_limit'] AND ($defaults['memory_limit'] = getBytes($defaults['memory_limit'])) > 0)
    
ini_set('memory_limit'$defaults['memory_limit']);

define('START_TIME'microtime(true));

define('ROOT_PATH'realpath($defaults['path']));

if (!
ROOT_PATH)
{
        if (
isCli())  {
        die(
stdOut("Directory '{$defaults['path']}' not found!"));
    }
}
elseif(!
is_readable(ROOT_PATH))
{
        if (
isCli())  {
        die(
stdOut("Cannot read directory '" ROOT_PATH "'!"));
    }
}

define('CURRENT_DIR'getcwd());
chdir(ROOT_PATH);

// Проверяем отчет
if (isCli() AND REPORT !== '' AND !getEmails(REPORT))
{
    
$report str_replace('\', '/', REPORT);
    $abs = strpos($report, '
/') === 0 ? DIR_SEPARATOR : '';
    $report = array_values(array_filter(explode('
/', $report)));
    $report_file = array_pop($report);
    $report_path = realpath($abs . implode(DIR_SEPARATOR, $report));

    define('
REPORT_FILE', $report_file);
    define('
REPORT_PATH', $report_path);

    if (REPORT_FILE AND REPORT_PATH AND is_file(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE))
    {
        @unlink(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE);
    }
}


if (function_exists('
phpinfo')) {
   ob_start();
   phpinfo();
   $l_PhpInfo = ob_get_contents();
   ob_end_clean();

   $l_PhpInfo = str_replace('
border1px', '', $l_PhpInfo);
   preg_match('
|<body>(.*)</body>|smi', $l_PhpInfo, $l_PhpInfoBody);
}

$l_Result =<<<MAIN_PAGE

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
<style type="text/css" title="currentStyle">
    @import "http://www.revisium.com/extra/media/css/demo_page.css";
    @import "http://www.revisium.com/extra/media/css/jquery.dataTables.css";
</style>


<script type="text/javascript" language="javascript" src="http://yandex.st/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="https://datatables.net/download/build/jquery.dataTables.js"></script>

<style type="text/css">
 body {
   font-family: Georgia;
   color: #303030;
   background: #FFFFF0;
   font-size: 12px;
   margin: 20px;
   padding: 0;
 }

.hidd {
display: none;
}

 h3 {
   font-size: 27px;
   margin: 0 0;
 }

 .sec {
  font-size: 25px;
  margin-bottom: 10px;
 }


 .warn {
   color: #FF4C00;
   margin: 0 0 20px 0;
 }

 .warn .it {
   color: #FF4C00;
 }

 .warn2 {
   color: #42ADFF;
   margin: 0 0 20px 0;
 }

 .warn2 .it {
   color: #42ADFF;
 }

 .ok {
   color: #007F0E;
   margin: 0 0 20px 0;
 }

 .vir {
    color: #A00000;
    margin: 0 0 20px 0;
  }

 .vir .it {
    color: #A00000;
 }

 .disclaimer {
   font-size: 11px;
   font-family: Arial;
   color: #505050;
   margin: 10px 0 10px 0;
 }

 .thanx {
  border: 1px solid #F0F0F0;
   padding: 20px 20px 10px 20px;
  font-size: 12px;
  font-family: Arial;
  background: #FBFFBA;
 }

 .footer {
  margin: 40px 0 0 0;
 }

 .rep {
   margin: 10px 0 20px 0;
   font-size: 11px;
   font-family: Arial;
 }

 .php_ok
 {
  color: #007F0E; 
 }

 .php_bad
 {
  color: #A00000; 
 }

 .notice
 {
  border: 1px solid cornflowerblue;
  padding: 10px;
  font-size: 12px;
  font-family: Arial;
  background: #E8F8F8;
 }

 .offer {
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;

   position: absolute;
   width: 350px;
   right: 20px;
   top: 54px;
   background: #E06060;
   color: white;
   font-size: 11px;
   font-family: Arial;
   padding: 15px 20px 10px 20px;

 }

  .offer2 {
  -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;

   position: absolute;
   width: 350px;
   right: 100px;
   top: 100px;
   background: #30A030;
   color: white;
   font-size: 11px;
   font-family: Arial;
   padding: 20px 20px 10px 20px;

 }

 
 .offer A, .offer2 A {
   color: yellow;
 }

 .update {
   color: red;
   font-size: 12px;
   font-family: Arial;
   margin: 0 0 20px 0;
 }

.updateinfo {
   color: blue;
   font-size: 12px;
   font-family: Arial;
   margin: 0 0 20px 0;
 }


 .tbg0 {
 }

 .tbg1 {
   background: #F0F0F0;
 }

 .it {
    font-size: 12px;
    font-family: Arial;
 }

 .ctd {
    font-size: 12px;
    font-family: Arial;
    color: #909090;
 }

 .flist {
   margin: 10px 0 30px 0;
 }

 .tbgh {
   background: #E0E0E0;
 }

 TH {
   text-align: left;
   font-size: 12px;
   font-family: Arial;
   color: #909090;
 }

 .details {
  font-size: 9px;
  font-family: Arial;
  color: #303030;
 }

 .marker
 {
    color: #FF0000;
    font-size: 16px;
    font-weight: 700;
 }

</style>

<script language="javascript">
  function addToIgnore(par_Lnk, par_FN, par_CRC) {
    var o = document.getElementById('
igid');
    var ta = document.forms.ignore.list;
    
    ta.value = ta.value + par_FN + String.fromCharCode(09) + par_CRC + String.fromCharCode(10);
    
    par_Lnk.innerHTML = '
Добавлено'; 
    o.style.display = '
block';
  }

function hsig(id) {
  var divs = document.getElementsByTagName("tr");
  for(var i = 0; i < divs.length; i++){
     
     if (divs[i].getAttribute('
o') == id) {
        divs[i].innerHTML = '';
     }
  }

  return false;
}

</script>

</head>
<body>
<noindex>
MAIN_PAGE;

////////////////////////////////////////////////////////////////////////////

$l_Result .= sprintf(AI_STR_001, AI_VERSION, INFO_M); 

$l_CreationTime = filemtime(__FILE__);
if (time() - $l_CreationTime > 86400 * 7) {
  $l_Result .= AI_STR_002;
}

$l_Result .= '
<div class="update" style="margin: 20px 0 20px 0; padding: 20px; width: 500px; border: 1px solid #400000"><b>' . AI_STR_003 . '</b></div>';

if (AI_EXPERT == 0) {
   $l_Result .= '
<div class="updateinfo">' . AI_STR_057 . '</div>'; 
} else {
   $l_Result .= '
<div style="font-size: 8px; color: #909090; margin: 10px 0 10px 0;">MODE=' . AI_EXPERT . '</div>'; 
}

define('
QCR_INDEX_FILENAME', 'fn');
define('
QCR_INDEX_TYPE', 'type');
define('
QCR_INDEX_WRITABLE', 'wr');
define('
QCR_SVALUE_FILE', '1');
define('
QCR_SVALUE_FOLDER', '0');

/**
 * Extract emails from the string
 * @param string $email
 * @return array of strings with emails or false on error
 */
function getEmails($email)
{
    $email = preg_split('
#[,s;]#', $email, -1, PREG_SPLIT_NO_EMPTY);
    
$r = array();
    for (
$i 0$size sizeof($email); $i $size$i++)
    {
            if (
function_exists('filter_var')) {
              if (
filter_var($email[$i], FILTER_VALIDATE_EMAIL))
              {
                  
$r[] = $email[$i];
               }
                } else {
                   
// for PHP4
                   
if (strpos($email[$i], '@') !== false) {
                  
$r[] = $email[$i];
                   }
                }
    }
    return empty(
$r) ? false $r;
}

/**
 * Get bytes from shorthand byte values (1M, 1G...)
 * @param int|string $val
 * @return int
 */
function getBytes($val)
{
    
$val trim($val);
    
$last strtolower($val{strlen($val) - 1});
    switch(
$last) {
        case 
't':
            
$val *= 1024;
        case 
'g':
            
$val *= 1024;
        case 
'm':
            
$val *= 1024;
        case 
'k':
            
$val *= 1024;
    }
    return 
intval($val);
}

/**
 * Format bytes to human readable
 * @param int $bites
 * @return string
 */
function bytes2Human($bites)
{
    if (
$bites 1024)
    {
        return 
$bites ' b';
    }
    elseif ((
$kb $bites 1024) < 1024)
    {
        return 
number_format($kb2) . ' Kb';
    }
    elseif ((
$mb $kb 1024) < 1024)
    {
        return 
number_format($mb2) . ' Mb';
    }
    elseif ((
$gb $mb 1024) < 1024)
    {
        return 
number_format($gb2) . ' Gb';
    }
    else
    {
        return 
number_format($gb 10242) . 'Tb';
    }
}

///////////////////////////////////////////////////////////////////////////
function needIgnore($par_FN$par_CRC) {
  global 
$g_IgnoreList;
  
  for (
$i 0$i count($g_IgnoreList); $i++) {
     if (
strpos($par_FN$g_IgnoreList[$i][0]) !== false) {
        if (
$par_CRC == $g_IgnoreList[$i][1]) {
            return 
true;
        }
     }
  }
  
  return 
false;
}

///////////////////////////////////////////////////////////////////////////
function printList($par_List$par_Details null$par_NeedIgnore false$par_SigId null$par_TableName null) {
  global 
$g_Structure;
  
  if (
$par_TableName == null) {
     
$par_TableName 'table_' rand(1000000,9000000);
  }

  
$l_Result '';
  
$l_Result .= "<div class="flist"><table cellspacing=1 cellpadding=4 border=0 id="" . $par_TableName . "">";

  
$l_Result .= "<thead><tr class="tbgh" . ( $i % 2 ). "">";
  
$l_Result .= "<th>" AI_STR_004 "</th>";
  
$l_Result .= "<th>" AI_STR_005 "</th>";
  
$l_Result .= "<th>" AI_STR_006 "</th>";
  
$l_Result .= "<th width=90>" AI_STR_007 "</th>";
  
$l_Result .= "<th width=90>CRC32</th>";
  
$l_Result .= "<th width=0></th>";
  
$l_Result .= "<th width=0></th>";
  
$l_Result .= "<th width=0></th>";
  
  
$l_Result .= "</tr></thead><tbody>";

  for (
$i 0$i count($par_List); $i++) {
    if (
$par_SigId != null) {
       
$l_SigId 'id_' $par_SigId[$i];
    } else {
       
$l_SigId 'id_z' rand(1000000,9000000);
    }
    
    
$l_Pos $par_List[$i];
        if (
$par_NeedIgnore) {
             if (
needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }
        }
  
     
$l_Creat $g_Structure['c'][$l_Pos] > date("d/m/Y H:i:s"$g_Structure['c'][$l_Pos]) : '-';
     
$l_Modif $g_Structure['m'][$l_Pos] > date("d/m/Y H:i:s"$g_Structure['m'][$l_Pos]) : '-';
     
$l_Size $g_Structure['s'][$l_Pos] > bytes2Human($g_Structure['s'][$l_Pos]) : '-';

     if (
$par_Details != null) {
        
$l_WithMarker preg_replace('|@AI_MARKER@|smi''<span class="marker">|</span>'$par_Details[$i]);
        
$l_Body '<div class="details">';

        if (
$par_SigId != null) {
           
$l_Body .= '<a href="#" onclick="return hsig('' . $l_SigId . '')">[x]</a> ';
        }

        
$l_Body .= $l_WithMarker '</div>';
     } else {
        
$l_Body '';
     }

     
$l_Result .= '<tr class="tbg' . ( $i ). '" o="' $l_SigId .'">';
     
     if (
is_file($g_Structure['n'][$l_Pos])) {
        
$l_Result .= '<td><div class="it"><a  class="it" target="_blank" href="'$defaults['site_url'] . 'ai-bolit.php?fn=' .
                  
$g_Structure['n'][$l_Pos] . '&ph=' realCRC(PASS) . '&c=' $g_Structure['crc'][$l_Pos] . '">' $g_Structure['n'][$l_Pos] . '</a></div>' $l_Body '</td>';
     } else {
        
$l_Result .= '<td><div class="it">' $g_Structure['n'][$par_List[$i]] . '</div></td>';
     }
     
     
$l_Result .= '<td><div class="ctd">' $l_Creat '</div></td>';
     
$l_Result .= '<td><div class="ctd">' $l_Modif '</div></td>';
     
$l_Result .= '<td><div class="ctd">' $l_Size '</div></td>';
     
$l_Result .= '<td><div class="ctd"><a href="#" onclick="addToIgnore(this, '' . $g_Structure['n'][$l_Pos] . '','' . $g_Structure['crc'][$l_Pos] . '');return false;">' $g_Structure['crc'][$l_Pos] . '</a></div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $g_Structure['c'][$l_Pos] . '</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $g_Structure['m'][$l_Pos] . '</div></td>';
     
$l_Result .= '<td class="hidd"><div class="hidd">' $l_SigId '</div></td>';
     
$l_Result .= '</tr>';

  }

  
$l_Result .= "</tbody></table></div>";

  return 
$l_Result;
}

///////////////////////////////////////////////////////////////////////////
function printPlainList($par_List$par_Details null$par_NeedIgnore false$par_SigId null$par_TableName null) {
  global 
$g_Structure;
  
//  $l_Result = "n#n";

  
$l_Src = array('&quot;''&lt;''&gt;''&amp;');
  
$l_Dst = array('"',      '<',    '>',    '&');

  for (
$i 0$i count($par_List); $i++) {
    
$l_Pos $par_List[$i];
        if (
$par_NeedIgnore) {
             if (
needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
                 continue;
             }                      
        }
  

     if (
$par_Details != null) {
        
$l_Body preg_replace('|(Ld+).+@AI_MARKER@|smi''$1: ...'$par_Details[$i]);
        
$l_Body preg_replace('/[^x21-x7F]/''.'$l_Body);
        
$l_Body str_replace($l_Src$l_Dst$l_Body);

     } else {
        
$l_Body '';
     }

     if (
is_file($g_Structure['n'][$l_Pos])) {
        
$l_Result .= $g_Structure['n'][$l_Pos] . "ttt" $l_Body "n";
     } else {
        
$l_Result .= $g_Structure['n'][$par_List[$i]] . "n";
     }
     
  }

  return 
$l_Result;
}

///////////////////////////////////////////////////////////////////////////
function extractValue(&$par_Str$par_Name) {
  if (
preg_match('|<tr><td class="e">s*'.$par_Name.'s*</td><td class="v">(.+?)</td>|sm'$par_Str$l_Result)) {
     return 
str_replace('no value'''strip_tags($l_Result[1]));
  }
}

///////////////////////////////////////////////////////////////////////////
function QCR_ExtractInfo($par_Str) {
   
$l_PhpInfoSystem extractValue($par_Str'System');
   
$l_PhpPHPAPI extractValue($par_Str'Server API');
   
$l_AllowUrlFOpen extractValue($par_Str'allow_url_fopen');
   
$l_AllowUrlInclude extractValue($par_Str'allow_url_include');
   
$l_DisabledFunction extractValue($par_Str'disable_functions');
   
$l_DisplayErrors extractValue($par_Str'display_errors');
   
$l_ErrorReporting extractValue($par_Str'error_reporting');
   
$l_ExposePHP extractValue($par_Str'expose_php');
   
$l_LogErrors extractValue($par_Str'log_errors');
   
$l_MQGPC extractValue($par_Str'magic_quotes_gpc');
   
$l_MQRT extractValue($par_Str'magic_quotes_runtime');
   
$l_OpenBaseDir extractValue($par_Str'open_basedir');
   
$l_RegisterGlobals extractValue($par_Str'register_globals');
   
$l_SafeMode extractValue($par_Str'safe_mode');


   
$l_DisabledFunction = ($l_DisabledFunction == '' '-?-' $l_DisabledFunction);
   
$l_OpenBaseDir = ($l_OpenBaseDir == '' '-?-' $l_OpenBaseDir);

   
$l_Result '<div class="sec">' AI_STR_008 ': ' phpversion() . '</div>';
   
$l_Result .= 'System Version: <span class="php_ok">' $l_PhpInfoSystem '</span><br/>';
   
$l_Result .= 'PHP API: <span class="php_ok">' $l_PhpPHPAPI'</span><br/>';
   
$l_Result .= 'allow_url_fopen: <span class="php_' . ($l_AllowUrlFOpen == 'On' 'bad' 'ok') . '">' $l_AllowUrlFOpen'</span><br/>';
   
$l_Result .= 'allow_url_include: <span class="php_' . ($l_AllowUrlInclude == 'On' 'bad' 'ok') . '">' $l_AllowUrlInclude'</span><br/>';
   
$l_Result .= 'disable_functions: <span class="php_' . ($l_DisabledFunction == '-?-' 'bad' 'ok') . '">' $l_DisabledFunction'</span><br/>';
   
$l_Result .= 'display_errors: <span class="php_' . ($l_DisplayErrors == 'On' 'ok' 'bad') . '">' $l_DisplayErrors'</span><br/>';
   
$l_Result .= 'error_reporting: <span class="php_ok">' $l_ErrorReporting'</span><br/>';
   
$l_Result .= 'expose_php: <span class="php_' . ($l_ExposePHP == 'On' 'bad' 'ok') . '">' $l_ExposePHP'</span><br/>';
   
$l_Result .= 'log_errors: <span class="php_' . ($l_LogErrors == 'On' 'ok' 'bad') . '">' $l_LogErrors '</span><br/>';
   
$l_Result .= 'magic_quotes_gpc: <span class="php_' . ($l_MQGPC == 'On' 'ok' 'bad') . '">' $l_MQGPC'</span><br/>';
   
$l_Result .= 'magic_quotes_runtime: <span class="php_' . ($l_MQRT == 'On' 'bad' 'ok') . '">' $l_MQRT'</span><br/>';
   
$l_Result .= 'register_globals: <span class="php_' . ($l_RegisterGlobals == 'On' 'bad' 'ok') . '">' $l_RegisterGlobals '</span><br/>';
   
$l_Result .= 'open_basedir: <span class="php_' . ($l_OpenBaseDir == '-?-' 'bad' 'ok') . '">' $l_OpenBaseDir '</span><br/>';
   
   if (
phpversion() < '5.3.0') {
      
$l_Result .= 'safe_mode (PHP < 5.3.0): <span class="php_' . ($l_SafeMode == 'On' 'ok' 'bad') . '">' $l_SafeMode'</span><br/>';
   }

   return 
$l_Result '<p>';
}

///////////////////////////////////////////////////////////////////////////
function QCR_Debug($par_Str) {
  if (!
DEBUG_MODE) {
     return;
  }

  
$l_MemInfo ' ';  
  if (
function_exists('memory_get_usage')) {
     
$l_MemInfo .= ' curmem=' .  bytes2Human(memory_get_usage());
  }

  if (
function_exists('memory_get_peak_usage')) {
     
$l_MemInfo .= ' maxmem=' .  bytes2Human(memory_get_peak_usage());
  }

  
stdOut("n" date('H:i:s') . ': ' $par_Str $l_MemInfo "n");
}


///////////////////////////////////////////////////////////////////////////
function QCR_ScanDirectories($l_RootDir)
{
    global 
$g_Structure$g_Counter$g_Doorway$g_FoundTotalFiles$g_FoundTotalDirs
            
$defaults$g_SkippedFolders$g_UrlIgnoreList$g_DirIgnoreList$g_UnsafeFilesArray$g_UnsafeDirArray
                        
$g_UnsafeFilesFound$g_SymLinks$g_HiddenFiles;

    
$l_DirCounter 0;
    
$l_DoorwayFilesCounter 0;
    
$l_SourceDirIndex $g_Counter 1;

    
QCR_Debug('Scan ' $l_RootDir);

        
$l_QuotedSeparator quotemeta(DIR_SEPARATOR); 
        
$l_NeedCheckCandi = ($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI;

    if (
$l_DIRH = @opendir($l_RootDir))
    {
        while ((
$l_FileName readdir($l_DIRH)) !== false)
        {
            if (
$l_FileName == '.' || $l_FileName == '..') continue;

                        if (
is_link($l_FileName)) 
                        {
                            
$g_SymLinks[] = $l_FileName;
                            continue;
                        }

            
$l_FileName $l_RootDir DIR_SEPARATOR $l_FileName;

            
$l_Ext substr($l_FileNamestrrpos($l_FileName'.') + 1);

            
$l_IsDir is_dir($l_FileName);

            
// which files should be scanned
            
$l_NeedToScan SCAN_ALL_FILES || (in_array($l_Ext, array(
                
'js''php''php3''phtml''shtml''khtml',
                
'php4''php5''tpl''inc''htaccess''html''htm'
            
)));

            if (
strpos(basename($l_FileName), '.') === 0) {
                            
$g_HiddenFiles[] = $l_FileName;
                        }

            if (
$l_IsDir)
            {
                
// if folder in ignore list
                
$l_Skip false;
                for (
$dr 0$dr count($g_DirIgnoreList); $dr++) {
                    if ((
$g_DirIgnoreList[$dr] != '') &&
                        
preg_match('#' $g_DirIgnoreList[$dr] . '#'$l_FileName$l_Found)) {
                        
$l_Skip true;
                    }
                }
            
                
// skip on ignore
                
if ($l_Skip) {
                    
$g_SkippedFolders[] = $l_FileName;
                    continue;
                }
                
                
$g_Structure['d'][$g_Counter] = $l_IsDir;
                
$g_Structure['n'][$g_Counter] = $l_FileName;

                
$l_DirCounter++;


                                if (
$l_NeedCheckCandi) {
                         for (
$j 0$j count($g_UnsafeDirArray); $j++) {
                             if (
preg_match('|' $l_QuotedSeparator $g_UnsafeDirArray[$j] . '$|i'$l_FileName$l_Found)) {
                                                
$g_UnsafeFilesFound[] = $g_Counter;
                                                break;
                                             }
                         }
                     }

                if (
$l_DirCounter MAX_ALLOWED_PHP_HTML_IN_DIR)
                {
                    
$g_Doorway[] = $l_SourceDirIndex;
                    
$l_DirCounter = -655360;
                }

                
$g_Counter++;
                
$g_FoundTotalDirs++;

                
QCR_ScanDirectories($l_FileName);

            } else
            {
                if (
$l_NeedToScan)
                {
                    
$g_FoundTotalFiles++;
                    if (
in_array($l_Ext, array(
                        
'php''php3',
                        
'php4''php5''html''htm''phtml''shtml''khtml'
                    
))
                    )
                    {
                        
$l_DoorwayFilesCounter++;
                        
                        if (
$l_DoorwayFilesCounter MAX_ALLOWED_PHP_HTML_IN_DIR)
                        {
                            
$g_Doorway[] = $l_SourceDirIndex;
                            
$l_DoorwayFilesCounter = -655360;
                        }
                    }


                    
$l_Stat stat($l_FileName);

                    
$g_Structure['d'][$g_Counter] = $l_IsDir;
                    
$g_Structure['n'][$g_Counter] = $l_FileName;
                    
$g_Structure['s'][$g_Counter] = $l_Stat['size'];
                    
$g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
                    
$g_Structure['m'][$g_Counter] = $l_Stat['mtime'];

                                        if (
$l_NeedCheckCandi) {
                              for (
$j 0$j count($g_UnsafeFilesArray); $j++) {
                                 if (
preg_match('|' $l_QuotedSeparator $g_UnsafeFilesArray[$j] . '|i'$l_FileName$l_Found)) {
                                                        
$g_UnsafeFilesFound[] = $g_Counter;
                                                        break;
                                                     }
                             }
                         }

                    
$g_Counter++;
                }
            }
        }

        
closedir($l_DIRH);
    }

    return 
$g_Structure;
}


///////////////////////////////////////////////////////////////////////////
function QCR_ScanFile($l_TheFile)
{
    global 
$g_Structure$g_Counter$g_Doorway$g_FoundTotalFiles$g_FoundTotalDirs
            
$defaults$g_SkippedFolders$g_UrlIgnoreList$g_DirIgnoreList$g_UnsafeFilesArray$g_UnsafeDirArray
                        
$g_UnsafeFilesFound$g_SymLinks$g_HiddenFiles;

    
QCR_Debug('Scan file ' $l_TheFile);

          
$l_Stat stat($l_TheFile);

          
$g_Structure['d'][$g_Counter] = false;
          
$g_Structure['n'][$g_Counter] = $l_TheFile;
          
$g_Structure['s'][$g_Counter] = $l_Stat['size'];
          
$g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
          
$g_Structure['m'][$g_Counter] = $l_Stat['mtime'];

          
$g_Counter++;

    return 
$g_Structure;
}



///////////////////////////////////////////////////////////////////////////
function getFragment($par_Content$par_Pos) {
  
$l_MaxChars MAX_PREVIEW_LEN;
  
$l_MaxLen strlen($par_Content);
  
$l_RightPos min($par_Pos $l_MaxChars$l_MaxLen); 
  
$l_MinPos max(0$par_Pos $l_MaxChars);

  
$l_FoundStart substr($par_Content0$par_Pos);
  
$l_FoundStart str_replace("r"''$l_FoundStart);
  
$l_LineNo strlen($l_FoundStart) - strlen(str_replace("n"''$l_FoundStart)) + 1;

  
$l_Res 'L' $l_LineNo "  " . ($l_MinPos '...' '') . substr($par_Content$l_MinPos$par_Pos $l_MinPos) . 
           
'@AI_MARKER@' 
           
substr($par_Content$par_Pos$l_RightPos $par_Pos 1);

  return 
htmlspecialchars($l_Res);
}

///////////////////////////////////////////////////////////////////////////
function _utf8_decode($string)
{
  
$tmp $string;
  
$count 0;

  while (
detect_utf_encoding($tmp) !== false )
  {
    
$tmp utf8_decode($tmp);
    
$count++;
  }
  
  for (
$i 0$i $count-$i++)
  {
    
$string utf8_decode($string);
    
  }

  return 
$string;
 
}

///////////////////////////////////////////////////////////////////////////
function escapedHexToHex($escaped)
$GLOBALS['g_EncObfu']++; return chr(hexdec($escaped[1])); }
function 
escapedOctDec($escaped)
$GLOBALS['g_EncObfu']++; return chr(octdec($escaped[1])); }
function 
escapedDec($escaped)
$GLOBALS['g_EncObfu']++; return chr($escaped[1]); }

///////////////////////////////////////////////////////////////////////////
if (!defined('T_ML_COMMENT')) {
   
define('T_ML_COMMENT'T_COMMENT);
} else {
   
define('T_DOC_COMMENT'T_ML_COMMENT);
}

function 
UnwrapObfu($par_Content) {
  
$GLOBALS['g_EncObfu'] = 0;

  
$par_Content preg_replace_callback('/\\x([a-fA-F0-9]{1,2})/i','escapedHexToHex'$par_Content);
  
$par_Content preg_replace_callback('/\\([0-9]{1,3})/i','escapedOctDec'$par_Content);
//  $par_Content = preg_replace_callback('/\\([0-9]{2})/i','escapedDec', $par_Content);

  
$par_Content preg_replace('/['"]s*?.s*?['"]/smi', '', $par_Content);

  return $par_Content;
}


///////////////////////////////////////////////////////////////////////////
// Unicode BOM is U+FEFF, but after encoded, it will look like this.
define ('
UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('
UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('
UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
define ('
UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('
UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));

function detect_utf_encoding($text) {
    $first2 = substr($text, 0, 2);
    $first3 = substr($text, 0, 3);
    $first4 = substr($text, 0, 3);
    
    if ($first3 == UTF8_BOM) return '
UTF-8';
    elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return '
UTF-32BE';
    elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return '
UTF-32LE';
    elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return '
UTF-16BE';
    elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return '
UTF-16LE';

    return false;
}

///////////////////////////////////////////////////////////////////////////
function QCR_SearchPHP($src)
{
  if (preg_match("/(<?php[ws]{5,})/smi", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
      return $l_Found[0][1];
  }

  if (preg_match("/(<script[^>]*languages*=s*)('
|"|)php('|"|)([^>]*>)/i", $src$l_Found, PREG_OFFSET_CAPTURE)) {
    return 
$l_Found[0][1];
  }

  return false;
}


///////////////////////////////////////////////////////////////////////////
function knowUrl(
$par_URL) {
  global 
$g_UrlIgnoreList;

  for (
$jk = 0; $jk < count($g_UrlIgnoreList); $jk++) {
     if  ((stripos(
$par_URL$g_UrlIgnoreList[$jk]) !== false)) {
         return true;
     }
  }

  return false;
}


///////////////////////////////////////////////////////////////////////////
function QCR_GoScan(
$par_Offset)
{
    global 
$g_IframerFragment$g_Iframer$g_SuspDir$g_Redirect$g_Doorway$g_EmptyLink$g_Structure$g_Counter
           
$g_WritableDirectories$g_HeuristicType$g_HeuristicDetected$g_TotalFolder$g_TotalFiles$g_WarningPHP$g_AdwareList,
           
$g_CriticalPHP$g_Phishing$g_CriticalJS$g_UrlIgnoreList$g_CriticalJSFragment$g_PHPCodeInside$g_PHPCodeInsideFragment
           
$g_NotRead$g_WarningPHPFragment$g_WarningPHPSig$g_BigFiles$g_RedirectPHPFragment$g_EmptyLinkSrc$g_CriticalPHPSig$g_CriticalPHPFragment
           
$g_Base64Fragment$g_UnixExec$g_PhishingSigFragment$g_PhishingFragment$g_PhishingSig$g_CriticalJSSig$g_IframerFragment$g_CMS$defaults$g_AdwareListFragment$g_KnownList;

    static 
$_files_and_ignored = 0;

        QCR_Debug('QCR_GoScan ' . 
$par_Offset);


    for (
$i = $par_Offset$i < $g_Counter$i++)
    {
        
$l_Filename = $g_Structure['n'][$i];

             QCR_Debug('Check ' . 
$l_Filename);

        if (
$g_Structure['d'][$i])
        {
            // FOLDER
            
$g_TotalFolder++;

            if (is_writable(
$l_Filename))
            {
                
$g_WritableDirectories[] = $i;
            }
        }
        else
        {

            // FILE
            if ((MAX_SIZE_TO_SCAN > 0 AND 
$g_Structure['s'][$i] > MAX_SIZE_TO_SCAN) || ($g_Structure['s'][$i] < 0))
            {
                
$g_BigFiles[] = $i;
            }
            else
            {
                
$g_TotalFiles++;

                
$l_Content = @implode('', file($l_Filename));
                if ((
$l_Content == '') && ($g_Structure['s'][$i] > 0)) {
                   
$g_NotRead[] = $i;
                }

                
$g_Structure['crc'][$i] = realCRC($l_Content);

                                
$l_KnownCRC = $g_Structure['crc'][$i] + realCRC(basename($l_Filename));
                                if (in_array(
$l_KnownCRC$g_KnownList)) {
                       printProgress(++
$_files_and_ignored$l_Filename);
                                   continue;
                                }

                
$l_Unwrapped = UnwrapObfu($l_Content);
                if (detect_utf_encoding(
$l_Content) !== false) {
                          if (function_exists('mb_convert_encoding')) {
                                      
$l_Unwrapped = mb_convert_encoding($l_Unwrapped, "CP1251");
                                   } else {
                                      
$g_NotRead[] = $i;
                   }
                                }

                          

                // ignore itself
                if (strpos(
$l_Content, 'OI87547623YUIOIUYIOYHJW') !== false) {
                    continue;
                }

                // warnings
                
$l_Pos = '';
                if (WarningPHP(
$l_Filename$l_Unwrapped$l_Pos$l_SigId))
                {       
$l_Prio = 1;
                        if (strpos(
$l_Filename, '.php') !== false) {
                              
$l_Prio = 0;
                    }

                    
$g_WarningPHP[$l_Prio][] = $i;
                    
$g_WarningPHPFragment[$l_Prio][] = getFragment($l_Content$l_Pos);
                    
$g_WarningPHPSig[] = $l_SigId;
                }

                // adware
                if (Adware(
$l_Filename$l_Unwrapped$l_Pos))
                {
                    
$g_AdwareList[] = $i;
                    
$g_AdwareListFragment[] = getFragment($l_Unwrapped$l_Pos);
                }

                // critical
                
$g_SkipNextCheck = false;
                if (CriticalPHP(
$l_Filename$i$l_Unwrapped$l_Pos$l_SigId))
                {
                    
$g_CriticalPHP[] = $i;
                    
$g_CriticalPHPFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$g_CriticalPHPSig[] = $l_SigId;
                    
$g_SkipNextCheck = true;
                } else {
                         if (CriticalPHP(
$l_Filename$i$l_Content$l_Pos$l_SigId))
                         {
                             
$g_CriticalPHP[] = $i;
                             
$g_CriticalPHPFragment[] = getFragment($l_Content$l_Pos);
                        
$g_CriticalPHPSig[] = $l_SigId;
                             
$g_SkipNextCheck = true;
                         }
                }

                
                // critical without comments
                
$l_NoComments = preg_replace('|/*.*?*/|smiu', '', $l_Unwrapped);
                if (
$l_NoComments == $l_Unwrapped) {
                                   
$g_SkipNextCheck = true;
                                }
                     
                if ((!
$g_SkipNextCheck) && CriticalPHP($l_Filename$i$l_NoComments$l_Pos$l_SigId))
                {
                    
$g_CriticalPHP[] = $i;
                    
$g_CriticalPHPFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$g_CriticalPHPSig[] = $l_SigId;
                }            

                
$l_TypeDe = 0;
                if (ai_check_extra_obfus(
$l_Content$l_TypeDe)) {
                    
$g_HeuristicDetected[] = $i;
                    
$g_HeuristicType[] = $l_TypeDe;
                }

                // critical JS
                
$l_Pos = CriticalJS($l_Filename$i$l_Unwrapped$l_SigId);
                if (
$l_Pos !== false)
                {
                    
$g_CriticalJS[] = $i;
                    
$g_CriticalJSFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$g_CriticalJSSig[] = $l_SigId;
                }

                // phishing
                
$l_Pos = Phishing($l_Filename$i$l_Unwrapped$l_SigId);
                if (
$l_Pos !== false)
                {
                    
$g_Phishing[] = $i;
                    
$g_PhishingFragment[] = getFragment($l_Unwrapped$l_Pos);
                    
$g_PhishingSigFragment[] = $l_SigId;
                }

                if
                (stripos(
$l_Filename, 'index.php') ||
                    stripos(
$l_Filename, 'index.htm') ||
                    SCAN_ALL_FILES
                )
                {
                    // check iframes
                    if (preg_match_all('|<iframe[^>]+src.+?>|smi', 
$l_Unwrapped$l_Found, PREG_SET_ORDER)) 
                    {
                        for (
$kk = 0; $kk < count($l_Found); $kk++) {
                                
$l_Pos = stripos($l_Found[$kk][0], 'http://');
                            if  ((
$l_Pos !== false) && (!knowUrl($l_Found[$kk][0]))) {
                                     
$g_Iframer[] = $i;
                                     
$g_IframerFragment[] = getFragment($l_Found[$kk][0], $l_Pos);
                            }
                        }
                    }

                    // check empty links
                    if (preg_match_all('|<a[^>]+href([^>]+?)>(.*?)</a>|smi', 
$l_Unwrapped$l_Found, PREG_SET_ORDER))
                    {
                        for (
$kk = 0; $kk < count($l_Found); $kk++) {
                            if  ((stripos(
$l_Found[$kk][1], 'http://') !== false) &&
                                                            (trim(strip_tags(
$l_Found[$kk][2])) == '')) {

                                
$l_NeedToAdd = true;

                                if  ((stripos(
$l_Found[$kk][1], $default['site_url']) !== false)
                                                                 || knowUrl(
$l_Found[$kk][1])) {
                                        
$l_NeedToAdd = false;
                                }
                                
                                if (
$l_NeedToAdd && (count($g_EmptyLink) < MAX_EXT_LINKS)) {
                                    
$g_EmptyLink[] = $i;
                                    
$g_EmptyLinkSrc[$i][] = substr($l_Found[$kk][0], 0, MAX_PREVIEW_LEN);
                                }
                            }
                        }
                    }
                }

                // check for PHP code inside any type of file
                if ((stripos(
$l_Filename, '.php') === false) && 
                    (stripos(
$l_Filename, '.phtml') === false))
                {
                    
$l_Pos = QCR_SearchPHP($l_Content);
                    if (
$l_Pos !== false)
                    {
                        
$g_PHPCodeInside[] = $i;
                        
$g_PHPCodeInsideFragment[] = getFragment($l_Unwrapped$l_Pos);
                    }
                }

                // articles
                if (stripos(
$l_Filename, 'article_index'))
                {
                    
$g_AdwareSig[] = $i;
                }

                // unix executables
                if (strpos(
$l_Content, chr(127) . 'ELF') !== false) 
                {
                    
$g_UnixExec[] = $i;
                }
                
                // htaccess
                if (stripos(
$l_Filename, '.htaccess'))
                {
                
                if (stripos(
$l_Content, 'index.php?name=$1') !== false ||
                        stripos(
$l_Content, 'index.php?m=1') !== false
                    )
                    {
                        
$g_SuspDir[] = $i;
                    }

                    
$l_Pos = stripos($l_Content, '^(%2d|-)[^=]+$');
                    if (
$l_Pos !== false)
                    {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                    }

                    
$l_Pos = stripos($l_Content, '%{HTTP_USER_AGENT}');
                    if (
$l_Pos !== false)
                    {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                    }


                    if (
                        preg_match_all('|(RewriteConds+%{HTTP_HOST}/%1 !^[w.]*([^/]+)/\1
$s+[NC])|smi', $l_Content$l_Found, PREG_OFFSET_CAPTURE)
                       )
                    {
                        
$g_Redirect[] = $i;
                                    
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Found[0][1]);
                    }
//

                    
$l_HTAContent = preg_replace('|^s*#.+$|m', '', $l_Content);

                    if (
                        preg_match_all("
|RewriteRules+.+?s+http://(.+?)/.+s+[.*R=d+.*]|smi", $l_HTAContent, $l_Found, PREG_SET_ORDER)
                    
)
                    {
                        
$l_Host str_replace('www.'''$_SERVER['HTTP_HOST']);
                        for (
$j 0$j sizeof($l_Found); $j++)
                        {
                            
$l_Found[$j][1] = str_replace('www.'''$l_Found[$j][1]);
                            if (
$l_Found[$j][1] != $l_Host)
                            {
                                
$g_Redirect[] = $i;
                                break;
                            }
                        }
                    }

                    unset(
$l_HTAContent);
                    
                    
$l_Pos stripos($l_Content'auto_prepend_file');
                    if (
$l_Pos !== false) {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                    }
                    
$l_Pos stripos($l_Content'auto_append_file');
                    if (
$l_Pos !== false) {
                        
$g_Redirect[] = $i;
                        
$g_RedirectPHPFragment[] = getFragment($l_Content$l_Pos);
                    }

                    if (
preg_match("|RewriteRules+^(.*)$s+-s+[s*Fs*,s*Ls*]|smi"$l_Content$l_Found)) {
                        
$g_Redirect[] = $i;
                    }
                }
            }
            
            unset(
$l_Unwrapped);
            unset(
$l_Content);
            
            
printProgress(++$_files_and_ignored$l_Filename);
        } 
// end of if (file)

        
usleep(SCAN_DELAY 1000);

    } 
// end of for

}

///////////////////////////////////////////////////////////////////////////
function WarningPHP($l_FN$l_Content, &$l_Pos, &$l_SigId)
{
  global 
$g_SusDB;

  
$l_Res false;

  foreach (
$g_SusDB as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);
           return 
true;
       }
    }
  }

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function Adware($l_FN$l_Content, &$l_Pos)
{
  global 
$g_AdwareSig;

  
$l_Res false;

  foreach (
$g_AdwareSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           return 
true;
       }
    }
  }

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function CheckException(&$l_Content, &$l_Found) {
  global 
$g_ExceptFlex$gX_FlexDBShe$gXX_FlexDBShe$g_FlexDBShe$gX_DBShe$g_DBShe$g_Base64$g_Base64Fragment;
   
$l_FoundStrPlus substr($l_Contentmax($l_Found[0][1] - 100), 70);

   foreach (
$g_ExceptFlex as $l_ExceptItem) {
      if (
preg_match('#(' $l_ExceptItem ')#smi'$l_FoundStrPlus$l_Detected)) {
         
$l_Exception true;
         return 
true;
      }
   }

   return 
false;
}

///////////////////////////////////////////////////////////////////////////
function Phishing($l_FN$l_Index$l_Content, &$l_SigId)
{
  global 
$g_PhishingSig;

  
$l_Res false;

  foreach (
$g_PhishingSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"Phis: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }

  return 
$l_Res;
}

///////////////////////////////////////////////////////////////////////////
function CriticalJS($l_FN$l_Index$l_Content, &$l_SigId)
{
  global 
$g_JSVirSig$gX_JSVirSig;

  
$l_Res false;

  foreach (
$g_JSVirSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"JS: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }

if (
AI_EXPERT 1) {
  foreach (
$gX_JSVirSig as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"JS PARA: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
$l_Pos;
       }
    }
  }
}

  return 
$l_Res;
}


///////////////////////////////////////////////////////////////////////////
  
function get_descr_heur($type) {
     
$msg '';
     switch (
$type) {
        case 
1$msg AI_STR_053;
                break;
        case 
2$msg AI_STR_054;
                break;
        case 
3$msg AI_STR_055;
                break;
        case 
4$msg AI_STR_056;
                break;
     }
     
     return 
$msg;
  }

  function 
ai_check_extra_obfus($content, &$type) {
     
$res false;

     
// 1
     
if (preg_match_all('|($[a-zA-Z0-9_]{3,}[[d+]]s*(s*$)|smiu'$content$foundPREG_SET_ORDER)) {
        
$ref_calls count($found);
     }

     
// 2
     
if (preg_match_all('|$([a-zA-Z0-9_]{3,}?)s*[;=(]|smi'$content$foundPREG_SET_ORDER)) {
       
$obf_var1 0;
       
$obf_var2 0;

       
$arr = array();
       foreach (
$found as $item) {
         
$arr[$item[1]] = 1;
       }                          


       
$found array_keys($arr);

       foreach (
$found as $item) {
          if (
preg_match('|([a-zA-Z]{2,}[0-9]+[a-zA-Z]+){1,}|'$item$found_ob)) {
             
$obf_var1++;
          }

          if (!
preg_match('|([aeiouy_])|i'$item$found_ob) && (strlen($item) > 4)) {
             
$obf_var2++;
          }

          if (
preg_match('|([0-9bcdfghjklmnpqrstvwxz]{6,})|i'$item$found_ob) && (strlen($item) > 3)) {
             
$obf_var3++;
          }
       }
     }

     
// 3
     
if (preg_match_all('|($GLOBALS['[a-z_0-9]+'][d+]()|smiu'$content$foundPREG_SET_ORDER)) {
        
$ref_glob count($found);
     }

     
// 4
//     if (preg_match_all('|(["'].+?["']s*.s*){10,}|smiu', $content, $found, PREG_SET_ORDER)) {
//        $type = 4;
//        return true;
//     }
     
     /////////////////////////////////////
     
if ($ref_calls 10) {
        
$type 1;
        return 
true;
     }

     if (
$ref_glob 10) {
        
$type 2;
        return 
true;
     }
     
     if (
$obf_var1 $obf_var2 $obf_var3 >= 3) {
        
$type 3;
        return 
true;
     }

 
     return 
false;
  }

///////////////////////////////////////////////////////////////////////////
function CriticalPHP($l_FN$l_Index$l_Content, &$l_Pos, &$l_SigId)
{
  global 
$g_ExceptFlex$gXX_FlexDBShe$gX_FlexDBShe$g_FlexDBShe$gX_DBShe$g_DBShe$g_Base64$g_Base64Fragment;

  
// OI87547623YUIOIUYIOYHJW

  
foreach ($g_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 1: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }

if (
AI_EXPERT 1) {
  foreach (
$gXX_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 2: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }
}

if (
AI_EXPERT 0) {
  foreach (
$gX_FlexDBShe as $l_Item) {
    if (
preg_match('#(' $l_Item ')#smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
       if (!
CheckException($l_Content$l_Found)) {
           
$l_Pos $l_Found[0][1];
           
$l_SigId myCheckSum($l_Item);

           if (
DEBUG_MODE) {
              echo 
"CRIT 3: $l_FN matched [$l_Item] in $l_Posn";
           }

           return 
true;
       }
    }
  }
}

  foreach (
$g_DBShe as $l_Item) {
    
$l_Pos stripos($l_Content$l_Item);
    if (
$l_Pos !== false) {
       
$l_SigId myCheckSum($l_Item);

       if (
DEBUG_MODE) {
          echo 
"CRIT 4: $l_FN matched [$l_Item] in $l_Posn";
       }

       return 
true;
    }
  }

if (
AI_EXPERT) {
  foreach (
$gX_DBShe as $l_Item) {
    
$l_Pos stripos($l_Content$l_Item);
    if (
$l_Pos !== false) {
       
$l_SigId myCheckSum($l_Item);

       if (
DEBUG_MODE) {
          echo 
"CRIT 5: $l_FN matched [$l_Item] in $l_Posn";
       }

       return 
true;
    }
  }

  if ((
strpos($l_FN'.ph') !== false) && (AI_EXPERT 1)) {
     
// for php only
     
$g_Specials = array(');#');

     foreach (
$g_Specials as $l_Item) {
       
$l_Pos stripos($l_Content$l_Item);
       if (
$l_Pos !== false) {
          
$l_SigId myCheckSum($l_Item);
          return 
true;
       }
     }
  }

}

  if ((
strpos($l_Content'GIF89') === 0) && (strpos($l_FN'.php') !== false )) {
     
$l_Pos 0;

     if (
DEBUG_MODE) {
          echo 
"CRIT 6: $l_FN matched [$l_Item] in $l_Posn";
     }

     return 
true;
  }

  if (
strpos($l_FN'.php.') !== false ) {
     
$g_Base64[] = $l_Index;
     
$g_Base64Fragment[] = '".php."';
     
$l_Pos 0;

     if (
DEBUG_MODE) {
          echo 
"CRIT 7: $l_FN matched [$l_Item] in $l_Posn";
     }

     return 
false;
  }

  if (
preg_match('#((include|require|require_once|include_once)s*(*s*["']http://.+?["'])#smi', $l_Content, $l_Found)) {
     
$g_Base64[] = $l_Index;
     
$g_Base64Fragment[] = substr($l_Found[1], 0MAX_PREVIEW_LEN);

     if (
DEBUG_MODE) {
          echo 
"CRIT 8: $l_FN matchedn";
     }

  }

  
// detect base64 suspicious
  
if (preg_match('|([A-Za-z0-9+/]{' BASE64_LENGTH ',})|smi'$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
     if (
preg_match('#base64_decodes*(#smi'
                 
$l_Content$l_FoundPREG_OFFSET_CAPTURE)) {
        if ((!
CheckException($l_Content$l_Found)) && (!in_array($l_Index$g_Base64))) {
        
$g_Base64[] = $l_Index;
        
$g_Base64Fragment[] = getFragment($l_Content$l_Found[1][1]);

           if (
DEBUG_MODE) {
                echo 
"CRIT 9: $l_FN matchedn";
           }
        }
     }
  }

  
// count number of base64_decode entries
  
$l_Count substr_count($l_Content'base64_decode');
  if (
$l_Count 10) {
     
$g_Base64[] = $l_Index;
     
$g_Base64Fragment[] = getFragment($l_Contentstripos($l_Content'base64_decode'));

     if (
DEBUG_MODE) {
        echo 
"CRIT 10: $l_FN matchedn";
     }
  }

  return 
false;
}

///////////////////////////////////////////////////////////////////////////
if (!isCli()) {
   
header('Content-type: text/html; charset=utf-8');
}

if (!
isCli()) {

  
$l_PassOK false;
  if (
strlen(PASS) > 8) {
     
$l_PassOK true;   
  } 

  if (
$l_PassOK && preg_match('|[0-9]|'PASS$l_Found) && preg_match('|[A-Z]|'PASS$l_Found) && preg_match('|[a-z]|'PASS$l_Found) ) {
     
$l_PassOK true;   
  }
  
  if (!
$l_PassOK) {  
    echo 
sprintf(AI_STR_009generatePassword());
    exit;
  }

  if (isset(
$_GET['fn']) && ($_GET['ph'] == crc32(PASS))) {
     
printFile();
     exit;
  }

  if (
$_GET['p'] != PASS) {
    echo 
sprintf(AI_STR_010generatePassword());
    exit;
  }
}

if (!
is_readable(ROOT_PATH)) {
  echo 
AI_STR_011;
  exit;
}

if (
isCli()) {
    if (
defined('REPORT_PATH') AND REPORT_PATH)
    {
        if (!
is_writable(REPORT_PATH))
        {
            die(
"nCannot write report. Report dir " REPORT_PATH " is not writable.");
        }

        else if (!
REPORT_FILE)
        {
            die(
"nCannot write report. Report filename is empty.");
        }

        else if ((
$file REPORT_PATH DIR_SEPARATOR REPORT_FILE) AND is_file($file) AND !is_writable($file))
        {
            die(
"nCannot write report. Report file '$file' exists but is not writable.");
        }
    }
}


$g_IgnoreList = array();
$g_DirIgnoreList = array();
$g_UrlIgnoreList = array();
$g_KnownList = array();

$g_AiBolitAbsolutePath dirname(__FILE__);

$l_IgnoreFilename $g_AiBolitAbsolutePath '/.aignore';
$l_DirIgnoreFilename $g_AiBolitAbsolutePath '/.adirignore';
$l_UrlIgnoreFilename $g_AiBolitAbsolutePath '/.aurlignore';
$l_KnownFilename '.aknown';

if (
file_exists($l_IgnoreFilename)) {
    
$l_IgnoreListRaw file($l_IgnoreFilename);
    for (
$i 0$i count($l_IgnoreListRaw); $i++) 
    {
        
$g_IgnoreList[] = explode("t"trim($l_IgnoreListRaw[$i]));
    }
    unset(
$l_IgnoreListRaw);
}

if (
file_exists($l_DirIgnoreFilename)) {
    
$g_DirIgnoreList file($l_DirIgnoreFilename);
    
    for (
$i 0$i count($g_DirIgnoreList); $i++) {
        
$g_DirIgnoreList[$i] = trim($g_DirIgnoreList[$i]);
    }
}

if (
file_exists($l_UrlIgnoreFilename)) {
    
$g_UrlIgnoreList file($l_UrlIgnoreFilename);
    
    for (
$i 0$i count($g_UrlIgnoreList); $i++) {
        
$g_UrlIgnoreList[$i] = trim($g_UrlIgnoreList[$i]);
    }
}


$g_AiBolitAbsolutePathKnownFiles dirname($g_AiBolitAbsolutePath) . '/known_files';
$g_AiBolitKnownFilesDirs = array('.');

if (
$l_DIRH opendir($g_AiBolitAbsolutePathKnownFiles))
{
    while ((
$l_FileName readdir($l_DIRH)) !== false)
    {
    if (
$l_FileName == '.' || $l_FileName == '..') continue;
        
array_push($g_AiBolitKnownFilesDirs$l_FileName);
    }

    
closedir($l_DIRH);
}


foreach (
$g_AiBolitKnownFilesDirs as $l_PathKnownFiles)
{
    if (
$l_PathKnownFiles != '.') {
       
$l_AbsolutePathKnownFiles $g_AiBolitAbsolutePathKnownFiles '/' $l_PathKnownFiles;
    } else {
      
$l_AbsolutePathKnownFiles $l_PathKnownFiles;
    }

    if (
$l_DIRH opendir($l_AbsolutePathKnownFiles))
    {
        while ((
$l_FileName readdir($l_DIRH)) !== false)
        {
            if (
$l_FileName == '.' || $l_FileName == '..') continue;
               if (
strpos($l_FileName$l_KnownFilename) !== false) {
                           
$g_KnownListTmp file($l_AbsolutePathKnownFiles '/' $l_FileName);
                            for (
$i 0$i count($g_KnownListTmp); $i++) {
                                
$g_KnownListTmp[$i] = trim($g_KnownListTmp[$i]);
                            }

                            
$g_KnownList array_merge($g_KnownListTmp$g_KnownList);
                       }
        }
        
closedir($l_DIRH);
    }
}

stdOut("Loaded " count($g_KnownList) . ' known files');

QCR_Debug();

// scan single file
if (defined('SCAN_FILE')) {
   if (
file_exists(SCAN_FILE) && is_file(SCAN_FILE) && is_readable(SCAN_FILE)) {
       
stdOut("Start scanning file '" SCAN_FILE "'.");
       
QCR_ScanFile(SCAN_FILE); 
   } else { 
       
stdOut("Error:" SCAN_FILE " either is not a file or readable");
   }
} else {
   
// scan list of files from file
   
if (file_exists(DOUBLECHECK_FILE)) {
      
stdOut("Start scanning the list from '" DOUBLECHECK_FILE "'.");
      
$l_FHList fopen(DOUBLECHECK_FILE"r");
      while(!
feof($l_FHList)) {
         
$l_FN trim(fgets($l_FHList));
         if (
file_exists($l_FN)) {
            
QCR_ScanFile($l_FN); 
         }
      }

      
fclose($l_FHList);

   } else {
      
// scan whole file system
      
stdOut("Start scanning '" ROOT_PATH "'.");
      
QCR_ScanDirectories(ROOT_PATH);
   }
}

$g_FoundTotalFiles count($g_Structure['n']);

QCR_Debug();

stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
stdOut(str_repeat(' '160),false);

$g_FoundTotalFiles count($g_Structure['n']);

// detect version CMS
$l_CmsListDetector = new CmsVersionDetector('.');
$l_CmsDetectedNum $l_CmsListDetector->getCmsNumber();
for (
$tt 0$tt $l_CmsDetectedNum$tt++) {
    
$g_CMS[] = $l_CmsListDetector->getCmsName($tt) . ' v' $l_CmsListDetector->getCmsVersion($tt);
}

QCR_GoScan(0);

QCR_Debug();


////////////////////////////////////////////////////////////////////////////
 
if ($BOOL_RESULT) {
  if ((
count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR  (count($g_Iframer) > 0) OR  (count($g_UnixExec) > 0))
  {
  echo 
"1n";
  exit(
0);
  }
 }
////////////////////////////////////////////////////////////////////////////

$l_Result .= "<div class="sec"><b>" AI_STR_051 . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : realpath('.')) . "</b></div>";

$time_tacked seconds2Human(microtime(true) - START_TIME);

$l_Result .= sprintf(AI_STR_013$g_TotalFolder$g_TotalFiles);

if (!
$defaults['scan_all_files']) {
    
$l_Result .= AI_STR_014;
}

$l_Result .= AI_STR_015;

$l_ShowOffer false;

stdOut("nBuilding reportn");


////////////////////////////////////////////////////////////////////////////
// save 
if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR 
   (
count($g_Iframer) > 0) OR  (count($g_UnixExec))) 
{

  if (!
file_exists(DOUBLECHECK_FILE)) {
      if (
$l_FH fopen(DOUBLECHECK_FILE'w')) {
         
fputs($l_FH'<?php die("Forbidden"); ?>' "n");

         
$l_CurrPath dirname(__FILE__);

         for (
$i 0$i count($g_CriticalPHP); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_CriticalPHP[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalPHP[$i]]));  
         
}

         for (
$i 0$i count($g_Base64); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_Base64[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Base64[$i]]));
         
}

         for (
$i 0$i count($g_CriticalJS); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_CriticalJS[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalJS[$i]]));
         
}

         for (
$i 0$i count($g_SuspDir); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_SuspDir[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_SuspDir[$i]]));
         
}

         for (
$i 0$i count($g_Iframer); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_Iframer[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Iframer[$i]]));
         
}

         for (
$i 0$i count($g_UnixExec); $i++) {
             
fputs($l_FHstr_replace($l_CurrPath'.'$g_Structure['n'][$g_UnixExec[$i]]) . "n");
             
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_UnixExec[$i]]));
         
}

         
fclose($l_FH);
      } else {
         
stdOut("Error! Cannot create " DOUBLECHECK_FILE);
      }      
  } else {
      
stdOut(DOUBLECHECK_FILE ' already exists.');
      
$l_Result .= '<div class="err">' DOUBLECHECK_FILE ' already exists.</div>';
  }
 
}

////////////////////////////////////////////////////////////////////////////

stdOut("Building list of shells " count($g_CriticalPHP));

if (
function_exists("gethostname") && is_callable("gethostname")) {
  
$l_HostName gethostname();
} else {
  
$l_HostName '???';
}

$l_PlainResult "# Malware list detected by AI-Bolit (http://revisium.com/ai/) on " date("d/m/Y H:i:s"time()) . " " $l_HostName .  "nn";

if (
count($g_CriticalPHP) > 0) {
  
$l_Result .= '<div class="vir"><b>' AI_STR_016 '</b> (' count($g_CriticalPHP) . ')';
  
$l_Result .= printList($g_CriticalPHP$g_CriticalPHPFragmenttrue$g_CriticalPHPSig'table_crit');
  
$l_PlainResult .= printPlainList($g_CriticalPHP$g_CriticalPHPFragmenttrue$g_CriticalPHPSig'table_crit');
  
$l_Result .= '</div>';

  
$l_ShowOffer true;
} else {
  
$l_Result .= '<div class="ok"><b>' AI_STR_017'</b></div>';
}

stdOut("Building list of js " count($g_CriticalJS));

if (
count($g_CriticalJS) > 0) {
  
$l_Result .= '<div class="vir"><b>' AI_STR_018 '</b> (' count($g_CriticalJS) . ')';
  
$l_Result .= printList($g_CriticalJS$g_CriticalJSFragmenttrue$g_CriticalJSSig'table_vir');
  
$l_PlainResult .= printPlainList($g_CriticalJS$g_CriticalJSFragmenttrue$g_CriticalJSSig'table_vir');
  
$l_Result .= "</div>";

  
$l_ShowOffer true;
}

stdOut("Building phishing pages " count($g_Phishing));

if (
count($g_Phishing) > 0) {
  
$l_Result .= '<div class="vir"><b>' AI_STR_058 '</b> (' count($g_Phishing) . ')';
  
$l_Result .= printList($g_Phishing$g_PhishingFragmenttrue$g_PhishingSigFragment'table_vir');
  
$l_PlainResult .= printPlainList($g_Phishing$g_PhishingFragmenttrue$g_PhishingSigFragment'table_vir');
  
$l_Result .= "</div>";

  
$l_ShowOffer true;
}

stdOut("Building list of unix executables " count($g_UnixExec));

if (
count($g_UnixExec) > 0) {
  
$l_Result .= "<div class="vir"><b>"AI_STR_019 ."</b> (" count($g_UnixExec) . ')';
  
$l_Result .= printList($g_UnixExec''true);
  
$l_PlainResult .= printPlainList($g_UnixExec''true);
  
$l_Result .= "</div>";

  
$l_ShowOffer true;
}

stdOut("Building list of iframes " count($g_Iframer));

if (
count($g_Iframer) > 0) {
  
$l_ShowOffer true;

  
$l_Result .= "<div class="vir"><b>" AI_STR_021 "</b> (" count($g_Iframer) . ')';
  
$l_Result .= printList($g_Iframer$g_IframerFragmenttrue);
  
$l_Result .= "</div>";

}

stdOut("Building list of base64s " count($g_Base64));

if (
count($g_Base64) > 0) {
  
$l_ShowOffer true;

  
$l_Result .= "<div class="warn"><b>" AI_STR_020 ."</b> (" count($g_Base64) . ')';
  
$l_Result .= printList($g_Base64$g_Base64Fragmenttrue);
  
$l_PlainResult .= printPlainList($g_Base64$g_Base64Fragmenttrue);
  
$l_Result .= "</div>";

}

stdOut("Building list of heuristics " count($g_HeuristicDetected));

if (
count($g_HeuristicDetected) > 0) {
  
$l_Result .= '<div class="warn"><b>' AI_STR_052 '</b><ul>';
  for (
$i 0$i count($g_HeuristicDetected); $i++) {
       
$l_Result .= '<li>' $g_Structure['n'][$g_HeuristicDetected[$i]] . ' (' get_descr_heur($g_HeuristicType[$i]) . ')</li>';
  }
  
  
$l_Result .= '</ul></div>';

  
$l_ShowOffer true;
}

stdOut("Building list of unread files " count($g_NotRead));

if (
count($g_NotRead) > 0) {

  
$l_ShowOffer true;
  
$l_Result .= "<div class="vir"><b>" AI_STR_030 ":</b>";
  
$l_Result .= printList($g_NotRead);
  
$l_Result .= "</div>";

}

stdOut("Building list of symlinks " count($g_SymLinks));

if (
count($g_SymLinks) > 0) {

  
$l_Result .= "<div class="warn"><b>" AI_STR_022 "</b> (" count($g_SymLinks) .")<br>";
  
$l_Result .= implode("<br>"$g_SymLinks);
  
$l_Result .= "</div>";

}

stdOut("Building list of hidden files " count($g_HiddenFiles));

if (
count($g_HiddenFiles) > 0) {

  
$l_Result .= "<div class="warn"><b>" AI_STR_023 "</b> (" count($g_HiddenFiles) . ")<br>";
  
$l_Result .= implode("<br>"$g_HiddenFiles);
  
$l_Result .= "</div>";

}

stdOut("Building list of susp dirs " count($g_SuspDir));

if (
count($g_SuspDir) > 0) {

  
$l_Result .= "<div class="vir"><b>" AI_STR_024 "</b><br>";
  
$l_Result .= printList($g_SuspDir);
  
$l_Result .= "</div>";

} else {

  
$l_Result .= '<div class="ok"><b>' AI_STR_025 '</b></div>';

}
 

stdOut("Building list of redirects " count($g_Redirect));

$l_Result .= "<div class="sec">" AI_STR_026 "</div>";

if (
count($g_Redirect) > 0) {

  
$l_ShowOffer true;
  
$l_Result .= "<div class="warn"><b>" AI_STR_027 "</b>";
  
$l_Result .= printList($g_Redirect$g_RedirectPHPFragmenttrue);
  
$l_Result .= "</div>";

}

stdOut("Building list of php inj " count($g_PHPCodeInside));

if ((
count($g_PHPCodeInside) > 0) && (($defaults['report_mask'] & REPORT_MASK_PHPSIGN) == REPORT_MASK_PHPSIGN)) {

  
$l_ShowOffer true;
  
$l_Result .= "<div class="warn"><b>" AI_STR_028 "</b>";
  
$l_Result .= printList($g_PHPCodeInside$g_PHPCodeInsideFragmenttrue);
  
$l_Result .= "</div>";

}

stdOut("Building list of adware " count($g_AdwareList));

if (
count($g_AdwareList) > 0) {
  
$l_ShowOffer true;

  
$l_Result .= "<div class="warn"><b>" AI_STR_029 "</b>";
  
$l_Result .= printList($g_AdwareList$g_AdwareListFragmenttrue);
  
$l_Result .= "</div>";

}

stdOut("Building list of empty links " count($g_EmptyLink));
if ((
count($g_EmptyLink) > 0) && (($defaults['report_mask'] & REPORT_MASK_SPAMLINKS) == REPORT_MASK_SPAMLINKS)) {
  
$l_ShowOffer true;
  
$l_Result .= "<div class="warn"><b>" AI_STR_031 "</b>";
  
$l_Result .= printList($g_EmptyLink''true);

  
$l_Result .= AI_STR_032 '<br/>';
  
  if (
count($g_EmptyLink) == MAX_EXT_LINKS) {
      
$l_Result .= '(' AI_STR_033 MAX_EXT_LINKS ')<br/>';
    }
   
  for (
$i 0$i count($g_EmptyLink); $i++) {
    
$l_Idx $g_EmptyLink[$i];
    for (
$j 0$j count($g_EmptyLinkSrc[$l_Idx]); $j++) {
      
$l_Result .= '<span class="details">' $g_Structure['n'][$g_EmptyLink[$i]] . ' &rarr; ' htmlspecialchars($g_EmptyLinkSrc[$l_Idx][$j]) . '</span><br/>';
    }
  }

  
$l_Result .= "</div>";

}

stdOut("Building list of doorways " count($g_Doorway));

if ((
count($g_Doorway) > 0) && (($defaults['report_mask'] & REPORT_MASK_DOORWAYS) == REPORT_MASK_DOORWAYS)) {
  
$l_ShowOffer true;

  
$l_Result .= "<div class="warn"><b>" AI_STR_034 "</b>";
  
$l_Result .= printList($g_Doorway);
  
$l_Result .= "</div>";

}

stdOut("Building list of php warnings " . (count($g_WarningPHP[0]) + count($g_WarningPHP[1])));

if ((
$defaults['report_mask'] & REPORT_MASK_SUSP) == REPORT_MASK_SUSP) {
   if ((
count($g_WarningPHP[0]) + count($g_WarningPHP[1])) > 0) {
     
$l_ShowOffer true;

     
$l_Result .= "<div class="warn"><b>" AI_STR_035 "</b>";

     for (
$i 0$i count($g_WarningPHP); $i++) {
         if (
count($g_WarningPHP[$i]) > 0
            
$l_Result .= printList($g_WarningPHP[$i], $g_WarningPHPFragment[$i], true$g_WarningPHPSig'table_warn');
     }                                                                                                                    
     
$l_Result .= "</div>";

   } 
}

stdOut("Building list of skipped dirs " count($g_SkippedFolders));
if (
count($g_SkippedFolders) > 0) {
     
$l_Result .= "<div class="warn2"><b>" AI_STR_036 "</b><br/>";
     
$l_Result .= implode("<br>"$g_SkippedFolders);
     
$l_Result .= "</div>";
 }

 
stdOut("Building list of writeable dirs " count($g_WritableDirectories));

if (
count($g_CMS) > 0) {
     
$l_Result .= "<div class="warn2"><b>" AI_STR_037 "</b><br/>";
     
$l_Result .= implode("<br>"$g_CMS);
     
$l_Result .= "</div>";
}

if (!
isCli()) {
   
$l_Result .= QCR_ExtractInfo($l_PhpInfoBody[1]);
}

$max_size_to_scan getBytes(MAX_SIZE_TO_SCAN);
$max_size_to_scan $max_size_to_scan $max_size_to_scan getBytes('1m');

stdOut("Building list of bigfiles " count($g_BigFiles));

if (
count($g_BigFiles) > 0) {

  
$l_Result .= "<div class="warn2"><b>" sprintf(AI_STR_038bytes2Human($max_size_to_scan)) . "</b>";
  
$l_Result .= printList($g_BigFiles);
  
$l_Result .= "</div>";

} else {
  if (
SCAN_ALL_FILES) {
    
$l_Result .= '<div class="ok"><b>' sprintf(AI_STR_039bytes2Human($max_size_to_scan)) . '</b></div>';
  }
}

stdOut("Building list of sensitive files " count($g_UnsafeFilesFound) . "n");

if ((
count($g_UnsafeFilesFound) > 0) && (($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI)) {
  
$l_Result .= "<div class="warn2"><b>" AI_STR_040 "</b>";
  
$l_Result .= printList($g_UnsafeFilesFound);
  
$l_Result .= "</div>";
}

if (!
$defaults['no_rw_dir']) {
   if (((
$defaults['report_mask'] & REPORT_MASK_WRIT) == REPORT_MASK_WRIT)) {
      if ((
count($g_WritableDirectories) > 0)) {

        
$l_Result .= "<div class="warn2"><b>" AI_STR_041 "</b>";
        
$l_Result .= printList($g_WritableDirectories);
        
$l_Result .= "</div>";

      } else {

        
$l_Result .= '<div class="ok"><b>' AI_STR_042 '</b></div>';

      }
   }
}

if (
function_exists('memory_get_peak_usage')) {
  
$l_Result .= AI_STR_043 bytes2Human(memory_get_peak_usage()) . '<p>';
}

$l_Result .= AI_STR_044;

if (!
SCAN_ALL_FILES) {
  
$l_Result .= AI_STR_045;
}

$l_Result .= sprintf(AI_STR_012count($g_DBShe) + count($gX_DBShe) + count($g_FlexDBShe), (count($g_SusDB) + count($g_AdwareSig ) + count($g_JSVirSig)), $time_tackeddate('d-m-Y в H:i:s'floor(START_TIME)) , date('d-m-Y в H:i:s'));

$l_Result .= '<div class="footer"><div class="disclaimer"><span class="vir">[!]</span> ' AI_STR_049 '</div>';
$l_Result .= '<div class="thanx">' AI_STR_050 '</div>';
$l_Result .= '</div>';

$l_OfferVK AI_STR_048;
              
if (
$l_ShowOffer) {
  
$l_Result .= AI_STR_047 .
        
'<p><a href="#" onclick="document.getElementById('ofr').style.display='none'" style="color: #303030">' AI_STR_046 '</a></p>' .
        
'</div>';
} else {
  
$l_Result .= '<div class="offer2" id="ofr2">' $l_OfferVK .
        
'<p><a href="#" onclick="document.getElementById('ofr2').style.display='none'" style="color: #303030">' AI_STR_046 .'</a></p>' .
        
'</div>';
}

$l_Result .=<<<ENDING
</body> 
<script language="javascript">

$(document).ready(function(){
    $('#table_crit').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }

     } );

});

$(document).ready(function(){
    $('#table_vir').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        },

     } );

});


    $('#table_warn').dataTable({
       "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
       "aoColumns": [
                                     {"iDataSort": 7},
                                     {"iDataSort": 5},
                                     {"iDataSort": 6},
                                     {"bSortable": true},
                                     {"bSortable": true},
                                     {"bVisible": false},
                                     {"bVisible": false},
                                     {"bVisible": false}
                     ],
       "iDisplayLength": 500,
        "oLanguage": {
            "sLengthMenu": "Отображать по _MENU_ записей",
            "sZeroRecords": "Ничего не найдено",
            "sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
            "sInfoEmpty": "Нет файлов",
            "sInfoFiltered": "(всего записей _MAX_)",
            "sSearch":       "Поиск:",
            "sUrl":          "",
            "oPaginate": {
                "sFirst": "Первая",
                "sPrevious": "Предыдущая",
                "sNext": "Следующая",
                "sLast": "Последняя"
            },
            "oAria": {
                "sSortAscending":  ": активировать для сортировки столбца по возрастанию",
                "sSortDescending": ": активировать для сортировки столбцов по убыванию"            
            }
        }

     } );

</script>

</html>
ENDING;

////////////////////////////////////////////////////////////////////////////
if (!isCli())
{
    echo 
$l_Result;
    exit;
}

if (!
defined('REPORT') OR REPORT === '')
{
    die(
'Report not written.');
}
 
// write plain text result
if (PLAIN_FILE != '') {
   if (
$l_FH fopen(PLAIN_FILE"w")) {
      
fputs($l_FH$l_PlainResult);
      
fclose($l_FH);
   }
}

$emails getEmails(REPORT);

if (!
$emails) {
    if (
$l_FH fopen($file"w")) {
       
fputs($l_FH$l_Result);
       
fclose($l_FH);
       
stdOut("nReport written to '$file'.");
    } else {
        
stdOut("nCannot create '$file'.");
    }
}    else    {
        
$headers = array(
            
'MIME-Version: 1.0',
            
'Content-type: text/html; charset=UTF-8',
            
'From: ' . ($defaults['email_from'] ? $defaults['email_from'] : 'AI-Bolit@myhost')
        );

        for (
$i 0$size sizeof($emails); $i $size$i++)
        {
            
mail($emails[$i], 'AI-Bolit Report ' date("d/m/Y H:i"time()), $l_Resultimplode("rn"$headers));
        }

        
stdOut("nReport sended to " implode(', '$emails));
}


$time_taken microtime(true) - START_TIME;
$time_taken number_format($time_taken5);

stdOut("Scanning complete! Time taken: " seconds2Human($time_taken));

stdOut("nn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
stdOut("Attention! DO NOT LEAVE either ai-bolit.php or AI-BOLIT-REPORT-<xxxx>-<yy>.html nfile on server. COPY it locally then REMOVE from server. ");
stdOut("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

QCR_Debug();

?>
Онлайн: 2
Реклама