Thinkphp ~runtime.php

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 5                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available through the world-wide-web at the following url:           |
// | http://www.php.net/license/3_0.txt.                                  |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | [email protected] so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Original Author <[email protected]>                        |
// |          Your Name <[email protected]>                                 |
// +----------------------------------------------------------------------+
//
// $Id:$

$GLOBALS['_beginTime'] = microtime(TRUE);
defined('APP_NAME') or define('APP_NAME', 'App');
defined('APP_PATH') or define('APP_PATH', './App/');
defined('MEMORY_LIMIT_ON') or define('MEMORY_LIMIT_ON', true);
defined('THINK_PATH') or define('THINK_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/');
defined('APP_DEBUG') or define('APP_DEBUG', false);
defined('RUNTIME_PATH') or define('RUNTIME_PATH', './App/Runtime/');
defined('RUNTIME_FILE') or define('RUNTIME_FILE', './App/Runtime/~runtime.php');
defined('THINK_VERSION') or define('THINK_VERSION', '3.1.3');
defined('MAGIC_QUOTES_GPC') or define('MAGIC_QUOTES_GPC', false);
defined('IS_CGI') or define('IS_CGI', 0);
defined('IS_WIN') or define('IS_WIN', 1);
defined('IS_CLI') or define('IS_CLI', 0);
defined('_PHP_FILE_') or define('_PHP_FILE_', '/index.php');
defined('__ROOT__') or define('__ROOT__', '');
defined('URL_COMMON') or define('URL_COMMON', 0);
defined('URL_PATHINFO') or define('URL_PATHINFO', 1);
defined('URL_REWRITE') or define('URL_REWRITE', 2);
defined('URL_COMPAT') or define('URL_COMPAT', 3);
defined('CORE_PATH') or define('CORE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/');
defined('EXTEND_PATH') or define('EXTEND_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/');
defined('MODE_PATH') or define('MODE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Mode/');
defined('ENGINE_PATH') or define('ENGINE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Engine/');
defined('VENDOR_PATH') or define('VENDOR_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Vendor/');
defined('LIBRARY_PATH') or define('LIBRARY_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Library/');
defined('COMMON_PATH') or define('COMMON_PATH', './App/Common/');
defined('LIB_PATH') or define('LIB_PATH', './App/Lib/');
defined('CONF_PATH') or define('CONF_PATH', './App/Conf/');
defined('LANG_PATH') or define('LANG_PATH', './App/Lang/');
defined('TMPL_PATH') or define('TMPL_PATH', './App/Tpl/');
defined('HTML_PATH') or define('HTML_PATH', './App/Html/');
defined('LOG_PATH') or define('LOG_PATH', './App/Runtime/Logs/');
defined('TEMP_PATH') or define('TEMP_PATH', './App/Runtime/Temp/');
defined('DATA_PATH') or define('DATA_PATH', './App/Runtime/Data/');
defined('CACHE_PATH') or define('CACHE_PATH', './App/Runtime/Cache/');
set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH);
function T($template = '', $layer = '') {
    if (is_file($template)) {
        return $template;
    }
    if (false === strpos($template, '://')) {
        $template = APP_NAME . '://' . str_replace(':', '/', $template);
    }
    $info = parse_url($template);
    $file = $info['host'] . (isset($info['path']) ? $info['path'] : '');
    $group = isset($info['user']) ? $info['user'] . '/' : (defined('GROUP_NAME') ? GROUP_NAME . '/' : '');
    $app = $info['scheme'];
    $layer = $layer ? $layer : C('DEFAULT_V_LAYER');
    if (($list = C('EXTEND_GROUP_LIST')) && isset($list[$app])) {
        $baseUrl = $list[$app] . '/' . $group . $layer . '/';
    } elseif (1 == C('APP_GROUP_MODE')) {
        $baseUrl = dirname(BASE_LIB_PATH) . '/' . $group . $layer . '/';
    } else {
        $baseUrl = TMPL_PATH . $group;
    }
    if ('' == $file) {
        $file = MODULE_NAME . C('TMPL_FILE_DEPR') . ACTION_NAME;
    } elseif (false === strpos($file, '/')) {
        $file = MODULE_NAME . C('TMPL_FILE_DEPR') . $file;
    }
    return $baseUrl . $file . C('TMPL_TEMPLATE_SUFFIX');
}
function I($name, $default = '', $filter = null) {
    if (strpos($name, '.')) {
        list($method, $name) = explode('.', $name, 2);
    } else {
        $method = 'param';
    }
    switch (strtolower($method)) {
        case 'get':
            $input = & $_GET;
            break;

        case 'post':
            $input = & $_POST;
            break;

        case 'put':
            parse_str(file_get_contents('php://input') , $input);
            break;

        case 'param':
            switch ($_SERVER['REQUEST_METHOD']) {
                case 'POST':
                    $input = $_POST;
                    break;

                case 'PUT':
                    parse_str(file_get_contents('php://input') , $input);
                    break;

                default:
                    $input = $_GET;
            }
            if (C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS') ])) {
                $input = array_merge($input, $_GET[C('VAR_URL_PARAMS') ]);
            }
            break;

        case 'request':
            $input = & $_REQUEST;
            break;

        case 'session':
            $input = & $_SESSION;
            break;

        case 'cookie':
            $input = & $_COOKIE;
            break;

        case 'server':
            $input = & $_SERVER;
            break;

        case 'globals':
            $input = & $GLOBALS;
            break;

        default:
            return NULL;
    }
    if (C('VAR_FILTERS')) {
        $_filters = explode(',', C('VAR_FILTERS'));
        foreach ($_filters as $_filter) {
            array_walk_recursive($input, $_filter);
        }
    }
    if (empty($name)) {
        $data = $input;
        $filters = isset($filter) ? $filter : C('DEFAULT_FILTER');
        if ($filters) {
            $filters = explode(',', $filters);
            foreach ($filters as $filter) {
                $data = array_map($filter, $data);
            }
        }
    } elseif (isset($input[$name])) {
        $data = $input[$name];
        $filters = isset($filter) ? $filter : C('DEFAULT_FILTER');
        if ($filters) {
            $filters = explode(',', $filters);
            foreach ($filters as $filter) {
                if (function_exists($filter)) {
                    $data = is_array($data) ? array_map($filter, $data) : $filter($data);
                } else {
                    $data = filter_var($data, is_int($filter) ? $filter : filter_id($filter));
                    if (false === $data) {
                        return isset($default) ? $default : NULL;
                    }
                }
            }
        }
    } else {
        $data = isset($default) ? $default : NULL;
    }
    return $data;
}
function G($start, $end = '', $dec = 4) {
    static $_info = array();
    static $_mem = array();
    if (is_float($end)) {
        $_info[$start] = $end;
    } elseif (!empty($end)) {
        if (!isset($_info[$end])) $_info[$end] = microtime(TRUE);
        if (MEMORY_LIMIT_ON && $dec == 'm') {
            if (!isset($_mem[$end])) $_mem[$end] = memory_get_usage();
            return number_format(($_mem[$end] - $_mem[$start]) / 1024);
        } else {
            return number_format(($_info[$end] - $_info[$start]) , $dec);
        }
    } else {
        $_info[$start] = microtime(TRUE);
        if (MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage();
    }
}
function N($key, $step = 0, $save = false) {
    static $_num = array();
    if (!isset($_num[$key])) {
        $_num[$key] = (false !== $save) ? S('N_' . $key) : 0;
    }
    if (empty($step)) return $_num[$key];
    else $_num[$key] = $_num[$key] + (int)$step;
    if (false !== $save) {
        S('N_' . $key, $_num[$key], $save);
    }
}
function parse_name($name, $type = 0) {
    if ($type) {
        return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
    } else {
        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name) , "_"));
    }
}
function require_cache($filename) {
    static $_importFiles = array();
    if (!isset($_importFiles[$filename])) {
        if (file_exists_case($filename)) {
            require $filename;
            $_importFiles[$filename] = true;
        } else {
            $_importFiles[$filename] = false;
        }
    }
    return $_importFiles[$filename];
}
function require_array($array, $return = false) {
    foreach ($array as $file) {
        if (require_cache($file) && $return) return true;
    }
    if ($return) return false;
}
function file_exists_case($filename) {
    if (is_file($filename)) {
        if (IS_WIN && C('APP_FILE_CASE')) {
            if (basename(realpath($filename)) != basename($filename)) return false;
        }
        return true;
    }
    return false;
}
function import($class, $baseUrl = '', $ext = '.class.php') {
    static $_file = array();
    $class = str_replace(array(
        '.',
        '#'
    ) , array(
        '/',
        '.'
    ) , $class);
    if ('' === $baseUrl && false === strpos($class, '/')) {
        return alias_import($class);
    }
    if (isset($_file[$class . $baseUrl])) return true;
    else $_file[$class . $baseUrl] = true;
    $class_strut = explode('/', $class);
    if (empty($baseUrl)) {
        $libPath = defined('BASE_LIB_PATH') ? BASE_LIB_PATH : LIB_PATH;
        if ('@' == $class_strut[0] || APP_NAME == $class_strut[0]) {
            $baseUrl = dirname($libPath);
            $class = substr_replace($class, basename($libPath) . '/', 0, strlen($class_strut[0]) + 1);
        } elseif ('think' == strtolower($class_strut[0])) {
            $baseUrl = CORE_PATH;
            $class = substr($class, 6);
        } elseif (in_array(strtolower($class_strut[0]) , array(
            'org',
            'com'
        ))) {
            $baseUrl = LIBRARY_PATH;
        } else {
            $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1);
            $baseUrl = APP_PATH . '../' . $class_strut[0] . '/' . basename($libPath) . '/';
        }
    }
    if (substr($baseUrl, -1) != '/') $baseUrl.= '/';
    $classfile = $baseUrl . $class . $ext;
    if (!class_exists(basename($class) , false)) {
        return require_cache($classfile);
    }
}
function load($name, $baseUrl = '', $ext = '.php') {
    $name = str_replace(array(
        '.',
        '#'
    ) , array(
        '/',
        '.'
    ) , $name);
    if (empty($baseUrl)) {
        if (0 === strpos($name, '@/')) {
            $baseUrl = COMMON_PATH;
            $name = substr($name, 2);
        } else {
            $baseUrl = EXTEND_PATH . 'Function/';
        }
    }
    if (substr($baseUrl, -1) != '/') $baseUrl.= '/';
    require_cache($baseUrl . $name . $ext);
}
function vendor($class, $baseUrl = '', $ext = '.php') {
    if (empty($baseUrl)) $baseUrl = VENDOR_PATH;
    return import($class, $baseUrl, $ext);
}
function alias_import($alias, $classfile = '') {
    static $_alias = array();
    if (is_string($alias)) {
        if (isset($_alias[$alias])) {
            return require_cache($_alias[$alias]);
        } elseif ('' !== $classfile) {
            $_alias[$alias] = $classfile;
            return;
        }
    } elseif (is_array($alias)) {
        $_alias = array_merge($_alias, $alias);
        return;
    }
    return false;
}
function D($name = '', $layer = '') {
    if (empty($name)) return new Model;
    static $_model = array();
    $layer = $layer ? $layer : C('DEFAULT_M_LAYER');
    if (strpos($name, '://')) {
        list($app) = explode('://', $name);
        $name = str_replace('://', '/' . $layer . '/', $name);
    } else {
        $app = C('DEFAULT_APP');
        $name = $app . '/' . $layer . '/' . $name;
    }
    if (isset($_model[$name])) return $_model[$name];
    $path = explode('/', $name);
    if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) {
        $baseUrl = $list[$app];
        import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
    } elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) {
        $baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/';
        import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
    } else {
        import($name . $layer);
    }
    $class = basename($name . $layer);
    if (class_exists($class)) {
        $model = new $class(basename($name));
    } else {
        $model = new Model(basename($name));
    }
    $_model[$name] = $model;
    return $model;
}
function M($name = '', $tablePrefix = '', $connection = '') {
    static $_model = array();
    if (strpos($name, ':')) {
        list($class, $name) = explode(':', $name);
    } else {
        $class = 'Model';
    }
    $guid = $tablePrefix . $name . '_' . $class;
    if (!isset($_model[$guid])) $_model[$guid] = new $class($name, $tablePrefix, $connection);
    return $_model[$guid];
}
function A($name, $layer = '', $common = false) {
    static $_action = array();
    $layer = $layer ? $layer : C('DEFAULT_C_LAYER');
    if (strpos($name, '://')) {
        list($app) = explode('://', $name);
        $name = str_replace('://', '/' . $layer . '/', $name);
    } else {
        $app = '@';
        $name = '@/' . $layer . '/' . $name;
    }
    if (isset($_action[$name])) return $_action[$name];
    $path = explode('/', $name);
    if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) {
        $baseUrl = $list[$app];
        import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
    } elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) {
        $baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/';
        import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
    } elseif ($common) {
        import(str_replace('@/', '', $name) . $layer, LIB_PATH);
    } else {
        import($name . $layer);
    }
    $class = basename($name . $layer);
    if (class_exists($class, false)) {
        $action = new $class();
        $_action[$name] = $action;
        return $action;
    } else {
        return false;
    }
}
function R($url, $vars = array() , $layer = '') {
    $info = pathinfo($url);
    $action = $info['basename'];
    $module = $info['dirname'];
    $class = A($module, $layer);
    if ($class) {
        if (is_string($vars)) {
            parse_str($vars, $vars);
        }
        return call_user_func_array(array(&$class,
            $action . C('ACTION_SUFFIX')
        ) , $vars);
    } else {
        return false;
    }
}
function L($name = null, $value = null) {
    static $_lang = array();
    if (empty($name)) return $_lang;
    if (is_string($name)) {
        $name = strtoupper($name);
        if (is_null($value)) return isset($_lang[$name]) ? $_lang[$name] : $name;
        $_lang[$name] = $value;
        return;
    }
    if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));
    return;
}
function C($name = null, $value = null) {
    static $_config = array();
    if (empty($name)) {
        if (!empty($value) && $array = S('c_' . $value)) {
            $_config = array_merge($_config, array_change_key_case($array));
        }
        return $_config;
    }
    if (is_string($name)) {
        if (!strpos($name, '.')) {
            $name = strtolower($name);
            if (is_null($value)) return isset($_config[$name]) ? $_config[$name] : null;
            $_config[$name] = $value;
            return;
        }
        $name = explode('.', $name);
        $name[0] = strtolower($name[0]);
        if (is_null($value)) return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
        $_config[$name[0]][$name[1]] = $value;
        return;
    }
    if (is_array($name)) {
        $_config = array_merge($_config, array_change_key_case($name));
        if (!empty($value)) {
            S('c_' . $value, $_config);
        }
        return;
    }
    return null;
}
function tag($tag, &$params = NULL) {
    $extends = C('extends.' . $tag);
    $tags = C('tags.' . $tag);
    if (!empty($tags)) {
        if (empty($tags['_overlay']) && !empty($extends)) {
            $tags = array_unique(array_merge($extends, $tags));
        } elseif (isset($tags['_overlay'])) {
            unset($tags['_overlay']);
        }
    } elseif (!empty($extends)) {
        $tags = $extends;
    }
    if ($tags) {
        if (APP_DEBUG) {
            G($tag . 'Start');
            trace('[ ' . $tag . ' ] --START--', '', 'INFO');
        }
        foreach ($tags as $key => $name) {
            if (!is_int($key)) {
                $name = $key;
            }
            B($name, $params);
        }
        if (APP_DEBUG) {
            trace('[ ' . $tag . ' ] --END-- [ RunTime:' . G($tag . 'Start', $tag . 'End', 6) . 's ]', '', 'INFO');
        }
    } else {
        return false;
    }
}
function add_tag_behavior($tag, $behavior, $path = '') {
    $array = C('tags.' . $tag);
    if (!$array) {
        $array = array();
    }
    if ($path) {
        $array[$behavior] = $path;
    } else {
        $array[] = $behavior;
    }
    C('tags.' . $tag, $array);
}
function B($name, &$params = NULL) {
    if (strpos($name, '/')) {
        list($name, $method) = explode('/', $name);
    } else {
        $method = 'run';
    }
    $class = $name . 'Behavior';
    if (APP_DEBUG) {
        G('behaviorStart');
    }
    $behavior = new $class();
    $behavior->$method($params);
    if (APP_DEBUG) {
        G('behaviorEnd');
        trace($name . ' Behavior ::' . $method . ' [ RunTime:' . G('behaviorStart', 'behaviorEnd', 6) . 's ]', '', 'INFO');
    }
}
function strip_whitespace($content) {
    $stripStr = '';
    $tokens = token_get_all($content);
    $last_space = false;
    for ($i = 0, $j = count($tokens); $i < $j; $i++) {
        if (is_string($tokens[$i])) {
            $last_space = false;
            $stripStr.= $tokens[$i];
        } else {
            switch ($tokens[$i][0]) {
                case T_COMMENT:
                case T_DOC_COMMENT:
                    break;

                case T_WHITESPACE:
                    if (!$last_space) {
                        $stripStr.= ' ';
                        $last_space = true;
                    }
                    break;

                case T_START_HEREDOC:
                    $stripStr.= "<<<THINK\n";
                    break;

                case T_END_HEREDOC:
                    $stripStr.= "THINK;\n";
                    for ($k = $i + 1; $k < $j; $k++) {
                        if (is_string($tokens[$k]) && $tokens[$k] == ';') {
                            $i = $k;
                            break;
                        } else if ($tokens[$k][0] == T_CLOSE_TAG) {
                            break;
                        }
                    }
                    break;

                default:
                    $last_space = false;
                    $stripStr.= $tokens[$i][1];
                }
        }
    }
    return $stripStr;
}
function trace($value = '[think]', $label = '', $level = 'DEBUG', $record = false) {
    static $_trace = array();
    if ('[think]' === $value) {
        return $_trace;
    } else {
        $info = ($label ? $label . ':' : '') . print_r($value, true);
        if ('ERR' == $level && C('TRACE_EXCEPTION')) {
            throw_exception($info);
        }
        $level = strtoupper($level);
        if (!isset($_trace[$level])) {
            $_trace[$level] = array();
        }
        $_trace[$level][] = $info;
        if ((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE') || $record) {
            Log::record($info, $level, $record);
        }
    }
}
class Think {
    private static $_instance = array();
    static public function start() {
        register_shutdown_function(array(
            'Think',
            'fatalError'
        ));
        set_error_handler(array(
            'Think',
            'appError'
        ));
        set_exception_handler(array(
            'Think',
            'appException'
        ));
        spl_autoload_register(array(
            'Think',
            'autoload'
        ));
        App::run();
        return;
    }
    public static function autoload($class) {
        if (alias_import($class)) return;
        $libPath = defined('BASE_LIB_PATH') ? BASE_LIB_PATH : LIB_PATH;
        $group = defined('GROUP_NAME') && C('APP_GROUP_MODE') == 0 ? GROUP_NAME . '/' : '';
        $file = $class . '.class.php';
        if (substr($class, -8) == 'Behavior') {
            if (require_array(array(
                CORE_PATH . 'Behavior/' . $file,
                EXTEND_PATH . 'Behavior/' . $file,
                LIB_PATH . 'Behavior/' . $file,
                $libPath . 'Behavior/' . $file
            ) , true) || (defined('MODE_NAME') && require_cache(MODE_PATH . ucwords(MODE_NAME) . '/Behavior/' . $file))) {
                return;
            }
        } elseif (substr($class, -5) == 'Model') {
            if (require_array(array(
                LIB_PATH . 'Model/' . $group . $file,
                $libPath . 'Model/' . $file,
                EXTEND_PATH . 'Model/' . $file
            ) , true)) {
                return;
            }
        } elseif (substr($class, -6) == 'Action') {
            if (require_array(array(
                LIB_PATH . 'Action/' . $group . $file,
                $libPath . 'Action/' . $file,
                EXTEND_PATH . 'Action/' . $file
            ) , true)) {
                return;
            }
        } elseif (substr($class, 0, 5) == 'Cache') {
            if (require_array(array(
                EXTEND_PATH . 'Driver/Cache/' . $file,
                CORE_PATH . 'Driver/Cache/' . $file
            ) , true)) {
                return;
            }
        } elseif (substr($class, 0, 2) == 'Db') {
            if (require_array(array(
                EXTEND_PATH . 'Driver/Db/' . $file,
                CORE_PATH . 'Driver/Db/' . $file
            ) , true)) {
                return;
            }
        } elseif (substr($class, 0, 8) == 'Template') {
            if (require_array(array(
                EXTEND_PATH . 'Driver/Template/' . $file,
                CORE_PATH . 'Driver/Template/' . $file
            ) , true)) {
                return;
            }
        } elseif (substr($class, 0, 6) == 'TagLib') {
            if (require_array(array(
                EXTEND_PATH . 'Driver/TagLib/' . $file,
                CORE_PATH . 'Driver/TagLib/' . $file
            ) , true)) {
                return;
            }
        }
        $paths = explode(',', C('APP_AUTOLOAD_PATH'));
        foreach ($paths as $path) {
            if (import($path . '.' . $class)) return;
        }
    }
    static public function instance($class, $method = '') {
        $identify = $class . $method;
        if (!isset(self::$_instance[$identify])) {
            if (class_exists($class)) {
                $o = new $class();
                if (!empty($method) && method_exists($o, $method)) self::$_instance[$identify] = call_user_func_array(array(&$o,
                    $method
                ));
                else self::$_instance[$identify] = $o;
            } else halt(L('_CLASS_NOT_EXIST_') . ':' . $class);
        }
        return self::$_instance[$identify];
    }
    static public function appException($e) {
        $error = array();
        $error['message'] = $e->getMessage();
        $trace = $e->getTrace();
        if ('throw_exception' == $trace[0]['function']) {
            $error['file'] = $trace[0]['file'];
            $error['line'] = $trace[0]['line'];
        } else {
            $error['file'] = $e->getFile();
            $error['line'] = $e->getLine();
        }
        Log::record($error['message'], Log::ERR);
        halt($error);
    }
    static public function appError($errno, $errstr, $errfile, $errline) {
        switch ($errno) {
            case E_ERROR:
            case E_PARSE:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_USER_ERROR:
                ob_end_clean();
                if (C('OUTPUT_ENCODE')) {
                    $zlib = ini_get('zlib.output_compression');
                    if (empty($zlib)) ob_start('ob_gzhandler');
                }
                $errorStr = "$errstr " . $errfile . " 第 $errline 行.";
                if (C('LOG_RECORD')) Log::write("[$errno] " . $errorStr, Log::ERR);
                function_exists('halt') ? halt($errorStr) : exit('ERROR:' . $errorStr);
                break;

            case E_STRICT:
            case E_USER_WARNING:
            case E_USER_NOTICE:
            default:
                $errorStr = "[$errno] $errstr " . $errfile . " 第 $errline 行.";
                trace($errorStr, '', 'NOTIC');
                break;
            }
        }
        static public function fatalError() {
            if (C('LOG_RECORD')) Log::save();
            if ($e = error_get_last()) {
                switch ($e['type']) {
                    case E_ERROR:
                    case E_PARSE:
                    case E_CORE_ERROR:
                    case E_COMPILE_ERROR:
                    case E_USER_ERROR:
                        ob_end_clean();
                        function_exists('halt') ? halt($e) : exit('ERROR:' . $e['message'] . ' in <b>' . $e['file'] . '</b> on line <b>' . $e['line'] . '</b>');
                        break;
                }
            }
        }
    }
    class ThinkException extends Exception {
    }
    abstract class Behavior {
        protected $options = array();
        public function __construct() {
            if (!empty($this->options)) {
                foreach ($this->options as $name => $val) {
                    if (NULL !== C($name)) {
                        $this->options[$name] = C($name);
                    } else {
                        C($name, $val);
                    }
                }
                array_change_key_case($this->options);
            }
        }
        public function __get($name) {
            return $this->options[strtolower($name) ];
        }
        abstract public function run(&$params);
    }
    class ReadHtmlCacheBehavior extends Behavior {
        protected $options = array(
            'HTML_CACHE_ON' => false,
            'HTML_CACHE_TIME' => 60,
            'HTML_CACHE_RULES' => array() ,
            'HTML_FILE_SUFFIX' => '.html',
        );
        public function run(&$params) {
            if (C('HTML_CACHE_ON')) {
                $cacheTime = $this->requireHtmlCache();
                if (false !== $cacheTime && $this->checkHTMLCache(HTML_FILE_NAME, $cacheTime)) {
                    readfile(HTML_FILE_NAME);
                    exit();
                }
            }
        }
        static private function requireHtmlCache() {
            $htmls = C('HTML_CACHE_RULES');
            if (!empty($htmls)) {
                $htmls = array_change_key_case($htmls);
                $moduleName = strtolower(MODULE_NAME);
                $actionName = strtolower(ACTION_NAME);
                if (isset($htmls[$moduleName . ':' . $actionName])) {
                    $html = $htmls[$moduleName . ':' . $actionName];
                } elseif (isset($htmls[$moduleName . ':'])) {
                    $html = $htmls[$moduleName . ':'];
                } elseif (isset($htmls[$actionName])) {
                    $html = $htmls[$actionName];
                } elseif (isset($htmls['*'])) {
                    $html = $htmls['*'];
                } elseif (isset($htmls['empty:index']) && !class_exists(MODULE_NAME . 'Action')) {
                    $html = $htmls['empty:index'];
                } elseif (isset($htmls[$moduleName . ':_empty']) && self::isEmptyAction(MODULE_NAME, ACTION_NAME)) {
                    $html = $htmls[$moduleName . ':_empty'];
                }
                if (!empty($html)) {
                    $rule = $html[0];
                    $rule = preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e', "\\3(\$\\1['\\2'])", $rule);
                    $rule = preg_replace('/{\$(_\w+)\.(\w+)}/e', "\$\\1['\\2']", $rule);
                    $rule = preg_replace('/{(\w+)\|(\w+)}/e', "\\2(\$_GET['\\1'])", $rule);
                    $rule = preg_replace('/{(\w+)}/e', "\$_GET['\\1']", $rule);
                    $rule = str_ireplace(array(
                        '{:app}',
                        '{:module}',
                        '{:action}',
                        '{:group}'
                    ) , array(
                        APP_NAME,
                        MODULE_NAME,
                        ACTION_NAME,
                        defined('GROUP_NAME') ? GROUP_NAME : ''
                    ) , $rule);
                    $rule = preg_replace('/{|(\w+)}/e', "\\1()", $rule);
                    if (!empty($html[2])) $rule = $html[2]($rule);
                    $cacheTime = isset($html[1]) ? $html[1] : C('HTML_CACHE_TIME');
                    define('HTML_FILE_NAME', HTML_PATH . $rule . C('HTML_FILE_SUFFIX'));
                    return $cacheTime;
                }
            }
            return false;
        }
        static public function checkHTMLCache($cacheFile = '', $cacheTime = '') {
            if (!is_file($cacheFile)) {
                return false;
            } elseif (filemtime(C('TEMPLATE_NAME')) > filemtime($cacheFile)) {
                return false;
            } elseif (!is_numeric($cacheTime) && function_exists($cacheTime)) {
                return $cacheTime($cacheFile);
            } elseif ($cacheTime != 0 && NOW_TIME > filemtime($cacheFile) + $cacheTime) {
                return false;
            }
            return true;
        }
        static private function isEmptyAction($module, $action) {
            $className = $module . 'Action';
            $class = new $className;
            return !method_exists($class, $action);
        }
    }
    class CheckRouteBehavior extends Behavior {
        protected $options = array(
            'URL_ROUTER_ON' => false,
            'URL_ROUTE_RULES' => array() ,
        );
        public function run(&$return) {
            $regx = trim($_SERVER['PATH_INFO'], '/');
            if (empty($regx)) return $return = true;
            if (!C('URL_ROUTER_ON')) return $return = false;
            $routes = C('URL_ROUTE_RULES');
            if (!empty($routes)) {
                $depr = C('URL_PATHINFO_DEPR');
                $regx = str_replace($depr, '/', $regx);
                foreach ($routes as $rule => $route) {
                    if (0 === strpos($rule, '/') && preg_match($rule, $regx, $matches)) {
                        return $return = $this->parseRegex($matches, $route, $regx);
                    } else {
                        $len1 = substr_count($regx, '/');
                        $len2 = substr_count($rule, '/');
                        if ($len1 >= $len2) {
                            if ('$' == substr($rule, -1, 1)) {
                                if ($len1 != $len2) {
                                    continue;
                                } else {
                                    $rule = substr($rule, 0, -1);
                                }
                            }
                            $match = $this->checkUrlMatch($regx, $rule);
                            if ($match) return $return = $this->parseRule($rule, $route, $regx);
                        }
                    }
                }
            }
            $return = false;
        }
        private function checkUrlMatch($regx, $rule) {
            $m1 = explode('/', $regx);
            $m2 = explode('/', $rule);
            $match = true;
            foreach ($m2 as $key => $val) {
                if (':' == substr($val, 0, 1)) {
                    if (strpos($val, '\\')) {
                        $type = substr($val, -1);
                        if ('d' == $type && !is_numeric($m1[$key])) {
                            $match = false;
                            break;
                        }
                    } elseif (strpos($val, '^')) {
                        $array = explode('|', substr(strstr($val, '^') , 1));
                        if (in_array($m1[$key], $array)) {
                            $match = false;
                            break;
                        }
                    }
                } elseif (0 !== strcasecmp($val, $m1[$key])) {
                    $match = false;
                    break;
                }
            }
            return $match;
        }
        private function parseUrl($url) {
            $var = array();
            if (false !== strpos($url, '?')) {
                $info = parse_url($url);
                $path = explode('/', $info['path']);
                parse_str($info['query'], $var);
            } elseif (strpos($url, '/')) {
                $path = explode('/', $url);
            } else {
                parse_str($url, $var);
            }
            if (isset($path)) {
                $var[C('VAR_ACTION') ] = array_pop($path);
                if (!empty($path)) {
                    $var[C('VAR_MODULE') ] = array_pop($path);
                }
                if (!empty($path)) {
                    $var[C('VAR_GROUP') ] = array_pop($path);
                }
            }
            return $var;
        }
        private function parseRule($rule, $route, $regx) {
            $url = is_array($route) ? $route[0] : $route;
            $paths = explode('/', $regx);
            $matches = array();
            $rule = explode('/', $rule);
            foreach ($rule as $item) {
                if (0 === strpos($item, ':')) {
                    if ($pos = strpos($item, '^')) {
                        $var = substr($item, 1, $pos - 1);
                    } elseif (strpos($item, '\\')) {
                        $var = substr($item, 1, -2);
                    } else {
                        $var = substr($item, 1);
                    }
                    $matches[$var] = array_shift($paths);
                } else {
                    array_shift($paths);
                }
            }
            if (0 === strpos($url, '/') || 0 === strpos($url, 'http')) {
                if (strpos($url, ':')) {
                    $values = array_values($matches);
                    $url = preg_replace('/:(\d+)/e', '$values[\\1-1]', $url);
                }
                header("Location: $url", true, (is_array($route) && isset($route[1])) ? $route[1] : 301);
                exit;
            } else {
                $var = $this->parseUrl($url);
                $values = array_values($matches);
                foreach ($var as $key => $val) {
                    if (0 === strpos($val, ':')) {
                        $var[$key] = $values[substr($val, 1) - 1];
                    }
                }
                $var = array_merge($matches, $var);
                if ($paths) {
                    preg_replace('@(\w+)\/([^\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/', $paths));
                }
                if (is_array($route) && isset($route[1])) {
                    parse_str($route[1], $params);
                    $var = array_merge($var, $params);
                }
                $_GET = array_merge($var, $_GET);
            }
            return true;
        }
        private function parseRegex($matches, $route, $regx) {
            $url = is_array($route) ? $route[0] : $route;
            $url = preg_replace('/:(\d+)/e', '$matches[\\1]', $url);
            if (0 === strpos($url, '/') || 0 === strpos($url, 'http')) {
                header("Location: $url", true, (is_array($route) && isset($route[1])) ? $route[1] : 301);
                exit;
            } else {
                $var = $this->parseUrl($url);
                $regx = substr_replace($regx, '', 0, strlen($matches[0]));
                if ($regx) {
                    preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx);
                }
                if (is_array($route) && isset($route[1])) {
                    parse_str($route[1], $params);
                    $var = array_merge($var, $params);
                }
                $_GET = array_merge($var, $_GET);
            }
            return true;
        }
    }
    class ParseTemplateBehavior extends Behavior {
        protected $options = array(
            'TMPL_ENGINE_TYPE' => 'Think',
            'TMPL_CACHFILE_SUFFIX' => '.php',
            'TMPL_DENY_FUNC_LIST' => 'echo,exit',
            'TMPL_DENY_PHP' => false,
            'TMPL_L_DELIM' => '{',
            'TMPL_R_DELIM' => '}',
            'TMPL_VAR_IDENTIFY' => 'array',
            'TMPL_STRIP_SPACE' => true,
            'TMPL_CACHE_ON' => true,
            'TMPL_CACHE_PREFIX' => '',
            'TMPL_CACHE_TIME' => 0,
            'TMPL_LAYOUT_ITEM' => '{__CONTENT__}',
            'LAYOUT_ON' => false,
            'LAYOUT_NAME' => 'layout',
            'TAGLIB_BEGIN' => '<',
            'TAGLIB_END' => '>',
            'TAGLIB_LOAD' => true,
            'TAGLIB_BUILD_IN' => 'cx',
            'TAGLIB_PRE_LOAD' => '',
        );
        public function run(&$_data) {
            $engine = strtolower(C('TMPL_ENGINE_TYPE'));
            $_content = empty($_data['content']) ? $_data['file'] : $_data['content'];
            $_data['prefix'] = !empty($_data['prefix']) ? $_data['prefix'] : C('TMPL_CACHE_PREFIX');
            if ('think' == $engine) {
                if ((!empty($_data['content']) && $this->checkContentCache($_data['content'], $_data['prefix'])) || $this->checkCache($_data['file'], $_data['prefix'])) {
                    extract($_data['var'], EXTR_OVERWRITE);
                    include C('CACHE_PATH') . $_data['prefix'] . md5($_content) . C('TMPL_CACHFILE_SUFFIX');
                } else {
                    $tpl = Think::instance('ThinkTemplate');
                    $tpl->fetch($_content, $_data['var'], $_data['prefix']);
                }
            } else {
                $class = 'Template' . ucwords($engine);
                if (class_exists($class)) {
                    $tpl = new $class;
                    $tpl->fetch($_content, $_data['var']);
                } else {
                    throw_exception(L('_NOT_SUPPERT_') . ': ' . $class);
                }
            }
        }
        protected function checkCache($tmplTemplateFile, $prefix = '') {
            if (!C('TMPL_CACHE_ON')) return false;
            $tmplCacheFile = C('CACHE_PATH') . $prefix . md5($tmplTemplateFile) . C('TMPL_CACHFILE_SUFFIX');
            if (!is_file($tmplCacheFile)) {
                return false;
            } elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) {
                return false;
            } elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile) + C('TMPL_CACHE_TIME')) {
                return false;
            }
            if (C('LAYOUT_ON')) {
                $layoutFile = THEME_PATH . C('LAYOUT_NAME') . C('TMPL_TEMPLATE_SUFFIX');
                if (filemtime($layoutFile) > filemtime($tmplCacheFile)) {
                    return false;
                }
            }
            return true;
        }
        protected function checkContentCache($tmplContent, $prefix = '') {
            if (is_file(C('CACHE_PATH') . $prefix . md5($tmplContent) . C('TMPL_CACHFILE_SUFFIX'))) {
                return true;
            } else {
                return false;
            }
        }
    }
    class ContentReplaceBehavior extends Behavior {
        protected $options = array(
            'TMPL_PARSE_STRING' => array() ,
        );
        public function run(&$content) {
            $content = $this->templateContentReplace($content);
        }
        protected function templateContentReplace($content) {
            $replace = array(
                '__TMPL__' => APP_TMPL_PATH,
                '__ROOT__' => __ROOT__,
                '__APP__' => __APP__,
                '__GROUP__' => defined('GROUP_NAME') ? __GROUP__ : __APP__,
                '__ACTION__' => __ACTION__,
                '__SELF__' => __SELF__,
                '__URL__' => __URL__,
                '../Public' => APP_TMPL_PATH . 'Public',
                '__PUBLIC__' => __ROOT__ . '/Public',
            );
            if (is_array(C('TMPL_PARSE_STRING'))) $replace = array_merge($replace, C('TMPL_PARSE_STRING'));
            $content = str_replace(array_keys($replace) , array_values($replace) , $content);
            return $content;
        }
    }
    class TokenBuildBehavior extends Behavior {
        protected $options = array(
            'TOKEN_ON' => false,
            'TOKEN_NAME' => '__hash__',
            'TOKEN_TYPE' => 'md5',
            'TOKEN_RESET' => true,
        );
        public function run(&$content) {
            if (C('TOKEN_ON')) {
                if (strpos($content, '{__TOKEN__}')) {
                    $content = str_replace('{__TOKEN__}', $this->buildToken() , $content);
                } elseif (preg_match('/<\/form(\s*)>/is', $content, $match)) {
                    $content = str_replace($match[0], $this->buildToken() . $match[0], $content);
                }
            } else {
                $content = str_replace('{__TOKEN__}', '', $content);
            }
        }
        private function buildToken() {
            $tokenName = C('TOKEN_NAME');
            $tokenType = C('TOKEN_TYPE');
            if (!isset($_SESSION[$tokenName])) {
                $_SESSION[$tokenName] = array();
            }
            $tokenKey = md5($_SERVER['REQUEST_URI']);
            if (isset($_SESSION[$tokenName][$tokenKey])) {
                $tokenValue = $_SESSION[$tokenName][$tokenKey];
            } else {
                $tokenValue = $tokenType(microtime(TRUE));
                $_SESSION[$tokenName][$tokenKey] = $tokenValue;
            }
            $token = '<input type="hidden" name="' . $tokenName . '" value="' . $tokenKey . '_' . $tokenValue . '" />';
            return $token;
        }
    }
    class WriteHtmlCacheBehavior extends Behavior {
        public function run(&$content) {
            if (C('HTML_CACHE_ON') && defined('HTML_FILE_NAME')) {
                if (!is_dir(dirname(HTML_FILE_NAME))) mkdir(dirname(HTML_FILE_NAME) , 0755, true);
                if (false === file_put_contents(HTML_FILE_NAME, $content)) throw_exception(L('_CACHE_WRITE_ERROR_') . ':' . HTML_FILE_NAME);
            }
        }
    }
    class ShowRuntimeBehavior extends Behavior {
        protected $options = array(
            'SHOW_RUN_TIME' => false,
            'SHOW_ADV_TIME' => false,
            'SHOW_DB_TIMES' => false,
            'SHOW_CACHE_TIMES' => false,
            'SHOW_USE_MEM' => false,
            'SHOW_LOAD_FILE' => false,
            'SHOW_FUN_TIMES' => false,
        );
        public function run(&$content) {
            if (C('SHOW_RUN_TIME')) {
                if (false !== strpos($content, '{__NORUNTIME__}')) {
                    $content = str_replace('{__NORUNTIME__}', '', $content);
                } else {
                    $runtime = $this->showTime();
                    if (strpos($content, '{__RUNTIME__}')) $content = str_replace('{__RUNTIME__}', $runtime, $content);
                    else $content.= $runtime;
                }
            } else {
                $content = str_replace(array(
                    '{__NORUNTIME__}',
                    '{__RUNTIME__}'
                ) , '', $content);
            }
        }
        private function showTime() {
            G('beginTime', $GLOBALS['_beginTime']);
            G('viewEndTime');
            $showTime = 'Process: ' . G('beginTime', 'viewEndTime') . 's ';
            if (C('SHOW_ADV_TIME')) {
                $showTime.= '( Load:' . G('beginTime', 'loadTime') . 's Init:' . G('loadTime', 'initTime') . 's Exec:' . G('initTime', 'viewStartTime') . 's Template:' . G('viewStartTime', 'viewEndTime') . 's )';
            }
            if (C('SHOW_DB_TIMES') && class_exists('Db', false)) {
                $showTime.= ' | DB :' . N('db_query') . ' queries ' . N('db_write') . ' writes ';
            }
            if (C('SHOW_CACHE_TIMES') && class_exists('Cache', false)) {
                $showTime.= ' | Cache :' . N('cache_read') . ' gets ' . N('cache_write') . ' writes ';
            }
            if (MEMORY_LIMIT_ON && C('SHOW_USE_MEM')) {
                $showTime.= ' | UseMem:' . number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024) . ' kb';
            }
            if (C('SHOW_LOAD_FILE')) {
                $showTime.= ' | LoadFile:' . count(get_included_files());
            }
            if (C('SHOW_FUN_TIMES')) {
                $fun = get_defined_functions();
                $showTime.= ' | CallFun:' . count($fun['user']) . ',' . count($fun['internal']);
            }
            return $showTime;
        }
    }
    class ShowPageTraceBehavior extends Behavior {
        protected $options = array(
            'SHOW_PAGE_TRACE' => false,
            'TRACE_PAGE_TABS' => array(
                'BASE' => '基本',
                'FILE' => '文件',
                'INFO' => '流程',
                'ERR|NOTIC' => '错误',
                'SQL' => 'SQL',
                'DEBUG' => '调试'
            ) ,
            'PAGE_TRACE_SAVE' => false,
        );
        public function run(&$params) {
            if (!IS_AJAX && C('SHOW_PAGE_TRACE')) {
                echo $this->showTrace();
            }
        }
        private function showTrace() {
            $files = get_included_files();
            $info = array();
            foreach ($files as $key => $file) {
                $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )';
            }
            $trace = array();
            $base = array(
                '请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . __SELF__,
                '运行时间' => $this->showTime() ,
                '吞吐率' => number_format(1 / G('beginTime', 'viewEndTime') , 2) . 'req/s',
                '内存开销' => MEMORY_LIMIT_ON ? number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024, 2) . ' kb' : '不支持',
                '查询信息' => N('db_query') . ' queries ' . N('db_write') . ' writes ',
                '文件加载' => count(get_included_files()) ,
                '缓存信息' => N('cache_read') . ' gets ' . N('cache_write') . ' writes ',
                '配置加载' => count(c()) ,
                '会话信息' => 'SESSION_ID=' . session_id() ,
            );
            $traceFile = CONF_PATH . 'trace.php';
            if (is_file($traceFile)) {
                $base = array_merge($base, include $traceFile);
            }
            $debug = trace();
            $tabs = C('TRACE_PAGE_TABS');
            foreach ($tabs as $name => $title) {
                switch (strtoupper($name)) {
                    case 'BASE':
                        $trace[$title] = $base;
                        break;

                    case 'FILE':
                        $trace[$title] = $info;
                        break;

                    default:
                        $name = strtoupper($name);
                        if (strpos($name, '|')) {
                            $array = explode('|', $name);
                            $result = array();
                            foreach ($array as $name) {
                                $result+= isset($debug[$name]) ? $debug[$name] : array();
                            }
                            $trace[$title] = $result;
                        } else {
                            $trace[$title] = isset($debug[$name]) ? $debug[$name] : '';
                        }
                }
            }
            if ($save = C('PAGE_TRACE_SAVE')) {
                if (is_array($save)) {
                    $tabs = C('TRACE_PAGE_TABS');
                    $array = array();
                    foreach ($save as $tab) {
                        $array[] = $tabs[$tab];
                    }
                }
                $content = date('[ c ]') . ' ' . get_client_ip() . ' ' . $_SERVER['REQUEST_URI'] . "\r\n";
                foreach ($trace as $key => $val) {
                    if (!isset($array) || in_array($key, $array)) {
                        $content.= '[ ' . $key . " ]\r\n";
                        if (is_array($val)) {
                            foreach ($val as $k => $v) {
                                $content.= (!is_numeric($k) ? $k . ':' : '') . print_r($v, true) . "\r\n";
                            }
                        } else {
                            $content.= print_r($val, true) . "\r\n";
                        }
                        $content.= "\r\n";
                    }
                }
                error_log(str_replace('<br/>', "\r\n", $content) , Log::FILE, LOG_PATH . date('y_m_d') . '_trace.log');
            }
            unset($files, $info, $base);
            ob_start();
            include C('TMPL_TRACE_FILE') ? C('TMPL_TRACE_FILE') : THINK_PATH . 'Tpl/page_trace.tpl';
            return ob_get_clean();
        }
        private function showTime() {
            G('beginTime', $GLOBALS['_beginTime']);
            G('viewEndTime');
            return G('beginTime', 'viewEndTime') . 's ( Load:' . G('beginTime', 'loadTime') . 's Init:' . G('loadTime', 'initTime') . 's Exec:' . G('initTime', 'viewStartTime') . 's Template:' . G('viewStartTime', 'viewEndTime') . 's )';
        }
    }
    alias_import(array(
        'Model' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Model.class.php',
        'Db' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Db.class.php',
        'Log' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Log.class.php',
        'ThinkTemplate' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Template/ThinkTemplate.class.php',
        'TagLib' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Template/TagLib.class.php',
        'Cache' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Cache.class.php',
        'Widget' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Widget.class.php',
        'TagLibCx' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Driver/TagLib/TagLibCx.class.php',
    ));
    function halt($error) {
        $e = array();
        if (APP_DEBUG) {
            if (!is_array($error)) {
                $trace = debug_backtrace();
                $e['message'] = $error;
                $e['file'] = $trace[0]['file'];
                $e['line'] = $trace[0]['line'];
                ob_start();
                debug_print_backtrace();
                $e['trace'] = ob_get_clean();
            } else {
                $e = $error;
            }
        } else {
            $error_page = C('ERROR_PAGE');
            if (!empty($error_page)) {
                redirect($error_page);
            } else {
                if (C('SHOW_ERROR_MSG')) $e['message'] = is_array($error) ? $error['message'] : $error;
                else $e['message'] = C('ERROR_MESSAGE');
            }
        }
        include C('TMPL_EXCEPTION_FILE');
        exit;
    }
    function throw_exception($msg, $type = 'ThinkException', $code = 0) {
        if (class_exists($type, false)) throw new $type($msg, $code);
        else halt($msg);
    }
    function dump($var, $echo = true, $label = null, $strict = true) {
        $label = ($label === null) ? '' : rtrim($label) . ' ';
        if (!$strict) {
            if (ini_get('html_errors')) {
                $output = print_r($var, true);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            } else {
                $output = $label . print_r($var, true);
            }
        } else {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
            if (!extension_loaded('xdebug')) {
                $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            }
        }
        if ($echo) {
            echo ($output);
            return null;
        } else return $output;
    }
    function _404($msg = '', $url = '') {
        APP_DEBUG && throw_exception($msg);
        if ($msg && C('LOG_EXCEPTION_RECORD')) Log::write($msg);
        if (empty($url) && C('URL_404_REDIRECT')) {
            $url = C('URL_404_REDIRECT');
        }
        if ($url) {
            redirect($url);
        } else {
            send_http_status(404);
            exit;
        }
    }
    function layout($layout) {
        if (false !== $layout) {
            C('LAYOUT_ON', true);
            if (is_string($layout)) {
                C('LAYOUT_NAME', $layout);
            }
        } else {
            C('LAYOUT_ON', false);
        }
    }
    function U($url = '', $vars = '', $suffix = true, $redirect = false, $domain = false) {
        $info = parse_url($url);
        $url = !empty($info['path']) ? $info['path'] : ACTION_NAME;
        if (isset($info['fragment'])) {
            $anchor = $info['fragment'];
            if (false !== strpos($anchor, '?')) {
                list($anchor, $info['query']) = explode('?', $anchor, 2);
            }
            if (false !== strpos($anchor, '@')) {
                list($anchor, $host) = explode('@', $anchor, 2);
            }
        } elseif (false !== strpos($url, '@')) {
            list($url, $host) = explode('@', $info['path'], 2);
        }
        if (isset($host)) {
            $domain = $host . (strpos($host, '.') ? '' : strstr($_SERVER['HTTP_HOST'], '.'));
        } elseif ($domain === true) {
            $domain = $_SERVER['HTTP_HOST'];
            if (C('APP_SUB_DOMAIN_DEPLOY')) {
                $domain = $domain == 'localhost' ? 'localhost' : 'www' . strstr($_SERVER['HTTP_HOST'], '.');
                foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) {
                    if (false === strpos($key, '*') && 0 === strpos($url, $rule[0])) {
                        $domain = $key . strstr($domain, '.');
                        $url = substr_replace($url, '', 0, strlen($rule[0]));
                        break;
                    }
                }
            }
        }
        if (is_string($vars)) {
            parse_str($vars, $vars);
        } elseif (!is_array($vars)) {
            $vars = array();
        }
        if (isset($info['query'])) {
            parse_str($info['query'], $params);
            $vars = array_merge($params, $vars);
        }
        $depr = C('URL_PATHINFO_DEPR');
        if ($url) {
            if (0 === strpos($url, '/')) {
                $route = true;
                $url = substr($url, 1);
                if ('/' != $depr) {
                    $url = str_replace('/', $depr, $url);
                }
            } else {
                if ('/' != $depr) {
                    $url = str_replace('/', $depr, $url);
                }
                $url = trim($url, $depr);
                $path = explode($depr, $url);
                $var = array();
                $var[C('VAR_ACTION') ] = !empty($path) ? array_pop($path) : ACTION_NAME;
                $var[C('VAR_MODULE') ] = !empty($path) ? array_pop($path) : MODULE_NAME;
                if ($maps = C('URL_ACTION_MAP')) {
                    if (isset($maps[strtolower($var[C('VAR_MODULE') ]) ])) {
                        $maps = $maps[strtolower($var[C('VAR_MODULE') ]) ];
                        if ($action = array_search(strtolower($var[C('VAR_ACTION') ]) , $maps)) {
                            $var[C('VAR_ACTION') ] = $action;
                        }
                    }
                }
                if ($maps = C('URL_MODULE_MAP')) {
                    if ($module = array_search(strtolower($var[C('VAR_MODULE') ]) , $maps)) {
                        $var[C('VAR_MODULE') ] = $module;
                    }
                }
                if (C('URL_CASE_INSENSITIVE')) {
                    $var[C('VAR_MODULE') ] = parse_name($var[C('VAR_MODULE') ]);
                }
                if (!C('APP_SUB_DOMAIN_DEPLOY') && C('APP_GROUP_LIST')) {
                    if (!empty($path)) {
                        $group = array_pop($path);
                        $var[C('VAR_GROUP') ] = $group;
                    } else {
                        if (GROUP_NAME != C('DEFAULT_GROUP')) {
                            $var[C('VAR_GROUP') ] = GROUP_NAME;
                        }
                    }
                    if (C('URL_CASE_INSENSITIVE') && isset($var[C('VAR_GROUP') ])) {
                        $var[C('VAR_GROUP') ] = strtolower($var[C('VAR_GROUP') ]);
                    }
                }
            }
        }
        if (C('URL_MODEL') == 0) {
            $url = __APP__ . '?' . http_build_query(array_reverse($var));
            if (!empty($vars)) {
                $vars = urldecode(http_build_query($vars));
                $url.= '&' . $vars;
            }
        } else {
            if (isset($route)) {
                $url = __APP__ . '/' . rtrim($url, $depr);
            } else {
                $url = __APP__ . '/' . implode($depr, array_reverse($var));
            }
            if (!empty($vars)) {
                foreach ($vars as $var => $val) {
                    if ('' !== trim($val)) $url.= $depr . $var . $depr . urlencode($val);
                }
            }
            if ($suffix) {
                $suffix = $suffix === true ? C('URL_HTML_SUFFIX') : $suffix;
                if ($pos = strpos($suffix, '|')) {
                    $suffix = substr($suffix, 0, $pos);
                }
                if ($suffix && '/' != substr($url, -1)) {
                    $url.= '.' . ltrim($suffix, '.');
                }
            }
        }
        if (isset($anchor)) {
            $url.= '#' . $anchor;
        }
        if ($domain) {
            $url = (is_ssl() ? 'https://' : 'http://') . $domain . $url;
        }
        if ($redirect) redirect($url);
        else return $url;
    }
    function W($name, $data = array() , $return = false, $path = '') {
        $class = $name . 'Widget';
        $path = empty($path) ? BASE_LIB_PATH : $path;
        require_cache($path . 'Widget/' . $class . '.class.php');
        if (!class_exists($class)) throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class);
        $widget = Think::instance($class);
        $content = $widget->render($data);
        if ($return) return $content;
        else echo $content;
    }
    function filter($name, &$content) {
        $class = $name . 'Filter';
        require_cache(BASE_LIB_PATH . 'Filter/' . $class . '.class.php');
        $filter = new $class();
        $content = $filter->run($content);
    }
    function is_ssl() {
        if (isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))) {
            return true;
        } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) {
            return true;
        }
        return false;
    }
    function redirect($url, $time = 0, $msg = '') {
        $url = str_replace(array(
            "\n",
            "\r"
        ) , '', $url);
        if (empty($msg)) $msg = "系统将在{$time}秒之后自动跳转到{$url}!";
        if (!headers_sent()) {
            if (0 === $time) {
                header('Location: ' . $url);
            } else {
                header("refresh:{$time};url={$url}");
                echo ($msg);
            }
            exit();
        } else {
            $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
            if ($time != 0) $str.= $msg;
            exit($str);
        }
    }
    function S($name, $value = '', $options = null) {
        static $cache = '';
        if (is_array($options) && empty($cache)) {
            $type = isset($options['type']) ? $options['type'] : '';
            $cache = Cache::getInstance($type, $options);
        } elseif (is_array($name)) {
            $type = isset($name['type']) ? $name['type'] : '';
            $cache = Cache::getInstance($type, $name);
            return $cache;
        } elseif (empty($cache)) {
            $cache = Cache::getInstance();
        }
        if ('' === $value) {
            return $cache->get($name);
        } elseif (is_null($value)) {
            return $cache->rm($name);
        } else {
            if (is_array($options)) {
                $expire = isset($options['expire']) ? $options['expire'] : NULL;
            } else {
                $expire = is_numeric($options) ? $options : NULL;
            }
            return $cache->set($name, $value, $expire);
        }
    }
    function cache($name, $value = '', $options = null) {
        return S($name, $value, $options);
    }
    function F($name, $value = '', $path = DATA_PATH) {
        static $_cache = array();
        $filename = $path . $name . '.php';
        if ('' !== $value) {
            if (is_null($value)) {
                return false !== strpos($name, '*') ? array_map("unlink", glob($filename)) : unlink($filename);
            } else {
                $dir = dirname($filename);
                if (!is_dir($dir)) mkdir($dir, 0755, true);
                $_cache[$name] = $value;
                return file_put_contents($filename, strip_whitespace("<?php\treturn " . var_export($value, true) . ";?>"));
            }
        }
        if (isset($_cache[$name])) return $_cache[$name];
        if (is_file($filename)) {
            $value = include $filename;
            $_cache[$name] = $value;
        } else {
            $value = false;
        }
        return $value;
    }
    function get_instance_of($name, $method = '', $args = array()) {
        static $_instance = array();
        $identify = empty($args) ? $name . $method : $name . $method . to_guid_string($args);
        if (!isset($_instance[$identify])) {
            if (class_exists($name)) {
                $o = new $name();
                if (method_exists($o, $method)) {
                    if (!empty($args)) {
                        $_instance[$identify] = call_user_func_array(array(&$o,
                            $method
                        ) , $args);
                    } else {
                        $_instance[$identify] = $o->$method();
                    }
                } else $_instance[$identify] = $o;
            } else halt(L('_CLASS_NOT_EXIST_') . ':' . $name);
        }
        return $_instance[$identify];
    }
    function to_guid_string($mix) {
        if (is_object($mix) && function_exists('spl_object_hash')) {
            return spl_object_hash($mix);
        } elseif (is_resource($mix)) {
            $mix = get_resource_type($mix) . strval($mix);
        } else {
            $mix = serialize($mix);
        }
        return md5($mix);
    }
    function xml_encode($data, $root = 'think', $item = 'item', $attr = '', $id = 'id', $encoding = 'utf-8') {
        if (is_array($attr)) {
            $_attr = array();
            foreach ($attr as $key => $value) {
                $_attr[] = "{$key}=\"{$value}\"";
            }
            $attr = implode(' ', $_attr);
        }
        $attr = trim($attr);
        $attr = empty($attr) ? '' : " {$attr}";
        $xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>";
        $xml.= "<{$root}{$attr}>";
        $xml.= data_to_xml($data, $item, $id);
        $xml.= "</{$root}>";
        return $xml;
    }
    function data_to_xml($data, $item = 'item', $id = 'id') {
        $xml = $attr = '';
        foreach ($data as $key => $val) {
            if (is_numeric($key)) {
                $id && $attr = " {$id}=\"{$key}\"";
                $key = $item;
            }
            $xml.= "<{$key}{$attr}>";
            $xml.= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val;
            $xml.= "</{$key}>";
        }
        return $xml;
    }
    function session($name, $value = '') {
        $prefix = C('SESSION_PREFIX');
        if (is_array($name)) {
            if (isset($name['prefix'])) C('SESSION_PREFIX', $name['prefix']);
            if (C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID') ])) {
                session_id($_REQUEST[C('VAR_SESSION_ID') ]);
            } elseif (isset($name['id'])) {
                session_id($name['id']);
            }
            ini_set('session.auto_start', 0);
            if (isset($name['name'])) session_name($name['name']);
            if (isset($name['path'])) session_save_path($name['path']);
            if (isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);
            if (isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);
            if (isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid'] ? 1 : 0);
            if (isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies'] ? 1 : 0);
            if (isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
            if (isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
            if (isset($name['type'])) C('SESSION_TYPE', $name['type']);
            if (C('SESSION_TYPE')) {
                $class = 'Session' . ucwords(strtolower(C('SESSION_TYPE')));
                if (require_cache(EXTEND_PATH . 'Driver/Session/' . $class . '.class.php')) {
                    $hander = new $class();
                    $hander->execute();
                } else {
                    throw_exception(L('_CLASS_NOT_EXIST_') . ': ' . $class);
                }
            }
            if (C('SESSION_AUTO_START')) session_start();
        } elseif ('' === $value) {
            if (0 === strpos($name, '[')) {
                if ('[pause]' == $name) {
                    session_write_close();
                } elseif ('[start]' == $name) {
                    session_start();
                } elseif ('[destroy]' == $name) {
                    $_SESSION = array();
                    session_unset();
                    session_destroy();
                } elseif ('[regenerate]' == $name) {
                    session_regenerate_id();
                }
            } elseif (0 === strpos($name, '?')) {
                $name = substr($name, 1);
                if (strpos($name, '.')) {
                    list($name1, $name2) = explode('.', $name);
                    return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]);
                } else {
                    return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]);
                }
            } elseif (is_null($name)) {
                if ($prefix) {
                    unset($_SESSION[$prefix]);
                } else {
                    $_SESSION = array();
                }
            } elseif ($prefix) {
                if (strpos($name, '.')) {
                    list($name1, $name2) = explode('.', $name);
                    return isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null;
                } else {
                    return isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null;
                }
            } else {
                if (strpos($name, '.')) {
                    list($name1, $name2) = explode('.', $name);
                    return isset($_SESSION[$name1][$name2]) ? $_SESSION[$name1][$name2] : null;
                } else {
                    return isset($_SESSION[$name]) ? $_SESSION[$name] : null;
                }
            }
        } elseif (is_null($value)) {
            if ($prefix) {
                unset($_SESSION[$prefix][$name]);
            } else {
                unset($_SESSION[$name]);
            }
        } else {
            if ($prefix) {
                if (!is_array($_SESSION[$prefix])) {
                    $_SESSION[$prefix] = array();
                }
                $_SESSION[$prefix][$name] = $value;
            } else {
                $_SESSION[$name] = $value;
            }
        }
    }
    function cookie($name, $value = '', $option = null) {
        $config = array(
            'prefix' => C('COOKIE_PREFIX') ,
            'expire' => C('COOKIE_EXPIRE') ,
            'path' => C('COOKIE_PATH') ,
            'domain' => C('COOKIE_DOMAIN') ,
        );
        if (!is_null($option)) {
            if (is_numeric($option)) $option = array(
                'expire' => $option
            );
            elseif (is_string($option)) parse_str($option, $option);
            $config = array_merge($config, array_change_key_case($option));
        }
        if (is_null($name)) {
            if (empty($_COOKIE)) return;
            $prefix = empty($value) ? $config['prefix'] : $value;
            if (!empty($prefix)) {
                foreach ($_COOKIE as $key => $val) {
                    if (0 === stripos($key, $prefix)) {
                        setcookie($key, '', time() - 3600, $config['path'], $config['domain']);
                        unset($_COOKIE[$key]);
                    }
                }
            }
            return;
        }
        $name = $config['prefix'] . $name;
        if ('' === $value) {
            if (isset($_COOKIE[$name])) {
                $value = $_COOKIE[$name];
                if (0 === strpos($value, 'think:')) {
                    $value = substr($value, 6);
                    return array_map('urldecode', json_decode(MAGIC_QUOTES_GPC ? stripslashes($value) : $value, true));
                } else {
                    return $value;
                }
            } else {
                return null;
            }
        } else {
            if (is_null($value)) {
                setcookie($name, '', time() - 3600, $config['path'], $config['domain']);
                unset($_COOKIE[$name]);
            } else {
                if (is_array($value)) {
                    $value = 'think:' . json_encode(array_map('urlencode', $value));
                }
                $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
                setcookie($name, $value, $expire, $config['path'], $config['domain']);
                $_COOKIE[$name] = $value;
            }
        }
    }
    function load_ext_file() {
        if (C('LOAD_EXT_FILE')) {
            $files = explode(',', C('LOAD_EXT_FILE'));
            foreach ($files as $file) {
                $file = COMMON_PATH . $file . '.php';
                if (is_file($file)) include $file;
            }
        }
        if (C('LOAD_EXT_CONFIG')) {
            $configs = C('LOAD_EXT_CONFIG');
            if (is_string($configs)) $configs = explode(',', $configs);
            foreach ($configs as $key => $config) {
                $file = CONF_PATH . $config . '.php';
                if (is_file($file)) {
                    is_numeric($key) ? C(include $file) : C($key, include $file);
                }
            }
        }
    }
    function get_client_ip($type = 0) {
        $type = $type ? 1 : 0;
        static $ip = NULL;
        if ($ip !== NULL) return $ip[$type];
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown', $arr);
            if (false !== $pos) unset($arr[$pos]);
            $ip = trim($arr[0]);
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        $long = sprintf("%u", ip2long($ip));
        $ip = $long ? array(
            $ip,
            $long
        ) : array(
            '0.0.0.0',
            0
        );
        return $ip[$type];
    }
    function send_http_status($code) {
        static $_status = array(
            100 => 'Continue',
            101 => 'Switching Protocols',
            200 => 'OK',
            201 => 'Created',
            202 => 'Accepted',
            203 => 'Non-Authoritative Information',
            204 => 'No Content',
            205 => 'Reset Content',
            206 => 'Partial Content',
            300 => 'Multiple Choices',
            301 => 'Moved Permanently',
            302 => 'Moved Temporarily ',
            303 => 'See Other',
            304 => 'Not Modified',
            305 => 'Use Proxy',
            307 => 'Temporary Redirect',
            400 => 'Bad Request',
            401 => 'Unauthorized',
            402 => 'Payment Required',
            403 => 'Forbidden',
            404 => 'Not Found',
            405 => 'Method Not Allowed',
            406 => 'Not Acceptable',
            407 => 'Proxy Authentication Required',
            408 => 'Request Timeout',
            409 => 'Conflict',
            410 => 'Gone',
            411 => 'Length Required',
            412 => 'Precondition Failed',
            413 => 'Request Entity Too Large',
            414 => 'Request-URI Too Long',
            415 => 'Unsupported Media Type',
            416 => 'Requested Range Not Satisfiable',
            417 => 'Expectation Failed',
            500 => 'Internal Server Error',
            501 => 'Not Implemented',
            502 => 'Bad Gateway',
            503 => 'Service Unavailable',
            504 => 'Gateway Timeout',
            505 => 'HTTP Version Not Supported',
            509 => 'Bandwidth Limit Exceeded'
        );
        if (isset($_status[$code])) {
            header('HTTP/1.1 ' . $code . ' ' . $_status[$code]);
            header('Status:' . $code . ' ' . $_status[$code]);
        }
    }
    function filter_exp(&$value) {
        if (in_array(strtolower($value) , array(
            'exp',
            'or'
        ))) {
            $value.= ' ';
        }
    }
    class Log {
        const EMERG = 'EMERG';
        const ALERT = 'ALERT';
        const CRIT = 'CRIT';
        const ERR = 'ERR';
        const WARN = 'WARN';
        const NOTICE = 'NOTIC';
        const INFO = 'INFO';
        const DEBUG = 'DEBUG';
        const SQL = 'SQL';
        const SYSTEM = 0;
        const MAIL = 1;
        const FILE = 3;
        const SAPI = 4;
        static $log = array();
        static $format = '[ c ]';
        static function record($message, $level = self::ERR, $record = false) {
            if ($record || false !== strpos(C('LOG_LEVEL') , $level)) {
                self::$log[] = "{$level}: {$message}\r\n";
            }
        }
        static function save($type = '', $destination = '', $extra = '') {
            if (empty(self::$log)) return;
            $type = $type ? $type : C('LOG_TYPE');
            if (self::FILE == $type) {
                if (empty($destination)) $destination = C('LOG_PATH') . date('y_m_d') . '.log';
                if (is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination)) rename($destination, dirname($destination) . '/' . time() . '-' . basename($destination));
            } else {
                $destination = $destination ? $destination : C('LOG_DEST');
                $extra = $extra ? $extra : C('LOG_EXTRA');
            }
            $now = date(self::$format);
            error_log($now . ' ' . get_client_ip() . ' ' . $_SERVER['REQUEST_URI'] . "\r\n" . implode('', self::$log) . "\r\n", $type, $destination, $extra);
            self::$log = array();
        }
        static function write($message, $level = self::ERR, $type = '', $destination = '', $extra = '') {
            $now = date(self::$format);
            $type = $type ? $type : C('LOG_TYPE');
            if (self::FILE == $type) {
                if (empty($destination)) $destination = C('LOG_PATH') . date('y_m_d') . '.log';
                if (is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination)) rename($destination, dirname($destination) . '/' . time() . '-' . basename($destination));
            } else {
                $destination = $destination ? $destination : C('LOG_DEST');
                $extra = $extra ? $extra : C('LOG_EXTRA');
            }
            error_log("{$now} {$level}: {$message}\r\n", $type, $destination, $extra);
        }
    }
    class Dispatcher {
        static public function dispatch() {
            $urlMode = C('URL_MODEL');
            if (isset($_GET[C('VAR_PATHINFO') ])) {
                $_SERVER['PATH_INFO'] = $_GET[C('VAR_PATHINFO') ];
                unset($_GET[C('VAR_PATHINFO') ]);
            }
            if ($urlMode == URL_COMPAT) {
                define('PHP_FILE', _PHP_FILE_ . '?' . C('VAR_PATHINFO') . '=');
            } elseif ($urlMode == URL_REWRITE) {
                $url = dirname(_PHP_FILE_);
                if ($url == '/' || $url == '\\') $url = '';
                define('PHP_FILE', $url);
            } else {
                define('PHP_FILE', _PHP_FILE_);
            }
            if (C('APP_SUB_DOMAIN_DEPLOY')) {
                $rules = C('APP_SUB_DOMAIN_RULES');
                if (isset($rules[$_SERVER['HTTP_HOST']])) {
                    $rule = $rules[$_SERVER['HTTP_HOST']];
                } else {
                    $subDomain = strtolower(substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.')));
                    define('SUB_DOMAIN', $subDomain);
                    if ($subDomain && isset($rules[$subDomain])) {
                        $rule = $rules[$subDomain];
                    } elseif (isset($rules['*'])) {
                        if ('www' != $subDomain && !in_array($subDomain, C('APP_SUB_DOMAIN_DENY'))) {
                            $rule = $rules['*'];
                        }
                    }
                }
                if (!empty($rule)) {
                    $array = explode('/', $rule[0]);
                    $module = array_pop($array);
                    if (!empty($module)) {
                        $_GET[C('VAR_MODULE') ] = $module;
                        $domainModule = true;
                    }
                    if (!empty($array)) {
                        $_GET[C('VAR_GROUP') ] = array_pop($array);
                        $domainGroup = true;
                    }
                    if (isset($rule[1])) {
                        parse_str($rule[1], $parms);
                        $_GET = array_merge($_GET, $parms);
                    }
                }
            }
            if (!isset($_SERVER['PATH_INFO'])) {
                $types = explode(',', C('URL_PATHINFO_FETCH'));
                foreach ($types as $type) {
                    if (0 === strpos($type, ':')) {
                        $_SERVER['PATH_INFO'] = call_user_func(substr($type, 1));
                        break;
                    } elseif (!empty($_SERVER[$type])) {
                        $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];
                        break;
                    }
                }
            }
            $depr = C('URL_PATHINFO_DEPR');
            if (!empty($_SERVER['PATH_INFO'])) {
                tag('path_info');
                $part = pathinfo($_SERVER['PATH_INFO']);
                define('__EXT__', isset($part['extension']) ? strtolower($part['extension']) : '');
                if (__EXT__) {
                    if (C('URL_DENY_SUFFIX') && preg_match('/\.(' . trim(C('URL_DENY_SUFFIX') , '.') . ')$/i', $_SERVER['PATH_INFO'])) {
                        send_http_status(404);
                        exit;
                    }
                    if (C('URL_HTML_SUFFIX')) {
                        $_SERVER['PATH_INFO'] = preg_replace('/\.(' . trim(C('URL_HTML_SUFFIX') , '.') . ')$/i', '', $_SERVER['PATH_INFO']);
                    } else {
                        $_SERVER['PATH_INFO'] = preg_replace('/.' . __EXT__ . '$/i', '', $_SERVER['PATH_INFO']);
                    }
                }
                if (!self::routerCheck()) {
                    $paths = explode($depr, trim($_SERVER['PATH_INFO'], '/'));
                    if (C('VAR_URL_PARAMS')) {
                        $_GET[C('VAR_URL_PARAMS') ] = $paths;
                    }
                    $var = array();
                    if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP') ])) {
                        $var[C('VAR_GROUP') ] = in_array(strtolower($paths[0]) , explode(',', strtolower(C('APP_GROUP_LIST')))) ? array_shift($paths) : '';
                        if (C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP') ]) , explode(',', strtolower(C('APP_GROUP_DENY'))))) {
                            exit;
                        }
                    }
                    if (!isset($_GET[C('VAR_MODULE') ])) {
                        $var[C('VAR_MODULE') ] = array_shift($paths);
                    }
                    $var[C('VAR_ACTION') ] = array_shift($paths);
                    preg_replace('@(\w+)\/([^\/]+)@e', '$var[\'\\1\']=strip_tags(\'\\2\');', implode('/', $paths));
                    $_GET = array_merge($var, $_GET);
                }
                define('__INFO__', $_SERVER['PATH_INFO']);
            } else {
                define('__INFO__', '');
            }
            define('__SELF__', strip_tags($_SERVER['REQUEST_URI']));
            define('__APP__', strip_tags(PHP_FILE));
            if (C('APP_GROUP_LIST')) {
                define('GROUP_NAME', self::getGroup(C('VAR_GROUP')));
                define('__GROUP__', (!empty($domainGroup) || strtolower(GROUP_NAME) == strtolower(C('DEFAULT_GROUP'))) ? __APP__ : __APP__ . '/' . (C('URL_CASE_INSENSITIVE') ? strtolower(GROUP_NAME) : GROUP_NAME));
            }
            define('BASE_LIB_PATH', (defined('GROUP_NAME') && C('APP_GROUP_MODE') == 1) ? APP_PATH . C('APP_GROUP_PATH') . '/' . GROUP_NAME . '/' : LIB_PATH);
            if (defined('GROUP_NAME')) {
                C('CACHE_PATH', CACHE_PATH . GROUP_NAME . '/');
                if (1 == C('APP_GROUP_MODE')) {
                    $config_path = BASE_LIB_PATH . 'Conf/';
                    $common_path = BASE_LIB_PATH . 'Common/';
                } else {
                    $config_path = CONF_PATH . GROUP_NAME . '/';
                    $common_path = COMMON_PATH . GROUP_NAME . '/';
                }
                if (is_file($config_path . 'config.php')) C(include $config_path . 'config.php');
                if (is_file($config_path . 'alias.php')) alias_import(include $config_path . 'alias.php');
                if (is_file($config_path . 'tags.php')) C('tags', include $config_path . 'tags.php');
                if (is_file($common_path . 'function.php')) include $common_path . 'function.php';
            } else {
                C('CACHE_PATH', CACHE_PATH);
            }
            define('MODULE_NAME', self::getModule(C('VAR_MODULE')));
            define('ACTION_NAME', self::getAction(C('VAR_ACTION')));
            $moduleName = defined('MODULE_ALIAS') ? MODULE_ALIAS : MODULE_NAME;
            if (defined('GROUP_NAME')) {
                define('__URL__', !empty($domainModule) ? __GROUP__ . $depr : __GROUP__ . $depr . (C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName));
            } else {
                define('__URL__', !empty($domainModule) ? __APP__ . '/' : __APP__ . '/' . (C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName));
            }
            define('__ACTION__', __URL__ . $depr . (defined('ACTION_ALIAS') ? ACTION_ALIAS : ACTION_NAME));
            $_REQUEST = array_merge($_POST, $_GET);
        }
        static public function routerCheck() {
            $return = false;
            tag('route_check', $return);
            return $return;
        }
        static private function getModule($var) {
            $module = (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_MODULE'));
            unset($_GET[$var]);
            if ($maps = C('URL_MODULE_MAP')) {
                if (isset($maps[strtolower($module) ])) {
                    define('MODULE_ALIAS', strtolower($module));
                    return $maps[MODULE_ALIAS];
                } elseif (array_search(strtolower($module) , $maps)) {
                    return '';
                }
            }
            if (C('URL_CASE_INSENSITIVE')) {
                $module = ucfirst(parse_name($module, 1));
            }
            return strip_tags($module);
        }
        static private function getAction($var) {
            $action = !empty($_POST[$var]) ? $_POST[$var] : (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_ACTION'));
            unset($_POST[$var], $_GET[$var]);
            if ($maps = C('URL_ACTION_MAP')) {
                if (isset($maps[strtolower(MODULE_NAME) ])) {
                    $maps = $maps[strtolower(MODULE_NAME) ];
                    if (isset($maps[strtolower($action) ])) {
                        define('ACTION_ALIAS', strtolower($action));
                        return $maps[ACTION_ALIAS];
                    } elseif (array_search(strtolower($action) , $maps)) {
                        return '';
                    }
                }
            }
            return strip_tags(C('URL_CASE_INSENSITIVE') ? strtolower($action) : $action);
        }
        static private function getGroup($var) {
            $group = (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_GROUP'));
            unset($_GET[$var]);
            return strip_tags(C('URL_CASE_INSENSITIVE') ? ucfirst(strtolower($group)) : $group);
        }
    }
    class App {
        static public function init() {
            if (C('OUTPUT_ENCODE')) {
                $zlib = ini_get('zlib.output_compression');
                if (empty($zlib)) ob_start('ob_gzhandler');
            }
            date_default_timezone_set(C('DEFAULT_TIMEZONE'));
            load_ext_file();
            Dispatcher::dispatch();
            define('NOW_TIME', $_SERVER['REQUEST_TIME']);
            define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
            define('IS_GET', REQUEST_METHOD == 'GET' ? true : false);
            define('IS_POST', REQUEST_METHOD == 'POST' ? true : false);
            define('IS_PUT', REQUEST_METHOD == 'PUT' ? true : false);
            define('IS_DELETE', REQUEST_METHOD == 'DELETE' ? true : false);
            define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT') ]) || !empty($_GET[C('VAR_AJAX_SUBMIT') ])) ? true : false);
            tag('url_dispatch');
            if (C('VAR_FILTERS')) {
                $filters = explode(',', C('VAR_FILTERS'));
                foreach ($filters as $filter) {
                    array_walk_recursive($_POST, $filter);
                    array_walk_recursive($_GET, $filter);
                }
            }
            C('LOG_PATH', realpath(LOG_PATH) . '/');
            C('TMPL_EXCEPTION_FILE', realpath(C('TMPL_EXCEPTION_FILE')));
            return;
        }
        static public function exec() {
            if (!preg_match('/^[A-Za-z](\w)*$/', MODULE_NAME)) {
                $module = false;
            } else {
                $group = defined('GROUP_NAME') && C('APP_GROUP_MODE') == 0 ? GROUP_NAME . '/' : '';
                $module = A($group . MODULE_NAME);
            }
            if (!$module) {
                if ('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) {
                    header("Content-type:image/png");
                    exit(base64_decode(App::logo()));
                }
                if (function_exists('__hack_module')) {
                    $module = __hack_module();
                    if (!is_object($module)) {
                        return;
                    }
                } else {
                    $module = A($group . 'Empty');
                    if (!$module) {
                        _404(L('_MODULE_NOT_EXIST_') . ':' . MODULE_NAME);
                    }
                }
            }
            $action = C('ACTION_NAME') ? C('ACTION_NAME') : ACTION_NAME;
            $action.= C('ACTION_SUFFIX');
            try {
                if (!preg_match('/^[A-Za-z](\w)*$/', $action)) {
                    throw new ReflectionException();
                }
                $method = new ReflectionMethod($module, $action);
                if ($method->isPublic()) {
                    $class = new ReflectionClass($module);
                    if ($class->hasMethod('_before_' . $action)) {
                        $before = $class->getMethod('_before_' . $action);
                        if ($before->isPublic()) {
                            $before->invoke($module);
                        }
                    }
                    if (C('URL_PARAMS_BIND') && $method->getNumberOfParameters() > 0) {
                        switch ($_SERVER['REQUEST_METHOD']) {
                            case 'POST':
                                $vars = array_merge($_GET, $_POST);
                                break;

                            case 'PUT':
                                parse_str(file_get_contents('php://input') , $vars);
                                break;

                            default:
                                $vars = $_GET;
                        }
                        $params = $method->getParameters();
                        foreach ($params as $param) {
                            $name = $param->getName();
                            if (isset($vars[$name])) {
                                $args[] = $vars[$name];
                            } elseif ($param->isDefaultValueAvailable()) {
                                $args[] = $param->getDefaultValue();
                            } else {
                                throw_exception(L('_PARAM_ERROR_') . ':' . $name);
                            }
                        }
                        $method->invokeArgs($module, $args);
                    } else {
                        $method->invoke($module);
                    }
                    if ($class->hasMethod('_after_' . $action)) {
                        $after = $class->getMethod('_after_' . $action);
                        if ($after->isPublic()) {
                            $after->invoke($module);
                        }
                    }
                } else {
                    throw new ReflectionException();
                }
            }
            catch(ReflectionException $e) {
                $method = new ReflectionMethod($module, '__call');
                $method->invokeArgs($module, array(
                    $action,
                    ''
                ));
            }
            return;
        }
        static public function run() {
            tag('app_init');
            App::init();
            tag('app_begin');
            session(C('SESSION_OPTIONS'));
            G('initTime');
            App::exec();
            tag('app_end');
            return;
        }
        static public function logo() {
            return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/9+69+8xuNtkHJAFCSIAkhMgjCCJQUi0GtEIVbP8Qq9LH2No6TmfaztjO2OnUdvqHFMfOVFTqIK0vUEEeqUBARCsEeYQkEPJoEvIiELLvvc9z+p27u2F3s5tsBB1OZiebu5dzf7/v/L7f952zMM8cWIwY+Mk2ulCp92Fnq3XvnzArr2NZnYNldDp0Gw+/OEQ4+obQn5D+4Ubb22+YOGsWi/Todh8AHglKEGkEsnHBQ162511GZFgW6ZCBM9/W4H3iNSQqIe09O196dLKX7d1O39OViP/wthtkND62if/wj/DbMpph8BY/m9xy8BoBmQk+mHqZQGNy4JYRwCoRbwa8l4JXw6M+orJxpU0U6ToKy/5bQsAiTeokGKkTx46RRxxEUgrwGgF4MWNNEJCGgYTvpgnY1IJWg5RzfqLgvcIgktX0i8dmMlFA8qCQ5L0Z/WObPLUxT1i4lWSYDISoEfBYGvM+LlMQQdkLHoWRRZ8zYQI62Thswe5WTORGwNXDcGjqeOA9AF7B8rhzsxMBEoJ8oJKaqPu4hblHMCMPwl9XeNWyb8xkB/DDGYKfMAE6aFL7xesZ389JlgG3XHEMI6UPDOP6JHHu67T2pwNPI69mCP4rEaBDUAJaKc/AOuXiwH07VCS3w5+UQMAuF/WqGI+yFIwVNBwemBD4r0wgQiKoFZa00sEYTwss32lA1tPwVxtc8jQ5/gWCwmGCyUD8vRT0sHBFW4GJDvZmrJFWRY1EkrGA6ZB8/10fOZSSj0E6F+BSP7xidiIzhBmKB09lEwHPkG+UQIyEN44EBiT5vrv2uJXyPQqSqO930fxvcvwbR/+JAkD9EfASgI9EHlp6YiHO4W+cAB20SnrFqxBbNljiXf1Pl1K2S0HCWfiog3YlAD5RGwwxK6oUjTweuVigLjyB0mX410mAFnMoVK1lvvUvgt8fUJH0JVyjuvcmg4dE5mUiFtD24AZ4qBVELxXKS+pMxN43kSdzNwudJ+bQbLlmnxvPOQoCugSap1GnSRoG8KOiKbH+rIA0lEeSAg3y6eeQ6XI2nrYnrPM89bUTgI0Pdqvl50vlNbtZxDUBcLBK0kPd5jPziyLdojJIN0pq5/mdzwL4UVvVInV5ncQEPNOUxa9d0TU+CW5l+FoI0GSDKHVVSOs+0KOsZoxwOzSZNFGv0mQ9avyLCh2Hpm+70Y0YJoJVgmQv822wnDC8Miq6VjJ5IFed0QD1YiAbT+nQE8v/RMZfmgmcCRHIIu7Bmcp39oM9fqEychcA747KxQ/AEyqQonl7hATtJmnhO2XYtgcia01aSbVMenAXrIomPcLgEBA4liGBzFZAT8zBYqW6brI67wg8sFVhxBhwLwBP2+tqBQqqK7VJKGh/BRrfTr6nWL7nYBaZdBJHqrX3kPEPap56xwE/GvjJTRMADeMCdcGpGXL1Xh4ZL8BDOlWkUpegfi0CeDzeA5YITzEnddv+IXL+UYCmqIvqC9UlUC/ki9FipwVjunL3yX7dOTLeXmVMAhbsGporPfyOBTm/BJ23gTVehsvXRnSewagUfpBXF3p5pygKS7OceqTjb7h2vjr/XKm0ZofKSI2Q/J102wHzatZkJPYQ5JoKsuK+EoHJakVzubzuLQDepCKllTZi9AG0DYg9ZLxhFaZsOu7bvlmVI5oPXJMQJcHxHClSln1apFTvAimeg48u0RWFeZW4lVcjbQWZuIQK1KozZfIDO6CSQmQQXdpBaiKZyEWThVK1uEc6v7V7uK0ysduExPZx4vysDR+4SelhBYm0R6LBuR4PXts8MYMcJPsINo4YZCDLj0sgB0/vLpPXvA2Tn42Cv5rsLulGubzW0sEd3d4W/mJt2Kck+DzDMijfPLOjyrDhXSh852B+OvflqAkoyXO1cYfujtc/i3jJSAwhgfFlp20laMLOku/bC7prgqW7lCn4auE5NhcXPd3M7x70+IceSgZvNljCd9k3fLjYsPElqLR14PXQZqD2ZNkkrAB79UeJUebFQmXpf8ZcAQt2XrMQdyNUVBqZoUzAFyp3V3xi/MubUA/mCT4Fhf038PC8XplhWnCmnK/ZzyC2BSTRSqKVOuY2kB8Jia0lvvRIVoP+vVWJbYarf6p655E2/nANBMCWkgD49DA0VAMyI1OLFMYCXiU9bmzi9/y5i/vsaTpHPHidTofzLbM65vMPva9HlovgXp0AvjtaqYMfDD0/4mAsYE92pxa+9k1QgCnRVObCpojpzsKTPvayPetTEgBdwnssjuc0kOBFX+q3HwRQxdrOLAqeYRjkMk/trTSu2Z9Lik7CfF0AvjtqAhS4NHobGXUnB5DQs8hG8p/wMX1r4+8xkmyvQ50JVq72TVeXbz3HvpWaQJi57hJYTw4kGbtS+C2TigQUtZUX+X27QQq2ePBZBru/0lxTm8fOOQ5yaZOZMAV+he4FqIMB+LQB0UgMSajANX29j+vbmly8ipRvHeSQoQOkM5iFXcPQCVwDMs5RBCQmaPOyvbNd6uwvQJ183BZQG3Zc+Eiv7vQOKu8YeDmMcJlt2ckyftVeMIGLBCmdMHl/tFILYwGPjXWO3zOfSq/+om+oa7Mlh2fpSsRGLp7RAW3FUVjNHgiMhyE6zBFjM2BdkdJGO7nP1kJXWAtBuBpPIAu7f+hhu7bFXIuC5xWrf0X2xreykOsUyKkF2gwadbrXDcXrfKxR43zGcSj4t/cCgr+a1iy6EjE5GYktUCl9fwfMeylyooGF48bN2IGLTw8x7StS7sj8TF9FmPGWQhm3rRR+o9lhvjJvSYAdfDUevI1M6bnX/OwWaDMOQ8RPgKRo0eulBTdT8AW2kl8e9L7UHghHwMfLiZPNoSpx0yugpQZaFqKWqxVSM3a2pN1SAhC2jf94I7ybBI7EL5A2Wvu5ht3xsoEt4+Ay/abXgCQAxyOeDsDlTCQzy75ohcGgv9Tra9uiymRUYTLrswOLlCdfAQf7HPDQQ4ErAH5EDXB9cMxWYpjtXApRncojS0sbV/cCgHTHwGNBJy+1PQE2x56FpaVR7wfQGZ37V+V+19EiHNvR6q1fRUjqvbjbMq1/qfHxbTrE10ePY2gPFk48D2CVMTf1AF4PXvyYR9dV6Wf7H413m3xTWQvYGhQ7mfYwA5mAX+18Vue05v/8jG/fZX/IW5MKPKtjSYlt0ellxh+/BOCPAwYaeVr0QofZFxJWVWC8znG70au6llVmktsF0bfHF6k8fvZ5esZJbwHwwnjg59tXz6sL/P0NUZDuSNu1mnJ8Vab17+cy005A9wtOpp3i0bZdpJLUil00semAwN45LgEViZYe3amNye0B6A9chviSlzXVsFtyN5/1H3gaNmMpn8Fz0GpYFp6Zw615H/LpUuRQQDMCL82n5DpBSawkvzIdN2ypiT8nSLth8Pk9jnjwdFzH3W4XW6KMBfwB569NdcGX93mC16tTflcArcYUc/mFuYbV+8zY0SAjAVoNErNgWjtwumJ3wbn/HlBFYdxHvSkJJEc+Ngal9opSwyo9YlITX2C/P/+gf8sxURSLR+mcZUmeqaS9wrh6vxW5zxFCOqFi90RbDWq/YwZmnu1+a6OvdpvRqkNxxe44lyl4OobEnpKA6Uox5EfH9xzPs/HRKrTPWdIQrK1VZDU7ETiD3Obpl+8wPPCRBbkbwNtpW9AbBe5L1SMlj3tdTxk/9W47JUmqS5HU+JzYymUKXjtWVmT9RenIhgXc+nroWLyxXJhmL112OdB8GCsk4f8oZJucnvmmtR85mBn10GZ0EKSCMUSAR3ukcXd5s7LvLD3me61WkuTCpJzYAyRurMB44EdEJzTfU271lUJC03YjXJXzYOGZwN4D8eB5jlfLrdWfzGRW7icMPfiSO6Oe7s20bmhdgLX4Z23B+s3JgQESzUDiMboSzDMHFpNMwccGePauhfwjzwnI2wu9zKGgEFg80jcZ7MHllk07s1H+5yojtUQTlH4nFdLKTGwDmPbIklOb1L1zO4T6N8NCuDLFLS/C63c0eNRimZ++s5BMBHxU11jHchI9oFVUxRh/eMDzHEzGYu0Lg8gJ7oS/tFCwoic44fyUtix0n/46vP4bf+//BRgAYwDDar4ncHIAAAAASUVORK5CYII=';
        }
    }
    abstract class Action {
        protected $view = null;
        private $name = '';
        protected $config = array();
        public function __construct() {
            tag('action_begin', $this->config);
            $this->view = Think::instance('View');
            if (method_exists($this, '_initialize')) $this->_initialize();
        }
        protected function getActionName() {
            if (empty($this->name)) {
                $this->name = substr(get_class($this) , 0, -6);
            }
            return $this->name;
        }
        protected function isAjax() {
            if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
                if ('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) return true;
            }
            if (!empty($_POST[C('VAR_AJAX_SUBMIT') ]) || !empty($_GET[C('VAR_AJAX_SUBMIT') ])) return true;
            return false;
        }
        protected function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
            $this->view->display($templateFile, $charset, $contentType, $content, $prefix);
        }
        protected function show($content, $charset = '', $contentType = '', $prefix = '') {
            $this->view->display('', $charset, $contentType, $content, $prefix);
        }
        protected function fetch($templateFile = '', $content = '', $prefix = '') {
            return $this->view->fetch($templateFile, $content, $prefix);
        }
        protected function buildHtml($htmlfile = '', $htmlpath = '', $templateFile = '') {
            $content = $this->fetch($templateFile);
            $htmlpath = !empty($htmlpath) ? $htmlpath : HTML_PATH;
            $htmlfile = $htmlpath . $htmlfile . C('HTML_FILE_SUFFIX');
            if (!is_dir(dirname($htmlfile))) mkdir(dirname($htmlfile) , 0755, true);
            if (false === file_put_contents($htmlfile, $content)) throw_exception(L('_CACHE_WRITE_ERROR_') . ':' . $htmlfile);
            return $content;
        }
        protected function theme($theme) {
            $this->view->theme($theme);
            return $this;
        }
        protected function assign($name, $value = '') {
            $this->view->assign($name, $value);
            return $this;
        }
        public function __set($name, $value) {
            $this->assign($name, $value);
        }
        public function get($name = '') {
            return $this->view->get($name);
        }
        public function __get($name) {
            return $this->get($name);
        }
        public function __isset($name) {
            return $this->get($name);
        }
        public function __call($method, $args) {
            if (0 === strcasecmp($method, ACTION_NAME . C('ACTION_SUFFIX'))) {
                if (method_exists($this, '_empty')) {
                    $this->_empty($method, $args);
                } elseif (file_exists_case($this->view->parseTemplate())) {
                    $this->display();
                } elseif (function_exists('__hack_action')) {
                    __hack_action();
                } else {
                    _404(L('_ERROR_ACTION_') . ':' . ACTION_NAME);
                }
            } else {
                switch (strtolower($method)) {
                    case 'ispost':
                    case 'isget':
                    case 'ishead':
                    case 'isdelete':
                    case 'isput':
                        return strtolower($_SERVER['REQUEST_METHOD']) == strtolower(substr($method, 2));
                    case '_get':
                        $input = & $_GET;
                        break;

                    case '_post':
                        $input = & $_POST;
                        break;

                    case '_put':
                        parse_str(file_get_contents('php://input') , $input);
                        break;

                    case '_param':
                        switch ($_SERVER['REQUEST_METHOD']) {
                            case 'POST':
                                $input = $_POST;
                                break;

                            case 'PUT':
                                parse_str(file_get_contents('php://input') , $input);
                                break;

                            default:
                                $input = $_GET;
                        }
                        if (C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS') ])) {
                            $input = array_merge($input, $_GET[C('VAR_URL_PARAMS') ]);
                        }
                        break;

                    case '_request':
                        $input = & $_REQUEST;
                        break;

                    case '_session':
                        $input = & $_SESSION;
                        break;

                    case '_cookie':
                        $input = & $_COOKIE;
                        break;

                    case '_server':
                        $input = & $_SERVER;
                        break;

                    case '_globals':
                        $input = & $GLOBALS;
                        break;

                    default:
                        throw_exception(__CLASS__ . ':' . $method . L('_METHOD_NOT_EXIST_'));
                }
                if (!isset($args[0])) {
                    $data = $input;
                } elseif (isset($input[$args[0]])) {
                    $data = $input[$args[0]];
                    $filters = isset($args[1]) ? $args[1] : C('DEFAULT_FILTER');
                    if ($filters) {
                        $filters = explode(',', $filters);
                        foreach ($filters as $filter) {
                            if (function_exists($filter)) {
                                $data = is_array($data) ? array_map($filter, $data) : $filter($data);
                            }
                        }
                    }
                } else {
                    $data = isset($args[2]) ? $args[2] : NULL;
                }
                Log::record('建议使用I方法替代' . $method, Log::NOTICE);
                return $data;
            }
        }
        protected function error($message = '', $jumpUrl = '', $ajax = false) {
            $this->dispatchJump($message, 0, $jumpUrl, $ajax);
        }
        protected function success($message = '', $jumpUrl = '', $ajax = false) {
            $this->dispatchJump($message, 1, $jumpUrl, $ajax);
        }
        protected function ajaxReturn($data, $type = '') {
            if (func_num_args() > 2) {
                $args = func_get_args();
                array_shift($args);
                $info = array();
                $info['data'] = $data;
                $info['info'] = array_shift($args);
                $info['status'] = array_shift($args);
                $data = $info;
                $type = $args ? array_shift($args) : '';
            }
            if (empty($type)) $type = C('DEFAULT_AJAX_RETURN');
            switch (strtoupper($type)) {
                case 'JSON':
                    header('Content-Type:application/json; charset=utf-8');
                    exit(json_encode($data));
                case 'XML':
                    header('Content-Type:text/xml; charset=utf-8');
                    exit(xml_encode($data));
                case 'JSONP':
                    header('Content-Type:application/json; charset=utf-8');
                    $handler = isset($_GET[C('VAR_JSONP_HANDLER') ]) ? $_GET[C('VAR_JSONP_HANDLER') ] : C('DEFAULT_JSONP_HANDLER');
                    exit($handler . '(' . json_encode($data) . ');');
                case 'EVAL':
                    header('Content-Type:text/html; charset=utf-8');
                    exit($data);
                default:
                    tag('ajax_return', $data);
            }
        }
        protected function redirect($url, $params = array() , $delay = 0, $msg = '') {
            $url = U($url, $params);
            redirect($url, $delay, $msg);
        }
        private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false) {
            if (true === $ajax || IS_AJAX) {
                $data = is_array($ajax) ? $ajax : array();
                $data['info'] = $message;
                $data['status'] = $status;
                $data['url'] = $jumpUrl;
                $this->ajaxReturn($data);
            }
            if (is_int($ajax)) $this->assign('waitSecond', $ajax);
            if (!empty($jumpUrl)) $this->assign('jumpUrl', $jumpUrl);
            $this->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
            if ($this->get('closeWin')) $this->assign('jumpUrl', 'javascript:window.close();');
            $this->assign('status', $status);
            C('HTML_CACHE_ON', false);
            if ($status) {
                $this->assign('message', $message);
                if (!isset($this->waitSecond)) $this->assign('waitSecond', '1');
                if (!isset($this->jumpUrl)) $this->assign("jumpUrl", $_SERVER["HTTP_REFERER"]);
                $this->display(C('TMPL_ACTION_SUCCESS'));
            } else {
                $this->assign('error', $message);
                if (!isset($this->waitSecond)) $this->assign('waitSecond', '3');
                if (!isset($this->jumpUrl)) $this->assign('jumpUrl', "javascript:history.back(-1);");
                $this->display(C('TMPL_ACTION_ERROR'));
                exit;
            }
        }
        public function __destruct() {
            tag('action_end');
        }
    }
    class View {
        protected $tVar = array();
        protected $theme = '';
        public function assign($name, $value = '') {
            if (is_array($name)) {
                $this->tVar = array_merge($this->tVar, $name);
            } else {
                $this->tVar[$name] = $value;
            }
        }
        public function get($name = '') {
            if ('' === $name) {
                return $this->tVar;
            }
            return isset($this->tVar[$name]) ? $this->tVar[$name] : false;
        }
        public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
            G('viewStartTime');
            tag('view_begin', $templateFile);
            $content = $this->fetch($templateFile, $content, $prefix);
            $this->render($content, $charset, $contentType);
            tag('view_end');
        }
        private function render($content, $charset = '', $contentType = '') {
            if (empty($charset)) $charset = C('DEFAULT_CHARSET');
            if (empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE');
            header('Content-Type:' . $contentType . '; charset=' . $charset);
            header('Cache-control: ' . C('HTTP_CACHE_CONTROL'));
            header('X-Powered-By:ThinkPHP');
            echo $content;
        }
        public function fetch($templateFile = '', $content = '', $prefix = '') {
            if (empty($content)) {
                $templateFile = $this->parseTemplate($templateFile);
                if (!is_file($templateFile)) throw_exception(L('_TEMPLATE_NOT_EXIST_') . '[' . $templateFile . ']');
            }
            ob_start();
            ob_implicit_flush(0);
            if ('php' == strtolower(C('TMPL_ENGINE_TYPE'))) {
                extract($this->tVar, EXTR_OVERWRITE);
                empty($content) ? include $templateFile : eval('?>' . $content);
            } else {
                $params = array(
                    'var' => $this->tVar,
                    'file' => $templateFile,
                    'content' => $content,
                    'prefix' => $prefix
                );
                tag('view_parse', $params);
            }
            $content = ob_get_clean();
            tag('view_filter', $content);
            return $content;
        }
        public function parseTemplate($template = '') {
            $app_name = APP_NAME == basename(dirname($_SERVER['SCRIPT_FILENAME'])) && '' == __APP__ ? '' : APP_NAME . '/';
            if (is_file($template)) {
                $group = defined('GROUP_NAME') ? GROUP_NAME . '/' : '';
                $theme = C('DEFAULT_THEME');
                if (1 == C('APP_GROUP_MODE')) {
                    define('THEME_PATH', dirname(BASE_LIB_PATH) . '/' . $group . basename(TMPL_PATH) . '/' . $theme);
                    define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . C('APP_GROUP_PATH') . '/' . $group . basename(TMPL_PATH) . '/' . $theme);
                } else {
                    define('THEME_PATH', TMPL_PATH . $group . $theme);
                    define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . basename(TMPL_PATH) . '/' . $group . $theme);
                }
                return $template;
            }
            $depr = C('TMPL_FILE_DEPR');
            $template = str_replace(':', $depr, $template);
            $theme = $this->getTemplateTheme();
            $group = defined('GROUP_NAME') ? GROUP_NAME . '/' : '';
            if (defined('GROUP_NAME') && strpos($template, '@')) {
                list($group, $template) = explode('@', $template);
                $group.= '/';
            }
            if (1 == C('APP_GROUP_MODE')) {
                define('THEME_PATH', dirname(BASE_LIB_PATH) . '/' . $group . basename(TMPL_PATH) . '/' . $theme);
                define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . C('APP_GROUP_PATH') . '/' . $group . basename(TMPL_PATH) . '/' . $theme);
            } else {
                define('THEME_PATH', TMPL_PATH . $group . $theme);
                define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . basename(TMPL_PATH) . '/' . $group . $theme);
            }
            if ('' == $template) {
                $template = MODULE_NAME . $depr . ACTION_NAME;
            } elseif (false === strpos($template, '/')) {
                $template = MODULE_NAME . $depr . $template;
            }
            return THEME_PATH . $template . C('TMPL_TEMPLATE_SUFFIX');
        }
        public function theme($theme) {
            $this->theme = $theme;
            return $this;
        }
        private function getTemplateTheme() {
            if ($this->theme) {
                $theme = $this->theme;
            } else {
                $theme = C('DEFAULT_THEME');
                if (C('TMPL_DETECT_THEME')) {
                    $t = C('VAR_TEMPLATE');
                    if (isset($_GET[$t])) {
                        $theme = $_GET[$t];
                    } elseif (cookie('think_template')) {
                        $theme = cookie('think_template');
                    }
                    if (!in_array($theme, explode(',', C('THEME_LIST')))) {
                        $theme = C('DEFAULT_THEME');
                    }
                    cookie('think_template', $theme, 864000);
                }
            }
            define('THEME_NAME', $theme);
            return $theme ? $theme . '/' : '';
        }
    }
    L(array(
        '_MODULE_NOT_EXIST_' => '无法加载模块',
        '_ERROR_ACTION_' => '非法操作',
        '_LANGUAGE_NOT_LOAD_' => '无法加载语言包',
        '_TEMPLATE_NOT_EXIST_' => '模板不存在',
        '_MODULE_' => '模块',
        '_ACTION_' => '操作',
        '_ACTION_NOT_EXIST_' => '控制器不存在或者没有定义',
        '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义',
        '_VALID_ACCESS_' => '没有权限',
        '_XML_TAG_ERROR_' => 'XML标签语法错误',
        '_DATA_TYPE_INVALID_' => '非法数据对象!',
        '_OPERATION_WRONG_' => '操作出现错误',
        '_NOT_LOAD_DB_' => '无法加载数据库',
        '_NO_DB_DRIVER_' => '无法加载数据库驱动',
        '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库',
        '_NO_DB_CONFIG_' => '没有定义数据库配置',
        '_NOT_SUPPERT_' => '系统不支持',
        '_CACHE_TYPE_INVALID_' => '无法加载缓存类型',
        '_FILE_NOT_WRITEABLE_' => '目录(文件)不可写',
        '_METHOD_NOT_EXIST_' => '您所请求的方法不存在!',
        '_CLASS_NOT_EXIST_' => '实例化一个不存在的类!',
        '_CLASS_CONFLICT_' => '类名冲突',
        '_TEMPLATE_ERROR_' => '模板引擎错误',
        '_CACHE_WRITE_ERROR_' => '缓存文件写入失败!',
        '_TAGLIB_NOT_EXIST_' => '标签库未定义',
        '_OPERATION_FAIL_' => '操作失败!',
        '_OPERATION_SUCCESS_' => '操作成功!',
        '_SELECT_NOT_EXIST_' => '记录不存在!',
        '_EXPRESS_ERROR_' => '表达式错误',
        '_TOKEN_ERROR_' => '表单令牌错误',
        '_RECORD_HAS_UPDATE_' => '记录已经更新',
        '_NOT_ALLOW_PHP_' => '模板禁用PHP代码',
        '_PARAM_ERROR_' => '参数错误或者未定义',
    ));
    C(array(
        'app_status' => 'debug',
        'app_file_case' => false,
        'app_autoload_path' => '',
        'app_tags_on' => true,
        'app_sub_domain_deploy' => false,
        'app_sub_domain_rules' => array() ,
        'app_sub_domain_deny' => array() ,
        'app_group_list' => 'Home,Admin',
        'app_group_mode' => 0,
        'app_group_path' => 'Modules',
        'action_suffix' => '',
        'cookie_expire' => 0,
        'cookie_domain' => '',
        'cookie_path' => '/',
        'cookie_prefix' => '',
        'default_m_layer' => 'Model',
        'default_c_layer' => 'Action',
        'default_v_layer' => 'Tpl',
        'default_app' => '@',
        'default_lang' => 'zh-cn',
        'default_theme' => '',
        'default_group' => 'Home',
        'default_module' => 'Index',
        'default_action' => 'index',
        'default_charset' => 'utf-8',
        'default_timezone' => 'PRC',
        'default_ajax_return' => 'JSON',
        'default_jsonp_handler' => 'jsonpReturn',
        'default_filter' => 'htmlspecialchars',
        'db_type' => 'mysql',
        'db_host' => 'localhost',
        'db_name' => 'employees',
        'db_user' => 'root',
        'db_pwd' => 'pq52ss63',
        'db_port' => '3306',
        'db_prefix' => '',
        'db_fieldtype_check' => false,
        'db_fields_cache' => true,
        'db_charset' => 'utf8',
        'db_deploy_type' => 0,
        'db_rw_separate' => false,
        'db_master_num' => 1,
        'db_slave_no' => '',
        'db_sql_build_cache' => false,
        'db_sql_build_queue' => 'file',
        'db_sql_build_length' => 20,
        'db_sql_log' => false,
        'data_cache_time' => 0,
        'data_cache_compress' => false,
        'data_cache_check' => false,
        'data_cache_prefix' => '',
        'data_cache_type' => 'File',
        'data_cache_path' => './App/Runtime/Temp/',
        'data_cache_subdir' => false,
        'data_path_level' => 1,
        'error_message' => '页面错误!请稍后再试~',
        'error_page' => '',
        'show_error_msg' => false,
        'trace_exception' => false,
        'log_record' => false,
        'log_type' => 3,
        'log_dest' => '',
        'log_extra' => '',
        'log_level' => 'EMERG,ALERT,CRIT,ERR',
        'log_file_size' => 2097152,
        'log_exception_record' => false,
        'session_auto_start' => true,
        'session_options' => array() ,
        'session_type' => '',
        'session_prefix' => '',
        'tmpl_content_type' => 'text/html',
        'tmpl_action_error' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/dispatch_jump.tpl',
        'tmpl_action_success' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/dispatch_jump.tpl',
        'tmpl_exception_file' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/think_exception.tpl',
        'tmpl_detect_theme' => false,
        'tmpl_template_suffix' => '.html',
        'tmpl_file_depr' => '/',
        'url_case_insensitive' => false,
        'url_model' => 1,
        'url_pathinfo_depr' => '/',
        'url_pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL',
        'url_html_suffix' => 'html',
        'url_deny_suffix' => 'ico|png|gif|jpg',
        'url_params_bind' => true,
        'url_404_redirect' => '',
        'var_group' => 'g',
        'var_module' => 'm',
        'var_action' => 'a',
        'var_ajax_submit' => 'ajax',
        'var_jsonp_handler' => 'callback',
        'var_pathinfo' => 's',
        'var_url_params' => '_URL_',
        'var_template' => 't',
        'var_filters' => 'filter_exp',
        'output_encode' => false,
        'http_cache_control' => 'private',
        'extends' => array(
            'app_init' => array() ,
            'app_begin' => array(
                0 => 'ReadHtmlCache',
            ) ,
            'route_check' => array(
                0 => 'CheckRoute',
            ) ,
            'app_end' => array() ,
            'path_info' => array() ,
            'action_begin' => array() ,
            'action_end' => array() ,
            'view_begin' => array() ,
            'view_parse' => array(
                0 => 'ParseTemplate',
            ) ,
            'view_filter' => array(
                0 => 'ContentReplace',
                1 => 'TokenBuild',
                2 => 'WriteHtmlCache',
                3 => 'ShowRuntime',
            ) ,
            'view_end' => array(
                0 => 'ShowPageTrace',
            ) ,
        ) ,
    ));
    G('loadTime');
    Think::Start();



你可能感兴趣的:(Thinkphp ~runtime.php)