Code

Updated smarty to 3.0.4
authorcajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 16 Nov 2010 13:45:48 +0000 (13:45 +0000)
committercajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 16 Nov 2010 13:45:48 +0000 (13:45 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@20235 594d385d-05f5-0310-b6e9-bd551577e9d8

70 files changed:
gosa-core/include/smarty/Smarty.class.php
gosa-core/include/smarty/plugins/block.php.php
gosa-core/include/smarty/plugins/block.textformat.php
gosa-core/include/smarty/plugins/function.counter.php
gosa-core/include/smarty/plugins/function.cycle.php
gosa-core/include/smarty/plugins/function.fetch.php
gosa-core/include/smarty/plugins/function.html_checkboxes.php
gosa-core/include/smarty/plugins/function.html_image.php
gosa-core/include/smarty/plugins/function.html_options.php
gosa-core/include/smarty/plugins/function.html_radios.php
gosa-core/include/smarty/plugins/function.html_select_date.php
gosa-core/include/smarty/plugins/function.html_select_time.php
gosa-core/include/smarty/plugins/function.html_table.php
gosa-core/include/smarty/plugins/function.mailto.php
gosa-core/include/smarty/plugins/function.math.php
gosa-core/include/smarty/plugins/function.popup.php
gosa-core/include/smarty/plugins/function.popup_init.php
gosa-core/include/smarty/sysplugins/smarty_internal_cacheresource_file.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_append.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_assign.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_block.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_break.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_call.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_capture.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_config_load.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_continue.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_debug.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_eval.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_extends.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_for.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_foreach.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_function.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_if.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_include.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_include_php.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_insert.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_ldelim.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_nocache.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_block_plugin.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_function_plugin.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_modifier.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_object_block_function.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_object_function.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_print_expression.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_registered_block.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_registered_function.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_private_special_variable.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_rdelim.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_section.php
gosa-core/include/smarty/sysplugins/smarty_internal_compile_while.php
gosa-core/include/smarty/sysplugins/smarty_internal_compilebase.php
gosa-core/include/smarty/sysplugins/smarty_internal_config.php
gosa-core/include/smarty/sysplugins/smarty_internal_config_file_compiler.php
gosa-core/include/smarty/sysplugins/smarty_internal_data.php
gosa-core/include/smarty/sysplugins/smarty_internal_debug.php
gosa-core/include/smarty/sysplugins/smarty_internal_filter.php [new file with mode: 0644]
gosa-core/include/smarty/sysplugins/smarty_internal_nocache_insert.php
gosa-core/include/smarty/sysplugins/smarty_internal_register.php
gosa-core/include/smarty/sysplugins/smarty_internal_resource_eval.php
gosa-core/include/smarty/sysplugins/smarty_internal_resource_extends.php
gosa-core/include/smarty/sysplugins/smarty_internal_resource_file.php
gosa-core/include/smarty/sysplugins/smarty_internal_resource_php.php
gosa-core/include/smarty/sysplugins/smarty_internal_resource_registered.php
gosa-core/include/smarty/sysplugins/smarty_internal_template.php
gosa-core/include/smarty/sysplugins/smarty_internal_templatecompilerbase.php
gosa-core/include/smarty/sysplugins/smarty_internal_templatelexer.php
gosa-core/include/smarty/sysplugins/smarty_internal_templateparser.php
gosa-core/include/smarty/sysplugins/smarty_internal_utility.php
gosa-core/include/smarty/sysplugins/smarty_internal_wrapper.php
gosa-core/include/smarty/sysplugins/smarty_security.php

index 1e3ffbd55e08d38a0df472d3ca29e97d659f85e8..213d01b0593d3b844cb4b28f076533190ae48b7b 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * Project:     Smarty: the PHP compiling template engine
  * File:        Smarty.class.php
- * SVN:         $Id: Smarty.class.php 3669 2010-09-17 18:10:10Z uwe.tews@googlemail.com $
+ * SVN:         $Id: Smarty.class.php 3788 2010-11-13 18:32:50Z uwe.tews@googlemail.com $
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
  * @author Monte Ohrt <monte at ohrt dot com> 
  * @author Uwe Tews 
  * @package Smarty
- * @version 3-SVN$Rev: 3286 $
+ * @version 3.0.4
  */
 
 /**
@@ -63,30 +63,6 @@ if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
     define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
 } 
 
-/**
- * define variable scopes
- */
-define('SMARTY_LOCAL_SCOPE', 0);
-define('SMARTY_PARENT_SCOPE', 1);
-define('SMARTY_ROOT_SCOPE', 2);
-define('SMARTY_GLOBAL_SCOPE', 3);
-
-/**
- * define caching modes
- */
-define('SMARTY_CACHING_OFF', 0);
-define('SMARTY_CACHING_LIFETIME_CURRENT', 1);
-define('SMARTY_CACHING_LIFETIME_SAVED', 2);
-
-/**
- * This determines how Smarty handles "<?php ... ?>" tags in templates.
- * possible values:
- */
-define('SMARTY_PHP_PASSTHRU', 0); //-> print tags as plain text
-define('SMARTY_PHP_QUOTE', 1); //-> escape tags as entities
-define('SMARTY_PHP_REMOVE', 2); //-> escape tags as entities
-define('SMARTY_PHP_ALLOW', 3); //-> escape tags as entities
-
 /**
  * register the class autoloader
  */
@@ -107,8 +83,45 @@ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR
  * This is the main Smarty class
  */
 class Smarty extends Smarty_Internal_Data {
+       /**
+       * constant definitions
+       */
     // smarty version
-    const SMARTY_VERSION = 'Smarty3rc4'; 
+    const SMARTY_VERSION = 'Smarty-3.0.4'; 
+       //define variable scopes
+       const SCOPE_LOCAL = 0;
+       const SCOPE_PARENT = 1;
+       const SCOPE_ROOT = 2;
+       const SCOPE_GLOBAL = 3;
+       // define caching modes
+       const CACHING_OFF = 0;
+       const CACHING_LIFETIME_CURRENT = 1;
+       const CACHING_LIFETIME_SAVED = 2;
+       /** modes for handling of "<?php ... ?>" tags in templates. **/
+       const PHP_PASSTHRU = 0; //-> print tags as plain text
+       const PHP_QUOTE = 1; //-> escape tags as entities
+       const PHP_REMOVE = 2; //-> escape tags as entities
+       const PHP_ALLOW = 3; //-> escape tags as entities
+       // filter types
+       const FILTER_POST = 'post';
+       const FILTER_PRE = 'pre';
+       const FILTER_OUTPUT = 'output';
+       const FILTER_VARIABLE = 'variable';
+       // plugin types
+       const PLUGIN_FUNCTION = 'function';
+       const PLUGIN_BLOCK = 'block';
+       const PLUGIN_COMPILER = 'compiler';
+       const PLUGIN_MODIFIER = 'modifier';
+
+       /**
+       * static variables
+       */
+    // assigned global tpl vars
+    static $global_tpl_vars = array(); 
+
+       /**
+       * variables
+       */
     // auto literal on delimiters with whitspace
     public $auto_literal = true; 
     // display error on not assigned variables
@@ -137,7 +150,7 @@ class Smarty extends Smarty_Internal_Data {
     public $compile_error = false; 
     // caching enabled
     public $caching = false; 
-    // merge compiled includea
+    // merge compiled includes
     public $merge_compiled_includes = false; 
     // cache lifetime
     public $cache_lifetime = 3600; 
@@ -152,12 +165,10 @@ class Smarty extends Smarty_Internal_Data {
     public $right_delimiter = "}"; 
     // security
     public $security_class = 'Smarty_Security';
-    public $php_handling = SMARTY_PHP_PASSTHRU;
+    public $security_policy = null;
+    public $php_handling = self::PHP_PASSTHRU;
     public $allow_php_tag = false;
     public $allow_php_templates = false;
-    public $security = false;
-    public $security_policy = null;
-    public $security_handler = null;
     public $direct_access_security = true; 
     public $trusted_dir = array();
     // debug mode
@@ -175,8 +186,6 @@ class Smarty extends Smarty_Internal_Data {
     public $config_vars = array(); 
     // assigned tpl vars
     public $tpl_vars = array(); 
-    // assigned global tpl vars
-    public $global_tpl_vars = array(); 
     // dummy parent object
     public $parent = null; 
     // global template functions
@@ -187,8 +196,6 @@ class Smarty extends Smarty_Internal_Data {
     public $caching_type = 'file'; 
     // internal cache resource types
     public $cache_resource_types = array('file'); 
-    // internal cache resource objects
-    public $cache_resource_objects = array(); 
     // internal config properties
     public $properties = array(); 
     // config type
@@ -207,6 +214,8 @@ class Smarty extends Smarty_Internal_Data {
     public $registered_classes = array(); 
     // registered filters
     public $registered_filters = array(); 
+    // registered resources
+    public $registered_resources = array(); 
     // autoload filter
     public $autoload_filters = array(); 
     // status of filter on variable output
@@ -221,25 +230,22 @@ class Smarty extends Smarty_Internal_Data {
     public $_file_perms = 0644; 
     // default dir permissions
     public $_dir_perms = 0771; 
-    // smarty object reference
-    public $smarty = null; 
     // block tag hierarchy
     public $_tag_stack = array(); 
     // flag if {block} tag is compiled for template inheritance
     public $inheritance = false;
-    // plugins
-    public $_plugins = array(); 
     // generate deprecated function call notices?
     public $deprecation_notices = true;
+    // Smarty 2 BC
+    public $_version = self::SMARTY_VERSION;
 
     /**
      * Class constructor, initializes basic smarty properties
      */
     public function __construct()
     { 
-        // self reference needed by other classes methods
-        $this->smarty = $this;
-
+               // selfpointer need by some other class methods
+               $this->smarty = $this;
         if (is_callable('mb_internal_encoding')) {
             mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET);
         } 
@@ -310,8 +316,9 @@ class Smarty extends Smarty_Internal_Data {
         // create template object if necessary
         ($template instanceof $this->template_class)? $_template = $template :
         $_template = $this->createTemplate ($template, $cache_id, $compile_id, $parent);
-        $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
-            ? $this->error_reporting : error_reporting() &~E_NOTICE); 
+        if (isset($this->error_reporting)) {
+               $_smarty_old_error_level = error_reporting($this->error_reporting);
+       }
         // obtain data for cache modified check
         if ($this->cache_modified_check && $this->caching && $display) {
             $_isCached = $_template->isCached() && !$_template->has_nocache_code;
@@ -328,7 +335,9 @@ class Smarty extends Smarty_Internal_Data {
             $_output = $_template->getRenderedTemplate();
         } 
         $_template->rendered_content = null;
-        error_reporting($_smarty_old_error_level); 
+        if (isset($this->error_reporting)) {
+               error_reporting($_smarty_old_error_level);
+        } 
         // display or fetch
         if ($display) {
             if ($this->caching && $this->cache_modified_check) {
@@ -376,12 +385,16 @@ class Smarty extends Smarty_Internal_Data {
      * @param string $ |object $template the resource handle of the template file or template object
      * @param mixed $cache_id cache id to be used with this template
      * @param mixed $compile_id compile id to be used with this template
+     * @param object $parent next higher level of Smarty variables
      * @return boolean cache status
      */
-    public function isCached($template, $cache_id = null, $compile_id = null)
+    public function isCached($template, $cache_id = null, $compile_id = null, $parent = null)
     {
+       if ($parent === null) {
+               $parent = $this;
+       }
         if (!($template instanceof $this->template_class)) {
-            $template = $this->createTemplate ($template, $cache_id, $compile_id, $this);
+            $template = $this->createTemplate ($template, $cache_id, $compile_id, $parent);
         } 
         // return cache status of template
         return $template->isCached();
@@ -422,13 +435,13 @@ class Smarty extends Smarty_Internal_Data {
         if (!is_object($template)) {
             // we got a template resource
             // already in template cache?
-            $_templateId = crc32($template . $cache_id . $compile_id);
+            $_templateId =  sha1($template . $cache_id . $compile_id);
             if (isset($this->template_objects[$_templateId]) && $this->caching) {
                 // return cached template object
                 $tpl = $this->template_objects[$_templateId];
             } else {
                 // create new template object
-                $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
+                $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id);
             } 
         } else {
             // just return a copy of template class
@@ -443,51 +456,8 @@ class Smarty extends Smarty_Internal_Data {
         } 
         return $tpl;
     } 
-
-    /**
-     * Loads security class and enables security
-     */
-    public function enableSecurity()
-    {
-        if (isset($this->security_class)) {
-            $this->security_policy = new $this->security_class;
-            $this->security_handler = new Smarty_Internal_Security_Handler($this);
-            $this->security = true;
-        } else {
-            throw new SmartyException('Property security_class is not defined');
-        } 
-    } 
-
-    /**
-     * Disable security
-     */
-    public function disableSecurity()
-    {
-        $this->security = false;
-    } 
-
-    /**
-     * Set template directory
-     * 
-     * @param string $ |array $template_dir folder(s) of template sorces
-     */
-    public function setTemplateDir($template_dir)
-    {
-        $this->template_dir = (array)$template_dir;
-        return;
-    } 
-
-    /**
-     * Adds template directory(s) to existing ones
-     * 
-     * @param string $ |array $template_dir folder(s) of template sources
-     */
-    public function addTemplateDir($template_dir)
-    {
-        $this->template_dir = array_merge((array)$this->template_dir, (array)$template_dir);
-        $this->template_dir = array_unique($this->template_dir);
-        return;
-    } 
+    
+     
 
     /**
      * Check if a template resource exists
@@ -503,120 +473,138 @@ class Smarty extends Smarty_Internal_Data {
         // check if it does exists
         $result = $tpl->isExisting();
         $this->template_objects = $save;
-        unset ($tpl);
         return $result;
     } 
 
     /**
-     * Takes unknown classes and loads plugin files for them
-     * class name format: Smarty_PluginType_PluginName
-     * plugin filename format: plugintype.pluginname.php
+     * Returns a single or all global  variables
      * 
-     * @param string $plugin_name class plugin name to load
-     * @return string |boolean filepath of loaded file or false
+     * @param object $smarty 
+     * @param string $varname variable name or null
+     * @return string variable value or or array of variables
      */
-    public function loadPlugin($plugin_name, $check = true)
-    { 
-        // if function or class exists, exit silently (already loaded)
-        if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false)))
-            return true; 
-        // Plugin name is expected to be: Smarty_[Type]_[Name]
-        $_plugin_name = strtolower($plugin_name);
-        $_name_parts = explode('_', $_plugin_name, 3); 
-        // class name must have three parts to be valid plugin
-        if (count($_name_parts) < 3 || $_name_parts[0] !== 'smarty') {
-            throw new SmartyException("plugin {$plugin_name} is not a valid name format");
-            return false;
-        } 
-        // if type is "internal", get plugin from sysplugins
-        if ($_name_parts[1] == 'internal') {
-            $file = SMARTY_SYSPLUGINS_DIR . $_plugin_name . '.php';
-            if (file_exists($file)) {
-                require_once($file);
-                return $file;
+    function getGlobal($varname = null)
+    {
+        if (isset($varname)) {
+            if (isset(self::$global_tpl_vars[$varname])) {
+                return self::$global_tpl_vars[$varname]->value;
             } else {
-                return false;
-            } 
-        } 
-        // plugin filename is expected to be: [type].[name].php
-        $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; 
-        // loop through plugin dirs and find the plugin
-        foreach((array)$this->plugins_dir as $_plugin_dir) {
-            if (strpos('/\\', substr($_plugin_dir, -1)) === false) {
-                $_plugin_dir .= DS;
+                return '';
             } 
-            $file = $_plugin_dir . $_plugin_filename;
-            if (file_exists($file)) {
-                require_once($file);
-                return $file;
+        } else {
+            $_result = array();
+            foreach (self::$global_tpl_vars AS $key => $var) {
+                $_result[$key] = $var->value;
             } 
+            return $_result;
         } 
-        // no plugin loaded
-        return false;
     } 
 
     /**
-     * load a filter of specified type and name
-     * 
-     * @param string $type filter type
-     * @param string $name filter name
-     * @return bool 
+    * Empty cache folder
+    * 
+    * @param integer $exp_time expiration time
+    * @param string $type resource type
+    * @return integer number of cache files deleted
+    */
+    function clearAllCache($exp_time = null, $type = null)
+    { 
+       // load cache resource and call clearAll
+        return $this->loadCacheResource($type)->clearAll($exp_time);
+    }        
+
+    /**
+    * Empty cache for a specific template
+    * 
+    * @param string $template_name template name
+    * @param string $cache_id cache id
+    * @param string $compile_id compile id
+    * @param integer $exp_time expiration time
+    * @param string $type resource type
+    * @return integer number of cache files deleted
+    */
+    function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
+    { 
+       // load cache resource and call clear
+        return $this->loadCacheResource($type)->clear($template_name, $cache_id, $compile_id, $exp_time);
+    }
+
+    /**
+     * Loads security class and enables security
      */
-    function loadFilter($type, $name)
+    public function enableSecurity($security_class = null)
     {
-        $_plugin = "smarty_{$type}filter_{$name}";
-        $_filter_name = $_plugin;
-        if ($this->loadPlugin($_plugin)) {
-            if (class_exists($_plugin, false)) {
-                $_plugin = array($_plugin, 'execute');
-            } 
-            if (is_callable($_plugin)) {
-                return $this->registered_filters[$type][$_filter_name] = $_plugin;
-            } 
+       if ($security_class instanceof Smarty_Security) {
+                       $this->security_policy = $security_class;
+                       return;
+               }
+       if ($security_class == null) {
+               $security_class = $this->security_class;
+       }
+        if (class_exists($security_class)) {
+            $this->security_policy = new $security_class($this);
+        } else {
+            throw new SmartyException("Security class '$security_class' is not defined");
         } 
-        throw new SmartyException("{$type}filter \"{$name}\" not callable");
-        return false;
     } 
 
     /**
-     * Sets the exception handler for Smarty.
-     * 
-     * @param mixed $handler function name or array with object/method names
-     * @return string previous exception handler
+     * Disable security
      */
-    public function setExceptionHandler($handler)
+    public function disableSecurity()
     {
-        $this->exception_handler = $handler;
-        return set_exception_handler($handler);
+       $this->security_policy = null;
+    } 
+
+    /**
+    * Loads cache resource.
+    * 
+    * @param string $type cache resource type
+    * @return object of cache resource
+    */
+    public function loadCacheResource($type = null) {
+        if (!isset($type)) {
+            $type = $this->caching_type;
+        } 
+        if (in_array($type, $this->cache_resource_types)) {
+            $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
+            return new $cache_resource_class($this);
+        } 
+        else {
+            // try plugins dir
+            $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
+            if ($this->loadPlugin($cache_resource_class)) {
+                return new $cache_resource_class($this);
+            } 
+            else {
+                throw new SmartyException("Unable to load cache resource '{$type}'");
+            } 
+        } 
     } 
 
+
     /**
-     * trigger Smarty error
+     * Set template directory
      * 
-     * @param string $error_msg 
-     * @param integer $error_type 
+     * @param string $ |array $template_dir folder(s) of template sorces
      */
-    public function trigger_error($error_msg, $error_type = E_USER_WARNING)
+    public function setTemplateDir($template_dir)
     {
-        throw new SmartyException("Smarty error: $error_msg");
+        $this->template_dir = (array)$template_dir;
+        return;
     } 
 
     /**
-     * Return internal filter name
+     * Adds template directory(s) to existing ones
      * 
-     * @param callback $function_name 
+     * @param string $ |array $template_dir folder(s) of template sources
      */
-    public function _get_filter_name($function_name)
+    public function addTemplateDir($template_dir)
     {
-        if (is_array($function_name)) {
-            $_class_name = (is_object($function_name[0]) ?
-                get_class($function_name[0]) : $function_name[0]);
-            return $_class_name . '_' . $function_name[1];
-        } else {
-            return $function_name;
-        } 
+        $this->template_dir = array_unique(array_merge((array)$this->template_dir, (array)$template_dir));
+        return;
     } 
-
     /**
      * Adds directory of plugin files
      * 
@@ -626,34 +614,10 @@ class Smarty extends Smarty_Internal_Data {
      */
     function addPluginsDir($plugins_dir)
     {
-        $this->plugins_dir = array_merge((array)$this->plugins_dir, (array)$plugins_dir);
-        $this->plugins_dir = array_unique($this->plugins_dir);
+        $this->plugins_dir = array_unique(array_merge((array)$this->plugins_dir, (array)$plugins_dir));
         return;
     } 
 
-    /**
-     * Returns a single or all global  variables
-     * 
-     * @param object $smarty 
-     * @param string $varname variable name or null
-     * @return string variable value or or array of variables
-     */
-    function getGlobal($varname = null)
-    {
-        if (isset($varname)) {
-            if (isset($this->global_tpl_vars[$varname])) {
-                return $this->global_tpl_vars[$varname]->value;
-            } else {
-                return '';
-            } 
-        } else {
-            $_result = array();
-            foreach ($this->global_tpl_vars AS $key => $var) {
-                $_result[$key] = $var->value;
-            } 
-            return $_result;
-        } 
-    } 
 
     /**
      * return a reference to a registered object
@@ -672,6 +636,7 @@ class Smarty extends Smarty_Internal_Data {
         return $this->registered_objects[$name][0];
     } 
 
+
     /**
      * return name of debugging template
      * 
@@ -694,29 +659,71 @@ class Smarty extends Smarty_Internal_Data {
     } 
 
     /**
-     * lazy loads (valid) property objects
+     * Takes unknown classes and loads plugin files for them
+     * class name format: Smarty_PluginType_PluginName
+     * plugin filename format: plugintype.pluginname.php
      * 
-     * @param string $name property name
+     * @param string $plugin_name class plugin name to load
+     * @return string |boolean filepath of loaded file or false
      */
-    public function __get($name)
-    {
-        if (in_array($name, array('register', 'unregister', 'utility', 'cache'))) {
-            $class = "Smarty_Internal_" . ucfirst($name);
-            $this->$name = new $class($this);
-            return $this->$name;
-        } else if ($name == '_version') {
-            // Smarty 2 BC
-            $this->_version = self::SMARTY_VERSION;
-            return $this->_version;
+    public function loadPlugin($plugin_name, $check = true)
+    { 
+        // if function or class exists, exit silently (already loaded)
+        if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false)))
+            return true; 
+        // Plugin name is expected to be: Smarty_[Type]_[Name]
+        $_plugin_name = strtolower($plugin_name);
+        $_name_parts = explode('_', $_plugin_name, 3); 
+        // class name must have three parts to be valid plugin
+        if (count($_name_parts) < 3 || $_name_parts[0] !== 'smarty') {
+            throw new SmartyException("plugin {$plugin_name} is not a valid name format");
+            return false;
+        } 
+        // if type is "internal", get plugin from sysplugins
+        if ($_name_parts[1] == 'internal') {
+            $file = SMARTY_SYSPLUGINS_DIR . $_plugin_name . '.php';
+            if (file_exists($file)) {
+                require_once($file);
+                return $file;
+            } else {
+                return false;
+            } 
         } 
-        return null;
+        // plugin filename is expected to be: [type].[name].php
+        $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; 
+        // loop through plugin dirs and find the plugin
+        foreach((array)$this->plugins_dir as $_plugin_dir) {
+            if (strpos('/\\', substr($_plugin_dir, -1)) === false) {
+                $_plugin_dir .= DS;
+            } 
+            $file = $_plugin_dir . $_plugin_filename;
+            if (file_exists($file)) {
+                require_once($file);
+                return $file;
+            } 
+        } 
+        // no plugin loaded
+        return false;
     } 
 
     /**
-     * Takes unknown class methods and lazy loads sysplugin files for them
-     * class name format: Smarty_Method_MethodName
-     * plugin filename format: method.methodname.php
-     * 
+    * clean up properties on cloned object
+     */
+    public function __clone()
+    {
+       // clear config vars
+       $this->config_vars = array(); 
+       // clear assigned tpl vars
+       $this->tpl_vars = array();
+       // clear objects for external methods
+       unset($this->register);  
+       unset($this->filter);  
+       }
+
+
+    /**
+     * Handle unknown class methods
+        *
      * @param string $name unknown methode name
      * @param array $args aurgument array
      */
@@ -725,11 +732,6 @@ class Smarty extends Smarty_Internal_Data {
         static $camel_func;
         if (!isset($camel_func))
             $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); 
-        // PHP4 call to constructor?
-        if (strtolower($name) == 'smarty') {
-            throw new SmartyException('Please use parent::__construct() to call parent constuctor');
-            return false;
-        } 
         // see if this is a set/get for a property
         $first3 = strtolower(substr($name, 0, 3));
         if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') {
@@ -746,13 +748,37 @@ class Smarty extends Smarty_Internal_Data {
                 return $this->$property_name;
             else
                 return $this->$property_name = $args[0];
+        }
+       // Smarty Backward Compatible wrapper
+               if (strpos($name,'_') !== false) {
+               if (!isset($this->wrapper)) {
+                $this->wrapper = new Smarty_Internal_Wrapper($this);
+               } 
+               return $this->wrapper->convert($name, $args);
+        }
+        // external Smarty methods ?
+        foreach(array('filter','register') as $external) {  
+               if (method_exists("Smarty_Internal_{$external}",$name)) {
+                       if (!isset($this->$external)) {
+                               $class = "Smarty_Internal_{$external}";
+                       $this->$external = new $class($this);
+                       } 
+                       return call_user_func_array(array($this->$external,$name), $args);
+                       }
+               }
+               if (in_array($name,array('clearCompiledTemplate','compileAllTemplates','compileAllConfig','testInstall','getTags'))) {
+                       if (!isset($this->utility)) {
+               $this->utility = new Smarty_Internal_Utility($this);
+               } 
+               return call_user_func_array(array($this->utility,$name), $args);
+               }
+         // PHP4 call to constructor?
+        if (strtolower($name) == 'smarty') {
+            throw new SmartyException('Please use parent::__construct() to call parent constuctor');
+            return false;
         } 
-        // Smarty Backward Compatible wrapper
-        if (!isset($this->wrapper)) {
-            $this->wrapper = new Smarty_Internal_Wrapper($this);
-        } 
-        return $this->wrapper->convert($name, $args);
-    } 
+        throw new SmartyException("Call of unknown function '$name'.");
+   } 
 } 
 
 /**
index 84a0275e07f4231b5869e2b71e2d7fd94e2cf003..8fedd8b4352dfc247680d372fd4045100f29c76c 100644 (file)
  * Smarty {php}{/php} block plugin
  * 
  * @param string $content contents of the block
- * @param object $smarty Smarty object
- * @param boolean $ &$repeat repeat flag
  * @param object $template template object
+ * @param boolean $ &$repeat repeat flag
  * @return string content re-formatted
  */
-function smarty_block_php($params, $content, $smarty, &$repeat, $template)
+function smarty_block_php($params, $content, $template, &$repeat)
 { 
-    if (!$smarty->allow_php_tag) {
+    if (!$template->allow_php_tag) {
         throw new SmartyException("{php} is deprecated, set allow_php_tag = true to enable");
     } 
     eval($content);
index 733f6e234907d2421de9bb2025fc2673269f754f..517fd62dd5274284c9f6256aa988a36c1b5f3271 100644 (file)
  * </pre>
  * @author Monte Ohrt <monte at ohrt dot com> 
  * @param string $content contents of the block
- * @param object $smarty Smarty object
- * @param boolean &$repeat repeat flag
  * @param object $template template object
+ * @param boolean &$repeat repeat flag
  * @return string content re-formatted
  */
-function smarty_block_textformat($params, $content, $smarty, &$repeat, $template)
+function smarty_block_textformat($params, $content, $template, &$repeat)
 {
     if (is_null($content)) {
         return;
@@ -67,7 +66,7 @@ function smarty_block_textformat($params, $content, $smarty, &$repeat, $template
                 break;
 
             default:
-                $smarty->trigger_error("textformat: unknown attribute '$_key'");
+                trigger_error("textformat: unknown attribute '$_key'");
         } 
     } 
 
index 534e9981bd261949a0d47ecb54f9f776e8db04b1..7c50bd44b7e0f51c3f102cd64f1cfb18a81a98f4 100644 (file)
@@ -19,7 +19,7 @@
  * @param object $template template object
  * @return string|null
  */
-function smarty_function_counter($params, $smarty, $template)
+function smarty_function_counter($params, $template)
 {
     static $counters = array();
 
index 76ff0c6b02e0d2913671db34162e424f0a37f6d1..98e3e28781afba867951dd0eea59b017c02b2690 100644 (file)
  * @author credit to Jason Sweat <jsweat_php@yahoo.com>
  * @version  1.3
  * @param array
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string|null
  */
 
-function smarty_function_cycle($params, $smarty, $template)
+function smarty_function_cycle($params, $template)
 {
     static $cycle_vars;
     
@@ -55,7 +54,7 @@ function smarty_function_cycle($params, $smarty, $template)
             
     if (!in_array('values', array_keys($params))) {
         if(!isset($cycle_vars[$name]['values'])) {
-            $smarty->trigger_error("cycle: missing 'values' parameter");
+            trigger_error("cycle: missing 'values' parameter");
             return;
         }
     } else {
index 0a511830bcf37ece213b35255b5ece69832bf147..21ea69ba6d65a2928e710c8539d053d8bf7d0e12 100644 (file)
  *       (Smarty online manual)
  * @author Monte Ohrt <monte at ohrt dot com>
  * @param array $params parameters
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string|null if the assign parameter is passed, Smarty assigns the
  *                     result to a template variable
  */
-function smarty_function_fetch($params, $smarty, $template)
+function smarty_function_fetch($params, $template)
 {
     if (empty($params['file'])) {
         trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE);
@@ -29,8 +28,8 @@ function smarty_function_fetch($params, $smarty, $template)
     }
 
     $content = '';
-    if ($template->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
-        if(!$smarty->security_handler->isTrustedResourceDir($params['file'])) {
+    if (isset($template->security_policy) && !preg_match('!^(http|ftp)://!i', $params['file'])) {
+        if(!$template->security_policy->isTrustedResourceDir($params['file'])) {
             return;
         }
         
index 328faf448a2ef862e9ec8fd93f1068dfc8e6e928..6a1a3ffdc71454beab3adadfbc1e62f697836bb6 100644 (file)
  *           - separator  (optional) - ie <br> or &nbsp;
  *           - output     (optional) - the output next to each checkbox
  *           - assign     (optional) - assign the output as an array to this variable
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string
  * @uses smarty_function_escape_special_chars()
  */
-function smarty_function_html_checkboxes($params, $smarty, $template)
+function smarty_function_html_checkboxes($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
-    //$smarty->loadPlugin('Smarty_shared_escape_special_chars');
 
     $name = 'checkbox';
     $values = null;
index e2714a67eb3628b49cc2d652e19681b9f369f16b..57c266586dfa72cf113c224d3af8c4cefc4dfd9e 100644 (file)
  *          - basedir = base directory for absolute paths, default
  *                      is environment variable DOCUMENT_ROOT
  *          - path_prefix = prefix for path output (optional, default empty)
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  * @uses smarty_function_escape_special_chars()
  */
-function smarty_function_html_image($params, $smarty, $template)
+function smarty_function_html_image($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
-    //$smarty->loadPlugin('Smarty_shared_escape_special_chars');
-
     $alt = '';
     $file = '';
     $height = '';
@@ -47,7 +45,7 @@ function smarty_function_html_image($params, $smarty, $template)
     $prefix = '';
     $suffix = '';
     $path_prefix = '';
-    $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
+    $server_vars = ($template->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
     $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
     foreach($params as $_key => $_val) {
         switch ($_key) {
@@ -108,8 +106,8 @@ function smarty_function_html_image($params, $smarty, $template)
                 return;
             } 
         } 
-        if ($template->security) {
-            if (!$smarty->security_handler->isTrustedResourceDir($_image_path)) {
+        if (isset($template->security_policy)) {
+            if (!$template->security_policy->isTrustedResourceDir($_image_path)) {
                 return;
             } 
         } 
index a4725809aa6a8bec735291f99d68c1cc1d83b2b0..65c77c659f3eff1a5d8a334be0aa2d4260dce46e 100644 (file)
  *            - options    (required if no values supplied) - associative array
  *            - selected   (optional) - string default not set
  *            - output     (required if not options supplied) - array
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  * @uses smarty_function_escape_special_chars()
  */
-function smarty_function_html_options($params, $smarty, $template)
+function smarty_function_html_options($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
-    //$smarty->loadPlugin('Smarty_shared_escape_special_chars');
 
     $name = null;
     $values = null;
index 39c02330efc1437b82eadbc9d716fe614aa4703b..c6b27edf2ca30d2e277e9707de72d52d169f8548 100644 (file)
  *            - separator  (optional) - ie <br> or &nbsp;
  *            - output     (optional) - the output next to each radio button
  *            - assign     (optional) - assign the output as an array to this variable
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  * @uses smarty_function_escape_special_chars()
  */
-function smarty_function_html_radios($params, $smarty, $template)
+function smarty_function_html_radios($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
-    //$smarty->loadPlugin('Smarty_shared_escape_special_chars');
 
     $name = 'radio';
     $values = null;
index cd20d689b9821d3a2abe2b6134defcc414bfcc99..1d57fdc7a792fe78ea4a9fa76676bea9fb2c8fc4 100644 (file)
  * @author Andrei Zmievski 
  * @author Monte Ohrt <monte at ohrt dot com> 
  * @param array $params parameters
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  */
-function smarty_function_html_select_date($params, $smarty, $template)
+function smarty_function_html_select_date($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
     require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
     require_once(SMARTY_PLUGINS_DIR . 'function.html_options.php');
-    //$smarty->loadPlugin('Smarty_shared_escape_special_chars');
-    //$smarty->loadPlugin('Smarty_shared_make_timestamp');
-    //$smarty->loadPlugin('Smarty_function_html_options');
 
     /* Default values. */
     $prefix = "Date_";
@@ -219,7 +215,7 @@ function smarty_function_html_select_date($params, $smarty, $template)
                 'values' => $month_values,
                 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
                 'print_result' => false),
-            $smarty, $template);
+                 $template);
         $month_result .= '</select>';
     } 
 
@@ -255,7 +251,7 @@ function smarty_function_html_select_date($params, $smarty, $template)
                 'values' => $day_values,
                 'selected' => $time[2],
                 'print_result' => false),
-            $smarty, $template);
+             $template);
         $day_result .= '</select>';
     } 
 
@@ -302,7 +298,7 @@ function smarty_function_html_select_date($params, $smarty, $template)
                     'values' => $yearvals,
                     'selected' => $time[0],
                     'print_result' => false),
-                $smarty, $template);
+                   $template);
             $year_result .= '</select>';
         } 
     } 
index e9d95c2fbed93eb83c08747c75681540613ad999..ddde4f5ac638fb488afaafd3c2ac83509de5323a 100644 (file)
  * @author Roberto Berto <roberto@berto.net> 
  * @credits Monte Ohrt <monte AT ohrt DOT com>
  * @param array $params parameters
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  * @uses smarty_make_timestamp()
  */
-function smarty_function_html_select_time($params, $smarty, $template)
+function smarty_function_html_select_time($params, $template)
 {
     require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
     require_once(SMARTY_PLUGINS_DIR . 'function.html_options.php');
-    //$smarty->loadPlugin('Smarty_shared_make_timestamp');
-    //$smarty->loadPlugin('Smarty_function_html_options');
 
     /* Default values. */
     $prefix = "Time_";
@@ -108,7 +105,7 @@ function smarty_function_html_select_time($params, $smarty, $template)
                 'values' => $hours,
                 'selected' => strftime($hour_fmt, $time),
                 'print_result' => false),
-            $smarty, $template);
+            $template);
         $html_result .= "</select>\n";
     } 
 
@@ -135,7 +132,7 @@ function smarty_function_html_select_time($params, $smarty, $template)
                 'values' => $minutes,
                 'selected' => $selected,
                 'print_result' => false),
-            $smarty, $template);
+              $template);
         $html_result .= "</select>\n";
     } 
 
@@ -163,7 +160,7 @@ function smarty_function_html_select_time($params, $smarty, $template)
                 'values' => $seconds,
                 'selected' => $selected,
                 'print_result' => false),
-            $smarty, $template);
+             $template);
         $html_result .= "</select>\n";
     } 
 
@@ -187,7 +184,7 @@ function smarty_function_html_select_time($params, $smarty, $template)
                 'values' => array('am', 'pm'),
                 'selected' => strtolower(strftime('%p', $time)),
                 'print_result' => false),
-            $smarty, $template);
+            $template);
         $html_result .= "</select>\n";
     } 
 
index f279ad6d970da6ddaa70065a7756c5bee3a34fdc..7986a9bcf99c2c664df7c1b6374e35ece99299d3 100644 (file)
  *          - hdir = horizontal direction (default: "right", means left-to-right)
  *          - inner = inner loop (default "cols": print $loop line by line,
  *                    $loop will be printed column by column otherwise)
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  */
-function smarty_function_html_table($params, $smarty, $template)
+function smarty_function_html_table($params, $template)
 {
     $table_attr = 'border="1"';
     $tr_attr = '';
index f75dc71bc4d1133806a894508470c4a599651e3f..976218f53885fd221cb86fba476f80d3d2a6c1fc 100644 (file)
  *          - newsgroups = (optional) newsgroup(s) to post to
  *          - followupto = (optional) address(es) to follow up to
  *          - extra = (optional) extra tags for the href link
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string 
  */
-function smarty_function_mailto($params, $smarty, $template)
+function smarty_function_mailto($params, $template)
 {
     $extra = '';
 
index 197f4df1453e922054d349c385747e03a579b694..cd90020a43d0850363041444f9fa19e736fadc01 100644 (file)
  *          (Smarty online manual)
  * @author   Monte Ohrt <monte at ohrt dot com>
  * @param array $params parameters
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string|null
  */
-function smarty_function_math($params, $smarty, $template)
+function smarty_function_math($params, $template)
 {
     // be sure equation parameter is present
     if (empty($params['equation'])) {
index c646181a45304a97736a34cfc89df97ce92593e6..6d09d05b0174406ded1b4a2f0fb4af464e13143b 100644 (file)
  *          (Smarty online manual)
  * @author   Monte Ohrt <monte at ohrt dot com>
  * @param array $params parameters
- * @param object $smarty Smarty object
  * @param object $template template object
  * @return string
  */
-function smarty_function_popup($params, $smarty, $template)
+function smarty_function_popup($params, $template)
 {
     $append = '';
     foreach ($params as $_key=>$_value) {
index ba1f9a658f3b00c3654f7974e77da079d56715aa..7d8ac7a8ebf8962b65adae324491840404e87975 100644 (file)
   *          (Smarty online manual)
   * @author   Monte Ohrt <monte at ohrt dot com>
   * @param array $params parameters
-  * @param object $smarty Smarty object
   * @param object $template template object
   * @return string 
   */
 
-function smarty_function_popup_init($params, $smarty, $template)
+function smarty_function_popup_init($params, $template)
 {
     $zindex = 1000;
     
index 3ce4e8fcd6c1aa7a69c1b3bcaec6aa49edc7e5d0..c2f9a726e360bb4681592ac859d64960c6506c8a 100644 (file)
@@ -76,11 +76,12 @@ class Smarty_Internal_CacheResource_File {
      */
     public function getCachedContents($_template, $no_render = false)
     {
-        ob_start();
+       if (!$no_render) {
+               ob_start();
+       }
         $_smarty_tpl = $_template;
         include $_template->getCachedFilepath();
         if ($no_render) {
-               ob_clean();
                return null;
         } else {
           return ob_get_clean();
index c9a05c3349465238c4a5736fbfe2c605f5d0e6e5..8b6c4ee8b270de21e8152477fc75ff9337943726 100644 (file)
@@ -1,68 +1,49 @@
 <?php
 
 /**
-  * Smarty Internal Plugin Compile Append
-  * 
-  * Compiles the {append} tag
-  * 
-  * @package Smarty
-  * @subpackage Compiler
-  * @author Uwe Tews 
-  */
-
+ * Smarty Internal Plugin Compile Append
+ * 
+ * Compiles the {append} tag
+ * 
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews 
+ */
 /**
-  * Smarty Internal Plugin Compile Append Class
-  */
-class Smarty_Internal_Compile_Append extends Smarty_Internal_CompileBase {
+ * Smarty Internal Plugin Compile Append Class
+ */
+class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign {
+       // attribute definitions
+    public $required_attributes = array('var', 'value');
+    public $shorttag_order = array('var', 'value');
+    public $optional_attributes = array('scope', 'index'); 
+
     /**
-    * Compiles code for the {append} tag
-    * 
-    * @param array $args array with attributes from parser
-    * @param object $compiler compiler object
-    * @return string compiled code
-    */
-    public function compile($args, $compiler)
+     * Compiles code for the {append} tag
+     * 
+     * @param array $args array with attributes from parser
+     * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
+     * @return string compiled code
+     */
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('var', 'value');
-        $this->optional_attributes = array('scope', 'nocache', 'index');
-
-        $_nocache = 'null';
-        $_scope = 'null'; 
-        // check for nocache attribute before _get_attributes because
-        // it shall not controll caching of the compiled code, but is a parameter
-        if (isset($args['nocache'])) {
-            if ($args['nocache'] == 'true') {
-                $this->compiler->tag_nocache = true;
-            } 
-            unset($args['nocache']);
-        } 
-
         // check and get attributes
-        $_attr = $this->_get_attributes($args);
-
-        if ($this->compiler->tag_nocache) {
-            $_nocache = 'true'; 
-            // create nocache var to make it know for further compiling
-            $compiler->template->tpl_vars[trim($_attr['var'],"'")] = new Smarty_variable(null, true);
-        } 
-
-        if (isset($_attr['scope'])) {
-            $_attr['scope'] = trim($_attr['scope'], "'\"");
-            if ($_attr['scope'] == 'parent') {
-                $_scope = SMARTY_PARENT_SCOPE;
-            } elseif ($_attr['scope'] == 'root') {
-                $_scope = SMARTY_ROOT_SCOPE;
-           } elseif ($_attr['scope'] == 'global') {
-                $_scope = SMARTY_GLOBAL_SCOPE;
-            } 
-        } 
-        // compiled output
+        $_attr = $this->_get_attributes($args); 
+        // map to compile assign attributes
         if (isset($_attr['index'])) {
-            return "<?php \$_smarty_tpl->append($_attr[var],array($_attr[index] => $_attr[value]),true,$_nocache,$_scope);?>";
+            $_params['smarty_internal_index'] = '[' . $_attr['index'] . ']';
+            unset($_attr['index']);
         } else {
-            return "<?php \$_smarty_tpl->append($_attr[var],$_attr[value],false,$_nocache,$_scope);?>";
+            $_params['smarty_internal_index'] = '[]';
+        }
+        $_new_attr = array();
+        foreach ($_attr as $key => $value) {
+            $_new_attr[] = array($key => $value);
         } 
+        // call compile assign
+        return parent::compile($_new_attr, $compiler, $_params);
     } 
 } 
 
index bdbefae32a49be64ee5b0adf1a95d4459a267618..b7dab7c416985faf6fca1419a18d097c248758f9 100644 (file)
@@ -19,47 +19,41 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
         $this->required_attributes = array('var', 'value');
-        $this->optional_attributes = array('scope', 'nocache', 'smarty_internal_index'); 
-
+        $this->shorttag_order = array('var', 'value');
+        $this->optional_attributes = array('scope');
         $_nocache = 'null';
         $_scope = 'null'; 
-        // check for nocache attribute before _get_attributes because
-        // it shall not controll caching of the compiled code, but is a parameter
-        if (isset($args['nocache'])) {
-            if ($args['nocache'] == 'true') {
-                $this->compiler->tag_nocache = true;
-            } 
-            unset($args['nocache']);
-        } 
-
         // check and get attributes
-        $_attr = $this->_get_attributes($args);
-
-        if ($this->compiler->tag_nocache) {
+        $_attr = $this->_get_attributes($args); 
+               // nocache ?
+        if ($this->compiler->tag_nocache || $this->compiler->nocache) {
             $_nocache = 'true'; 
             // create nocache var to make it know for further compiling
-            $compiler->template->tpl_vars[trim($_attr['var'],"'")] = new Smarty_variable(null, true);
+            $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true);
         } 
-
+        // scope setup
         if (isset($_attr['scope'])) {
             $_attr['scope'] = trim($_attr['scope'], "'\"");
             if ($_attr['scope'] == 'parent') {
-                $_scope = SMARTY_PARENT_SCOPE;
+                $_scope = Smarty::SCOPE_PARENT;
             } elseif ($_attr['scope'] == 'root') {
-                $_scope = SMARTY_ROOT_SCOPE;
+                $_scope = Smarty::SCOPE_ROOT;
             } elseif ($_attr['scope'] == 'global') {
-                $_scope = SMARTY_GLOBAL_SCOPE;
+                $_scope = Smarty::SCOPE_GLOBAL;
+            } else {
+                $this->compiler->trigger_template_error('illegal value for "scope" attribute', $this->compiler->lex->taglineno);
             } 
         } 
         // compiled output
-        if (isset($_attr['smarty_internal_index'])) {
-            return "<?php if (!isset(\$_smarty_tpl->tpl_vars[$_attr[var]]) || !is_array(\$_smarty_tpl->tpl_vars[$_attr[var]]->value)) \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[smarty_internal_index] = $_attr[value];?>";
+        if (isset($parameter['smarty_internal_index'])) {
+            return "<?php if (!isset(\$_smarty_tpl->tpl_vars[$_attr[var]]) || !is_array(\$_smarty_tpl->tpl_vars[$_attr[var]]->value)) \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];?>";
         } else {
             return "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);?>";
         } 
index 7e651e4389074ff2612cd35938712f071903ffa2..2cc03ee72fab6df37cd3de877ad6e1b4f0b56075 100644 (file)
@@ -13,6 +13,9 @@
  * Smarty Internal Plugin Compile Block Class
  */
 class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('name');
+    public $shorttag_order = array('name');
     /**
      * Compiles code for the {block} tag
      * 
@@ -23,16 +26,12 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('name');
-        $this->optional_attributes = array('assign', 'nocache'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
-        $save = array($_attr, $compiler->parser->current_buffer, $this->compiler->nocache, $this->compiler->smarty->merge_compiled_includes);
+        $save = array($_attr, $compiler->parser->current_buffer, $this->compiler->nocache, $this->compiler->smarty->merge_compiled_includes, $compiler->smarty->inheritance);
         $this->_open_tag('block', $save);
-        if (isset($_attr['nocache'])) {
-            if ($_attr['nocache'] == 'true') {
-                $compiler->nocache = true;
-            } 
+        if ($_attr['nocache'] == true) {
+            $compiler->nocache = true;
         }
         // set flag for {block} tag
         $compiler->smarty->inheritance = true;
@@ -43,7 +42,105 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
         $compiler->has_code = false;
         return true;
     } 
-} 
+
+
+    static function saveBlockData($block_content, $block_tag, $template, $filepath)
+    {
+         $_rdl = preg_quote($template->smarty->right_delimiter);
+        $_ldl = preg_quote($template->smarty->left_delimiter);
+
+        if (0 == preg_match("!({$_ldl}block\s+)(name=)?(\w+|'\w+'|\"\w+\")(\s*?)?((append|prepend|nocache)(=true)?)?(\s*{$_rdl})!", $block_tag, $_match)) {
+            $template->compiler_object->trigger_template_error('Illegal {block} tag syntax');
+        } else {
+            $_name = trim($_match[3], '\'"'); 
+            // replace {$smarty.block.child}
+            if (strpos($block_content, $template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter) !== false) {
+                if (isset($template->block_data[$_name])) {
+                    $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter,
+                        $template->block_data[$_name]['source'], $block_content);
+                    unset($template->block_data[$_name]);
+                } else {
+                    $block_content = str_replace($template->smarty->left_delimiter . '$smarty.block.child' . $template->smarty->right_delimiter,
+                        '', $block_content);
+                } 
+            } 
+            if (isset($template->block_data[$_name])) {
+                if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
+                    $template->block_data[$_name]['source'] =
+                    str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']);
+                } elseif ($template->block_data[$_name]['mode'] == 'prepend') {
+                    $template->block_data[$_name]['source'] .= $block_content;
+                } elseif ($template->block_data[$_name]['mode'] == 'append') {
+                    $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source'];
+                } 
+            } else {
+                $template->block_data[$_name]['source'] = $block_content;
+            } 
+            if ($_match[6] == 'append') {
+                $template->block_data[$_name]['mode'] = 'append';
+            } elseif ($_match[6] == 'prepend') {
+                $template->block_data[$_name]['mode'] = 'prepend';
+            } else {
+                $template->block_data[$_name]['mode'] = 'replace';
+            } 
+            $template->block_data[$_name]['file'] = $filepath;
+        } 
+    }
+
+       static function compileChildBlock ($compiler, $_name = null)
+       {
+               $_output = '';
+        // if called by {$smarty.block.child} we must search the name of enclosing {block}
+               if ($_name == null) {
+               $stack_count = count($compiler->_tag_stack);
+            while (--$stack_count >= 0) {
+               if ($compiler->_tag_stack[$stack_count][0] == 'block') {
+                       $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'] ,"'");
+                       break;
+                }
+            }
+        }
+               if ($_name == null) {
+                       $compiler->trigger_template_error('{$smarty.block.child} used out of context');
+               }
+                   $_tpl = new Smarty_Internal_template ('eval:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id, 
+                              $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime);
+               $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
+               $_tpl->template_filepath = $compiler->template->block_data[$_name]['file'];
+               if ($compiler->nocache) {
+                       $_tpl->forceNocache = 2;
+               } else {
+                       $_tpl->forceNocache = 1;
+               }
+               $_tpl->suppressHeader = true;
+               $_tpl->suppressFileDependency = true;
+               if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
+                       $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->getCompiledTemplate());
+               } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') {
+                       $_output = $_tpl->getCompiledTemplate() . $compiler->parser->current_buffer->to_smarty_php();
+               } elseif ($compiler->template->block_data[$_name]['mode'] == 'append') {
+                       $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->getCompiledTemplate();
+               } elseif (!empty($compiler->template->block_data[$_name])) {
+                       $_output = $_tpl->getCompiledTemplate();
+               }
+               $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']);
+               $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']);
+               if ($_tpl->has_nocache_code) {
+                       $compiler->template->has_nocache_code = true;
+               }
+               foreach($_tpl->required_plugins as $code => $tmp1) {
+                       foreach($tmp1 as $name => $tmp) {
+                               foreach($tmp as $type => $data) {
+                                       $compiler->template->required_plugins[$code][$name][$type] = $data;
+                               }
+                       }
+               }
+               unset($_tpl);
+        $compiler->template->block_data[$_name]['compiled'] = true;
+               return $_output;
+       }
+
+}
 
 /**
  * Smarty Internal Plugin Compile BlockClose Class
@@ -62,59 +159,23 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase {
         $this->smarty = $compiler->smarty;
         $this->compiler->has_code = true; 
         // check and get attributes
-        $this->optional_attributes = array('name');
         $_attr = $this->_get_attributes($args);
-        $saved_data = $this->_close_tag(array('block')); 
-        // if name does match to opening tag
-        if (isset($_attr['name']) && $saved_data[0]['name'] != $_attr['name']) {
-            $this->compiler->trigger_template_error('mismatching name attributes "' . $saved_data[0]['name'] . '" and "' . $_attr['name'] . '"');
-        } 
+        $saved_data = $this->_close_tag(array('block'));
         $_name = trim($saved_data[0]['name'], "\"'");
-        if (isset($compiler->template->block_data[$_name])) {
-            $_tpl = $this->smarty->createTemplate('eval:' . $compiler->template->block_data[$_name]['source'], null, null, $compiler->template);
-            $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
-            $_tpl->template_filepath = $compiler->template->block_data[$_name]['file'];
-            if ($compiler->nocache) {
-                $_tpl->forceNocache = 2;
-            } else {
-                $_tpl->forceNocache = 1;
-            } 
-            $_tpl->suppressHeader = true;
-            $_tpl->suppressFileDependency = true;
-            if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
-                $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->getCompiledTemplate());
-            } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') {
-                $_output = $_tpl->getCompiledTemplate() . $compiler->parser->current_buffer->to_smarty_php();
-            } elseif ($compiler->template->block_data[$_name]['mode'] == 'append') {
-                $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->getCompiledTemplate();
-            } elseif (!empty($compiler->template->block_data[$_name])) {
-                $_output = $_tpl->getCompiledTemplate();
-            } 
-            $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']);
-            $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']);
-            if ($_tpl->has_nocache_code) {
-                $compiler->template->has_nocache_code = true;
-            } 
-            foreach($_tpl->required_plugins as $code => $tmp1) {
-                foreach($tmp1 as $name => $tmp) {
-                    foreach($tmp as $type => $data) {
-                        $compiler->template->required_plugins[$code][$name][$type] = $data;
-                    } 
-                } 
-            } 
-            unset($_tpl);
+        if (isset($compiler->template->block_data[$_name]) && !isset($compiler->template->block_data[$_name]['compiled'])) {
+               $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name);
         } else {
             $_output = $compiler->parser->current_buffer->to_smarty_php();
+            unset ($compiler->template->block_data[$_name]['compiled']);
         } 
+        // reset flags
         $compiler->parser->current_buffer = $saved_data[1];
         $compiler->nocache = $saved_data[2];
         $compiler->smarty->merge_compiled_includes = $saved_data[3];
+        $compiler->smarty->inheritance = $saved_data[4];
         // $_output content has already nocache code processed
         $compiler->suppressNocacheProcessing = true;
-        // reset flag
-        $compiler->smarty->inheritance = false;
         return $_output;
     } 
 } 
-
 ?>
\ No newline at end of file
index 60e856df1d6811f33f3ca7b5c06d306cd081016b..2e57da4017d45e86f992fe86e5f5e9fb8ca36131 100644 (file)
  * Smarty Internal Plugin Compile Break Class\r
  */\r
 class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase {\r
+       // attribute definitions\r
+    public $optional_attributes = array('levels'); \r
+    public $shorttag_order = array('levels');\r
+\r
+\r
     /**\r
      * Compiles code for the {break} tag\r
      * \r
      * @param array $args array with attributes from parser\r
      * @param object $compiler compiler object\r
+     * @param array $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler)\r
-    {\r
+    public function compile($args, $compiler, $parameter)\r
+    {    \r
         $this->compiler = $compiler;\r
         $this->smarty = $compiler->smarty;\r
-        $this->optional_attributes = array('levels'); \r
         // check and get attributes\r
         $_attr = $this->_get_attributes($args);\r
 \r
+        if ($_attr['nocache'] === true) {\r
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);\r
+        }\r
+\r
         if (isset($_attr['levels'])) {\r
             if (!is_numeric($_attr['levels'])) {\r
                 $this->compiler->trigger_template_error('level attribute must be a numeric constant', $this->compiler->lex->taglineno);\r
index e63bd1c8329877e449ebe10180210c60dc5662af..8d63b7c7358f3ebac810283f6bdb0bf167e5025e 100644 (file)
  * Smarty Internal Plugin Compile Function_Call Class
  */
 class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('name');
+    public $shorttag_order = array('name');
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles the calls of user defined tags defined by {function}
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
         $this->smarty = $compiler->smarty;
-        $this->required_attributes = array('name');
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args); 
-        // save posible attributes
+        // save possible attributes
         if (isset($_attr['assign'])) {
             // output will be stored in a smarty variable instead of beind displayed
             $_assign = $_attr['assign'];
         } 
         $_name = trim($_attr['name'], "'\"");
-        unset($_attr['name'], $_attr['assign']); 
+        unset($_attr['name'], $_attr['assign'], $_attr['nocache']); 
         // set flag (compiled code of {function} must be included in cache file
         if ($compiler->nocache || $compiler->tag_nocache) {
             $_nocache = 'true';
@@ -49,7 +53,8 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase {
             } else {
                 $_paramsArray[] = "'$_key'=>$_value";
             } 
-        } 
+        }
+       if (false) {
         if (isset($compiler->template->properties['function'][$_name]['parameter'])) {
             foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) {
                 if (!isset($_attr[$_key])) {
@@ -70,15 +75,16 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase {
                     } 
                 } 
             } 
-        } 
+        }
+       }
         $_params = 'array(' . implode(",", $_paramsArray) . ')';
     $_hash = str_replace('-','_',$compiler->template->properties['nocache_hash']);
         // was there an assign attribute
         if (isset($_assign)) {
             if ($compiler->template->caching) {
-                $_output = "\$_smarty_tpl->assign({$_assign},Smarty_Internal_Function_Call_Handler::call ('{$_name}',\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}));?>\n";
+                $_output = "<?php ob_start(); Smarty_Internal_Function_Call_Handler::call ('{$_name}',\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
             } else {
-                $_output = "\$_smarty_tpl->assign({$_assign},smarty_template_function_{$_name}(\$_smarty_tpl,{$_params}));?>\n";
+                $_output = "<?php ob_start(); smarty_template_function_{$_name}(\$_smarty_tpl,{$_params}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
             } 
         } else {
             if ($compiler->template->caching) {
index 96589cdde70ab3d698c3018f1eba419b29ddbb65..2583aadc08fe6f1e1347128000d812a0b3f86649 100644 (file)
  * Smarty Internal Plugin Compile Capture Class
  */
 class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $shorttag_order = array('name');
+    public $optional_attributes = array('name', 'assign', 'append'); 
+
     /**
      * Compiles code for the {capture} tag
      * 
@@ -23,7 +27,6 @@ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->optional_attributes = array('name', 'assign', 'append'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
@@ -31,8 +34,9 @@ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase {
         $assign = isset($_attr['assign']) ? $_attr['assign'] : null;
         $append = isset($_attr['append']) ? $_attr['append'] : null;
 
-        $this->compiler->_capture_stack[] = array($buffer, $assign, $append);
-
+        $this->compiler->_capture_stack[] = array($buffer, $assign, $append, $this->compiler->nocache);
+        // maybe nocache because of nocache variables
+        $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; 
         $_output = "<?php ob_start(); ?>";
 
         return $_output;
@@ -55,8 +59,12 @@ class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase {
         $this->compiler = $compiler; 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
+        // must endblock be nocache?
+        if ($this->compiler->nocache) {
+            $this->compiler->tag_nocache = true;
+        } 
 
-        list($buffer, $assign, $append) = array_pop($this->compiler->_capture_stack);
+        list($buffer, $assign, $append, $this->compiler->nocache) = array_pop($this->compiler->_capture_stack);
 
         $_output = "<?php ";
         if (isset($assign)) {
index bb0103ed59efb27e841d497d56538e0fb2c83ec6..733e1ac5d2782f5f6fa080ea1c3b567342488b8a 100644 (file)
  * Smarty Internal Plugin Compile Config Load Class
  */
 class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('file');
+    public $shorttag_order = array('file','section');
+    public $optional_attributes = array('section', 'scope'); 
+
     /**
      * Compiles code for the {config_load} tag
      * 
@@ -24,10 +29,14 @@ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('file');
-        $this->optional_attributes = array('section', 'scope'); 
         // check and get attributes
-        $_attr = $this->_get_attributes($args); 
+        $_attr = $this->_get_attributes($args);
+        
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
+
+         
         // save posible attributes
         $conf_file = $_attr['file'];
         if (isset($_attr['section'])) {
@@ -35,18 +44,19 @@ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase {
         } else {
             $section = 'null';
         } 
-        $scope = '$_smarty_tpl->smarty';
+        $scope = 'local';
+        // scope setup
         if (isset($_attr['scope'])) {
             $_attr['scope'] = trim($_attr['scope'], "'\"");
-            if ($_attr['scope'] == 'local') {
-                $scope = '$_smarty_tpl';
-            } elseif ($_attr['scope'] == 'parent') {
-                $scope = '$_smarty_tpl->parent';
-            
+            if (in_array($_attr['scope'],array('local','parent','root','global'))) {
+                $scope = $_attr['scope'];
+           } else {
+                $this->compiler->trigger_template_error('illegal value for "scope" attribute', $this->compiler->lex->taglineno);
+           } 
         } 
         // create config object
         $_output = "<?php  \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);";
-        $_output .= "\$_config->loadConfigVars($section, $scope); ?>";
+        $_output .= "\$_config->loadConfigVars($section, '$scope'); ?>";
         return $_output;
     } 
 } 
index 3c15e8f1280c6a033243a0b5b7845852bcbd0b46..7d79667328e9bdecce7704ffd2d2697918ccec3a 100644 (file)
  * Smarty Internal Plugin Compile Continue Class\r
  */\r
 class Smarty_Internal_Compile_Continue extends Smarty_Internal_CompileBase {\r
+       // attribute definitions\r
+    public $optional_attributes = array('levels'); \r
+    public $shorttag_order = array('levels');\r
+\r
     /**\r
      * Compiles code for the {continue} tag\r
      * \r
      * @param array $args array with attributes from parser\r
      * @param object $compiler compiler object\r
+     * @param array $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler)\r
+    public function compile($args, $compiler, $parameter)\r
     {\r
         $this->compiler = $compiler;\r
         $this->smarty = $compiler->smarty;\r
-        $this->optional_attributes = array('levels'); \r
         // check and get attributes\r
         $_attr = $this->_get_attributes($args);\r
 \r
+        if ($_attr['nocache'] === true) {\r
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);\r
+        }\r
+\r
         if (isset($_attr['levels'])) {\r
             if (!is_numeric($_attr['levels'])) {\r
                 $this->compiler->trigger_template_error('level attribute must be a numeric constant', $this->compiler->lex->taglineno);\r
index d6d8905f9a3c8765ad15aad9221e07d6f792760f..f6189e7e1cc24904574d3f6bf5dc7f1687911ce7 100644 (file)
@@ -26,8 +26,11 @@ class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase {
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
+               // compile always as nocache
+               $this->compiler->tag_nocache = true;
+
         // display debug template
-        $_output = "<?php \$_smarty_tpl->smarty->loadPlugin('Smarty_Internal_Debug'); Smarty_Internal_Debug::display_debug(\$_smarty_tpl->smarty); ?>";
+        $_output = "<?php \$_smarty_tpl->smarty->loadPlugin('Smarty_Internal_Debug'); Smarty_Internal_Debug::display_debug(\$_smarty_tpl); ?>";
         return $_output;
     } 
 } 
index 17be1f80c3d643c53e9030b683aa621224381a19..aa3c25807751b79a6096155e5c0695be5c5b0df2 100644 (file)
  * Smarty Internal Plugin Compile Eval Class
  */ 
 class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase {
+    public $required_attributes = array('var');
+    public $optional_attributes = array('assign'); 
+    public $shorttag_order = array('var','assign');
+
     /**
      * Compiles code for the {eval} tag
      * 
index 245fe9c4e627158fd320477a70e35a08b135100a..3d3ac7976b4ad6dfadbef003c3da1acfc53e21ed 100644 (file)
  * Smarty Internal Plugin Compile extend Class
  */
 class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('file');
+    public $shorttag_order = array('file');
+
     /**
      * Compiles code for the {extends} tag
      * 
@@ -27,26 +31,34 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
         $this->smarty = $compiler->smarty;
         $this->_rdl = preg_quote($this->smarty->right_delimiter);
         $this->_ldl = preg_quote($this->smarty->left_delimiter);
-        $this->required_attributes = array('file'); 
+        $filepath = $compiler->template->getTemplateFilepath();
         // check and get attributes
         $_attr = $this->_get_attributes($args);
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
+
         $_smarty_tpl = $compiler->template; 
         $include_file = null;
         eval('$include_file = ' . $_attr['file'] . ';'); 
         // create template object
         $_template = new $compiler->smarty->template_class($include_file, $this->smarty, $compiler->template); 
         // save file dependency
-        $template_sha1 = sha1($_template->getTemplateFilepath());
+        if (in_array($_template->resource_type,array('eval','string'))) {
+               $template_sha1 = sha1($include_file);
+       } else {
+               $template_sha1 = sha1($_template->getTemplateFilepath());
+       }
         if (isset($compiler->template->properties['file_dependency'][$template_sha1])) {
             $this->compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"",$compiler->lex->line-1);
         } 
-        $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->getTemplateFilepath(), $_template->getTemplateTimestamp());
-        $_content = $compiler->template->template_source;
+        $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->getTemplateFilepath(), $_template->getTemplateTimestamp(),$_template->resource_type);
+        $_content = substr($compiler->template->template_source,$compiler->lex->counter-1);
         if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $s) !=
-                preg_match_all("!({$this->_ldl}/block(.*?){$this->_rdl})!", $_content, $c)) {
+                preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $c)) {
             $this->compiler->trigger_template_error('unmatched {block} {/block} pairs');
         } 
-        preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block(.*?){$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+        preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
         $_result_count = count($_result[0]);
         $_start = 0;
         while ($_start < $_result_count) {
@@ -62,7 +74,7 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
             } 
             $_block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.parent' . $this->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%',
                 substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0])));
-            $this->saveBlockData($_block_content, $_result[0][$_start][0], $compiler->template);
+            Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $compiler->template, $filepath);
             $_start = $_start + $_end + 1;
         } 
         $compiler->template->template_source = $_template->getTemplateSource();
@@ -71,45 +83,5 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
         return '';
     } 
 
-    protected function saveBlockData($block_content, $block_tag, $template)
-    {
-        if (0 == preg_match("!(.?)(name=)(.*?)(?=(\s|{$this->_rdl}))!", $block_tag, $_match)) {
-            $this->compiler->trigger_template_error("\"" . $block_tag . "\" missing name attribute");
-        } else {
-            $_name = trim($_match[3], '\'"'); 
-            // replace {$smarty.block.child}
-            if (strpos($block_content, $this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter) !== false) {
-                if (isset($template->block_data[$_name])) {
-                    $block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter,
-                        $template->block_data[$_name]['source'], $block_content);
-                    unset($template->block_data[$_name]);
-                } else {
-                    $block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter,
-                        '', $block_content);
-                } 
-            } 
-            if (isset($template->block_data[$_name])) {
-                if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
-                    $template->block_data[$_name]['source'] =
-                    str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']);
-                } elseif ($template->block_data[$_name]['mode'] == 'prepend') {
-                    $template->block_data[$_name]['source'] .= $block_content;
-                } elseif ($template->block_data[$_name]['mode'] == 'append') {
-                    $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source'];
-                } 
-            } else {
-                $template->block_data[$_name]['source'] = $block_content;
-            } 
-            if (preg_match('/(.?)(append)(.*)/', $block_tag, $_match) != 0) {
-                $template->block_data[$_name]['mode'] = 'append';
-            } elseif (preg_match('/(.?)(prepend)(.*)/', $block_tag, $_match) != 0) {
-                $template->block_data[$_name]['mode'] = 'prepend';
-            } else {
-                $template->block_data[$_name]['mode'] = 'replace';
-            } 
-            $template->block_data[$_name]['file'] = $template->getTemplateFilepath();
-        } 
-    } 
 } 
-
 ?>
\ No newline at end of file
index 77f196cc853519c22917837e33cfa455583cbaa5..2e5d0a11f9197f61f7896d1690698c0638c5f043 100644 (file)
@@ -29,32 +29,33 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
-        // {for $x=0; $x<$y; $x++} syntax
-        if (isset($args['ifexp'])) {
-            $this->required_attributes = array('ifexp', 'start', 'loop', 'varloop');
+        if ($parameter == 0) {
+               $this->required_attributes = array('start','to');
+               $this->optional_attributes = array('max','step');
         } else {
-            $this->required_attributes = array('start', 'to');
-            $this->optional_attributes = array('step', 'max');
-        } 
+               $this->required_attributes = array('start','ifexp','var','step');
+               $this->optional_attributes = array();
+        }
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
         $local_vars = array();
 
         $output = "<?php ";
-        if (isset($_attr['ifexp'])) {
+        if ($parameter == 1) {
             foreach ($_attr['start'] as $_statement) {
                 $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
                 $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value];\n";
                 $compiler->local_var[$_statement['var']] = true;
                 $local_vars[] = $_statement['var'];
             } 
-            $output .= "  if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[varloop]]->value$_attr[loop]){\n";
+            $output .= "  if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]){\n";
         } else {
             $_statement = $_attr['start'];
             $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
@@ -63,12 +64,12 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase {
             if (isset($_attr['step'])) {
                 $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];";
             } else {
-                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = ($_attr[to] - ($_statement[value]) < 0) ? -1 : 1;";
+                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = 1;";
             } 
             if (isset($_attr['max'])) {
-                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - $_statement[value] : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n";
+                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n";
             } else {
-                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - $_statement[value] : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n";
+                $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n";
             } 
             $output .= "if (\$_smarty_tpl->tpl_vars[$_statement[var]]->total > 0){\n";
             $output .= "for (\$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value], \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration = 1;\$_smarty_tpl->tpl_vars[$_statement[var]]->iteration <= \$_smarty_tpl->tpl_vars[$_statement[var]]->total;\$_smarty_tpl->tpl_vars[$_statement[var]]->value += \$_smarty_tpl->tpl_vars[$_statement[var]]->step, \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration++){\n";
@@ -94,13 +95,14 @@ class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
         // check and get attributes
-        $_attr = $this->_get_attributes($args);
+        $_attr  = $this->_get_attributes($args);
 
         list($_open_tag, $nocache, $local_vars) = $this->_close_tag(array('for'));
         $this->_open_tag('forelse', array('forelse', $nocache, $local_vars));
@@ -117,13 +119,14 @@ class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
         // check and get attributes
-        $_attr = $this->_get_attributes($args); 
+        $_attr  = $this->_get_attributes($args); 
         // must endblock be nocache?
         if ($this->compiler->nocache) {
             $this->compiler->tag_nocache = true;
index 52b78c3341a4012ec912b7c562316a94760d9990..9564c6a25bcacec884ea758ace210074390bf917 100644 (file)
  * Smarty Internal Plugin Compile Foreach Class
  */
 class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('from', 'item');
+    public $optional_attributes = array('name', 'key'); 
+    public $shorttag_order = array('from','item','key','name');
+
     /**
      * Compiles code for the {foreach} tag
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('from', 'item');
-        $this->optional_attributes = array('name', 'key');
         $tpl = $compiler->template; 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
@@ -62,11 +66,12 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
             $usesSmartyIndex = strpos($tpl->template_source, $SmartyVarName . 'index') !== false;
             $usesSmartyIteration = strpos($tpl->template_source, $SmartyVarName . 'iteration') !== false;
             $usesSmartyShow = strpos($tpl->template_source, $SmartyVarName . 'show') !== false;
-            $usesSmartyTotal = $usesSmartyLast || strpos($tpl->template_source, $SmartyVarName . 'total') !== false;
+            $usesSmartyTotal = strpos($tpl->template_source, $SmartyVarName . 'total') !== false;
         } else {
             $usesSmartyFirst = false;
             $usesSmartyLast = false;
             $usesSmartyTotal = false;
+            $usesSmartyShow = false;
         } 
 
         $usesPropFirst = $usesSmartyFirst || strpos($tpl->template_source, $ItemVarName . 'first') !== false;
@@ -74,7 +79,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
         $usesPropIndex = $usesPropFirst || strpos($tpl->template_source, $ItemVarName . 'index') !== false;
         $usesPropIteration = $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'iteration') !== false;
         $usesPropShow = strpos($tpl->template_source, $ItemVarName . 'show') !== false;
-        $usesPropTotal = $usesSmartyTotal || $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'total') !== false; 
+        $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'total') !== false; 
         // generate output code
         $output = "<?php ";
         $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable;\n";
@@ -85,7 +90,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
         } 
         $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n";
         if ($usesPropTotal) {
-            $output .= " \$_smarty_tpl->tpl_vars[$item]->total=(\$_from instanceof Traversable)?iterator_count(\$_from):count(\$_from);\n";
+            $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
         } 
         if ($usesPropIteration) {
             $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
@@ -93,6 +98,9 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
         if ($usesPropIndex) {
             $output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
         } 
+        if ($usesPropShow) {
+            $output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+        } 
         if ($has_name) {
             if ($usesSmartyTotal) {
                 $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n";
@@ -103,9 +111,16 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
             if ($usesSmartyIndex) {
                 $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n";
             } 
+            if ($usesSmartyShow) {
+                $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+            } 
         } 
-        $output .= "if (count(\$_from) > 0){\n";
-        $output .= "    foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n";
+        if ($usesPropTotal) {
+                       $output .= "if (\$_smarty_tpl->tpl_vars[$item]->total > 0){\n";
+        } else {
+                       $output .= "if (\$_smarty_tpl->_count(\$_from) > 0){\n";
+               }
+               $output .= "    foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n";
         if ($key != null) {
             $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
         } 
@@ -150,9 +165,10 @@ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
         // check and get attributes
@@ -174,9 +190,10 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
         // check and get attributes
index 0080704af8733dd32f82ef4cee70a88f42eddcea..3b7ebca283b4ddaad2bcbf80d6563fc4fa5f3733 100644 (file)
  * Smarty Internal Plugin Compile Function Class
  */
 class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('name');
+    public $shorttag_order = array('name');
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the {function} tag
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
-     * @return boolean true
+      * @param array $parameter array with compilation parameter
+    * @return boolean true
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('name');
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
+
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
+
         $save = array($_attr, $compiler->parser->current_buffer,
             $compiler->template->has_nocache_code, $compiler->template->required_plugins);
         $this->_open_tag('function', $save);
@@ -43,6 +52,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase {
             $output = "<?php if (!function_exists('smarty_template_function_{$_name}')) {
     function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) {
     \$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
+    foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(trim(\$value,'\''));};
     foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
         } 
         // Init temporay context
@@ -65,9 +75,10 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return boolean true
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
         $_attr = $this->_get_attributes($args);
@@ -93,6 +104,11 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
             } 
             $plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n";
         } 
+               // remove last line break from function definition
+               $last = count($compiler->parser->current_buffer->subtrees) - 1;
+               if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) {
+                       unset($compiler->parser->current_buffer->subtrees[$last]);
+               }
         // if caching save template function for possible nocache call
         if ($compiler->template->caching) {
             $compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string
index 4eac8d4b3a5d6e4434a8e1eedc5b6de7fe491c6a..496451364ae8661d57de2864d0167fce21b09f71 100644 (file)
@@ -18,21 +18,30 @@ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('if condition'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
-        $this->_open_tag('if',array(1,$compiler->tag_nocache));
-        if (is_array($args['if condition'])) {
-            $_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[".$args['if condition']['var']."])) \$_smarty_tpl->tpl_vars[".$args['if condition']['var']."] = new Smarty_Variable;";
-            $_output .= "if (\$_smarty_tpl->tpl_vars[".$args['if condition']['var']."]->value = ".$args['if condition']['value']."){?>";
+        $this->_open_tag('if',array(1,$this->compiler->nocache));
+        // must whole block be nocache ?
+        $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; 
+        if (is_array($parameter['if condition'])) {
+               if ($this->compiler->nocache) {
+                       $_nocache = '(null,true)';
+               // create nocache var to make it know for further compiling
+               $this->compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+               } else {
+                       $_nocache = '';
+               }
+            $_output = "<?php \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable{$_nocache};";            
+            $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>";
             return $_output;
         } else {
-            return "<?php if ({$args['if condition']}){?>";
+            return "<?php if ({$parameter['if condition']}){?>";
         } 
     } 
 } 
@@ -46,9 +55,10 @@ class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
         list($nesting, $compiler->tag_nocache) = $this->_close_tag(array('if', 'elseif'));
@@ -67,26 +77,52 @@ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase {
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('if condition'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
         list($nesting, $compiler->tag_nocache) = $this->_close_tag(array('if', 'elseif'));
 
+               if (is_array($parameter['if condition'])) {
+                       $condition_by_assign = true;
+                       if ($this->compiler->nocache) {
+                               $_nocache = '(null,true)';
+                       // create nocache var to make it know for further compiling
+                       $this->compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+                       } else {
+                               $_nocache = '';
+                       }
+               } else {
+                       $condition_by_assign = false;
+               }
+
         if (empty($this->compiler->prefix_code)) {
-            $this->_open_tag('elseif', array($nesting, $compiler->tag_nocache));
-            return "<?php }elseif({$args['if condition']}){?>";
+               if ($condition_by_assign) {
+               $this->_open_tag('elseif', array($nesting + 1, $compiler->tag_nocache));
+               $_output = "<?php }else{ \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable{$_nocache};";            
+               $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>";
+               return $_output;
+               } else {
+               $this->_open_tag('elseif', array($nesting, $compiler->tag_nocache));
+               return "<?php }elseif({$parameter['if condition']}){?>";
+               }
         } else {
             $tmp = '';
             foreach ($this->compiler->prefix_code as $code) $tmp .= $code;
             $this->compiler->prefix_code = array();
             $this->_open_tag('elseif', array($nesting + 1, $compiler->tag_nocache));
-            return "<?php }else{?>{$tmp}<?php if ({$args['if condition']}){?>";
+               if ($condition_by_assign) {
+               $_output = "<?php }else{?>{$tmp}<?php \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable{$_nocache};";            
+               $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>";
+               return $_output;
+               } else {
+               return "<?php }else{?>{$tmp}<?php if ({$parameter['if condition']}){?>";
+               }
         } 
     } 
 } 
@@ -100,12 +136,17 @@ class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase {
     * 
     * @param array $args array with attributes from parser
     * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
     * @return string compiled code
     */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler; 
-        list($nesting, $compiler->tag_nocache) = $this->_close_tag(array('if', 'else', 'elseif'));
+            // must endblock be nocache?
+            if ($this->compiler->nocache) {
+                $this->compiler->tag_nocache = true;
+            } 
+        list($nesting, $this->compiler->nocache) = $this->_close_tag(array('if', 'else', 'elseif'));
         $tmp = '';
         for ($i = 0; $i < $nesting ; $i++) $tmp .= '}';
         return "<?php {$tmp}?>";
index fa1d6427742439e16fcccd0f621ad2fe11593cb9..ea323101910667982a6ad3fefc5a8134fb3d9a71 100644 (file)
  * Smarty Internal Plugin Compile Include Class
  */
 class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase {
+       // caching mode to create nocache code but no cache file
+       const CACHING_NOCACHE_CODE = 9999;
+       // attribute definitions
+    public $required_attributes = array('file');
+       public $shorttag_order = array('file');
+    public $option_flags = array('nocache','inline','caching');
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the {include} tag
      * 
@@ -24,28 +32,28 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('file');
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args); 
         // save posible attributes
         $include_file = $_attr['file'];
         $has_compiled_template = false;
-        if ($compiler->smarty->merge_compiled_includes || isset($_attr['inline'])) {
+        if ($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) {
             // check if compiled code can be merged (contains no variable part)
             if (!$compiler->has_variable_string && (substr_count($include_file, '"') == 2 or substr_count($include_file, "'") == 2) and substr_count($include_file, '(') == 0) {
              $tmp = null;
            eval("\$tmp = $include_file;");
                 if ($this->compiler->template->template_resource != $tmp) {
                     $tpl = new $compiler->smarty->template_class ($tmp, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);
+                    // suppress writing of compiled file
+                    $tpl->write_compiled_code = false;
                     if ($this->compiler->template->caching) {
                         // needs code for cached page but no cache file
-                        $tpl->caching = 9999;
+                        $tpl->caching = self::CACHING_NOCACHE_CODE;
                     } 
-                    if ($this->compiler->template->mustCompile) {
+//                    if ($this->compiler->template->mustCompile) {
                         // make sure whole chain gest compiled
                         $tpl->mustCompile = true;
-                    } 
+//                    } 
                     if ($tpl->resource_object->usesCompiler && $tpl->isExisting()) {
                         // get compiled code
                         $compiled_tpl = $tpl->getCompiledTemplate(); 
@@ -77,24 +85,24 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase {
             $_assign = $_attr['assign'];
         } 
 
-        $_parent_scope = SMARTY_LOCAL_SCOPE;
+        $_parent_scope = Smarty::SCOPE_LOCAL;
         if (isset($_attr['scope'])) {
             $_attr['scope'] = trim($_attr['scope'], "'\"");
             if ($_attr['scope'] == 'parent') {
-                $_parent_scope = SMARTY_PARENT_SCOPE;
+                $_parent_scope = Smarty::SCOPE_PARENT;
             } elseif ($_attr['scope'] == 'root') {
-                $_parent_scope = SMARTY_ROOT_SCOPE;
+                $_parent_scope = Smarty::SCOPE_ROOT;
             } elseif ($_attr['scope'] == 'global') {
-                $_parent_scope = SMARTY_GLOBAL_SCOPE;
+                $_parent_scope = Smarty::SCOPE_GLOBAL;
             } 
         } 
         $_caching = 'null';
         if ($this->compiler->nocache || $this->compiler->tag_nocache) {
-            $_caching = SMARTY_CACHING_OFF;
+            $_caching = Smarty::CACHING_OFF;
         } 
         // default for included templates
         if ($this->compiler->template->caching && !$this->compiler->nocache && !$this->compiler->tag_nocache) {
-            $_caching = 9999;
+            $_caching = self::CACHING_NOCACHE_CODE;
         } 
         /*
         * if the {include} tag provides individual parameter for caching
@@ -104,38 +112,36 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase {
         if (isset($_attr['cache_lifetime'])) {
             $_cache_lifetime = $_attr['cache_lifetime'];
             $this->compiler->tag_nocache = true;
-            $_caching = SMARTY_CACHING_LIFETIME_CURRENT;
+            $_caching = Smarty::CACHING_LIFETIME_CURRENT;
         } else {
             $_cache_lifetime = 'null';
         } 
         if (isset($_attr['cache_id'])) {
             $_cache_id = $_attr['cache_id'];
             $this->compiler->tag_nocache = true;
-            $_caching = SMARTY_CACHING_LIFETIME_CURRENT;
+            $_caching = Smarty::CACHING_LIFETIME_CURRENT;
         } else {
             $_cache_id = '$_smarty_tpl->cache_id';
         } 
-        if (isset($_attr['nocache'])) {
-            if (trim($_attr['nocache'], "'\"") == 'true') {
-                $this->compiler->tag_nocache = true;
-                $_caching = SMARTY_CACHING_OFF;
-            } 
+        if (isset($_attr['compile_id'])) {
+            $_compile_id = $_attr['compile_id'];
+        } else {
+            $_compile_id = '$_smarty_tpl->compile_id';
         } 
-        if (isset($_attr['caching'])) {
-            if (trim($_attr['caching'], "'\"") == 'true') {
-                $_caching = SMARTY_CACHING_LIFETIME_CURRENT;
-            } else {
-                $this->compiler->tag_nocache = true;
-                $_caching = SMARTY_CACHING_OFF;
-            } 
+        if ($_attr['caching'] === true) {
+            $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+        } 
+        if ($_attr['nocache'] === true) {
+            $this->compiler->tag_nocache = true;
+            $_caching = Smarty::CACHING_OFF;
         } 
         // create template object
-        $_output = "<?php \$_template = new {$compiler->smarty->template_class}($include_file, \$_smarty_tpl->smarty, \$_smarty_tpl, $_cache_id, \$_smarty_tpl->compile_id, $_caching, $_cache_lifetime);\n"; 
+        $_output = "<?php \$_template = new {$compiler->smarty->template_class}($include_file, \$_smarty_tpl->smarty, \$_smarty_tpl, $_cache_id, $_compile_id, $_caching, $_cache_lifetime);\n"; 
         // delete {include} standard attributes
-        unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']); 
+        unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']); 
         // remaining attributes must be assigned as smarty variable
         if (!empty($_attr)) {
-            if ($_parent_scope == SMARTY_LOCAL_SCOPE) {
+            if ($_parent_scope == Smarty::SCOPE_LOCAL) {
                 // create variables
                 foreach ($_attr as $_key => $_value) {
                     $_output .= "\$_template->assign('$_key',$_value);";
index 5aa558ddf5378bd7bc8b2879762531957d741908..19ee186bc9e572836afaf6d366a249c38ec21714 100644 (file)
  * Smarty Internal Plugin Compile Insert Class
  */
 class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('file');
+       public $shorttag_order = array('file');
+    public $optional_attributes = array('once', 'assign'); 
+
     /**
      * Compiles code for the {include_php} tag
      * 
@@ -23,30 +28,46 @@ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase {
      */
     public function compile($args, $compiler)
     {
+       if (!$compiler->smarty->allow_php_tag) {
+               throw new SmartyException("{include_php} is deprecated, set allow_php_tag = true to enable");
+       } 
         $this->compiler = $compiler;
-        $this->required_attributes = array('file');
-        $this->optional_attributes = array('once', 'assign'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
         $_output = '<?php '; 
 
         $_smarty_tpl = $compiler->template; 
+        $_filepath = false;
         eval('$_file = ' . $_attr['file'] . ';'); 
-        
-        $_file = realpath($_file);
-
-        if ($this->compiler->smarty->security) {
-            $this->compiler->smarty->security_handler->isTrustedPHPDir($_file);
+        if (!isset($this->compiler->smarty->security_policy) && file_exists($_file)) {
+               $_filepath = $_file;
+        } else {
+            if (isset($this->compiler->smarty->security_policy)) {
+                $_dir = $this->compiler->smarty->security_policy->trusted_dir;
+            } else {
+                $_dir = $this->compiler->smarty->trusted_dir;
+            } 
+            if (!empty($_dir)) {
+                foreach((array)$_dir as $_script_dir) {
+                    if (strpos('/\\', substr($_script_dir, -1)) === false) {
+                        $_script_dir .= DS;
+                    } 
+                    if (file_exists($_script_dir . $_file)) {
+                        $_filepath = $_script_dir .  $_file;
+                        break;
+                    } 
+                } 
+            } 
         } 
-
-        if ($_file === false) {
-            $this->compiler->trigger_template_error('include_php: file "' . $_attr['file'] . '" is not readable');
+        if ($_filepath == false) {
+            $this->compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $this->compiler->lex->taglineno);
         } 
 
-        if ($this->compiler->smarty->security) {
-            $this->compiler->smarty->security_handler->isTrustedPHPDir($_file);
+        if (isset($this->compiler->smarty->security_policy)) {
+            $this->compiler->smarty->security_policy->isTrustedPHPDir($_filepath);
         } 
+
         if (isset($_attr['assign'])) {
             // output will be stored in a smarty variable instead of being displayed
             $_assign = $_attr['assign'];
@@ -59,9 +80,9 @@ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase {
         } 
 
         if (isset($_assign)) {
-            return "<?php ob_start(); include{$_once} ('{$_file}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>";
+            return "<?php ob_start(); include{$_once} ('{$_filepath}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>";
         } else {
-            return "<?php include{$_once} ('{$_file}');?>\n";
+            return "<?php include{$_once} ('{$_filepath}');?>\n";
         } 
     } 
 } 
index f1b5e8ebd903e69404296bfc24f713518fc0c35d..898e5315ae8678b5eed6fbd06d03a31adf299433 100644 (file)
  * Smarty Internal Plugin Compile Insert Class
  */
 class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('name');
+       public $shorttag_order = array('name');
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the {insert} tag
      * 
@@ -24,8 +29,6 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('name');
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args); 
         // never compile as nocache code
@@ -39,7 +42,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
         // save posible attributes
         eval('$_name = ' . $_attr['name'] . ';');
         if (isset($_attr['assign'])) {
-            // output will be stored in a smarty variable instead of beind displayed
+            // output will be stored in a smarty variable instead of being displayed
             $_assign = $_attr['assign']; 
             // create variable to make shure that the compiler knows about its nocache status
             $this->compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true);
@@ -50,10 +53,10 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
             $_smarty_tpl = $compiler->template;
             $_filepath = false;
             eval('$_script = ' . $_attr['script'] . ';');
-            if (!$this->compiler->smarty->security && file_exists($_script)) {
+            if (!isset($this->compiler->smarty->security_policy) && file_exists($_script)) {
                 $_filepath = $_script;
             } else {
-                if ($this->compiler->smarty->security) {
+                if (isset($this->compiler->smarty->security_policy)) {
                     $_dir = $this->compiler->smarty->security_policy->trusted_dir;
                 } else {
                     $_dir = $this->compiler->smarty->trusted_dir;
@@ -91,7 +94,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
             } 
         } 
         // delete {insert} standard attributes
-        unset($_attr['name'], $_attr['assign'], $_attr['script']); 
+        unset($_attr['name'], $_attr['assign'], $_attr['script'], $_attr['nocache']); 
         // convert attributes into parameter array string
         $_paramsArray = array();
         foreach ($_attr as $_key => $_value) {
@@ -103,14 +106,14 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
             if ($_smarty_tpl->caching) {
                 $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>";
             } else {
-                $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl), true);?>";
+                $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>";
             } 
         } else {
             $this->compiler->has_output = true;
             if ($_smarty_tpl->caching) {
                 $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>";
             } else {
-                $_output .= "echo {$_function}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl);?>";
+                $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
             } 
         } 
         return $_output;
index 9f6294cab6446de80512b38736ba96b8121d7f43..bdf86de4c5a6875e8c6e14ae5fd7e30041288169 100644 (file)
@@ -25,6 +25,9 @@ class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase {
     {
         $this->compiler = $compiler; 
         $_attr = $this->_get_attributes($args);
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
         // this tag does not return compiled code
         $this->compiler->has_code = true;
         return $this->compiler->smarty->left_delimiter;
index 3a4e113504eb6fad443df53c1014d6a4fd05bcb9..0c88b14bd57d7c9111cc7018773558ebe94351ce 100644 (file)
@@ -25,6 +25,9 @@ class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase {
     {
         $this->compiler = $compiler; 
         $_attr = $this->_get_attributes($args);
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
         // enter nocache mode
         $this->compiler->nocache = true;
         // this tag does not return compiled code
index 79772a12eb116648c559c08189fd7a550ee3fcbe..7cfdc51c8bef71dc82f24c1440f21ae543f596d2 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+ <?php
 /**
  * Smarty Internal Plugin Compile Block Plugin
  * 
  * Smarty Internal Plugin Compile Block Plugin Class
  */
 class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the execution of block plugin
      * 
      * @param array $args array with attributes from parser
-     * @param string $tag name of block function
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
+     * @param string $tag name of block plugin
+     * @param string $function PHP function name
      * @return string compiled code
      */
-    public function compile($args, $compiler, $tag, $function)
+    public function compile($args, $compiler, $parameter, $tag, $function)
     {
         $this->compiler = $compiler;
         if (strlen($tag) < 6 || substr($tag, -5) != 'close') {
             // opening tag of block plugin
-            $this->required_attributes = array();
-            $this->optional_attributes = array('_any'); 
-            // check and get attributes
-            $_attr = $this->_get_attributes($args); 
+               // check and get attributes
+               $_attr = $this->_get_attributes($args); 
+               if ($_attr['nocache'] === true) {
+               $this->compiler->tag_nocache = true;
+               }
+                       unset($_attr['nocache']);
             // convert attributes into parameter array string
             $_paramsArray = array();
             foreach ($_attr as $_key => $_value) {
@@ -45,7 +52,7 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi
             // maybe nocache because of nocache variables or nocache plugin
             $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; 
             // compile code
-            $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl);while (\$_block_repeat) { ob_start();?>";
+            $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
         } else {
             // must endblock be nocache?
             if ($this->compiler->nocache) {
@@ -56,7 +63,7 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi
             // This tag does create output
             $this->compiler->has_output = true; 
             // compile code
-            $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function}({$_params}, \$_block_content, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+            $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
         } 
         return $output . "\n";
     } 
index 77f83c0d36c0ceb90440f5bb7e16964577566c91..965d696ef887abe43c068618a3d99607a02cee43 100644 (file)
  * Smarty Internal Plugin Compile Function Plugin Class
  */
 class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array();
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the execution of function plugin
      * 
      * @param array $args array with attributes from parser
-     * @param string $tag name of function
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
+     * @param string $tag name of function plugin
+     * @param string $function PHP function name
      * @return string compiled code
      */
-    public function compile($args, $compiler, $tag, $function)
+    public function compile($args, $compiler, $parameter, $tag, $function)
     {
         $this->compiler = $compiler; 
         // This tag does create output
         $this->compiler->has_output = true;
 
-        $this->required_attributes = array();
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args); 
+        if ($_attr['nocache'] === true) {
+            $this->compiler->tag_nocache = true;
+        }
+        unset($_attr['nocache']);
         // convert attributes into parameter array string
         $_paramsArray = array();
         foreach ($_attr as $_key => $_value) {
@@ -42,7 +50,7 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co
         } 
         $_params = 'array(' . implode(",", $_paramsArray) . ')'; 
         // compile code
-        $output = "<?php echo {$function}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl);?>\n";
+        $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n";
         return $output;
     } 
 } 
index 06b5a885e4309acf71d8f6e94edc11748ca3f6c8..1648db2ed7649c086016555bcb2a47e390407887 100644 (file)
@@ -18,40 +18,29 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
      * \r
      * @param array $args array with attributes from parser\r
      * @param object $compiler compiler object\r
+     * @param array $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler)\r
+    public function compile($args, $compiler, $parameter)\r
     {\r
         $this->compiler = $compiler;\r
         $this->smarty = $this->compiler->smarty;\r
-        $this->required_attributes = array('value', 'modifierlist'); \r
         // check and get attributes\r
         $_attr = $this->_get_attributes($args);\r
-        $output = $_attr['value']; \r
+        $output = $parameter['value']; \r
         // loop over list of modifiers\r
-        foreach ($_attr['modifierlist'] as $single_modifier) {\r
-            preg_match_all('/(((\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|[^:"]*"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")[^:]*)+|::?|[^:]+)/', $single_modifier, $mod_array);\r
-            $modifier = $mod_array[0][0];\r
-            for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) {\r
-                if ($mod_array[0][$i] == ':') {\r
-                    $mod_array[0][$i] = ',';\r
-                } \r
-                if ($mod_array[0][$i] == '::') {\r
-                    $mod_array[0][$i-1] = $mod_array[0][$i-1] . $mod_array[0][$i] . $mod_array[0][$i + 1];\r
-                    unset($mod_array[0][$i], $mod_array[0][$i + 1]);\r
-                    $i++;\r
-                } \r
-            } \r
-            unset($mod_array[0][0]);\r
-            $params = $output . implode('', $mod_array[0]); \r
+        foreach ($parameter['modifierlist'] as $single_modifier) {\r
+            $modifier = $single_modifier[0];\r
+          $single_modifier[0] = $output;\r
+            $params = implode(',', $single_modifier); \r
             // check for registered modifier\r
-            if (isset($compiler->smarty->registered_plugins['modifier'][$modifier])) {\r
-                $function = $compiler->smarty->registered_plugins['modifier'][$modifier][0];\r
+            if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) {\r
+                $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];\r
                 if (!is_array($function)) {\r
                     $output = "{$function}({$params})";\r
                 } else {\r
                     if (is_object($function[0])) {\r
-                        $output = '$_smarty_tpl->smarty->registered_plugins[\'modifier\'][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';\r
+                        $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';\r
                     } else {\r
                         $output = $function[0] . '::' . $function[1] . '(' . $params . ')';\r
                     } \r
@@ -59,24 +48,18 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
                 // check for plugin modifiercompiler\r
             } else if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {\r
                 $plugin = 'smarty_modifiercompiler_' . $modifier;\r
-                foreach($mod_array[0] as $key => $value) {\r
-                    if ($value == ',') {\r
-                        unset ($mod_array[0][$key]);\r
-                    } \r
-                } \r
-                $args = array_merge((array)$output, $mod_array[0]);\r
-                $output = $plugin($args, $compiler); \r
+                $output = $plugin($single_modifier, $compiler); \r
                 // check for plugin modifier\r
-            } else if ($function = $this->compiler->getPlugin($modifier, 'modifier')) {\r
+            } else if ($function = $this->compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {\r
                 $output = "{$function}({$params})"; \r
                 // check if trusted PHP function\r
             } else if (is_callable($modifier)) {\r
                 // check if modifier allowed\r
-                if (!$this->compiler->template->security || $this->smarty->security_handler->isTrustedModifier($modifier, $this->compiler)) {\r
+                if (!is_object($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedModifier($modifier, $this->compiler)) {\r
                     $output = "{$modifier}({$params})";\r
                 } \r
             } else {\r
-                $this->compiler->trigger_template_error ("unknown modifier \"" . $modifier . "\"");\r
+                $this->compiler->trigger_template_error ("unknown modifier \"" . $modifier . "\"", $this->compiler->lex->taglineno);\r
             } \r
         } \r
         return $output;\r
index 83558bfcd0ed5c8c4d5d85baf1640e604d566c6e..f3ae966f6703c4581e0a75425452774b6b051a6b 100644 (file)
  * Smarty Internal Plugin Compile Object Block Function Class
  */
 class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array();
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the execution of block plugin
      * 
      * @param array $args array with attributes from parser
-     * @param string $tag name of block function
-     * @param string $methode name of methode to call
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
+     * @param string $tag name of block object
+     * @param string $methode name of methode to call
      * @return string compiled code
      */
-    public function compile($args, $compiler, $tag, $methode)
+    public function compile($args, $compiler, $parameter, $tag, $methode)
     {
         $this->compiler = $compiler;
         if (strlen($tag) < 5 || substr($tag, -5) != 'close') {
             // opening tag of block plugin
-            $this->required_attributes = array();
-            $this->optional_attributes = array('_any'); 
-            // check and get attributes
-            $_attr = $this->_get_attributes($args); 
+               // check and get attributes
+               $_attr = $this->_get_attributes($args); 
+               if ($_attr['nocache'] === true) {
+               $this->compiler->tag_nocache = true;
+               }
+                       unset($_attr['nocache']);
             // convert attributes into parameter array string
             $_paramsArray = array();
             foreach ($_attr as $_key => $_value) {
@@ -42,13 +49,19 @@ class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Inter
             } 
             $_params = 'array(' . implode(",", $_paramsArray) . ')';
 
-            $this->_open_tag($tag . '->' . $methode, $_params); 
+            $this->_open_tag($tag . '->' . $methode, array($_params, $this->compiler->nocache)); 
+            // maybe nocache because of nocache variables or nocache plugin
+            $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; 
             // compile code
-            $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$methode}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params}, null, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl);while (\$_block_repeat) { ob_start();?>";
+            $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$methode}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
         } else {
             $base_tag = substr($tag, 0, -5); 
-            // closing tag of block plugin
-            $_params = $this->_close_tag($base_tag . '->' . $methode); 
+            // must endblock be nocache?
+            if ($this->compiler->nocache) {
+                $this->compiler->tag_nocache = true;
+            } 
+            // closing tag of block plugin, restore nocache
+            list($_params, $this->compiler->nocache) = $this->_close_tag($base_tag . '->' . $methode); 
             // This tag does create output
             $this->compiler->has_output = true; 
             // compile code
index 32bdbdce224433688d34f05d33c8c422a8597feb..f0755f062ec38eb9a4e35180bfd6389c235aa799 100644 (file)
  * Smarty Internal Plugin Compile Object Function Class
  */
 class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array();
+    public $optional_attributes = array('_any'); 
+
     /**
      * Compiles code for the execution of function plugin
      * 
      * @param array $args array with attributes from parser
+     * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @param string $tag name of function
      * @param string $methode name of methode to call
-     * @param object $compiler compiler object
      * @return string compiled code
      */
-    public function compile($args, $compiler, $tag, $methode)
+    public function compile($args, $compiler, $parameter, $tag, $methode)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array();
-        $this->optional_attributes = array('_any'); 
         // check and get attributes
-        $_attr = $this->_get_attributes($args);
+        $_attr = $this->_get_attributes($args); 
+        if ($_attr['nocache'] === true) {
+            $this->compiler->tag_nocache = true;
+        }
+        unset($_attr['nocache']);
         $_assign = null;
         if (isset($_attr['assign'])) {
             $_assign = $_attr['assign'];
@@ -45,7 +52,7 @@ class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_Co
                 } 
             } 
             $_params = 'array(' . implode(",", $_paramsArray) . ')';
-            $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl)";
+            $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params},\$_smarty_tpl)";
         } else {
             $_params = implode(",", $_attr);
             $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$methode}({$_params})";
index 850917d4b02ae3928053b1340549a5b5c4d34fbe..3843428f4c435cfccbfc43de15f23e3cc8ddc606 100644 (file)
  * Smarty Internal Plugin Compile Print Expression Class
  */
 class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $optional_attributes = array('assign'); 
+    public $option_flags = array('nocache', 'nofilter'); 
+
     /**
      * Compiles code for gererting output from any expression
      * 
      * @param array $args array with attributes from parser
      * @param object $compiler compiler object
+     * @param array $parameter array with compilation parameter
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('value');
-        $this->optional_attributes = array('assign', 'nocache', 'filter', 'nofilter', 'modifierlist'); 
         // check and get attributes
-        $_attr = $this->_get_attributes($args);
-
-        if (isset($_attr['nocache'])) {
-            if ($_attr['nocache'] == 'true') {
-                $this->compiler->tag_nocache = true;
-            } 
-        } 
-
-        if (!isset($_attr['filter'])) {
-            $_attr['filter'] = 'null';
+        $_attr = $this->_get_attributes($args); 
+        // nocache option
+        if ($_attr['nocache'] === true) {
+            $this->compiler->tag_nocache = true;
         } 
-        if (isset($_attr['nofilter'])) {
-            if ($_attr['nofilter'] == 'true') {
-                $_attr['filter'] = 'false';
-            } 
+        // filter handling
+        if ($_attr['nofilter'] === true) {
+            $_filter = 'false';
+        } else {
+            $_filter = 'true';
         } 
-
+        // compiled output
+        // compiled output
         if (isset($_attr['assign'])) {
             // assign output to variable
-            $output = '<?php $_smarty_tpl->assign(' . $_attr['assign'] . ',' . $_attr['value'] . ');?>';
+            $output = "<?php \$_smarty_tpl->assign({$_attr['assign']},{$parameter['value']});?>";
         } else {
             // display value
-            if (isset($this->compiler->smarty->registered_filters['variable'])) {
-                $output = 'Smarty_Internal_Filter_Handler::runFilter(\'variable\', ' . $_attr['value'] . ',$_smarty_tpl->smarty, $_smarty_tpl, ' . $_attr['filter'] . ')';
+            if (!$_attr['nofilter'] && isset($this->compiler->smarty->registered_filters['variable'])) {
+                $output = "Smarty_Internal_Filter_Handler::runFilter('variable', {$parameter['value']},\$_smarty_tpl->smarty, \$_smarty_tpl, {$_filter})";
             } else {
-                $output = $_attr['value'];
+                $output = $parameter['value'];
             } 
-            if (!isset($_attr['nofilter']) && isset($this->compiler->smarty->default_modifiers)) {
-                $output = $this->compiler->compileTag('private_modifier', array('modifierlist' => $this->compiler->smarty->default_modifiers, 'value' => $output));
+            if (!$_attr['nofilter'] && !empty($this->compiler->smarty->default_modifiers)) {
+                $modifierlist = array();
+                foreach ($this->compiler->smarty->default_modifiers as $key => $single_default_modifier) {
+                    preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array);
+                    for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) {
+                        if ($mod_array[0][$i] != ':') {
+                            $modifierlist[$key][] = $mod_array[0][$i];
+                        } 
+                    } 
+                } 
+                $output = $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $modifierlist, 'value' => $output));
             } 
-            if (isset($_attr['modifierlist'])) {
-                $output = $this->compiler->compileTag('private_modifier', array('modifierlist' => $_attr['modifierlist'], 'value' => $output));
+            if (!empty($parameter['modifierlist'])) {
+                $output = $this->compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output));
             } 
-      $this->compiler->has_output = true;
-           $output = '<?php echo ' . $output . ';?>';
+            $this->compiler->has_output = true;
+            $output = "<?php echo {$output};?>";
         } 
         return $output;
     } 
index 39ad5903e259370975faff1cee49e3a8e5afba90..8f55a97c55f8f4787842fae0268580d087dc4033 100644 (file)
  * Smarty Internal Plugin Compile Registered Block Class\r
  */\r
 class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_CompileBase {\r
+       // attribute definitions\r
+    public $optional_attributes = array('_any'); \r
+\r
     /**\r
      * Compiles code for the execution of a block function\r
      * \r
      * @param array $args array with attributes from parser\r
-     * @param string $tag name of block function\r
      * @param object $compiler compiler object\r
+     * @param array $parameter array with compilation parameter\r
+     * @param string $tag name of block function\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler, $tag)\r
+    public function compile($args, $compiler, $parameter, $tag)\r
     {\r
         $this->compiler = $compiler;\r
         if (strlen($tag) < 6 || substr($tag,-5) != 'close') {\r
             // opening tag of block plugin\r
-            $this->required_attributes = array();\r
-            $this->optional_attributes = array('_any'); \r
-            // check and get attributes\r
-            $_attr = $this->_get_attributes($args); \r
+               // check and get attributes\r
+               $_attr = $this->_get_attributes($args); \r
+               if ($_attr['nocache']) {\r
+               $this->compiler->tag_nocache = true;\r
+               }\r
+                       unset($_attr['nocache']);\r
             // convert attributes into parameter array string\r
             $_paramsArray = array();\r
             foreach ($_attr as $_key => $_value) {\r
@@ -43,15 +49,15 @@ class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_C
 \r
             $this->_open_tag($tag, array($_params, $this->compiler->nocache)); \r
             // maybe nocache because of nocache variables or nocache plugin\r
-            $this->compiler->nocache = !$compiler->smarty->registered_plugins['block'][$tag][1] | $this->compiler->nocache | $this->compiler->tag_nocache;\r
-            $function = $compiler->smarty->registered_plugins['block'][$tag][0]; \r
+            $this->compiler->nocache = !$compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag][1] | $this->compiler->nocache | $this->compiler->tag_nocache;\r
+            $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag][0]; \r
             // compile code\r
             if (!is_array($function)) {\r
-                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl);while (\$_block_repeat) { ob_start();?>";\r
+                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";\r
             } else if (is_object($function[0])) {\r
-                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]->{$function[1]}({$_params}, null, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl);while (\$_block_repeat) { ob_start();?>";\r
+                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; \$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]->{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";\r
             } else {\r
-                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl);while (\$_block_repeat) { ob_start();?>";\r
+                $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";\r
             } \r
         } else {\r
             // must endblock be nocache?\r
@@ -63,14 +69,14 @@ class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_C
             list($_params, $this->compiler->nocache) = $this->_close_tag($base_tag); \r
             // This tag does create output\r
             $this->compiler->has_output = true;\r
-            $function = $compiler->smarty->registered_plugins['block'][$base_tag][0]; \r
+            $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0]; \r
             // compile code\r
             if (!is_array($function)) {\r
-                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function}({$_params}, \$_block_content, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
+                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
             } else if (is_object($function[0])) {\r
-                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo \$_smarty_tpl->smarty->registered_plugins['block']['{$base_tag}'][0][0]->{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
+                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo \$_smarty_tpl->smarty->registered_plugins['block']['{$base_tag}'][0][0]->{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
             } else {\r
-                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function[0]}::{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl->smarty, \$_block_repeat, \$_smarty_tpl); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
+                $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false; echo {$function[0]}::{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";\r
             } \r
         } \r
         return $output."\n";\r
index 3590beac479280688a5454012df36835489dad1f..ca4e68dbaaa0b8d4cb69918df4fe48cb1280708b 100644 (file)
  * Smarty Internal Plugin Compile Registered Function Class\r
  */\r
 class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Internal_CompileBase {\r
+       // attribute definitions\r
+    public $optional_attributes = array('_any'); \r
+\r
     /**\r
      * Compiles code for the execution of a registered function\r
      * \r
      * @param array $args array with attributes from parser\r
-     * @param string $tag name of function\r
      * @param object $compiler compiler object\r
+     * @param array $parameter array with compilation parameter\r
+     * @param string $tag name of function\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler, $tag)\r
+    public function compile($args, $compiler, $parameter, $tag)\r
     {\r
         $this->compiler = $compiler; \r
         // This tag does create output\r
         $this->compiler->has_output = true;\r
-\r
-        $this->required_attributes = array();\r
-        $this->optional_attributes = array('_any'); \r
         // check and get attributes\r
         $_attr = $this->_get_attributes($args); \r
+        if ($_attr['nocache']) {\r
+            $this->compiler->tag_nocache = true;\r
+        }\r
+        unset($_attr['nocache']);\r
         // not cachable?\r
-        $this->compiler->tag_nocache = !$compiler->smarty->registered_plugins['function'][$tag][1]; \r
+        $this->compiler->tag_nocache =  $this->compiler->tag_nocache || !$compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag][1]; \r
         // convert attributes into parameter array string\r
         $_paramsArray = array();\r
         foreach ($_attr as $_key => $_value) {\r
@@ -43,14 +48,14 @@ class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Interna
             } \r
         } \r
         $_params = 'array(' . implode(",", $_paramsArray) . ')'; \r
-        $function = $compiler->smarty->registered_plugins['function'][$tag][0]; \r
+        $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag][0]; \r
         // compile code\r
         if (!is_array($function)) {\r
-            $output = "<?php echo {$function}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl);?>\n";\r
+            $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n";\r
         } else if (is_object($function[0])) {\r
-            $output = "<?php echo \$_smarty_tpl->smarty->registered_plugins['function']['{$tag}'][0][0]->{$function[1]}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl);?>\n";\r
+            $output = "<?php echo \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0][0]->{$function[1]}({$_params},\$_smarty_tpl);?>\n";\r
         } else {\r
-            $output = "<?php echo {$function[0]}::{$function[1]}({$_params},\$_smarty_tpl->smarty,\$_smarty_tpl);?>\n";\r
+            $output = "<?php echo {$function[0]}::{$function[1]}({$_params},\$_smarty_tpl);?>\n";\r
         } \r
         return $output;\r
     } \r
index ec628b05b1c4fdf30ecea7ff7318d37b04bb498b..76527f4eeb72b59c50abb5542acbb30263f643f5 100644 (file)
@@ -20,22 +20,22 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
      * @param object $compiler compiler object
      * @return string compiled code
      */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
-        $_index = explode(',', str_replace(array(']['), array(','), substr($args, 1, strlen($args)-2)));
+        $_index = preg_split("/\]\[/",substr($parameter, 1, strlen($parameter)-2));
         $compiled_ref = ' ';
         $variable = trim($_index[0], "'");
         switch ($variable) {
             case 'foreach':
-                return "\$_smarty_tpl->getVariable('smarty')->value$args";
+                return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
             case 'section':
-                return "\$_smarty_tpl->getVariable('smarty')->value$args";
+                return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
             case 'capture':
-                return "\$_smarty_tpl->smarty->_smarty_vars$args";
+                return "\$_smarty_tpl->smarty->_smarty_vars$parameter";
             case 'now':
                 return 'time()';
             case 'cookies':
-                if ($compiler->smarty->security && !$compiler->smarty->security_policy->allow_super_globals) {
+                if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
                     $compiler->trigger_template_error("(secure mode) super globals not permitted");
                     break;
                 } 
@@ -48,7 +48,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
             case 'server':
             case 'session':
             case 'request':
-                if ($compiler->smarty->security && !$compiler->smarty->security_policy->allow_super_globals) {
+                if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
                     $compiler->trigger_template_error("(secure mode) super globals not permitted");
                     break;
                 } 
@@ -78,7 +78,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
                 return "'$_version'";
 
             case 'const':
-                if ($compiler->smarty->security && !$compiler->smarty->security_policy->allow_constants) {
+                if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) {
                     $compiler->trigger_template_error("(secure mode) constants not permitted");
                     break;
                 } 
@@ -104,7 +104,7 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
                 $compiled_ref = $compiled_ref . "[$_ind]";
             } 
         } 
-        return $compiled_ref;
+        return "(isset($compiled_ref)? $compiled_ref : null)";
     } 
 } 
 
index e8f3eb24ffccc6edd75f056bf166043587911c12..6436bfd1659009ada85ba7e189aeb9fc067a2350 100644 (file)
@@ -25,6 +25,9 @@ class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_CompileBase {
     {
         $this->compiler = $compiler; 
         $_attr = $this->_get_attributes($args);
+        if ($_attr['nocache'] === true) {
+               $this->compiler->trigger_template_error('nocache option not allowed', $this->compiler->lex->taglineno);
+        }
         // this tag does not return compiled code
         $this->compiler->has_code = true;
         return $this->compiler->smarty->right_delimiter;
index 50c8272265cd4610424ae2386d5cb8edf3e1a7f3..0768b026e107a1227aa1d68cd34e1c10b1e089ca 100644 (file)
  * Smarty Internal Plugin Compile Section Class
  */
 class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase {
+       // attribute definitions
+    public $required_attributes = array('name', 'loop');
+       public $shorttag_order = array('name', 'loop');
+    public $optional_attributes = array('start', 'step', 'max', 'show'); 
+
     /**
      * Compiles code for the {section} tag
      * 
@@ -23,8 +28,6 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase {
     public function compile($args, $compiler)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('name', 'loop');
-        $this->optional_attributes = array('start', 'step', 'max', 'show'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
 
index 1a0d8dd429231290fcc23b527ab895bc8583e6c1..ecad071484a397a5d30d9fd678d0d983abbc868a 100644 (file)
@@ -18,12 +18,12 @@ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase {
     * 
     * @param array $args array with attributes from parser
     * @param object $compiler compiler object
+    * @param array $parameter array with compilation parameter
     * @return string compiled code
     */
-    public function compile($args, $compiler)
+    public function compile($args, $compiler, $parameter)
     {
         $this->compiler = $compiler;
-        $this->required_attributes = array('if condition'); 
         // check and get attributes
         $_attr = $this->_get_attributes($args);
         $this->_open_tag('while', $this->compiler->nocache);
@@ -32,12 +32,12 @@ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase {
         $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache;
 
         
-        if (is_array($args['if condition'])) {
-            $_output = " <?php if (!isset(\$_smarty_tpl->tpl_vars[".$args['if condition']['var']."])) \$_smarty_tpl->tpl_vars[".$args['if condition']['var']."] = new Smarty_Variable;\n";
-            $_output .= " while (\$_smarty_tpl->tpl_vars[".$args['if condition']['var']."]->value = ".$args['if condition']['value'].") {\n ?>";
+        if (is_array($parameter['if condition'])) {
+            $_output = " <?php if (!isset(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."])) \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable;\n";
+            $_output .= " while (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value'].") {\n ?>";
             return $_output;
         } else {
-            return '<?php while (' . $args['if condition'] . ') { ?>';
+            return '<?php while (' . $parameter['if condition'] . ') { ?>';
         } 
     } 
 } 
index 9485eacd71c13d49308a7cfd43aafa9802fed0a3..5b3260a295b8f3b1046892bb96b830212295f685 100644 (file)
 <?php
 
 /**
-* Smarty Internal Plugin CompileBase
-* 
-* @package Smarty
-* @subpackage Compiler
-* @author Uwe Tews 
-*/
+ * Smarty Internal Plugin CompileBase
+ 
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews 
+ */
 
 /**
-* This class does extend all internal compile plugins
-*/
-//abstract class Smarty_Internal_CompileBase implements TagCompilerInterface 
-abstract class Smarty_Internal_CompileBase 
-{
-    function __construct()
-    {
-        // initialize valid attributes
-        $this->required_attributes = array();
-        $this->optional_attributes = array();
-    } 
+ * This class does extend all internal compile plugins
+ */
+// abstract class Smarty_Internal_CompileBase implements TagCompilerInterface
+class Smarty_Internal_CompileBase {
+       public $required_attributes = array();
+    public $optional_attributes = array();
+    public $shorttag_order = array();
+    public $option_flags = array('nocache');
+
 
     /**
-    * This function checks if the attributes passed are valid
-    * 
-    * The attributes passed for the tag to compile are checked against the list of required and 
-    * optional attributes. Required attributes must be present. Optional attributes are check against
-    * against the corresponding list. The keyword '_any' specifies that any attribute will be accepted 
-    * as valid
-    * 
-    * @todo More generallized handling of the nocache attributes in compile plugins
-    * @param array $args attributes applied to the tag
-    * @return array attributes for further processing
-    */
-    function _get_attributes ($args)
-    { 
+     * This function checks if the attributes passed are valid
+     * 
+     * The attributes passed for the tag to compile are checked against the list of required and 
+     * optional attributes. Required attributes must be present. Optional attributes are check against
+     * against the corresponding list. The keyword '_any' specifies that any attribute will be accepted 
+     * as valid
+     * 
+     * @param array $attributes attributes applied to the tag
+     * @return array of mapped attributes for further processing
+     */
+    function _get_attributes ($attributes)
+    {
+        $_indexed_attr = array(); 
+        // loop over attributes
+        foreach ($attributes as $key => $mixed) {
+            // shorthand ?
+            if (!is_array($mixed)) {
+                // option flag ?
+                if (in_array(trim($mixed, '\'"'), $this->option_flags)) {
+                    $_indexed_attr[trim($mixed, '\'"')] = true; 
+                    // shorthand attribute ?
+                } else if (isset($this->shorttag_order[$key])) {
+                    $_indexed_attr[$this->shorttag_order[$key]] = $mixed;
+                } else {
+                    // too many shorthands
+                    $this->compiler->trigger_template_error('too many shorthand attributes', $this->compiler->lex->taglineno);
+                } 
+                // named attribute
+            } else {
+                $kv = each($mixed); 
+                // option flag?
+                if (in_array($kv['key'], $this->option_flags)) {
+                    if (is_bool($kv['value'])) {
+                        $_indexed_attr[$kv['key']] = $kv['value'];
+                    } else if (is_string($kv['value']) && in_array(trim($kv['value'], '\'"'), array('true', 'false'))) {
+                        if (trim($kv['value']) == 'true') {
+                            $_indexed_attr[$kv['key']] = true;
+                        } else {
+                            $_indexed_attr[$kv['key']] = false;
+                        } 
+                    } else if (is_numeric($kv['value']) && in_array($kv['value'], array(0, 1))) {
+                        if ($kv['value'] == 1) {
+                            $_indexed_attr[$kv['key']] = true;
+                        } else {
+                            $_indexed_attr[$kv['key']] = false;
+                        } 
+                    } else {
+                        $this->compiler->trigger_template_error("illegal value of option flag \"{$kv['key']}\"", $this->compiler->lex->taglineno);
+                    } 
+                    // must be named attribute
+                } else {
+                    $_indexed_attr = array_merge($_indexed_attr, $mixed);
+                } 
+            } 
+        } 
         // check if all required attributes present
         foreach ($this->required_attributes as $attr) {
-            if (!array_key_exists($attr, $args)) {
-                $this->compiler->trigger_template_error("missing \"" . $attr . "\" attribute");
+            if (!array_key_exists($attr, $_indexed_attr)) {
+                $this->compiler->trigger_template_error("missing \"" . $attr . "\" attribute", $this->compiler->lex->taglineno);
             } 
         } 
         // check for unallowed attributes
         if ($this->optional_attributes != array('_any')) {
-            $tmp_array = array_merge($this->required_attributes, $this->optional_attributes);
-            foreach ($args as $key => $dummy) {
-                 if (!in_array($key, $tmp_array) && $key !== 0) {
-                   $this->compiler->trigger_template_error("unexpected \"" . $key . "\" attribute");
+            $tmp_array = array_merge($this->required_attributes, $this->optional_attributes, $this->option_flags);
+            foreach ($_indexed_attr as $key => $dummy) {
+                if (!in_array($key, $tmp_array) && $key !== 0) {
+                    $this->compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", $this->compiler->lex->taglineno);
                 } 
             } 
         } 
+        // default 'false' for all option flags not set
+        foreach ($this->option_flags as $flag) {
+            if (!isset($_indexed_attr[$flag])) {
+                $_indexed_attr[$flag] = false;
+            } 
+        } 
 
-        return $args;
+        return $_indexed_attr;
     } 
 
     /**
-    * Push opening tag name on stack
-    * 
-    * Optionally additional data can be saved on stack
-    * 
-    * @param string $open_tag the opening tag's name
-    * @param anytype $data optional data which shall be saved on stack
-    */
+     * Push opening tag name on stack
+     
+     * Optionally additional data can be saved on stack
+     
+     * @param string $open_tag the opening tag's name
+     * @param anytype $data optional data which shall be saved on stack
+     */
     function _open_tag($open_tag, $data = null)
     {
         array_push($this->compiler->_tag_stack, array($open_tag, $data));
     } 
 
     /**
-    * Pop closing tag
-    * 
-    * Raise an error if this stack-top doesn't match with expected opening tags
-    * 
-    * @param array $ |string $expected_tag the expected opening tag names
-    * @return anytype the opening tag's name or saved data
-    */
+     * Pop closing tag
+     
+     * Raise an error if this stack-top doesn't match with expected opening tags
+     
+     * @param array $ |string $expected_tag the expected opening tag names
+     * @return anytype the opening tag's name or saved data
+     */
     function _close_tag($expected_tag)
     {
         if (count($this->compiler->_tag_stack) > 0) {
@@ -95,7 +141,7 @@ abstract class Smarty_Internal_CompileBase
             return;
         } 
         // wrong nesting of tags
-        $this->compiler->trigger_template_error("unexpected closing tag",$this->compiler->lex->taglineno);
+        $this->compiler->trigger_template_error("unexpected closing tag", $this->compiler->lex->taglineno);
         return;
     } 
 } 
index 5097398ce8926981f94ca8cc8f34730194416887..06ae70ba910e9b12c5cb37137e864a6051933c7e 100644 (file)
@@ -12,9 +12,9 @@
 class Smarty_Internal_Config {
     static $config_objects = array();
 
-    public function __construct($config_resource, $smarty, $template = null)
+    public function __construct($config_resource, $smarty, $data = null)
     {
-        $this->template = $template;
+        $this->data = $data;
         $this->smarty = $smarty;
         $this->config_resource = $config_resource;
         $this->config_resource_type = null;
@@ -135,6 +135,7 @@ class Smarty_Internal_Config {
     } 
     public function buildCompiledFilepath()
     {
+        $_compile_id = isset($this->smarty->compile_id) ? preg_replace('![^\w\|]+!', '_', $this->smarty->compile_id) : null;
         $_flag = (int)$this->smarty->config_read_hidden + (int)$this->smarty->config_booleanize * 2 +
         (int)$this->smarty->config_overwrite * 4;
         $_filepath = sha1($this->config_resource_name . $_flag); 
@@ -145,6 +146,10 @@ class Smarty_Internal_Config {
              . substr($_filepath, 4, 2) . DS
              . $_filepath;
         } 
+        $_compile_dir_sep = $this->smarty->use_sub_dirs ? DS : '^';
+        if (isset($_compile_id)) {
+            $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
+        } 
         $_compile_dir = $this->smarty->compile_dir;
         if (substr($_compile_dir, -1) != DS) {
             $_compile_dir .= DS;
@@ -233,39 +238,51 @@ class Smarty_Internal_Config {
     * @param mixed $sections array of section names, single section or null
     * @param object $scope global,parent or local
     */
-    public function loadConfigVars ($sections = null, $scope)
+    public function loadConfigVars ($sections = null, $scope = 'local')
     {
-        if (isset($this->template)) {
-            $this->template->properties['file_dependency'][sha1($this->getConfigFilepath())] = array($this->getConfigFilepath(), $this->getTimestamp());
-        } else {
-            $this->smarty->properties['file_dependency'][sha1($this->getConfigFilepath())] = array($this->getConfigFilepath(), $this->getTimestamp());
+        if ($this->data instanceof Smarty_Internal_Template) {
+            $this->data->properties['file_dependency'][sha1($this->getConfigFilepath())] = array($this->getConfigFilepath(), $this->getTimestamp(),'file');
         } 
         if ($this->mustCompile()) {
             $this->compileConfigSource();
-        } 
+        }
+        // pointer to scope
+        if ($scope == 'local') {
+               $scope_ptr = $this->data;
+        } elseif ($scope == 'parent') {
+               if (isset($this->data->parent)) {
+                       $scope_ptr = $this->data->parent;
+               } else {
+                       $scope_ptr = $this->data;
+               }                       
+        } elseif ($scope == 'root' || $scope == 'global') {
+               $scope_ptr = $this->data;
+               while (isset($scope_ptr->parent)) {
+                       $scope_ptr = $scope_ptr->parent;
+               } 
+        }
         $_config_vars = array();
-        include($this->getCompiledFilepath ()); 
+        include($this->getCompiledFilepath ());
         // copy global config vars
         foreach ($_config_vars['vars'] as $variable => $value) {
-            if ($this->smarty->config_overwrite || !isset($scope->config_vars[$variable])) {
-                $scope->config_vars[$variable] = $value;
+            if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+                $scope_ptr->config_vars[$variable] = $value;
             } else {
-                $scope->config_vars[$variable] = array_merge((array)$scope->config_vars[$variable], (array)$value);
+                $scope_ptr->config_vars[$variable] = array_merge((array)$scope_ptr->config_vars[$variable], (array)$value);
             } 
         } 
         // scan sections
         foreach ($_config_vars['sections'] as $this_section => $dummy) {
             if ($sections == null || in_array($this_section, (array)$sections)) {
                 foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
-                    if ($this->smarty->config_overwrite || !isset($scope->config_vars[$variable])) {
-                        $scope->config_vars[$variable] = $value;
+                    if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+                        $scope_ptr->config_vars[$variable] = $value;
                     } else {
-                        $scope->config_vars[$variable] = array_merge((array)$scope->config_vars[$variable], (array)$value);
+                        $scope_ptr->config_vars[$variable] = array_merge((array)$scope_ptr->config_vars[$variable], (array)$value);
                     } 
                 } 
             } 
-        } 
+        }
     } 
 } 
-
 ?>
\ No newline at end of file
index 469dab276dd7af161db19fb7a5991ddc5a2cb2c9..e9dfbdb02155b307acd5c9ff80d8fe9590396477 100644 (file)
@@ -23,7 +23,7 @@ class Smarty_Internal_Config_File_Compiler {
         $this->smarty = $smarty; 
         // get required plugins
         $this->smarty->loadPlugin('Smarty_Internal_Configfilelexer');
-        $this->smarty->loadPlugin('Smarty_Internal_Configfileparser');
+               $this->smarty->loadPlugin('Smarty_Internal_Configfileparser');
         $this->config_data['sections'] = array();
         $this->config_data['vars'] = array();
     } 
index 95a03c774ab78ddb7e58bede044246fa1dcbea0c..5b8d48abc48e8b0c0ffddd5c2115ef2a0d92de7a 100644 (file)
@@ -25,17 +25,17 @@ class Smarty_Internal_Data {
      * @param boolean $nocache if true any output of this variable will be not cached
      * @param boolean $scope the scope the variable will have  (local,parent or root)
      */
-    public function assign($tpl_var, $value = null, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function assign($tpl_var, $value = null, $nocache = false)
     {
         if (is_array($tpl_var)) {
             foreach ($tpl_var as $_key => $_val) {
                 if ($_key != '') {
-                    $this->tpl_vars[$_key] = new Smarty_variable($_val, $nocache, $scope);
+                    $this->tpl_vars[$_key] = new Smarty_variable($_val, $nocache);
                 } 
             } 
         } else {
             if ($tpl_var != '') {
-                $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache, $scope);
+                $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache);
             } 
         } 
     } 
@@ -49,7 +49,7 @@ class Smarty_Internal_Data {
     public function assignGlobal($varname, $value = null, $nocache = false)
     {
         if ($varname != '') {
-            $this->smarty->global_tpl_vars[$varname] = new Smarty_variable($value, $nocache);
+            Smarty::$global_tpl_vars[$varname] = new Smarty_variable($value, $nocache);
         } 
     } 
     /**
@@ -58,27 +58,26 @@ class Smarty_Internal_Data {
      * @param string $tpl_var the template variable name
      * @param mixed $ &$value the referenced value to assign
      * @param boolean $nocache if true any output of this variable will be not cached
-     * @param boolean $scope the scope the variable will have  (local,parent or root)
      */
-    public function assignByRef($tpl_var, &$value, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function assignByRef($tpl_var, &$value, $nocache = false)
     {
         if ($tpl_var != '') {
-            $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache, $scope);
+            $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
             $this->tpl_vars[$tpl_var]->value = &$value;
         } 
     } 
+
     /**
      * wrapper function for Smarty 2 BC
      * 
      * @param string $tpl_var the template variable name
      * @param mixed $ &$value the referenced value to assign
-     * @param boolean $nocache if true any output of this variable will be not cached
-     * @param boolean $scope the scope the variable will have  (local,parent or root)
      */
-    public function assign_by_ref($tpl_var, &$value, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function assign_by_ref($tpl_var, &$value)
     {
-        trigger_error("function call 'assign_by_ref' is unknown or deprecated, use 'assignByRef'", E_USER_NOTICE);
-        $this->assignByRef($tpl_var, $value, $nocache, $scope);
+               if($this->smarty->deprecation_notices)
+               trigger_error("function call 'assign_by_ref' is unknown or deprecated, use 'assignByRef'", E_USER_NOTICE);
+        $this->assignByRef($tpl_var, $value);
     } 
     /**
      * appends values to template variables
@@ -87,9 +86,8 @@ class Smarty_Internal_Data {
      * @param mixed $value the value to append
      * @param boolean $merge flag if array elements shall be merged
      * @param boolean $nocache if true any output of this variable will be not cached
-     * @param boolean $scope the scope the variable will have  (local,parent or root)
      */
-    public function append($tpl_var, $value = null, $merge = false, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function append($tpl_var, $value = null, $merge = false, $nocache = false)
     {
         if (is_array($tpl_var)) {
             // $tpl_var is an array, ignore $value
@@ -98,12 +96,9 @@ class Smarty_Internal_Data {
                     if (!isset($this->tpl_vars[$_key])) {
                         $tpl_var_inst = $this->getVariable($_key, null, true, false);
                         if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
-                            $this->tpl_vars[$_key] = new Smarty_variable(null, $nocache, $scope);
+                            $this->tpl_vars[$_key] = new Smarty_variable(null, $nocache);
                         } else {
                             $this->tpl_vars[$_key] = clone $tpl_var_inst;
-                            if ($scope != SMARTY_LOCAL_SCOPE) {
-                                $this->tpl_vars[$_key]->scope = $scope;
-                            } 
                         } 
                     } 
                     if (!(is_array($this->tpl_vars[$_key]->value) || $this->tpl_vars[$_key]->value instanceof ArrayAccess)) {
@@ -123,12 +118,9 @@ class Smarty_Internal_Data {
                 if (!isset($this->tpl_vars[$tpl_var])) {
                     $tpl_var_inst = $this->getVariable($tpl_var, null, true, false);
                     if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
-                        $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache, $scope);
+                        $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
                     } else {
                         $this->tpl_vars[$tpl_var] = clone $tpl_var_inst;
-                        if ($scope != SMARTY_LOCAL_SCOPE) {
-                            $this->tpl_vars[$tpl_var]->scope = $scope;
-                        } 
                     } 
                 } 
                 if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) {
@@ -170,8 +162,8 @@ class Smarty_Internal_Data {
             } 
         } 
     } 
-    /**
-     * wrapper function for Smarty 2 BC
+     /**
      * 
      * @param string $tpl_var the template variable name
      * @param mixed $ &$value the referenced value to append
@@ -179,7 +171,8 @@ class Smarty_Internal_Data {
      */
     public function append_by_ref($tpl_var, &$value, $merge = false)
     {
-        trigger_error("function call 'append_by_ref' is unknown or deprecated, use 'appendByRef'", E_USER_NOTICE);
+               if($this->smarty->deprecation_notices)
+               trigger_error("function call 'append_by_ref' is unknown or deprecated, use 'appendByRef'", E_USER_NOTICE);
         $this->appendByRef($tpl_var, $value, $merge);
     } 
     /**
@@ -212,8 +205,8 @@ class Smarty_Internal_Data {
                     $_ptr = null;
                 } 
             } 
-            if ($search_parents && isset($this->global_tpl_vars)) {
-                foreach ($this->global_tpl_vars AS $key => $var) {
+            if ($search_parents && isset(Smarty::$global_tpl_vars)) {
+                foreach (Smarty::$global_tpl_vars AS $key => $var) {
                     $_result[$key] = $var->value;
                 } 
             } 
@@ -254,8 +247,8 @@ class Smarty_Internal_Data {
     public function configLoad($config_file, $sections = null)
     { 
         // load Config class
-        $config = new Smarty_Internal_Config($config_file, $this->smarty);
-        $config->loadConfigVars($sections, $this);
+        $config = new Smarty_Internal_Config($config_file, $this->smarty, $this);
+        $config->loadConfigVars($sections);
     } 
 
     /**
@@ -282,9 +275,9 @@ class Smarty_Internal_Data {
                 $_ptr = null;
             } 
         } 
-        if (isset($this->smarty->global_tpl_vars[$variable])) {
+        if (isset(Smarty::$global_tpl_vars[$variable])) {
             // found it, return it
-            return $this->smarty->global_tpl_vars[$variable];
+            return Smarty::$global_tpl_vars[$variable];
         } 
         if ($this->smarty->error_unassigned && $error_enable) {
             throw new SmartyException('Undefined Smarty variable "' . $variable . '"');
@@ -312,7 +305,7 @@ class Smarty_Internal_Data {
         if ($this->smarty->error_unassigned) {
             throw new SmartyException('Undefined config variable "' . $variable . '"');
         } else {
-            return '';
+            return null;
         } 
     } 
     /**
@@ -335,7 +328,7 @@ class Smarty_Internal_Data {
         if ($this->smarty->error_unassigned) {
             throw new SmartyException('Undefined stream variable "' . $variable . '"');
         } else {
-            return '';
+            return null;
         } 
     } 
 
@@ -428,7 +421,7 @@ class Smarty_Variable {
      * @param boolean $nocache if true any output of this variable will be not cached
      * @param boolean $scope the scope the variable will have  (local,parent or root)
      */
-    public function __construct ($value = null, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function __construct ($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
     {
         $this->value = $value;
         $this->nocache = $nocache;
index ad1091b5f6f8ad26e05e1bc88bf5301582ad4f52..d165d7d78a332054231cf1a3db210ae08223ed90 100644 (file)
@@ -73,21 +73,30 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data {
     /**
      * Opens a window for the Smarty Debugging Consol and display the data
      */
-    public static function display_debug($smarty)
+    public static function display_debug($obj)
     { 
         // prepare information of assigned variables
-        $_assigned_vars = $smarty->tpl_vars;
+        $ptr = $obj;
+        while (isset($ptr->parent)) {
+               $ptr = $ptr->parent;
+        }
+        if ($obj instanceof Smarty) {
+               $smarty = $obj;
+        } else {
+                       $smarty = $obj->smarty;
+               }               
+        $_assigned_vars = $ptr->tpl_vars;
         ksort($_assigned_vars);
-        $_config_vars = $smarty->config_vars;
+        $_config_vars = $ptr->config_vars;
         ksort($_config_vars);
         $ldelim = $smarty->left_delimiter;
         $rdelim = $smarty->right_delimiter;
         $smarty->left_delimiter = '{';
         $smarty->right_delimiter = '}';
-        $_template = new Smarty_Template ($smarty->debug_tpl, $smarty);
+        $_template = new Smarty_Internal_Template ($smarty->debug_tpl, $smarty);
         $_template->caching = false;
         $_template->force_compile = false;
-        $_template->security = false;
+        $_template->disableSecurity();
         $_template->cache_id = null;
         $_template->compile_id = null;
         $_template->assign('template_data', self::$template_data);
diff --git a/gosa-core/include/smarty/sysplugins/smarty_internal_filter.php b/gosa-core/include/smarty/sysplugins/smarty_internal_filter.php
new file mode 100644 (file)
index 0000000..90214ad
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Filter
+ * 
+ * External Smarty filter methods
+ * 
+ * @package Smarty
+ * @author Uwe Tews 
+ */
+
+/**
+ * Class for filter methods
+ */
+class Smarty_Internal_Filter {
+
+    function __construct($smarty)
+    {
+        $this->smarty = $smarty;
+    } 
+    /**
+     * Registers a filter function
+     * 
+     * @param string $type filter type
+     * @param callback $callback 
+     */
+       public function registerFilter($type, $callback)
+       {
+               $this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
+       }
+
+    /**
+     * Unregisters a filter function
+     * 
+     * @param string $type filter type
+     * @param callback $callback 
+     */
+       public function unregisterFilter($type, $callback)
+       {
+               $name = $this->_get_filter_name($callback);
+               if(isset($this->smarty->registered_filters[$type][$name])) {
+               unset($this->smarty->registered_filters[$type][$name]);
+               }
+       }
+
+
+    /**
+     * Return internal filter name
+     * 
+     * @param callback $function_name 
+     */
+    public function _get_filter_name($function_name)
+    {
+        if (is_array($function_name)) {
+            $_class_name = (is_object($function_name[0]) ?
+                get_class($function_name[0]) : $function_name[0]);
+            return $_class_name . '_' . $function_name[1];
+        } else {
+            return $function_name;
+        } 
+    } 
+
+
+    /**
+     * load a filter of specified type and name
+     * 
+     * @param string $type filter type
+     * @param string $name filter name
+     * @return bool 
+     */
+    function loadFilter($type, $name)
+    {
+        $_plugin = "smarty_{$type}filter_{$name}";
+        $_filter_name = $_plugin;
+        if ($this->smarty->loadPlugin($_plugin)) {
+            if (class_exists($_plugin, false)) {
+                $_plugin = array($_plugin, 'execute');
+            } 
+            if (is_callable($_plugin)) {
+                return $this->smarty->registered_filters[$type][$_filter_name] = $_plugin;
+            } 
+        } 
+        throw new SmartyException("{$type}filter \"{$name}\" not callable");
+        return false;
+    } 
+
+
+}
+?>
\ No newline at end of file
index ae11a7ce6f2f745f2c7b88058f012066002ccd71..76e97816e7a802dacc87d23ba2ae4001f6151d5b 100644 (file)
@@ -34,9 +34,9 @@ class Smarty_Internal_Nocache_Insert {
         } \r
         // call insert\r
         if (isset($_assign)) {\r
-            $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . ",\$_smarty_tpl->smarty,\$_smarty_tpl), true);?>";\r
+            $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . ",\$_smarty_tpl), true);?>";\r
         } else {\r
-            $_output .= "echo {$_function}(" . var_export($_attr, true) . ",\$_smarty_tpl->smarty,\$_smarty_tpl);?>";\r
+            $_output .= "echo {$_function}(" . var_export($_attr, true) . ",\$_smarty_tpl);?>";\r
         } \r
         $_tpl = $_template;\r
         while ($_tpl->parent instanceof Smarty_Internal_Template) {\r
index a1e3acd0f287b68be9f59e653ef4736b860200e6..aee61584047b261317d9813cd1fd9cc1829b64da 100644 (file)
 <?php
 
 /**
- * Project:     Smarty: the PHP compiling template engine
- * File:        smarty_internal_register.php
- * SVN:         $Id: $
+ * Smarty Internal Plugin Register
  * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * External Smarty methods register/unregister
  * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
- * For questions, help, comments, discussion, etc., please join the
- * Smarty mailing list. Send a blank e-mail to
- * smarty-discussion-subscribe@googlegroups.com
- * 
- * @link http://www.smarty.net/
- * @copyright 2008 New Digital Group, Inc.
- * @author Monte Ohrt <monte at ohrt dot com> 
- * @author Uwe Tews 
  * @package Smarty
- * @subpackage PluginsInternal
- * @version 3-SVN$Rev: 3286 $
+ * @author Uwe Tews 
  */
 
+/**
+ * Class for register/unregister methods
+ */
 class Smarty_Internal_Register {
-    protected $smarty;
 
     function __construct($smarty)
     {
         $this->smarty = $smarty;
     } 
-
     /**
-     * Registers block function to be used in templates
+     * Registers plugin to be used in templates
      * 
-     * @param string $block_tag name of template block
-     * @param string $block_impl PHP function to register
+     * @param string $type plugin type
+     * @param string $tag name of template tag
+     * @param callback $callback PHP callback to register
      * @param boolean $cacheable if true (default) this fuction is cachable
      * @param array $cache_attr caching attributes if any
      */
-    function block($block_tag, $block_impl, $cacheable = true, $cache_attr = array())
-    {
-        if (isset($this->smarty->registered_plugins['block'][$block_tag])) {
-            throw new SmartyException("Plugin tag \"{$block_tag}\" already registered");
-        } elseif (!is_callable($block_impl)) {
-            throw new SmartyException("Plugin \"{$block_tag}\" not callable");
-        } else {
-            $this->smarty->registered_plugins['block'][$block_tag] =
-            array($block_impl, $cacheable, $cache_attr);
-        } 
-    } 
+
+       public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null)
+       {
+               if (isset($this->smarty->registered_plugins[$type][$tag])) {
+               throw new Exception("Plugin tag \"{$tag}\" already registered");
+       } elseif (!is_callable($callback)) {
+               throw new Exception("Plugin \"{$tag}\" not callable");
+       } else {
+                       $this->smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable);
+               if (isset($cache_attr)&&in_array($type, array(Smarty::PLUGIN_BLOCK, Smarty::PLUGIN_FUNCTION))) {
+                       $this->smarty->registered_plugins[$type][$tag][] = (array) $cache_attr;
+               }
+       }
+       } 
 
     /**
-     * Registers compiler function
+     * Unregister Plugin
      * 
-     * @param string $compiler_tag of template function
-     * @param string $compiler_impl name of PHP function to register
-     * @param boolean $cacheable if true (default) this fuction is cachable
+     * @param string $type of plugin
+     * @param string $tag name of plugin
      */
-    function compilerFunction($compiler_tag, $compiler_impl, $cacheable = true)
+    function unregisterPlugin($type, $tag)
     {
-        if (isset($this->smarty->registered_plugins['compiler'][$compiler_tag])) {
-            throw new SmartyException("Plugin tag \"{$compiler_tag}\" already registered");
-        } elseif (!is_callable($compiler_impl)) {
-            throw new SmartyException("Plugin \"{$compiler_tag}\" not callable");
-        } else {
-            $this->smarty->registered_plugins['compiler'][$compiler_tag] =
-            array($compiler_impl, $cacheable);
+        if (isset($this->smarty->registered_plugins[$type][$tag])) {
+            unset($this->smarty->registered_plugins[$type][$tag]);
         } 
     } 
-
     /**
-     * Registers custom function to be used in templates
+     * Registers a resource to fetch a template
      * 
-     * @param string $function_tag the name of the template function
-     * @param string $function_impl the name of the PHP function to register
-     * @param boolean $cacheable if true (default) this fuction is cachable
-     * @param array $cache_attr caching attributes if any
+     * @param string $type name of resource type
+     * @param array $callback array of callbacks to handle resource
      */
-    function templateFunction($function_tag, $function_impl, $cacheable = true, $cache_attr = array())
-    {
-        if (isset($this->smarty->registered_plugins['function'][$function_tag])) {
-            throw new SmartyException("Plugin tag \"{$function_tag}\" already registered");
-        } elseif (!is_callable($function_impl)) {
-            throw new SmartyException("Plugin \"{$function_tag}\" not callable");
-        } else {
-            $this->smarty->registered_plugins['function'][$function_tag] =
-            array($function_impl, $cacheable, $cache_attr);
-        } 
-    } 
+       public function registerResource($type, $callback)
+       {
+               $this->smarty->registered_resources[$type] = array($callback, false);
+    }
 
     /**
-     * Registers modifier to be used in templates
+     * Unregisters a resource 
      * 
-     * @param string $modifier_name name of template modifier
-     * @param string $modifier_impl name of PHP function to register
+     * @param string $type name of resource type
      */
-    function modifier($modifier_name, $modifier_impl)
+   function unregisterResource($type)
     {
-        if (isset($this->smarty->registered_plugins['modifier'][$modifier_name])) {
-            throw new SmartyException("Plugin \"{$modifier_name}\" already registered");
-        } elseif (!is_callable($modifier_impl)) {
-            throw new SmartyException("Plugin \"{$modifier_name}\" not callable");
-        } else {
-            $this->smarty->registered_plugins['modifier'][$modifier_name] =
-            array($modifier_impl);
+        if (isset($this->smarty->registered_resources[$type])) {
+            unset($this->smarty->registered_resources[$type]);
         } 
     } 
 
+
     /**
      * Registers object to be used in templates
      * 
@@ -126,7 +88,7 @@ class Smarty_Internal_Register {
      * @param boolean $smarty_args smarty argument format, else traditional
      * @param mixed $ null | array $block_functs list of methods that are block format
      */
-    function templateObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+    function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
     { 
         // test if allowed methodes callable
         if (!empty($allowed)) {
@@ -155,7 +117,7 @@ class Smarty_Internal_Register {
      * @param string $class name of template class
      * @param string $class_impl the referenced PHP class to register
      */
-    function templateClass($class_name, $class_impl)
+    function registerClass($class_name, $class_impl)
     { 
         // test if exists
         if (!class_exists($class_impl)) {
@@ -165,100 +127,33 @@ class Smarty_Internal_Register {
         $this->smarty->registered_classes[$class_name] = $class_impl;
     } 
 
-    /**
-     * Registers an output filter function to apply
-     * to a template output
-     * 
-     * @param callback $function_name 
-     */
-    function outputFilter($function_name)
-    {
-        $this->smarty->registered_filters['output'][$this->smarty->_get_filter_name($function_name)] = $function_name;
-    } 
-
-    /**
-     * Registers a postfilter function to apply
-     * to a compiled template after compilation
-     * 
-     * @param callback $function_name 
-     */
-    function postFilter($function_name)
-    {
-        $this->smarty->registered_filters['post'][$this->smarty->_get_filter_name($function_name)] = $function_name;
-    } 
-
-    /**
-     * Registers a prefilter function to apply
-     * to a template before compiling
-     * 
-     * @param callback $function_name 
-     */
-    function preFilter($function_name)
-    {
-        $this->smarty->registered_filters['pre'][$this->smarty->_get_filter_name($function_name)] = $function_name;
-    } 
-
-    /**
-     * Registers a resource to fetch a template
-     * 
-     * @param string $resource_type name of resource type
-     * @param array $function_names array of functions to handle resource
-     */
-    function resource($resource_type, $function_names)
-    {
-        if (count($function_names) == 4) {
-            $this->smarty->_plugins['resource'][$resource_type] =
-            array($function_names, false);
-        } elseif (count($function_names) == 5) {
-            $this->smarty->_plugins['resource'][$resource_type] =
-            array(array(array(&$function_names[0], $function_names[1]),
-                    array(&$function_names[0], $function_names[2]),
-                    array(&$function_names[0], $function_names[3]),
-                    array(&$function_names[0], $function_names[4])),
-                false);
-        } else {
-            throw new SmartyException("malformed function-list for '$resource_type' in register_resource");
-        } 
-    } 
-
-    /**
-     * Registers an output filter function which
-     * runs over any variable output
-     * 
-     * @param callback $function_name 
-     */
-    function variableFilter($function_name)
-    {
-        $this->smarty->registered_filters['variable'][$this->smarty->_get_filter_name($function_name)] = $function_name;
-    } 
-
     /**
      * Registers a default plugin handler
      * 
-     * @param  $function_name mixed string | array $plugin class/methode name
+     * @param  $callback mixed string | array $plugin class/methode name
      */
-    function defaultPluginHandler($function_name)
+    function registerDefaultPluginHandler($callback)
     {
-        if (is_callable($function_name)) {
-            $this->smarty->default_plugin_handler_func = $function_name;
+        if (is_callable($callback)) {
+            $this->smarty->default_plugin_handler_func = $callback;
         } else {
-            throw new SmartyException("Default plugin handler '$function_name' not callable");
+            throw new SmartyException("Default plugin handler '$callback' not callable");
         } 
     } 
 
     /**
      * Registers a default template handler
      * 
-     * @param  $function_name mixed string | array class/method name
+     * @param  $callback mixed string | array class/method name
      */
-    function defaultTemplateHandler($function_name)
+    function registerDefaultTemplateHandler($callback)
     {
-        if (is_callable($function_name)) {
-            $this->smarty->default_template_handler_func = $function_name;
+        if (is_callable($callback)) {
+            $this->smarty->default_template_handler_func = $callback;
         } else {
-            throw new SmartyException("Default template handler '$function_name' not callable");
+            throw new SmartyException("Default template handler '$callback' not callable");
         } 
     } 
-}
 
+}
 ?>
\ No newline at end of file
index 2eb2085715e3be184499adf24b7c01895b3d724c..c4a75f585aca1bf27ab389e3c7e63b1a7c48401a 100644 (file)
@@ -86,5 +86,4 @@ class Smarty_Internal_Resource_Eval {
         return false;\r
     } \r
 } \r
-\r
 ?>
\ No newline at end of file
index c263f8ac301a171adac4ac66b6e2d6c1dd25cdc8..74dc0f9b6205e5d4c5a819d38b035fcc695587a7 100644 (file)
@@ -58,9 +58,9 @@ class Smarty_Internal_Resource_Extends {
         foreach ($_files as $_file) {
             $_filepath = $_template->buildTemplateFilepath ($_file);
             if ($_filepath !== false) {
-                if ($_template->security) {
-                    $_template->smarty->security_handler->isTrustedResourceDir($_filepath);
-                
+               if (is_object($_template->smarty->security_policy)) {
+                       $_template->smarty->security_policy->isTrustedResourceDir($_filepath);
+               } 
             } 
             $sha1String .= $_filepath;
             $this->allFilepaths[$_file] = $_filepath;
@@ -98,16 +98,16 @@ class Smarty_Internal_Resource_Extends {
                        }
             // read template file
             if ($_filepath != $_first) {
-                $_template->properties['file_dependency'][sha1($_filepath)] = array($_filepath, filemtime($_filepath));
+                $_template->properties['file_dependency'][sha1($_filepath)] = array($_filepath, filemtime($_filepath),'file');
             } 
             $_template->template_filepath = $_filepath;
             $_content = file_get_contents($_filepath);
             if ($_filepath != $_last) {
                 if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $_open) !=
-                        preg_match_all("!({$this->_ldl}/block(.*?){$this->_rdl})!", $_content, $_close)) {
-                    $this->smarty->trigger_error("unmatched {block} {/block} pairs in file '$_filepath'");
+                        preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $_close)) {
+                    $this->smarty->triggerError("unmatched {block} {/block} pairs in file '$_filepath'");
                 } 
-                preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block(.*?){$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+                preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
                 $_result_count = count($_result[0]);
                 $_start = 0;
                 while ($_start < $_result_count) {
@@ -123,7 +123,7 @@ class Smarty_Internal_Resource_Extends {
                     } 
                     $_block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.parent' . $this->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%',
                         substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0])));
-                    $this->saveBlockData($_block_content, $_result[0][$_start][0], $_filepath, $_template);
+                    Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $_template, $_filepath);
                     $_start = $_start + $_end + 1;
                 } 
             } else {
@@ -133,48 +133,6 @@ class Smarty_Internal_Resource_Extends {
         } 
     }
     
-    /**
-     * saveBlockData
-     */    
-    protected function saveBlockData($block_content, $block_tag, $_filepath, $_template)
-    {
-        if (0 == preg_match("!(.?)(name=)(.*?)(?=(\s|{$this->_rdl}))!", $block_tag, $_match)) {
-            $this->smarty->trigger_error("'{$block_tag}' missing name attribute in file '$_filepath'");
-        } else {
-            $_name = trim($_match[3], '\'"');
-       // replace {$smarty.block.child} 
-            if (strpos($block_content, $this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter) !== false) {
-                if (isset($_template->block_data[$_name])) {
-                    $block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter,
-                        $_template->block_data[$_name]['source'], $block_content);
-                    unset($_template->block_data[$_name]);
-                } else {
-                    $block_content = str_replace($this->smarty->left_delimiter . '$smarty.block.child' . $this->smarty->right_delimiter,
-                        '', $block_content);
-                } 
-            } 
-            if (isset($_template->block_data[$_name])) {
-                if (strpos($_template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
-                    $_template->block_data[$_name]['source'] =
-                    str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $_template->block_data[$_name]['source']);
-                } elseif ($_template->block_data[$_name]['mode'] == 'prepend') {
-                    $_template->block_data[$_name]['source'] .= $block_content;
-                } elseif ($_template->block_data[$_name]['mode'] == 'append') {
-                    $_template->block_data[$_name]['source'] = $block_content . $_template->block_data[$_name]['source'];
-                } 
-            } else {
-                $_template->block_data[$_name]['source'] = $block_content;
-            } 
-            if (preg_match('/(.?)(append)(.*)/', $block_tag, $_match) != 0) {
-                $_template->block_data[$_name]['mode'] = 'append';
-            } elseif (preg_match('/(.?)(prepend)(.*)/', $block_tag, $_match) != 0) {
-                $_template->block_data[$_name]['mode'] = 'prepend';
-            } else {
-                $_template->block_data[$_name]['mode'] = 'replace';
-            } 
-            $_template->block_data[$_name]['file'] = $_filepath;
-        } 
-    } 
 
     /**
      * Get filepath to compiled template
index abdd6c5a47fd084e3e6effff893ffd02414d0d31..79decc599686b23da614804bf4a736133bcd7d12 100644 (file)
@@ -51,8 +51,8 @@ class Smarty_Internal_Resource_File {
         $_filepath = $_template->buildTemplateFilepath ();
 
         if ($_filepath !== false) {
-            if ($_template->security) {
-                $_template->smarty->security_handler->isTrustedResourceDir($_filepath);
+            if (is_object($_template->smarty->security_policy)) {
+                $_template->smarty->security_policy->isTrustedResourceDir($_filepath);
             } 
         } 
         $_template->templateUid = sha1($_filepath);
@@ -79,8 +79,8 @@ class Smarty_Internal_Resource_File {
     public function getTemplateSource($_template)
     { 
         // read template file
-        if (file_exists($_template->getTemplateFilepath())) {
-            $_template->template_source = file_get_contents($_template->getTemplateFilepath());
+        if (file_exists($_tfp = $_template->getTemplateFilepath())) {
+            $_template->template_source = file_get_contents($_tfp);
             return true;
         } else {
             return false;
index d0d285f659ab112f3883d7203d28a39d04b9ed08..16c77446e5a3ab821a90311462663ea7efcb94c1 100644 (file)
@@ -50,8 +50,8 @@ class Smarty_Internal_Resource_PHP {
     {
         $_filepath = $_template->buildTemplateFilepath ();
 
-        if ($_template->security) {
-            $_template->smarty->security_handler->isTrustedResourceDir($_filepath);
+        if (is_object($_template->smarty->security_policy)) {
+            $_template->smarty->security_policy->isTrustedResourceDir($_filepath);
         } 
         $_template->templateUid = sha1($_filepath);
         return $_filepath;
@@ -76,8 +76,8 @@ class Smarty_Internal_Resource_PHP {
      */
     public function getTemplateSource($_template)
     {
-        if (file_exists($_template->getTemplateFilepath())) {
-            $_template->template_source = file_get_contents($_template->getTemplateFilepath());
+        if (file_exists($_tfp = $_template->getTemplateFilepath())) {
+            $_template->template_source = file_get_contents($_tfp);
             return true;
         } else {
             return false;
index d120d1790fe4c9c10bb5c809f10797addf34ffb6..467da11a839b72ca5924b57d6f848d76869a179d 100644 (file)
  * Smarty Internal Plugin Resource Registered
  */
 class Smarty_Internal_Resource_Registered {
-    public function __construct($smarty)
+    public function __construct($template, $resource_type = null)
     {
-        $this->smarty = $smarty;
+        $this->smarty = $template->smarty;
+        if (isset($resource_type)) {
+               $template->smarty->registerResource($resource_type,
+                       array("smarty_resource_{$resource_type}_source",
+                       "smarty_resource_{$resource_type}_timestamp",
+                       "smarty_resource_{$resource_type}_secure",
+                       "smarty_resource_{$resource_type}_trusted"));
+        }
     } 
     // classes used for compiling Smarty templates from file resource
     public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler';
@@ -62,7 +69,7 @@ class Smarty_Internal_Resource_Registered {
     { 
         // return timestamp
         $time_stamp = false;
-        call_user_func_array($this->smarty->_plugins['resource'][$_template->resource_type][0][1],
+        call_user_func_array($this->smarty->registered_resources[$_template->resource_type][0][1],
             array($_template->resource_name, &$time_stamp, $this->smarty));
         return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp;
     }
@@ -77,7 +84,7 @@ class Smarty_Internal_Resource_Registered {
     { 
         // return timestamp
         $time_stamp = false;
-        call_user_func_array($this->smarty->_plugins['resource'][$_resource_type][0][1],
+        call_user_func_array($this->smarty->registered_resources[$_resource_type][0][1],
             array($_resource_name, &$time_stamp, $this->smarty));
         return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp;
     } 
@@ -91,7 +98,7 @@ class Smarty_Internal_Resource_Registered {
     public function getTemplateSource($_template)
     { 
         // return template string
-        return call_user_func_array($this->smarty->_plugins['resource'][$_template->resource_type][0][0],
+        return call_user_func_array($this->smarty->registered_resources[$_template->resource_type][0][0],
             array($_template->resource_name, &$_template->template_source, $this->smarty));
     } 
 
index e8a4e7f80e7d3b5ad32418a781d728113ff418ee..6b81ed0ce9c0ac62589196bf53ade216bc1ff9e9 100644 (file)
@@ -24,13 +24,12 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     public $cache_lifetime = null;
     public $cacher_class = null;
     public $caching_type = null;
-    public $force_compile = null;
     public $forceNocache = false; 
     // Template resource
     public $template_resource = null;
     public $resource_type = null;
     public $resource_name = null;
-    public $resource_object = null;
+//    public $resource_object = null;
     private $isExisting = null;
     public $templateUid = ''; 
     // Template source
@@ -45,13 +44,14 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     public $suppressHeader = false;
     public $suppressFileDependency = false;
     public $has_nocache_code = false; 
+    public $write_compiled_code = true; 
     // Rendered content
     public $rendered_content = null; 
     // Cache file
     private $cached_filepath = null;
     public $cached_timestamp = null;
     private $isCached = null;
-    private $cache_resource_object = null;
+//    private $cache_resource_object = null;
     private $cacheFileChecked = false; 
     // template variables
     public $tpl_vars = array();
@@ -65,7 +65,6 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
         'function' => array()); 
     // required plugins
     public $required_plugins = array('compiled' => array(), 'nocache' => array());
-    public $security = false;
     public $saved_modifier = null;
     public $smarty = null;
     // blocks for template inheritance
@@ -87,27 +86,16 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
         // Smarty parameter
         $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
         $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
-        $this->force_compile = $this->smarty->force_compile;
         $this->caching = $_caching === null ? $this->smarty->caching : $_caching;
-        if ($this->caching === true) $this->caching = SMARTY_CACHING_LIFETIME_CURRENT;
+        if ($this->caching === true) $this->caching =  Smarty::CACHING_LIFETIME_CURRENT;
         $this->cache_lifetime = $_cache_lifetime === null ?$this->smarty->cache_lifetime : $_cache_lifetime;
-        $this->force_cache = $this->smarty->force_cache;
-        $this->security = $this->smarty->security;
         $this->parent = $_parent; 
         // dummy local smarty variable
         $this->tpl_vars['smarty'] = new Smarty_Variable; 
         // Template resource
         $this->template_resource = $template_resource; 
-        // parse resource name
-        if (!$this->parseResourceName ($template_resource, $this->resource_type, $this->resource_name, $this->resource_object)) {
-            throw new SmartyException ("Unable to parse resource name \"{$template_resource}\"");
-        } 
-        // load cache resource
-        if (!$this->resource_object->isEvaluated && ($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED)) {
-            $this->cache_resource_object = $this->smarty->cache->loadResource();
-        }
         // copy block data of template inheritance
-        if ($this->parent instanceof Smarty_Template or $this->parent instanceof Smarty_Internal_Template) {
+        if ($this->parent instanceof Smarty_Internal_Template) {
                $this->block_data = $this->parent->block_data;
         }
  
@@ -187,7 +175,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     {
         $this->isExisting(true);
         if ($this->mustCompile === null) {
-            $this->mustCompile = ($this->resource_object->usesCompiler && ($this->force_compile || $this->resource_object->isEvaluated || $this->getCompiledTimestamp () === false || 
+            $this->mustCompile = ($this->resource_object->usesCompiler && ($this->smarty->force_compile || $this->resource_object->isEvaluated || $this->getCompiledTimestamp () === false || 
                     // ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ())));
                     ($this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTemplateTimestamp ())));
         } 
@@ -249,7 +237,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     {
         if (!$this->resource_object->isEvaluated) {
             $this->properties['file_dependency'] = array();
-            $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp());
+            $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp(),$this->resource_type);
         } 
         if ($this->smarty->debugging) {
             Smarty_Internal_Debug::start_compile($this);
@@ -278,7 +266,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
             throw $e;
         } 
         // compiling succeded
-        if (!$this->resource_object->isEvaluated) {
+        if (!$this->resource_object->isEvaluated && $this->write_compiled_code) {
             // write compiled template
             Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->compiled_template, $this->smarty);
         } 
@@ -296,11 +284,8 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
      */
     public function getCachedFilepath ()
     {
-        if (!isset($this->cache_resource_object)) {
-            $this->cache_resource_object = $this->smarty->cache->loadResource();
-        } 
         return $this->cached_filepath === null ?
-        $this->cached_filepath = ($this->resource_object->isEvaluated || !($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedFilepath($this) :
+        $this->cached_filepath = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedFilepath($this) :
         $this->cached_filepath;
     } 
 
@@ -313,11 +298,8 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
      */
     public function getCachedTimestamp ()
     {
-        if (!isset($this->cache_resource_object)) {
-            $this->cache_resource_object = $this->smarty->cache->loadResource();
-        } 
         return $this->cached_timestamp === null ?
-        $this->cached_timestamp = ($this->resource_object->isEvaluated || !($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedTimestamp($this) :
+        $this->cached_timestamp = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedTimestamp($this) :
         $this->cached_timestamp;
     } 
 
@@ -328,11 +310,8 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
      */
     public function getCachedContent ()
     {
-        if (!isset($this->cache_resource_object)) {
-            $this->cache_resource_object = $this->smarty->cache->loadResource();
-        } 
         return $this->rendered_content === null ?
-        $this->rendered_content = ($this->resource_object->isEvaluated || !($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedContents($this) :
+        $this->rendered_content = ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) ? false : $this->cache_resource_object->getCachedContents($this) :
         $this->rendered_content;
     } 
 
@@ -341,7 +320,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
      */
     public function writeCachedContent ($content)
     {
-        if ($this->resource_object->isEvaluated || !($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED)) {
+        if ($this->resource_object->isEvaluated || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) {
             // don't write cache file
             return false;
         } 
@@ -356,19 +335,26 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
      * 
      * @return boolean true if cache is valid
      */
-    public function isCached ($no_render = true)
+    public function isCached ($template = null, $cache_id = null, $compile_id = null, $parent = null)
     {
+       if ($template === null) {               
+                       $no_render = true;
+               } elseif ($template === false) {
+                       $no_render = false;
+               } else {
+                       if ($parent === null) {
+                               $parent = $this;
+                       }
+                       $this->smarty->isCached ($template, $cache_id, $compile_id, $parent);
+               }
         if ($this->isCached === null) {
             $this->isCached = false;
-            if (($this->caching == SMARTY_CACHING_LIFETIME_CURRENT || $this->caching == SMARTY_CACHING_LIFETIME_SAVED) && !$this->resource_object->isEvaluated) {
-                if (!isset($this->cache_resource_object)) {
-                    $this->cache_resource_object = $this->smarty->cache->loadResource();
-                } 
+            if (($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED) && !$this->resource_object->isEvaluated) {
                 $cachedTimestamp = $this->getCachedTimestamp();
-                if ($cachedTimestamp === false || $this->force_compile || $this->force_cache) {
+                if ($cachedTimestamp === false || $this->smarty->force_compile || $this->smarty->force_cache) {
                     return $this->isCached;
                 } 
-                if ($this->caching === SMARTY_CACHING_LIFETIME_SAVED || ($this->caching == SMARTY_CACHING_LIFETIME_CURRENT && (time() <= ($cachedTimestamp + $this->cache_lifetime) || $this->cache_lifetime < 0))) {
+                if ($this->caching === Smarty::CACHING_LIFETIME_SAVED || ($this->caching == Smarty::CACHING_LIFETIME_CURRENT && (time() <= ($cachedTimestamp + $this->cache_lifetime) || $this->cache_lifetime < 0))) {
                     if ($this->smarty->debugging) {
                         Smarty_Internal_Debug::start_cache($this);
                     } 
@@ -381,7 +367,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                         return $this->isCached;
                     } 
                     $this->cacheFileChecked = true;
-                    if ($this->caching === SMARTY_CACHING_LIFETIME_SAVED && $this->properties['cache_lifetime'] >= 0 && (time() > ($this->getCachedTimestamp() + $this->properties['cache_lifetime']))) {
+                    if ($this->caching === Smarty::CACHING_LIFETIME_SAVED && $this->properties['cache_lifetime'] >= 0 && (time() > ($this->getCachedTimestamp() + $this->properties['cache_lifetime']))) {
                         $this->tpl_vars = array();
                         $this->rendered_content = null;
                         return $this->isCached;
@@ -390,10 +376,10 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                         $resource_type = null;
                         $resource_name = null;
                         foreach ($this->properties['file_dependency'] as $_file_to_check) {
-                            $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name);
-                            If ($resource_type == 'file') {
+                            If ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'extends' || $_file_to_check[2] == 'php') {
                                 $mtime = filemtime($_file_to_check[0]);
                             } else {
+                                $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name);
                                 $resource_handler = $this->loadTemplateResourceHandler($resource_type);
                                 $mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name);
                             } 
@@ -441,10 +427,10 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                         $resource_type = null;
                         $resource_name = null;
                         foreach ($this->properties['file_dependency'] as $_file_to_check) {
-                            $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name);
-                            If ($resource_type == 'file') {
+                            If ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'extends' || $_file_to_check[2] == 'php') {
                                 $mtime = filemtime($_file_to_check[0]);
                             } else {
+                               $this->getResourceTypeName($_file_to_check[0], $resource_type, $resource_name);
                                 $resource_handler = $this->loadTemplateResourceHandler($resource_type);
                                 $mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name);
                             } 
@@ -477,9 +463,9 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
         } 
         $this->rendered_content = ob_get_clean();
         if (!$this->resource_object->isEvaluated && empty($this->properties['file_dependency'][$this->templateUid])) {
-            $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp());
+            $this->properties['file_dependency'][$this->templateUid] = array($this->getTemplateFilepath(), $this->getTemplateTimestamp(),$this->resource_type);
         } 
-        if ($this->parent instanceof Smarty_Template or $this->parent instanceof Smarty_Internal_Template) {
+        if ($this->parent instanceof Smarty_Internal_Template) {
             $this->parent->properties['file_dependency'] = array_merge($this->parent->properties['file_dependency'], $this->properties['file_dependency']);
             foreach($this->required_plugins as $code => $tmp1) {
                 foreach($tmp1 as $name => $tmp) {
@@ -493,7 +479,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
             Smarty_Internal_Debug::end_render($this);
         } 
         // write to cache when nessecary
-        if (!$this->resource_object->isEvaluated && ($this->caching == SMARTY_CACHING_LIFETIME_SAVED || $this->caching == SMARTY_CACHING_LIFETIME_CURRENT)) {
+        if (!$this->resource_object->isEvaluated && ($this->caching == Smarty::CACHING_LIFETIME_SAVED || $this->caching == Smarty::CACHING_LIFETIME_CURRENT)) {
             if ($this->smarty->debugging) {
                 Smarty_Internal_Debug::start_cache($this);
             } 
@@ -591,7 +577,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
         // cache template object under a unique ID
         // do not cache eval resources
         if ($resource_type != 'eval') {
-            $this->smarty->template_objects[crc32($this->template_resource . $this->cache_id . $this->compile_id)] = $this;
+            $this->smarty->template_objects[sha1($this->template_resource . $this->cache_id . $this->compile_id)] = $this;
         } 
         return true;
     } 
@@ -634,25 +620,25 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     /**
      * Update Smarty variables in other scopes
      */
-    public function updateParentVariables ($scope = SMARTY_LOCAL_SCOPE)
+    public function updateParentVariables ($scope = Smarty::SCOPE_LOCAL)
     {
         $has_root = false;
         foreach ($this->tpl_vars as $_key => $_variable) {
             $_variable_scope = $this->tpl_vars[$_key]->scope;
-            if ($scope == SMARTY_LOCAL_SCOPE && $_variable_scope == SMARTY_LOCAL_SCOPE) {
+            if ($scope == Smarty::SCOPE_LOCAL && $_variable_scope == Smarty::SCOPE_LOCAL) {
                 continue;
             } 
-            if (isset($this->parent) && ($scope == SMARTY_PARENT_SCOPE || $_variable_scope == SMARTY_PARENT_SCOPE)) {
+            if (isset($this->parent) && ($scope == Smarty::SCOPE_PARENT || $_variable_scope == Smarty::SCOPE_PARENT)) {
                 if (isset($this->parent->tpl_vars[$_key])) {
                     // variable is already defined in parent, copy value
                     $this->parent->tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value;
                 } else {
                     // create variable in parent
                     $this->parent->tpl_vars[$_key] = clone $_variable;
-                    $this->parent->tpl_vars[$_key]->scope = SMARTY_LOCAL_SCOPE;
+                    $this->parent->tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL;
                 } 
             } 
-            if ($scope == SMARTY_ROOT_SCOPE || $_variable_scope == SMARTY_ROOT_SCOPE) {
+            if ($scope == Smarty::SCOPE_ROOT || $_variable_scope == Smarty::SCOPE_ROOT) {
                 if ($this->parent == null) {
                     continue;
                 } 
@@ -670,18 +656,18 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                 } else {
                     // create variable in root
                     $root_ptr->tpl_vars[$_key] = clone $_variable;
-                    $root_ptr->tpl_vars[$_key]->scope = SMARTY_LOCAL_SCOPE;
+                    $root_ptr->tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL;
                 } 
             } 
-            if ($scope == SMARTY_GLOBAL_SCOPE || $_variable_scope == SMARTY_GLOBAL_SCOPE) {
-                if (isset($this->smarty->global_tpl_vars[$_key])) {
+            if ($scope == Smarty::SCOPE_GLOBAL || $_variable_scope == Smarty::SCOPE_GLOBAL) {
+                if (isset(Smarty::$global_tpl_vars[$_key])) {
                     // variable is already defined in root, copy value
-                    $this->smarty->global_tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value;
+                    Smarty::$global_tpl_vars[$_key]->value = $this->tpl_vars[$_key]->value;
                 } else {
-                    // create variable in root
-                    $this->smarty->global_tpl_vars[$_key] = clone $_variable;
+                    // create global variable
+                   Smarty::$global_tpl_vars[$_key] = clone $_variable;
                 } 
-                $this->smarty->global_tpl_vars[$_key]->scope = SMARTY_LOCAL_SCOPE;
+               Smarty::$global_tpl_vars[$_key]->scope = Smarty::SCOPE_LOCAL;
             } 
         } 
     } 
@@ -706,9 +692,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                 // 1 char is not resource type, but part of filepath
                 $resource_type = 'file';
                 $resource_name = $template_resource;
-            } else {
-                $resource_type = $resource_type;
-            } 
+            }
         } 
     } 
 
@@ -721,11 +705,11 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     protected function loadTemplateResourceHandler ($resource_type)
     { 
         // try registered resource
-        if (isset($this->smarty->_plugins['resource'][$resource_type])) {
-            return new Smarty_Internal_Resource_Registered($this->smarty);
+        if (isset($this->smarty->registered_resources[$resource_type])) {
+            return new Smarty_Internal_Resource_Registered($this);
         } else {
             // try sysplugins dir
-            if (in_array($resource_type, array('file', 'string', 'extends', 'php', 'registered', 'stream', 'eval'))) {
+            if (in_array($resource_type, array('file', 'string', 'extends', 'php', 'stream', 'eval'))) {
                 $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($resource_type);
                 return new $_resource_class($this->smarty);
             } else {
@@ -735,20 +719,15 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                     if (class_exists($_resource_class, false)) {
                         return new $_resource_class($this->smarty);
                     } else {
-                        $this->smarty->register->resource($resource_type,
-                            array("smarty_resource_{$resource_type}_source",
-                                "smarty_resource_{$resource_type}_timestamp",
-                                "smarty_resource_{$resource_type}_secure",
-                                "smarty_resource_{$resource_type}_trusted"));
-                        return new Smarty_Internal_Resource_Registered($this->smarty);
+                        return new Smarty_Internal_Resource_Registered($this, $resource_type);
                     } 
                 } else {
                     // try streams
                     $_known_stream = stream_get_wrappers();
                     if (in_array($resource_type, $_known_stream)) {
                         // is known stream
-                        if ($this->smarty->security) {
-                            $this->smarty->security_handler->isTrustedStream($resource_type);
+                        if (is_object($this->smarty->security_policy)) {
+                            $this->smarty->security_policy->isTrustedStream($resource_type);
                         } 
                         return new Smarty_Internal_Resource_Stream($this->smarty);
                     } else {
@@ -830,9 +809,9 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
     } 
 
     /**
-     * creates a loacal Smarty variable for array assihgments
+     * creates a loacal Smarty variable for array assignments
      */
-    public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
+    public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
     {
         if (!isset($this->tpl_vars[$tpl_var])) {
             $tpl_var_inst = $this->getVariable($tpl_var, null, true, false);
@@ -840,7 +819,7 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
                 $this->tpl_vars[$tpl_var] = new Smarty_variable(array(), $nocache, $scope);
             } else {
                 $this->tpl_vars[$tpl_var] = clone $tpl_var_inst;
-                if ($scope != SMARTY_LOCAL_SCOPE) {
+                if ($scope != Smarty::SCOPE_LOCAL) {
                     $this->tpl_vars[$tpl_var]->scope = $scope;
                 } 
             } 
@@ -849,40 +828,113 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
             settype($this->tpl_vars[$tpl_var]->value, 'array');
         } 
     } 
+
     /**
-     * wrapper for display
+     * [util function] counts an array, arrayaccess/traversable or PDOStatement object
+     * @param mixed $value
+     * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
      */
-    public function display ()
+    public function _count($value)
     {
-        return $this->smarty->display($this);
-    } 
+        if (is_array($value) === true || $value instanceof Countable) {
+            return count($value);
+        } elseif ($value instanceof ArrayAccess) {
+            if ($value->offsetExists(0)) {
+                return 1;
+            }
+        } elseif ($value instanceof Iterator) {
+            $value->rewind();
+            if ($value->valid()) {
+                return 1;
+            }
+        } elseif ($value instanceof PDOStatement) {
+            return $value->rowCount();
+        } elseif ($value instanceof Traversable) {
+            return iterator_count($value);
+        } elseif ($value instanceof ArrayAccess) {
+            if ($value->offsetExists(0)) {
+                return 1;
+            }
+       } elseif (is_object($value)) {
+            return count($value);
+       }
+       return 0;
+    }
 
     /**
      * wrapper for fetch
      */
-    public function fetch ()
+    public function fetch ($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false)
+    {
+               if ($template == null) {
+               return $this->smarty->fetch($this);
+        } else {
+               if (!isset($parent)) {
+                       $parent = $this;
+               }
+               return $this->smarty->fetch($template, $cache_id, $compile_id, $parent, $display);
+        }
+        
+    } 
+     /**
+     * wrapper for display
+     */
+    public function display ($template = null, $cache_id = null, $compile_id = null, $parent = null)
     {
-        return $this->smarty->fetch($this);
+               if ($template == null) {
+               return $this->smarty->display($this);
+        } else {
+               if (!isset($parent)) {
+                       $parent = $this;
+               }
+                       return $this->smarty->display($template, $cache_id, $compile_id, $parent);
+        }
+       
     } 
 
     /**
-     * lazy loads (valid) property objects
-     * 
-     * @param string $name property name
+     * set Smarty property in template context      
+     * @param string $property_name property name
+     * @param mixed $value value
      */
-    public function __get($name)
+    public function __set($property_name, $value)
     {
-        if (in_array($name, array('register', 'unregister', 'utility', 'cache'))) {
-            $class = "Smarty_Internal_" . ucfirst($name);
-            $this->$name = new $class($this);
-            return $this->$name;
-        } else if ($name == '_version') {
-            // Smarty 2 BC
-            $this->_version = self::SMARTY_VERSION;
-            return $this->_version;
-        } 
-        return null;
-    } 
+       if ($property_name == 'resource_object' || $property_name == 'cache_resource_object') {
+               $this->$property_name = $value;
+       } elseif (property_exists($this->smarty, $property_name)) {
+               $this->smarty->$property_name = $value;
+       } else {
+               throw new SmartyException("invalid template property '$property_name'.");
+        }
+    }
+
+    /**
+     * get Smarty property in template context      
+     * @param string $property_name property name
+     */
+    public function __get($property_name)
+    {
+       if ($property_name == 'resource_object') {
+               // load template resource
+               $this->resource_object = null;
+               if (!$this->parseResourceName ($this->template_resource, $this->resource_type, $this->resource_name, $this->resource_object)) {
+               throw new SmartyException ("Unable to parse resource name \"{$template_resource}\"");
+               }
+               return $this->resource_object;
+        }
+        if ($property_name == 'cache_resource_object') { 
+               // load cache resource
+            $this->cache_resource_object = $this->loadCacheResource();
+            return $this->cache_resource_object;
+       }
+       if (property_exists($this->smarty, $property_name)) {
+               return $this->smarty->$property_name;
+       } else {
+               throw new SmartyException("template property '$property_name' does not exist.");
+        }
+    }
+
 
     /**
      * Takes unknown class methods and lazy loads sysplugin files for them
@@ -905,22 +957,16 @@ class Smarty_Internal_Template extends Smarty_Internal_Data {
             $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4); 
             // convert camel case to underscored name
             $property_name = preg_replace_callback('/([A-Z])/', $camel_func, $property_name);
-            if (!property_exists($this, $property_name)) {
-                throw new SmartyException("property '$property_name' does not exist.");
-                return false;
-            } 
-            if ($first3 == 'get')
-                return $this->$property_name;
-            else
-                return $this->$property_name = $args[0];
-        } 
+               if (property_exists($this, $property_name)) {
+               if ($first3 == 'get')
+                       return $this->$property_name;
+               else
+                       return $this->$property_name = $args[0];
+               }
+        }
+        // pass call to Smarty object  
+        return call_user_func_array(array($this->smarty,$name),$args);
     } 
-} 
-
-/**
- * wrapper for template class
- */
-class Smarty_Template extends Smarty_Internal_Template {
-} 
 
+}
 ?>
\ No newline at end of file
index 0a0218c2cfbf499cd83a2c045bd159ee6ad2c27a..cca157845deb49f2b2ca3f7c84cd3414bae578e5 100644 (file)
@@ -23,6 +23,8 @@ class Smarty_Internal_TemplateCompilerBase {
     public $_tag_stack = array(); \r
     // current template\r
     public $template = null;\r
+    // optional log of tag/attributes\r
+    public $used_tags = array();\r
 \r
     /**\r
      * Initialize compiler\r
@@ -45,9 +47,6 @@ class Smarty_Internal_TemplateCompilerBase {
         } else {\r
             $this->nocache_hash = $template->properties['nocache_hash'];\r
         } \r
-        /* here is where the compiling takes place. Smarty\r
-       tags in the templates are replaces with PHP code,\r
-       then written to compiled files. */\r
         // flag for nochache sections\r
         $this->nocache = false;\r
         $this->tag_nocache = false; \r
@@ -102,20 +101,30 @@ class Smarty_Internal_TemplateCompilerBase {
      * \r
      * @param string $tag tag name\r
      * @param array $args array with tag attributes\r
+     * @param array $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compileTag($tag, $args)\r
+    public function compileTag($tag, $args, $parameter = array())\r
     { \r
         // $args contains the attributes parsed and compiled by the lexer/parser\r
         // assume that tag does compile into code, but creates no HTML output\r
         $this->has_code = true;\r
-        $this->has_output = false; \r
+        $this->has_output = false;\r
+        // log tag/attributes\r
+        if (isset($this->smarty->get_used_tags) && $this->smarty->get_used_tags) {\r
+               $this->used_tags[] = array($tag,$args);\r
+        } \r
+               // check nocache option flag\r
+        if (in_array("'nocache'",$args) || in_array(array('nocache'=>'true'),$args)\r
+                       || in_array(array('nocache'=>'"true"'),$args) || in_array(array('nocache'=>"'true'"),$args)) {\r
+               $this->tag_nocache = true;\r
+        }\r
         // compile the smarty tag (required compile classes to compile the tag are autoloaded)\r
-        if (($_output = $this->callTagCompiler($tag, $args)) === false) {\r
+        if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) {\r
             if (isset($this->smarty->template_functions[$tag])) {\r
                 // template defined by {template} tag\r
-                $args['name'] = "'" . $tag . "'";\r
-                $_output = $this->callTagCompiler('call', $args);\r
+                $args['_attr']['name'] = "'" . $tag . "'";\r
+                $_output = $this->callTagCompiler('call', $args, $parameter);\r
             } \r
         } \r
         if ($_output !== false) {\r
@@ -133,47 +142,58 @@ class Smarty_Internal_TemplateCompilerBase {
             // tag did not produce compiled code\r
             return '';\r
         } else {\r
+            // map_named attributes\r
+            if (isset($args['_attr'])) {\r
+                foreach ($args['_attr'] as $key => $attribute) {\r
+                    if (is_array($attribute)) {\r
+                        $args = array_merge($args, $attribute);\r
+                    } \r
+                } \r
+            } \r
             // not an internal compiler tag\r
             if (strlen($tag) < 6 || substr($tag, -5) != 'close') {\r
                 // check if tag is a registered object\r
-                if (isset($this->smarty->registered_objects[$tag]) && isset($args['object_methode'])) {\r
-                    $methode = $args['object_methode'];\r
-                    unset ($args['object_methode']);\r
+                if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_methode'])) {\r
+                    $methode = $parameter['object_methode'];\r
                     if (!in_array($methode, $this->smarty->registered_objects[$tag][3]) &&\r
                             (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {\r
-                        return $this->callTagCompiler('private_object_function', $args, $tag, $methode);\r
+                        return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $methode);\r
                     } elseif (in_array($methode, $this->smarty->registered_objects[$tag][3])) {\r
-                        return $this->callTagCompiler('private_object_block_function', $args, $tag, $methode);\r
+                        return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);\r
                     } else {\r
                         return $this->trigger_template_error ('unallowed methode "' . $methode . '" in registered object "' . $tag . '"', $this->lex->taglineno);\r
                     } \r
                 } \r
                 // check if tag is registered\r
-                foreach (array('compiler', 'function', 'block') as $type) {\r
+                foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK) as $type) {\r
                     if (isset($this->smarty->registered_plugins[$type][$tag])) {\r
                         // if compiler function plugin call it now\r
-                        if ($type == 'compiler') {\r
+                        if ($type == Smarty::PLUGIN_COMPILER) {\r
+                            $new_args = array();\r
+                            foreach ($args as $mixed) {\r
+                                $new_args = array_merge($new_args, $mixed);\r
+                            } \r
                             if (!$this->smarty->registered_plugins[$type][$tag][1]) {\r
                                 $this->tag_nocache = true;\r
                             } \r
                             $function = $this->smarty->registered_plugins[$type][$tag][0];\r
                             if (!is_array($function)) {\r
-                                return $function($args, $this);\r
+                                return $function($new_args, $this);\r
                             } else if (is_object($function[0])) {\r
-                                return $this->smarty->registered_plugins[$type][$tag][0][0]->$function[1]($args, $this);\r
+                                return $this->smarty->registered_plugins[$type][$tag][0][0]->$function[1]($new_args, $this);\r
                             } else {\r
-                                return call_user_func_array($this->smarty->registered_plugins[$type][$tag][0], array($args, $this));\r
+                                return call_user_func_array($this->smarty->registered_plugins[$type][$tag][0], array($new_args, $this));\r
                             } \r
                         } \r
                         // compile registered function or block function\r
-                        if ($type == 'function' || $type == 'block') {\r
-                            return $this->callTagCompiler('private_registered_' . $type, $args, $tag);\r
+                        if ($type == Smarty::PLUGIN_FUNCTION || $type == Smarty::PLUGIN_BLOCK) {\r
+                            return $this->callTagCompiler('private_registered_' . $type, $args, $parameter, $tag);\r
                         } \r
                     } \r
                 } \r
                 // check plugins from plugins folder\r
                 foreach ($this->smarty->plugin_search_order as $plugin_type) {\r
-                    if ($plugin_type == 'compiler' && $this->smarty->loadPlugin('smarty_compiler_' . $tag)) {\r
+                    if ($plugin_type == Smarty::PLUGIN_BLOCK && $this->smarty->loadPlugin('smarty_compiler_' . $tag)) {\r
                         $plugin = 'smarty_compiler_' . $tag;\r
                         if (is_callable($plugin)) {\r
                             return $plugin($args, $this->smarty);\r
@@ -187,7 +207,7 @@ class Smarty_Internal_TemplateCompilerBase {
                         throw new SmartyException("Plugin \"{$tag}\" not callable");\r
                     } else {\r
                         if ($function = $this->getPlugin($tag, $plugin_type)) {\r
-                            return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $tag, $function);\r
+                            return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, $tag, $function);\r
                         } \r
                     } \r
                 } \r
@@ -195,22 +215,21 @@ class Smarty_Internal_TemplateCompilerBase {
                 // compile closing tag of block function\r
                 $base_tag = substr($tag, 0, -5); \r
                 // check if closing tag is a registered object\r
-                if (isset($this->smarty->registered_objects[$base_tag]) && isset($args['object_methode'])) {\r
-                    $methode = $args['object_methode'];\r
-                    unset ($args['object_methode']);\r
+                if (isset($this->smarty->registered_objects[$base_tag]) && isset($parameter['object_methode'])) {\r
+                    $methode = $parameter['object_methode'];\r
                     if (in_array($methode, $this->smarty->registered_objects[$base_tag][3])) {\r
-                        return $this->callTagCompiler('private_object_block_function', $args, $tag, $methode);\r
+                        return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);\r
                     } else {\r
                         return $this->trigger_template_error ('unallowed closing tag methode "' . $methode . '" in registered object "' . $base_tag . '"', $this->lex->taglineno);\r
                     } \r
                 } \r
                 // registered block tag ?\r
-                if (isset($this->smarty->registered_plugins['block'][$base_tag])) {\r
-                    return $this->callTagCompiler('private_registered_block', $args, $tag);\r
+                if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {\r
+                    return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag);\r
                 } \r
                 // block plugin?\r
-                if ($function = $this->getPlugin($base_tag, 'block')) {\r
-                    return $this->callTagCompiler('private_block_plugin', $args, $tag, $function);\r
+                if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) {\r
+                    return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function);\r
                 } \r
                 if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) {\r
                     $plugin = 'smarty_compiler_' . $tag;\r
@@ -403,5 +422,6 @@ class Smarty_Internal_TemplateCompilerBase {
         } \r
         throw new SmartyCompilerException($error_text);\r
     } \r
-}\r
+} \r
+\r
 ?>
\ No newline at end of file
index 50decb9e44aa652d69decd792cc1045ad50dcee2..6744e7f67a2eda085558264c5ed09c6b8feafc36 100644 (file)
@@ -133,16 +133,16 @@ class Smarty_Internal_Templatelexer
     {
         $tokenMap = array (
               1 => 0,
-              2 => 1,
-              4 => 0,
+              2 => 0,
+              3 => 1,
               5 => 0,
               6 => 0,
               7 => 0,
               8 => 0,
               9 => 0,
               10 => 0,
-              11 => 1,
-              13 => 0,
+              11 => 0,
+              12 => 1,
               14 => 0,
               15 => 0,
               16 => 0,
@@ -151,13 +151,14 @@ class Smarty_Internal_Templatelexer
               19 => 0,
               20 => 0,
               21 => 0,
-              22 => 2,
-              25 => 0,
+              22 => 0,
+              23 => 2,
+              26 => 0,
             );
         if ($this->counter >= strlen($this->data)) {
             return false; // end of input
         }
-        $yy_global_pattern = "/^(\\{\\})|^(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|^([\t ]*[\r\n]+[\t ]*)|^(".$this->ldel."strip".$this->rdel.")|^(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\/strip".$this->rdel.")|^(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\\s*literal\\s*".$this->rdel.")|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)(?![^\s]))|^(".$this->ldel."\\s*for(?![^\s]))|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(".$this->ldel."\/)|^(".$this->ldel.")|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."|<\\?|\\?>|<%|%>)))|^([\S\s]+)/";
+        $yy_global_pattern = "/^(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|^(\\{\\})|^(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|^([\t ]*[\r\n]+[\t ]*)|^(".$this->ldel."strip".$this->rdel.")|^(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\/strip".$this->rdel.")|^(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|^(".$this->ldel."\\s*literal\\s*".$this->rdel.")|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)(?![^\s]))|^(".$this->ldel."\\s*for(?![^\s]))|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(".$this->ldel."\/)|^(".$this->ldel.")|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|".$this->ldel."|<\\?|\\?>|<%|%>)))|^([\S\s]+)/";
 
         do {
             if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
@@ -210,14 +211,19 @@ class Smarty_Internal_Templatelexer
     function yy_r1_1($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_OTHER;
+  $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILD;
     }
     function yy_r1_2($yy_subpatterns)
     {
 
+  $this->token = Smarty_Internal_Templateparser::TP_OTHER;
+    }
+    function yy_r1_3($yy_subpatterns)
+    {
+
   $this->token = Smarty_Internal_Templateparser::TP_COMMENT;
     }
-    function yy_r1_4($yy_subpatterns)
+    function yy_r1_5($yy_subpatterns)
     {
 
   if ($this->strip) {
@@ -226,13 +232,13 @@ class Smarty_Internal_Templatelexer
      $this->token = Smarty_Internal_Templateparser::TP_LINEBREAK;
   }
     }
-    function yy_r1_5($yy_subpatterns)
+    function yy_r1_6($yy_subpatterns)
     {
 
   $this->strip = true;
   return false;
     }
-    function yy_r1_6($yy_subpatterns)
+    function yy_r1_7($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal) {
@@ -242,13 +248,13 @@ class Smarty_Internal_Templatelexer
     return false;
   }
     }
-    function yy_r1_7($yy_subpatterns)
+    function yy_r1_8($yy_subpatterns)
     {
 
   $this->strip = false;
   return false;
     }
-    function yy_r1_8($yy_subpatterns)
+    function yy_r1_9($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal) {
@@ -258,13 +264,13 @@ class Smarty_Internal_Templatelexer
     return false;
   }
     }
-    function yy_r1_9($yy_subpatterns)
+    function yy_r1_10($yy_subpatterns)
     {
 
    $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
    $this->yypushstate(self::LITERAL);
     }
-    function yy_r1_10($yy_subpatterns)
+    function yy_r1_11($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal) {
@@ -275,7 +281,7 @@ class Smarty_Internal_Templatelexer
      $this->taglineno = $this->line;
   }
     }
-    function yy_r1_11($yy_subpatterns)
+    function yy_r1_12($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
@@ -286,7 +292,7 @@ class Smarty_Internal_Templatelexer
      $this->taglineno = $this->line;
   }
     }
-    function yy_r1_13($yy_subpatterns)
+    function yy_r1_14($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
@@ -297,7 +303,7 @@ class Smarty_Internal_Templatelexer
      $this->taglineno = $this->line;
   }
     }
-    function yy_r1_14($yy_subpatterns)
+    function yy_r1_15($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
@@ -308,7 +314,7 @@ class Smarty_Internal_Templatelexer
      $this->taglineno = $this->line;
   }
     }
-    function yy_r1_15($yy_subpatterns)
+    function yy_r1_16($yy_subpatterns)
     {
 
   if ($this->smarty->auto_literal) {
@@ -319,21 +325,21 @@ class Smarty_Internal_Templatelexer
      $this->taglineno = $this->line;
   }
     }
-    function yy_r1_16($yy_subpatterns)
+    function yy_r1_17($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
      $this->yypushstate(self::SMARTY);
      $this->taglineno = $this->line;
     }
-    function yy_r1_17($yy_subpatterns)
+    function yy_r1_18($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_LDEL;
      $this->yypushstate(self::SMARTY);
      $this->taglineno = $this->line;
     }
-    function yy_r1_18($yy_subpatterns)
+    function yy_r1_19($yy_subpatterns)
     {
 
   if (in_array($this->value, Array('<?', '<?=', '<?php'))) {
@@ -345,27 +351,27 @@ class Smarty_Internal_Templatelexer
     $this->value = substr($this->value, 0, 2);
   }
      }
-    function yy_r1_19($yy_subpatterns)
+    function yy_r1_20($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
     }
-    function yy_r1_20($yy_subpatterns)
+    function yy_r1_21($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
     }
-    function yy_r1_21($yy_subpatterns)
+    function yy_r1_22($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
     }
-    function yy_r1_22($yy_subpatterns)
+    function yy_r1_23($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_OTHER;
     }
-    function yy_r1_25($yy_subpatterns)
+    function yy_r1_26($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_OTHER;
@@ -421,9 +427,10 @@ class Smarty_Internal_Templatelexer
               62 => 0,
               63 => 0,
               64 => 0,
-              65 => 1,
-              67 => 1,
-              69 => 1,
+              65 => 0,
+              66 => 1,
+              68 => 1,
+              70 => 0,
               71 => 0,
               72 => 0,
               73 => 0,
@@ -441,12 +448,11 @@ class Smarty_Internal_Templatelexer
               85 => 0,
               86 => 0,
               87 => 0,
-              88 => 0,
             );
         if ($this->counter >= strlen($this->data)) {
             return false; // end of input
         }
-        $yy_global_pattern = "/^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)(?![^\s]))|^(".$this->ldel."\\s*for(?![^\s]))|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(\\s{1,}".$this->rdel.")|^(".$this->ldel."\/)|^(".$this->ldel.")|^(".$this->rdel.")|^(\\s+is\\s+in\\s+)|^(\\s+(AS|as)\\s+)|^(\\s+(to)\\s+)|^(\\s+(step)\\s+)|^(\\s+instanceof\\s+)|^(\\s*===\\s*)|^(\\s*!==\\s*)|^(\\s*==\\s*|\\s+(EQ|eq)\\s+)|^(\\s*!=\\s*|\\s*<>\\s*|\\s+(NE|NEQ|ne|neq)\\s+)|^(\\s*>=\\s*|\\s+(GE|GTE|ge|gte)\\s+)|^(\\s*<=\\s*|\\s+(LE|LTE|le|lte)\\s+)|^(\\s*>\\s*|\\s+(GT|gt)\\s+)|^(\\s*<\\s*|\\s+(LT|lt)\\s+)|^(\\s+(MOD|mod)\\s+)|^(!\\s*|(NOT|not)\\s+)|^(\\s*&&\\s*|\\s*(AND|and)\\s+)|^(\\s*\\|\\|\\s*|\\s*(OR|or)\\s+)|^(\\s*(XOR|xor)\\s+)|^(\\s+is\\s+odd\\s+by\\s+)|^(\\s+is\\s+not\\s+odd\\s+by\\s+)|^(\\s+is\\s+odd)|^(\\s+is\\s+not\\s+odd)|^(\\s+is\\s+even\\s+by\\s+)|^(\\s+is\\s+not\\s+even\\s+by\\s+)|^(\\s+is\\s+even)|^(\\s+is\\s+not\\s+even)|^(\\s+is\\s+div\\s+by\\s+)|^(\\s+is\\s+not\\s+div\\s+by\\s+)|^(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|^(\\(\\s*)|^(\\s*\\))|^(\\[\\s*)|^(\\s*\\])|^(\\s*->\\s*)|^(\\s*=>\\s*)|^(\\s*=\\s*)|^((\\+\\+|--)\\s*)|^(\\s*(\\+|-)\\s*)|^(\\s*(\\*|\/|%)\\s*)|^(\\$)|^(\\s*;)|^(::)|^(\\s*:\\s*)|^(@)|^(#)|^(\")|^(`)|^(\\|)|^(\\.)|^(\\s*,\\s*)|^(\\s*&\\s*)|^(\\s*\\?\\s*)|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_]\\w*)|^(\\d+)|^(\\s+)|^(.)/";
+        $yy_global_pattern = "/^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|^(".$this->ldel."\\s{1,}\/)|^(".$this->ldel."\\s*(if|elseif|else if|while)(?![^\s]))|^(".$this->ldel."\\s*for(?![^\s]))|^(".$this->ldel."\\s*foreach(?![^\s]))|^(".$this->ldel."\\s{1,})|^(\\s{1,}".$this->rdel.")|^(".$this->ldel."\/)|^(".$this->ldel.")|^(".$this->rdel.")|^(\\s+is\\s+in\\s+)|^(\\s+(AS|as)\\s+)|^(\\s+(to)\\s+)|^(\\s+(step)\\s+)|^(\\s+instanceof\\s+)|^(\\s*===\\s*)|^(\\s*!==\\s*)|^(\\s*==\\s*|\\s+(EQ|eq)\\s+)|^(\\s*!=\\s*|\\s*<>\\s*|\\s+(NE|NEQ|ne|neq)\\s+)|^(\\s*>=\\s*|\\s+(GE|GTE|ge|gte)\\s+)|^(\\s*<=\\s*|\\s+(LE|LTE|le|lte)\\s+)|^(\\s*>\\s*|\\s+(GT|gt)\\s+)|^(\\s*<\\s*|\\s+(LT|lt)\\s+)|^(\\s+(MOD|mod)\\s+)|^(!\\s*|(NOT|not)\\s+)|^(\\s*&&\\s*|\\s*(AND|and)\\s+)|^(\\s*\\|\\|\\s*|\\s*(OR|or)\\s+)|^(\\s*(XOR|xor)\\s+)|^(\\s+is\\s+odd\\s+by\\s+)|^(\\s+is\\s+not\\s+odd\\s+by\\s+)|^(\\s+is\\s+odd)|^(\\s+is\\s+not\\s+odd)|^(\\s+is\\s+even\\s+by\\s+)|^(\\s+is\\s+not\\s+even\\s+by\\s+)|^(\\s+is\\s+even)|^(\\s+is\\s+not\\s+even)|^(\\s+is\\s+div\\s+by\\s+)|^(\\s+is\\s+not\\s+div\\s+by\\s+)|^(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|^(\\(\\s*)|^(\\s*\\))|^(\\[\\s*)|^(\\s*\\])|^(\\s*->\\s*)|^(\\s*=>\\s*)|^(\\s*=\\s*)|^(\\+\\+|--)|^(\\s*(\\+|-)\\s*)|^(\\s*(\\*|\/|%)\\s*)|^(\\$)|^(\\s*;)|^(::)|^(\\s*:\\s*)|^(@)|^(#)|^(\")|^(`)|^(\\|)|^(\\.)|^(\\s*,\\s*)|^(\\s*&\\s*)|^(\\s*\\?\\s*)|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_]\\w*)|^(\\d+)|^(\\s+)|^(.)/";
 
         do {
             if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
@@ -771,104 +777,104 @@ class Smarty_Internal_Templatelexer
 
   $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
     }
-    function yy_r2_67($yy_subpatterns)
+    function yy_r2_66($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
     }
-    function yy_r2_69($yy_subpatterns)
+    function yy_r2_68($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_MATH;
     }
-    function yy_r2_71($yy_subpatterns)
+    function yy_r2_70($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
     }
-    function yy_r2_72($yy_subpatterns)
+    function yy_r2_71($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
     }
-    function yy_r2_73($yy_subpatterns)
+    function yy_r2_72($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
     }
-    function yy_r2_74($yy_subpatterns)
+    function yy_r2_73($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_COLON;
     }
-    function yy_r2_75($yy_subpatterns)
+    function yy_r2_74($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_AT;
     }
-    function yy_r2_76($yy_subpatterns)
+    function yy_r2_75($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_HATCH;
     }
-    function yy_r2_77($yy_subpatterns)
+    function yy_r2_76($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
   $this->yypushstate(self::DOUBLEQUOTEDSTRING);
     }
-    function yy_r2_78($yy_subpatterns)
+    function yy_r2_77($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
   $this->yypopstate();
     }
-    function yy_r2_79($yy_subpatterns)
+    function yy_r2_78($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_VERT;
     }
-    function yy_r2_80($yy_subpatterns)
+    function yy_r2_79($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_DOT;
     }
-    function yy_r2_81($yy_subpatterns)
+    function yy_r2_80($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_COMMA;
     }
-    function yy_r2_82($yy_subpatterns)
+    function yy_r2_81($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_ANDSYM;
     }
-    function yy_r2_83($yy_subpatterns)
+    function yy_r2_82($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_QMARK;
     }
-    function yy_r2_84($yy_subpatterns)
+    function yy_r2_83($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_HEX;
     }
-    function yy_r2_85($yy_subpatterns)
+    function yy_r2_84($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_ID;
     }
-    function yy_r2_86($yy_subpatterns)
+    function yy_r2_85($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
     }
-    function yy_r2_87($yy_subpatterns)
+    function yy_r2_86($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_SPACE;
     }
-    function yy_r2_88($yy_subpatterns)
+    function yy_r2_87($yy_subpatterns)
     {
 
   $this->token = Smarty_Internal_Templateparser::TP_OTHER;
@@ -1169,6 +1175,5 @@ class Smarty_Internal_Templatelexer
 
   $this->token = Smarty_Internal_Templateparser::TP_OTHER;
     }
-
 }
 ?>
\ No newline at end of file
index 03aa34825b7ae246e1add0baae1ec1d4ca959132..c06df6d1f3fdf42e8a5601bf37f57da9be2fc132 100644 (file)
@@ -88,6 +88,8 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php
 {
 #line 14 "smarty_internal_templateparser.y"
 
+         const Err1 = "Security error: Call to private object member not allowed";
+         const Err2 = "Security error: Call to dynamic object member not allowed";
     // states whether the parse was successful or not
     public $successful = true;
     public $retvalue = 0;
@@ -101,15 +103,15 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php
         $this->compiler = $compiler;
         $this->smarty = $this->compiler->smarty;
         $this->template = $this->compiler->template;
-        if ($this->template->security && isset($this->smarty->security_handler)) {
-              $this->sec_obj = $this->smarty->security_policy;
-        } else {
-              $this->sec_obj = $this->smarty;
-        }
         $this->compiler->has_variable_string = false;
                                $this->compiler->prefix_code = array();
                                $this->prefix_number = 0;
                                $this->block_nesting_level = 0;
+                               if ($this->security = isset($this->smarty->security_policy)) {
+              $this->php_handling = $this->smarty->security_policy->php_handling;
+        } else {
+              $this->php_handling = $this->smarty->php_handling;
+        }
                                $this->is_xml = false;
                                $this->asp_tags = (ini_get('asp_tags') != '0');
                                $this->current_buffer = $this->root_buffer = new _smarty_template_buffer($this);
@@ -134,7 +136,7 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php
     }
 
     
-#line 130 "smarty_internal_templateparser.php"
+#line 132 "smarty_internal_templateparser.php"
 
     const TP_VERT                           =  1;
     const TP_COLON                          =  2;
@@ -166,672 +168,739 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php
     const TP_LDELFOREACH                    = 28;
     const TP_AS                             = 29;
     const TP_APTR                           = 30;
-    const TP_LDELSLASH                      = 31;
-    const TP_INTEGER                        = 32;
-    const TP_COMMA                          = 33;
-    const TP_MATH                           = 34;
-    const TP_UNIMATH                        = 35;
-    const TP_ANDSYM                         = 36;
-    const TP_ISIN                           = 37;
-    const TP_ISDIVBY                        = 38;
-    const TP_ISNOTDIVBY                     = 39;
-    const TP_ISEVEN                         = 40;
-    const TP_ISNOTEVEN                      = 41;
-    const TP_ISEVENBY                       = 42;
-    const TP_ISNOTEVENBY                    = 43;
-    const TP_ISODD                          = 44;
-    const TP_ISNOTODD                       = 45;
-    const TP_ISODDBY                        = 46;
-    const TP_ISNOTODDBY                     = 47;
-    const TP_INSTANCEOF                     = 48;
-    const TP_OPENP                          = 49;
-    const TP_CLOSEP                         = 50;
-    const TP_QMARK                          = 51;
-    const TP_NOT                            = 52;
-    const TP_TYPECAST                       = 53;
-    const TP_HEX                            = 54;
-    const TP_DOT                            = 55;
-    const TP_SINGLEQUOTESTRING              = 56;
-    const TP_DOUBLECOLON                    = 57;
-    const TP_AT                             = 58;
-    const TP_HATCH                          = 59;
-    const TP_OPENB                          = 60;
-    const TP_CLOSEB                         = 61;
-    const TP_EQUALS                         = 62;
-    const TP_NOTEQUALS                      = 63;
-    const TP_GREATERTHAN                    = 64;
-    const TP_LESSTHAN                       = 65;
-    const TP_GREATEREQUAL                   = 66;
-    const TP_LESSEQUAL                      = 67;
-    const TP_IDENTITY                       = 68;
-    const TP_NONEIDENTITY                   = 69;
-    const TP_MOD                            = 70;
-    const TP_LAND                           = 71;
-    const TP_LOR                            = 72;
-    const TP_LXOR                           = 73;
-    const TP_QUOTE                          = 74;
-    const TP_BACKTICK                       = 75;
-    const TP_DOLLARID                       = 76;
-    const YY_NO_ACTION = 564;
-    const YY_ACCEPT_ACTION = 563;
-    const YY_ERROR_ACTION = 562;
+    const TP_SMARTYBLOCKCHILD               = 31;
+    const TP_LDELSLASH                      = 32;
+    const TP_INTEGER                        = 33;
+    const TP_COMMA                          = 34;
+    const TP_MATH                           = 35;
+    const TP_UNIMATH                        = 36;
+    const TP_ANDSYM                         = 37;
+    const TP_ISIN                           = 38;
+    const TP_ISDIVBY                        = 39;
+    const TP_ISNOTDIVBY                     = 40;
+    const TP_ISEVEN                         = 41;
+    const TP_ISNOTEVEN                      = 42;
+    const TP_ISEVENBY                       = 43;
+    const TP_ISNOTEVENBY                    = 44;
+    const TP_ISODD                          = 45;
+    const TP_ISNOTODD                       = 46;
+    const TP_ISODDBY                        = 47;
+    const TP_ISNOTODDBY                     = 48;
+    const TP_INSTANCEOF                     = 49;
+    const TP_OPENP                          = 50;
+    const TP_CLOSEP                         = 51;
+    const TP_QMARK                          = 52;
+    const TP_NOT                            = 53;
+    const TP_TYPECAST                       = 54;
+    const TP_HEX                            = 55;
+    const TP_DOT                            = 56;
+    const TP_SINGLEQUOTESTRING              = 57;
+    const TP_DOUBLECOLON                    = 58;
+    const TP_AT                             = 59;
+    const TP_HATCH                          = 60;
+    const TP_OPENB                          = 61;
+    const TP_CLOSEB                         = 62;
+    const TP_EQUALS                         = 63;
+    const TP_NOTEQUALS                      = 64;
+    const TP_GREATERTHAN                    = 65;
+    const TP_LESSTHAN                       = 66;
+    const TP_GREATEREQUAL                   = 67;
+    const TP_LESSEQUAL                      = 68;
+    const TP_IDENTITY                       = 69;
+    const TP_NONEIDENTITY                   = 70;
+    const TP_MOD                            = 71;
+    const TP_LAND                           = 72;
+    const TP_LOR                            = 73;
+    const TP_LXOR                           = 74;
+    const TP_QUOTE                          = 75;
+    const TP_BACKTICK                       = 76;
+    const TP_DOLLARID                       = 77;
+    const YY_NO_ACTION = 573;
+    const YY_ACCEPT_ACTION = 572;
+    const YY_ERROR_ACTION = 571;
 
-    const YY_SZ_ACTTAB = 2088;
+    const YY_SZ_ACTTAB = 2401;
 static public $yy_action = array(
- /*     0 */   182,   20,    8,  140,  302,  299,  298,  294,  293,  295,
- /*    10 */   296,  297,  304,  160,  163,  323,    2,  270,  161,  341,
- /*    20 */     4,  188,  195,  168,  208,   27,   26,   38,  114,  124,
- /*    30 */   265,  271,  204,   48,   47,   44,   39,   32,   30,  348,
- /*    40 */   349,   28,   15,  356,  357,   16,   18,  312,  307,  306,
- /*    50 */   308,  311,  431,    7,  130,  160,  313,  316,  431,    6,
- /*    60 */   322,  364,  365,  366,  367,  363,  362,  358,  359,  360,
- /*    70 */   361,  344,  343,  182,  326,  300,  301,  303,  194,   12,
- /*    80 */   210,   53,  174,  120,  106,    4,  141,   13,  319,  163,
- /*    90 */   266,  104,   43,  114,  188,  240,  353,  345,  168,  327,
- /*   100 */   270,   26,   38,  217,  193,  133,   48,   47,   44,   39,
- /*   110 */    32,   30,  348,  349,   28,   15,  356,  357,   16,   18,
- /*   120 */   563,   85,  229,  301,  303,   33,   24,  110,  136,  272,
- /*   130 */    36,   94,  237,   84,  364,  365,  366,  367,  363,  362,
- /*   140 */   358,  359,  360,  361,  344,  343,  182,  182,  326,  145,
- /*   150 */    24,  276,  176,  272,  210,   77,   24,  231,  106,  272,
- /*   160 */    36,  167,  338,  270,  266,  199,  189,  188,  188,  216,
- /*   170 */   353,  345,   34,  327,   24,  256,  197,  272,   92,   48,
- /*   180 */    47,   44,   39,   32,   30,  348,  349,   28,   15,  356,
- /*   190 */   357,   16,   18,    9,  278,    4,   24,   23,   24,  272,
- /*   200 */    21,  272,   40,  114,  103,  223,  258,  364,  365,  366,
- /*   210 */   367,  363,  362,  358,  359,  360,  361,  344,  343,  182,
- /*   220 */   326,  135,  188,  164,   98,   24,   99,   50,  272,  123,
- /*   230 */   100,  325,  166,  211,  170,  155,  266,  188,   90,  130,
- /*   240 */   278,  216,  353,  345,  230,  327,   88,  168,  197,  270,
- /*   250 */    26,   38,   48,   47,   44,   39,   32,   30,  348,  349,
- /*   260 */    28,   15,  356,  357,   16,   18,  182,  430,  224,   24,
- /*   270 */   277,    6,  272,  188,  174,   35,  278,  105,  317,   13,
- /*   280 */   364,  365,  366,  367,  363,  362,  358,  359,  360,  361,
- /*   290 */   344,  343,  318,  282,  286,  156,  341,  182,    5,   48,
- /*   300 */    47,   44,   39,   32,   30,  348,  349,   28,   15,  356,
- /*   310 */   357,   16,   18,  182,  150,  339,  273,  331,  188,  275,
- /*   320 */    43,  188,  214,  188,  182,  188,  121,  364,  365,  366,
- /*   330 */   367,  363,  362,  358,  359,  360,  361,  344,  343,  430,
- /*   340 */    24,  327,  206,  272,   87,  188,   48,   47,   44,   39,
- /*   350 */    32,   30,  348,  349,   28,   15,  356,  357,   16,   18,
- /*   360 */   182,   25,  330,  321,  269,  340,  158,  341,  188,  188,
- /*   370 */   188,  188,  192,  248,  364,  365,  366,  367,  363,  362,
- /*   380 */   358,  359,  360,  361,  344,  343,  220,   24,   10,   24,
- /*   390 */   196,   31,  207,   48,   47,   44,   39,   32,   30,  348,
- /*   400 */   349,   28,   15,  356,  357,   16,   18,    4,  320,   43,
- /*   410 */   309,  433,  234,  218,  188,  114,  188,  433,  188,  247,
- /*   420 */   219,  364,  365,  366,  367,  363,  362,  358,  359,  360,
- /*   430 */   361,  344,  343,  182,  326,   23,  243,  139,  194,  126,
- /*   440 */   210,   66,   43,   43,  106,  213,  138,    4,  233,  163,
- /*   450 */   266,  270,  188,  284,   10,  114,  353,  345,  168,  327,
- /*   460 */   270,   26,   38,  315,  474,  314,   48,   47,   44,   39,
- /*   470 */    32,   30,  348,  349,   28,   15,  356,  357,   16,   18,
- /*   480 */   165,  355,  240,  329,    4,  337,  153,  332,  273,  188,
- /*   490 */   130,  188,  114,  188,  364,  365,  366,  367,  363,  362,
- /*   500 */   358,  359,  360,  361,  344,  343,  182,  182,  326,  285,
- /*   510 */    24,  255,   98,  272,  102,   52,  125,  123,  100,  336,
- /*   520 */   147,  221,  268,  163,  266,  209,  222,  104,  188,  162,
- /*   530 */   353,  345,  168,  327,  270,   26,   38,  225,  183,   48,
- /*   540 */    47,   44,   39,   32,   30,  348,  349,   28,   15,  356,
- /*   550 */   357,   16,   18,  182,  347,  280,  333,  310,  324,  246,
- /*   560 */   249,  125,  188,  188,  188,  142,  137,  364,  365,  366,
- /*   570 */   367,  363,  362,  358,  359,  360,  361,  344,  343,  270,
- /*   580 */   270,   24,  354,  212,  181,  254,   48,   47,   44,   39,
- /*   590 */    32,   30,  348,  349,   28,   15,  356,  357,   16,   18,
- /*   600 */   201,   37,  250,  267,  342,  202,  239,  283,  251,  188,
- /*   610 */   188,  157,  274,  273,  364,  365,  366,  367,  363,  362,
- /*   620 */   358,  359,  360,  361,  344,  343,  182,  368,  326,  109,
- /*   630 */   115,  127,  178,  211,  210,   51,   29,  122,  106,  290,
- /*   640 */   144,  128,  263,   93,  266,  284,  111,  188,  278,  113,
- /*   650 */   353,  345,  168,  327,  270,  284,  119,    3,  281,   48,
- /*   660 */    47,   44,   39,   32,   30,  348,  349,   28,   15,  356,
- /*   670 */   357,   16,   18,  112,  292,  282,   40,  130,  118,  328,
- /*   680 */   273,   41,  260,  271,  134,  232,  305,  364,  365,  366,
- /*   690 */   367,  363,  362,  358,  359,  360,  361,  344,  343,  182,
- /*   700 */   326,  159,  182,   95,  194,  326,  210,   80,  235,  194,
- /*   710 */   106,  210,   62,  167,  264,  106,  266,  108,   89,  314,
- /*   720 */   314,  266,  353,  345,  200,  327,  314,  353,  345,   14,
- /*   730 */   327,  284,   48,   47,   44,   39,   32,   30,  348,  349,
- /*   740 */    28,   15,  356,  357,   16,   18,  182,  314,  314,  314,
- /*   750 */   314,  314,  314,  314,  314,  314,  314,  314,   96,   97,
- /*   760 */   364,  365,  366,  367,  363,  362,  358,  359,  360,  361,
- /*   770 */   344,  343,  284,  284,  314,  314,  314,  314,  314,   48,
- /*   780 */    47,   44,   39,   32,   30,  348,  349,   28,   15,  356,
- /*   790 */   357,   16,   18,  314,  314,  205,  314,  314,  314,  314,
- /*   800 */   314,  314,  314,  314,  314,  314,  314,  364,  365,  366,
- /*   810 */   367,  363,  362,  358,  359,  360,  361,  344,  343,  182,
- /*   820 */   326,  314,  314,  129,  194,  326,  210,   63,  314,  194,
- /*   830 */   106,  210,   75,  314,  245,  106,  266,  284,  314,  314,
- /*   840 */   314,  266,  353,  345,  314,  327,  314,  353,  345,  314,
- /*   850 */   327,  314,   48,   47,   44,   39,   32,   30,  348,  349,
- /*   860 */    28,   15,  356,  357,   16,   18,  314,  314,  314,  314,
- /*   870 */   314,  314,  314,  314,  314,  314,  314,  314,  314,  154,
- /*   880 */   364,  365,  366,  367,  363,  362,  358,  359,  360,  361,
- /*   890 */   344,  343,  182,  270,  314,  326,  314,  314,  151,  194,
- /*   900 */   314,  210,   65,  238,  314,  106,  314,  171,   11,  314,
- /*   910 */   169,  266,  270,  314,  195,  314,  208,  353,  345,  314,
- /*   920 */   327,  124,  314,  314,  204,   48,   47,   44,   39,   32,
- /*   930 */    30,  348,  349,   28,   15,  356,  357,   16,   18,  182,
- /*   940 */   314,  314,  314,  314,  314,  314,  314,  314,  314,  314,
- /*   950 */   314,  131,  101,  364,  365,  366,  367,  363,  362,  358,
- /*   960 */   359,  360,  361,  344,  343,  284,  284,  335,   19,  228,
- /*   970 */   314,  314,   48,   47,   44,   39,   32,   30,  348,  349,
- /*   980 */    28,   15,  356,  357,   16,   18,  314,  314,  244,  314,
- /*   990 */   314,  314,  314,  314,  314,  314,  314,  314,  314,  143,
- /*  1000 */   364,  365,  366,  367,  363,  362,  358,  359,  360,  361,
- /*  1010 */   344,  343,  182,  270,  314,  326,  314,  314,  152,  194,
- /*  1020 */   314,  210,   71,  238,  314,  106,  314,  291,   11,  314,
- /*  1030 */   167,  266,  270,  314,  195,  314,  208,  353,  345,  314,
- /*  1040 */   327,  124,  314,  314,  204,   48,   47,   44,   39,   32,
- /*  1050 */    30,  348,  349,   28,   15,  356,  357,   16,   18,  182,
- /*  1060 */   314,  314,  314,  314,  314,  314,  314,  314,  314,  314,
- /*  1070 */   314,  149,  132,  364,  365,  366,  367,  363,  362,  358,
- /*  1080 */   359,  360,  361,  344,  343,  270,  284,  334,   19,  228,
- /*  1090 */   314,  314,   48,   47,   44,   39,   32,   30,  348,  349,
- /*  1100 */    28,   15,  356,  357,   16,   18,  314,  314,  314,  314,
- /*  1110 */   314,  314,  314,  314,  314,  314,  314,  314,  314,  314,
- /*  1120 */   364,  365,  366,  367,  363,  362,  358,  359,  360,  361,
- /*  1130 */   344,  343,  314,  146,  148,  314,    2,   91,  116,  175,
- /*  1140 */   314,  314,  195,  314,  208,  167,  168,  270,  270,  124,
- /*  1150 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1160 */   314,  314,  326,  314,  314,  314,  179,  314,  210,   74,
- /*  1170 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1180 */    88,    1,  242,  314,  353,  345,    2,  327,  116,  184,
- /*  1190 */   314,  314,  195,  314,  208,   86,  180,  241,  314,  124,
- /*  1200 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1210 */   314,  314,  326,  314,  314,  314,  179,  314,  210,   74,
- /*  1220 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1230 */    88,    1,  314,  314,  353,  345,    2,  327,  103,  173,
- /*  1240 */   314,  314,  195,  314,  208,   86,  314,  259,  314,  124,
- /*  1250 */   314,  314,  204,  187,  314,  314,   45,  314,  314,  314,
- /*  1260 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   67,
- /*  1270 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1280 */    88,    1,  314,  314,  353,  345,    2,  327,  103,  184,
- /*  1290 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1300 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1310 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   68,
- /*  1320 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1330 */    88,    1,  314,  314,  353,  345,    2,  327,  117,   83,
- /*  1340 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1350 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1360 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   81,
- /*  1370 */    22,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1380 */    88,    1,  314,  314,  353,  345,    2,  327,  116,  177,
- /*  1390 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1400 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1410 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   64,
- /*  1420 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1430 */    88,    1,  314,  314,  353,  345,    2,  327,  116,  184,
- /*  1440 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1450 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1460 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   72,
- /*  1470 */    22,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1480 */    88,    1,  314,  314,  353,  345,    2,  327,  107,  184,
- /*  1490 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1500 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1510 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   69,
- /*  1520 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1530 */    88,    1,  314,  314,  353,  345,    2,  327,  116,  172,
- /*  1540 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1550 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1560 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   54,
- /*  1570 */    22,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1580 */    88,    1,  314,  314,  353,  345,    2,  327,  103,  184,
- /*  1590 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1600 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1610 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   57,
- /*  1620 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1630 */    88,  314,  314,  314,  353,  345,    2,  327,  103,  186,
- /*  1640 */   314,  314,  195,  314,  208,   86,  314,  314,  314,  124,
- /*  1650 */   314,  314,  204,  198,  314,  314,   45,  314,  314,  314,
- /*  1660 */   314,  314,  326,  314,  314,  314,  194,  314,  210,   60,
- /*  1670 */    17,  314,  106,   42,   46,  289,  190,  346,  266,  314,
- /*  1680 */    88,  314,  314,  314,  353,  345,  314,  327,  314,  314,
- /*  1690 */   314,  314,  314,  314,  226,   86,  314,  314,  314,  314,
- /*  1700 */   326,  314,  314,  314,  194,  326,  210,   76,  314,  194,
- /*  1710 */   106,  210,   60,  314,  314,  106,  266,  314,  314,  314,
- /*  1720 */   314,  266,  353,  345,  314,  327,  314,  353,  345,  314,
- /*  1730 */   327,  314,  314,  314,  326,  314,  314,  227,  194,  314,
- /*  1740 */   210,   60,  314,  314,  106,  314,  314,  314,  326,  314,
- /*  1750 */   266,  314,  194,  314,  210,   60,  353,  345,  106,  327,
- /*  1760 */   314,  314,  314,  314,  266,  314,  252,  314,  314,  314,
- /*  1770 */   353,  345,  314,  327,  314,  314,  314,  326,  314,  314,
- /*  1780 */   215,  194,  326,  210,   61,  314,  194,  106,  210,   59,
- /*  1790 */   314,  314,  106,  266,  314,  314,  314,  314,  266,  353,
- /*  1800 */   345,  314,  327,  314,  353,  345,  314,  327,  314,  326,
- /*  1810 */   314,  314,  314,  194,  314,  210,   78,  314,  314,  106,
- /*  1820 */   326,  314,  314,  314,  194,  266,  210,   82,  314,  314,
- /*  1830 */   106,  353,  345,  314,  327,  314,  266,  314,  314,  314,
- /*  1840 */   326,  314,  353,  345,  194,  327,  210,   58,  326,  314,
- /*  1850 */   106,  314,  194,  314,  210,   49,  266,  314,  106,  314,
- /*  1860 */   314,  314,  353,  345,  266,  327,  314,  314,  326,  314,
- /*  1870 */   353,  345,  194,  327,  210,   70,  314,  314,  106,  314,
- /*  1880 */   314,  314,  326,  314,  266,  314,  194,  314,  185,   55,
- /*  1890 */   353,  345,  106,  327,  314,  314,  314,  314,  266,  314,
- /*  1900 */   314,  314,  326,  314,  353,  345,  194,  327,  210,   73,
- /*  1910 */   314,  314,  106,  326,  314,  314,  314,  194,  266,  210,
- /*  1920 */    56,  314,  314,  106,  353,  345,  314,  327,  314,  266,
- /*  1930 */   314,  314,  314,  314,  314,  353,  345,  326,  327,  314,
- /*  1940 */   314,  194,  314,  210,   79,  326,  314,  106,  314,  203,
- /*  1950 */   314,  210,  314,  266,  314,  106,  314,  314,  314,  353,
- /*  1960 */   345,  191,  327,  314,  314,  314,  314,  353,  345,  314,
- /*  1970 */   327,  326,  314,  314,  314,  350,  314,  210,  314,  314,
- /*  1980 */   326,  106,  314,  314,  288,  314,  210,  351,  314,  314,
- /*  1990 */   106,  326,  314,  353,  345,  261,  327,  210,  314,  314,
- /*  2000 */   326,  106,  353,  345,  253,  327,  210,  262,  314,  314,
- /*  2010 */   106,  326,  314,  353,  345,  287,  327,  210,  314,  314,
- /*  2020 */   326,  106,  353,  345,  352,  327,  210,  314,  314,  314,
- /*  2030 */   106,  326,  314,  353,  345,  279,  327,  210,  314,  314,
- /*  2040 */   314,  106,  353,  345,  314,  327,  314,  314,  314,  314,
- /*  2050 */   314,  314,  314,  353,  345,  314,  327,  326,  314,  314,
- /*  2060 */   314,  236,  326,  210,  314,  314,  257,  106,  210,  314,
- /*  2070 */   314,  314,  106,  314,  314,  314,  314,  314,  314,  353,
- /*  2080 */   345,  314,  327,  314,  353,  345,  314,  327,
+ /*     0 */   191,  304,  303,  306,  305,  307,  302,  301,  297,  296,
+ /*    10 */   298,  299,  300,  168,  334,  325,   37,  341,  152,    3,
+ /*    20 */    38,   38,  215,  281,  201,  218,  360,  128,  277,  133,
+ /*    30 */    33,  243,  270,  209,   50,   44,   49,   43,   13,    9,
+ /*    40 */   354,  361,   19,   35,  362,  370,   30,   20,  320,  315,
+ /*    50 */   311,  310,  316,  103,  265,  279,  168,  309,  319,  356,
+ /*    60 */   191,   38,  371,  372,  373,  369,  368,  364,  363,  365,
+ /*    70 */   366,  367,  349,  268,  191,  269,  331,  170,   25,  219,
+ /*    80 */   202,   38,  213,   52,  252,  116,  115,  176,  440,  324,
+ /*    90 */    17,   14,  284,  348,  440,   38,  359,  352,    3,  330,
+ /*   100 */   226,  572,   91,  239,  303,  306,  128,  169,   50,   44,
+ /*   110 */    49,   43,   13,    9,  354,  361,   19,   35,  362,  370,
+ /*   120 */    30,   20,    3,  272,    7,  146,  437,  204,  102,   38,
+ /*   130 */   128,   10,  437,  112,  322,  277,  371,  372,  373,  369,
+ /*   140 */   368,  364,  363,  365,  366,  367,  349,  268,  191,  357,
+ /*   150 */   331,  179,  238,  142,  202,  275,  213,   61,   18,  116,
+ /*   160 */     3,  274,   41,  295,   24,  135,  284,  348,  128,   38,
+ /*   170 */   359,  352,   18,  330,   18,  274,   41,  274,  233,  192,
+ /*   180 */   232,   38,   50,   44,   49,   43,   13,    9,  354,  361,
+ /*   190 */    19,   35,  362,  370,   30,   20,   18,  283,   18,  274,
+ /*   200 */    15,  274,  228,  119,  185,   18,  236,  155,  274,    8,
+ /*   210 */   371,  372,  373,  369,  368,  364,  363,  365,  366,  367,
+ /*   220 */   349,  268,  191,  167,  331,  281,  148,  173,  202,  101,
+ /*   230 */   213,   61,   21,  116,  120,  158,  277,   12,   11,  135,
+ /*   240 */   284,  348,  228,   38,  359,  352,  159,  330,   39,  230,
+ /*   250 */   179,   40,  179,   27,  200,  260,   50,   44,   49,   43,
+ /*   260 */    13,    9,  354,  361,   19,   35,  362,  370,   30,   20,
+ /*   270 */     3,  144,   48,  442,  100,  185,  339,  312,  128,  442,
+ /*   280 */     8,  277,  191,   38,  371,  372,  373,  369,  368,  364,
+ /*   290 */   363,  365,  366,  367,  349,  268,  191,  179,  331,  259,
+ /*   300 */    94,  147,  202,   38,  213,   61,   48,  116,  229,   18,
+ /*   310 */    48,  277,  274,  321,  284,  348,   38,   38,  359,  352,
+ /*   320 */   313,  330,  275,  439,  206,   23,   38,  285,  257,  439,
+ /*   330 */    50,   44,   49,   43,   13,    9,  354,  361,   19,   35,
+ /*   340 */   362,  370,   30,   20,  287,  436,  286,  141,  175,  335,
+ /*   350 */   267,   38,  114,  231,  281,    2,   48,  277,  371,  372,
+ /*   360 */   373,  369,  368,  364,  363,  365,  366,  367,  349,  268,
+ /*   370 */   191,  331,  164,  177,  150,  202,  174,  213,   61,  162,
+ /*   380 */   116,  191,  277,   18,  277,  180,  274,  284,  348,  277,
+ /*   390 */    38,  359,  352,  275,  330,   96,  436,  271,  210,   38,
+ /*   400 */   275,  223,   38,   38,   50,   44,   49,   43,   13,    9,
+ /*   410 */   354,  361,   19,   35,  362,  370,   30,   20,  345,  278,
+ /*   420 */   151,  327,  220,   18,   38,   38,  274,   38,  166,  335,
+ /*   430 */   277,  126,  371,  372,  373,  369,  368,  364,  363,  365,
+ /*   440 */   366,  367,  349,  268,  191,  331,  177,  222,  143,  202,
+ /*   450 */   131,  197,   68,  121,  116,  224,  203,  276,  277,  178,
+ /*   460 */   135,  284,  348,   38,  330,  359,  352,  346,  330,  275,
+ /*   470 */   227,  347,   18,   38,  318,  208,  317,   38,   50,   44,
+ /*   480 */    49,   43,   13,    9,  354,  361,   19,   35,  362,  370,
+ /*   490 */    30,   20,  191,  153,  149,  294,  329,   18,  119,  240,
+ /*   500 */   225,   38,   38,  277,  277,   38,  371,  372,  373,  369,
+ /*   510 */   368,  364,  363,  365,  366,  367,  349,  268,  326,  177,
+ /*   520 */   177,  156,   18,  275,   38,  207,   50,   44,   49,   43,
+ /*   530 */    13,    9,  354,  361,   19,   35,  362,  370,   30,   20,
+ /*   540 */    99,  280,  247,  248,  336,  266,  323,   38,    6,   38,
+ /*   550 */    38,   38,  117,  321,  371,  372,  373,  369,  368,  364,
+ /*   560 */   363,  365,  366,  367,  349,  268,  191,  331,  172,  335,
+ /*   570 */   353,  202,  256,  213,   74,  160,  116,  130,   38,   48,
+ /*   580 */   333,  254,   28,  284,  348,  277,   38,  359,  352,  258,
+ /*   590 */   330,  328,  255,  281,    4,   38,   18,   38,   38,  196,
+ /*   600 */    50,   44,   49,   43,   13,    9,  354,  361,   19,   35,
+ /*   610 */   362,  370,   30,   20,  191,  288,   89,    2,  127,  234,
+ /*   620 */    48,  293,  130,  264,  289,  341,  204,   93,  371,  372,
+ /*   630 */   373,  369,  368,  364,  363,  365,  366,  367,  349,  268,
+ /*   640 */   321,  253,  229,  118,   34,  134,   90,    5,   50,   44,
+ /*   650 */    49,   43,   13,    9,  354,  361,   19,   35,  362,  370,
+ /*   660 */    30,   20,  338,  157,  165,  161,  314,  286,  135,   16,
+ /*   670 */   275,  332,   42,  123,  277,  277,  371,  372,  373,  369,
+ /*   680 */   368,  364,  363,  365,  366,  367,  349,  268,  191,  331,
+ /*   690 */   263,  122,   95,  202,  108,  213,   72,  214,  116,  242,
+ /*   700 */   136,  108,  245,  106,  321,  284,  348,  321,  132,  359,
+ /*   710 */   352,  171,  330,  321,  321,  273,  321,  177,  191,  104,
+ /*   720 */   275,   29,   50,   44,   49,   43,   13,    9,  354,  361,
+ /*   730 */    19,   35,  362,  370,   30,   20,  105,  308,  318,  318,
+ /*   740 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  321,
+ /*   750 */   371,  372,  373,  369,  368,  364,  363,  365,  366,  367,
+ /*   760 */   349,  268,  191,  331,  318,  318,  318,  202,  318,  213,
+ /*   770 */    55,  318,  116,  318,  137,   97,  318,  261,  318,  284,
+ /*   780 */   348,  318,  318,  359,  352,  318,  330,  321,  321,  318,
+ /*   790 */   318,  318,  318,  318,  318,  318,   50,   44,   49,   43,
+ /*   800 */    13,    9,  354,  361,   19,   35,  362,  370,   30,   20,
+ /*   810 */   191,   31,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*   820 */   318,  318,  318,  318,  371,  372,  373,  369,  368,  364,
+ /*   830 */   363,  365,  366,  367,  349,  268,  318,  318,  318,  318,
+ /*   840 */   318,  318,  318,  318,   50,   44,   49,   43,   13,    9,
+ /*   850 */   354,  361,   19,   35,  362,  370,   30,   20,  191,  318,
+ /*   860 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*   870 */   318,  318,  371,  372,  373,  369,  368,  364,  363,  365,
+ /*   880 */   366,  367,  349,  268,  318,  318,  318,  318,  318,  318,
+ /*   890 */   318,  318,   50,   44,   49,   43,   13,    9,  354,  361,
+ /*   900 */    19,   35,  362,  370,   30,   20,  191,  318,  221,  318,
+ /*   910 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*   920 */   371,  372,  373,  369,  368,  364,  363,  365,  366,  367,
+ /*   930 */   349,  268,  318,  318,  217,  318,  318,  318,  318,  318,
+ /*   940 */    50,   44,   49,   43,   13,    9,  354,  361,   19,   35,
+ /*   950 */   362,  370,   30,   20,  191,  318,  318,  318,  318,  318,
+ /*   960 */   318,  318,  318,  318,  318,  318,  318,  318,  371,  372,
+ /*   970 */   373,  369,  368,  364,  363,  365,  366,  367,  349,  268,
+ /*   980 */   318,  318,  318,  318,  318,  318,  318,  318,   50,   44,
+ /*   990 */    49,   43,   13,    9,  354,  361,   19,   35,  362,  370,
+ /*  1000 */    30,   20,  191,  318,  318,  318,  318,  318,  318,  318,
+ /*  1010 */   318,  318,  318,  318,  318,  246,  371,  372,  373,  369,
+ /*  1020 */   368,  364,  363,  365,  366,  367,  349,  268,  318,  318,
+ /*  1030 */   318,  318,  318,  318,  318,  318,   50,   44,   49,   43,
+ /*  1040 */    13,    9,  354,  361,   19,   35,  362,  370,   30,   20,
+ /*  1050 */   191,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*  1060 */   318,  318,  318,  318,  371,  372,  373,  369,  368,  364,
+ /*  1070 */   363,  365,  366,  367,  349,  268,  318,  337,  318,  318,
+ /*  1080 */   318,  318,  318,  318,   50,   44,   49,   43,   13,    9,
+ /*  1090 */   354,  361,   19,   35,  362,  370,   30,   20,  318,  318,
+ /*  1100 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*  1110 */   318,  318,  371,  372,  373,  369,  368,  364,  363,  365,
+ /*  1120 */   366,  367,  349,  268,   50,   44,   49,   43,   13,    9,
+ /*  1130 */   354,  361,   19,   35,  362,  370,   30,   20,  318,  318,
+ /*  1140 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*  1150 */   318,  318,  371,  372,  373,  369,  368,  364,  363,  365,
+ /*  1160 */   366,  367,  349,  268,  318,  318,  318,  318,   37,  318,
+ /*  1170 */   129,  186,  318,  331,  215,  318,  201,  351,  318,  213,
+ /*  1180 */   318,  133,  116,  318,  270,  209,  216,  318,  318,   45,
+ /*  1190 */   355,  442,  318,  359,  352,  318,  330,  442,  318,  318,
+ /*  1200 */   318,  318,  318,   32,  212,  318,   46,   47,  292,  205,
+ /*  1210 */   350,  318,  318,   96,    1,  241,  318,  318,  318,   37,
+ /*  1220 */   318,  129,  193,  318,   48,  215,  318,  201,   92,  318,
+ /*  1230 */   318,  318,  133,  318,  318,  270,  209,  216,  318,  318,
+ /*  1240 */    45,  318,  318,  318,  318,  318,  331,  318,  318,  318,
+ /*  1250 */   195,  318,  213,   73,   32,  116,  318,   46,   47,  292,
+ /*  1260 */   205,  350,  284,  348,   96,    1,  359,  352,  318,  330,
+ /*  1270 */    37,  318,  114,  193,  318,  318,  215,  318,  201,   92,
+ /*  1280 */   194,  235,  318,  133,  318,  318,  270,  209,  216,  318,
+ /*  1290 */   318,   45,  318,  318,  318,  318,  318,  331,  318,  318,
+ /*  1300 */   318,  195,  318,  213,   73,   36,  116,  318,   46,   47,
+ /*  1310 */   292,  205,  350,  284,  348,   96,    1,  359,  352,  318,
+ /*  1320 */   330,   37,  318,  129,  189,  318,  318,  215,  318,  201,
+ /*  1330 */    92,  318,  244,  318,  133,  318,  318,  270,  209,  216,
+ /*  1340 */   318,  318,   45,  318,  318,  318,  318,  318,  331,  318,
+ /*  1350 */   318,  318,  202,  318,  213,   66,   32,  116,  318,   46,
+ /*  1360 */    47,  292,  205,  350,  284,  348,   96,    1,  359,  352,
+ /*  1370 */   318,  330,   37,  318,  129,  181,  318,  318,  215,  318,
+ /*  1380 */   201,   92,  318,  318,  318,  133,  318,  318,  270,  209,
+ /*  1390 */   216,  318,  318,   45,  318,  318,  318,  318,  318,  331,
+ /*  1400 */   318,  318,  318,  202,  318,  213,   77,   32,  116,  318,
+ /*  1410 */    46,   47,  292,  205,  350,  284,  348,   96,    1,  359,
+ /*  1420 */   352,  318,  330,   37,  318,  129,  182,  318,  318,  215,
+ /*  1430 */   318,  201,   92,  318,  318,  318,  133,  318,  318,  270,
+ /*  1440 */   209,  198,  318,  318,   45,  318,  318,  318,  318,  318,
+ /*  1450 */   331,  318,  318,  318,  187,  318,  213,   83,   32,  116,
+ /*  1460 */   318,   46,   47,  292,  205,  350,  284,  348,   96,    1,
+ /*  1470 */   359,  352,  318,  330,   37,  318,  113,  193,  318,  318,
+ /*  1480 */   215,  318,  201,   92,  318,  318,  318,  133,  318,  318,
+ /*  1490 */   270,  209,  216,  318,  318,   45,  318,  318,  318,  318,
+ /*  1500 */   318,  331,  318,  318,  318,  202,  318,  213,   71,   32,
+ /*  1510 */   116,  318,   46,   47,  292,  205,  350,  284,  348,   96,
+ /*  1520 */     1,  359,  352,  318,  330,   37,  318,  124,   88,  318,
+ /*  1530 */   318,  215,  318,  201,   92,  318,  318,  318,  133,  318,
+ /*  1540 */   318,  270,  209,  216,  318,  318,   45,  318,  318,  318,
+ /*  1550 */   318,  318,  331,  318,  318,  318,  202,  318,  213,   81,
+ /*  1560 */    32,  116,  318,   46,   47,  292,  205,  350,  284,  348,
+ /*  1570 */    96,    1,  359,  352,  318,  330,   37,  318,  129,  183,
+ /*  1580 */   318,  318,  215,  318,  201,   92,  318,  318,  318,  133,
+ /*  1590 */   318,  318,  270,  209,  216,  318,  318,   45,  318,  318,
+ /*  1600 */   318,  318,  318,  331,  318,  318,  318,  202,  318,  213,
+ /*  1610 */    58,   32,  116,  318,   46,   47,  292,  205,  350,  284,
+ /*  1620 */   348,   96,    1,  359,  352,  318,  330,   37,  318,  125,
+ /*  1630 */   193,  318,  318,  215,  318,  201,   92,  318,  318,  318,
+ /*  1640 */   133,  318,  318,  270,  209,  216,  318,  318,   45,  318,
+ /*  1650 */   318,  318,  318,  318,  331,  318,  318,  318,  190,  318,
+ /*  1660 */   213,   53,   32,  116,  318,   46,   47,  292,  205,  350,
+ /*  1670 */   284,  348,   96,    1,  359,  352,  318,  330,   37,  318,
+ /*  1680 */   114,  193,  318,  318,  215,  318,  201,   92,  318,  318,
+ /*  1690 */   318,  133,  318,  318,  270,  209,  216,  318,  318,   45,
+ /*  1700 */   318,  318,  318,  318,  318,  331,  318,  318,  318,  111,
+ /*  1710 */   318,  107,   54,   36,  109,  318,   46,   47,  292,  205,
+ /*  1720 */   350,  284,  348,   96,  318,  359,  352,  318,  330,   37,
+ /*  1730 */   318,  114,  199,  318,  318,  215,  318,  201,   92,  318,
+ /*  1740 */   318,  318,  133,  318,  318,  270,  209,  216,  483,  318,
+ /*  1750 */    45,  318,  318,  318,  483,  318,  483,  318,  483,  483,
+ /*  1760 */   318,  483,  139,  318,   36,  173,  483,   46,   47,  292,
+ /*  1770 */   205,  350,  277,  318,   96,   12,   11,  318,  318,  318,
+ /*  1780 */   318,  483,    3,  483,  318,  318,  318,  318,  179,   92,
+ /*  1790 */   128,  318,  318,  163,  483,  331,   98,  318,  318,  202,
+ /*  1800 */   318,  213,   84,  277,  116,  318,   12,   11,  483,  318,
+ /*  1810 */   318,  284,  348,  318,  318,  359,  352,  318,  330,  179,
+ /*  1820 */   331,  318,  318,  318,  202,  318,  213,   85,  318,  116,
+ /*  1830 */   318,  318,  318,  318,  318,  318,  284,  348,  318,  318,
+ /*  1840 */   359,  352,  331,  330,  318,  318,  184,  318,  213,   63,
+ /*  1850 */   318,  116,  318,  318,  318,  318,  318,  318,  284,  348,
+ /*  1860 */   318,  318,  359,  352,  331,  330,  318,  318,  202,  318,
+ /*  1870 */   213,   75,  318,  116,  318,  318,  318,  318,  318,  318,
+ /*  1880 */   284,  348,  331,  318,  359,  352,  202,  330,  213,   62,
+ /*  1890 */   318,  116,  318,  318,  318,  318,  318,  318,  284,  348,
+ /*  1900 */   318,  318,  359,  352,  318,  330,  318,  331,  318,  318,
+ /*  1910 */   318,  202,  318,  213,   76,  318,  116,  318,  318,  318,
+ /*  1920 */   318,  318,  318,  284,  348,  318,  318,  359,  352,  318,
+ /*  1930 */   330,  318,  318,  318,  374,  318,  318,  318,  318,   22,
+ /*  1940 */   318,  318,  331,  318,  318,  215,  202,  201,  213,   60,
+ /*  1950 */   318,  116,  133,  318,  318,  270,  209,  318,  284,  348,
+ /*  1960 */   318,  318,  359,  352,  331,  330,  318,  318,  202,  318,
+ /*  1970 */   213,   80,  318,  116,  318,  318,  318,  318,  318,  318,
+ /*  1980 */   284,  348,  318,  318,  359,  352,  331,  330,  318,  318,
+ /*  1990 */   202,  318,  213,   82,  318,  116,  318,  318,  318,  343,
+ /*  2000 */    26,  340,  284,  348,  318,  318,  359,  352,  318,  330,
+ /*  2010 */   331,  318,  318,  318,  202,  318,  213,   87,  318,  116,
+ /*  2020 */   318,  318,  318,  318,  318,  318,  284,  348,  331,  318,
+ /*  2030 */   359,  352,  202,  330,  213,   69,  318,  116,  318,  318,
+ /*  2040 */   318,  318,  318,  318,  284,  348,  331,  318,  359,  352,
+ /*  2050 */   202,  330,  213,   57,  318,  116,  318,  318,  318,  318,
+ /*  2060 */   318,  318,  284,  348,  331,  318,  359,  352,  202,  330,
+ /*  2070 */   213,   70,  318,  116,  318,  318,  318,  318,  318,  318,
+ /*  2080 */   284,  348,  331,  318,  359,  352,  202,  330,  213,   59,
+ /*  2090 */   318,  116,  318,  318,  318,  318,  318,  318,  284,  348,
+ /*  2100 */   331,  318,  359,  352,  111,  330,  110,   56,  318,  109,
+ /*  2110 */   318,  318,  318,  318,  318,  318,  284,  348,  331,  318,
+ /*  2120 */   359,  352,  188,  330,  213,   79,  318,  116,  318,  318,
+ /*  2130 */   318,  374,  318,  318,  284,  348,   22,  318,  359,  352,
+ /*  2140 */   318,  330,  215,  318,  201,  318,  318,  318,  318,  133,
+ /*  2150 */   331,  318,  270,  209,  202,  318,  213,   78,  318,  116,
+ /*  2160 */   318,  318,  318,  318,  318,  318,  284,  348,  331,  318,
+ /*  2170 */   359,  352,  202,  330,  213,   51,  318,  116,  318,  318,
+ /*  2180 */   318,  318,  318,  318,  284,  348,  331,  318,  359,  352,
+ /*  2190 */   202,  330,  213,   67,  318,  116,  342,   26,  340,  318,
+ /*  2200 */   318,  318,  284,  348,  331,  318,  359,  352,  202,  330,
+ /*  2210 */   213,   65,  318,  116,  318,  318,  318,  318,  318,  318,
+ /*  2220 */   284,  348,  331,  318,  359,  352,  202,  330,  213,   64,
+ /*  2230 */   318,  116,  318,  318,  318,  318,  318,  318,  284,  348,
+ /*  2240 */   331,  318,  359,  352,  202,  330,  213,   86,  318,  116,
+ /*  2250 */   318,  318,  318,  318,  318,  318,  284,  348,  331,  318,
+ /*  2260 */   359,  352,  251,  330,  213,  318,  318,  116,  331,  318,
+ /*  2270 */   318,  318,  282,  318,  213,  250,  331,  116,  359,  352,
+ /*  2280 */   358,  330,  213,  318,  318,  116,  331,  318,  359,  352,
+ /*  2290 */   290,  330,  213,  318,  331,  116,  359,  352,  262,  330,
+ /*  2300 */   213,  318,  318,  116,  331,  318,  359,  352,  249,  330,
+ /*  2310 */   213,  318,  331,  116,  359,  352,  237,  330,  213,  191,
+ /*  2320 */   318,  116,  331,  318,  359,  352,  291,  330,  213,  318,
+ /*  2330 */   318,  116,  359,  352,  344,  330,  318,  318,  211,  318,
+ /*  2340 */    38,  318,  359,  352,  140,  330,  138,  173,  318,  173,
+ /*  2350 */   318,  318,  145,  318,  277,  173,  277,   12,   11,   12,
+ /*  2360 */    11,  318,  277,  318,  318,   12,   11,  318,    3,  318,
+ /*  2370 */   179,  318,  179,  318,  154,  318,  128,  173,  179,  318,
+ /*  2380 */   318,  318,  318,  318,  277,  318,  318,   12,   11,  318,
+ /*  2390 */   318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+ /*  2400 */   179,
     );
     static public $yy_lookahead = array(
- /*     0 */     1,   30,   33,   86,    3,    4,    5,    6,    7,    8,
- /*    10 */     9,   10,   11,   12,   89,   16,   15,  100,  110,  111,
- /*    20 */    49,   22,   21,   98,   23,   15,  101,  102,   57,   28,
- /*    30 */    61,  114,   31,   34,   35,   36,   37,   38,   39,   40,
- /*    40 */    41,   42,   43,   44,   45,   46,   47,    4,    5,    6,
- /*    50 */     7,    8,   16,   19,   20,   12,   13,   14,   22,   49,
- /*    60 */    16,   62,   63,   64,   65,   66,   67,   68,   69,   70,
- /*    70 */    71,   72,   73,    1,   81,   80,   81,   82,   85,   22,
- /*    80 */    87,   88,   55,   90,   91,   49,   86,   60,   16,   89,
- /*    90 */    97,   57,   48,   57,   22,   81,  103,  104,   98,  106,
- /*   100 */   100,  101,  102,   17,   18,  107,   34,   35,   36,   37,
- /*   110 */    38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
- /*   120 */    78,   79,   80,   81,   82,   15,   15,   17,   18,   18,
- /*   130 */    19,  117,  118,   18,   62,   63,   64,   65,   66,   67,
- /*   140 */    68,   69,   70,   71,   72,   73,    1,    1,   81,   86,
- /*   150 */    15,   16,   85,   18,   87,   88,   15,   90,   91,   18,
- /*   160 */    19,   98,   16,  100,   97,   30,   20,   22,   22,   58,
- /*   170 */   103,  104,   27,  106,   15,   16,    2,   18,   99,   34,
- /*   180 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
- /*   190 */    45,   46,   47,   19,   25,   49,   15,   19,   15,   18,
- /*   200 */    19,   18,    2,   57,   17,   18,   25,   62,   63,   64,
- /*   210 */    65,   66,   67,   68,   69,   70,   71,   72,   73,    1,
- /*   220 */    81,  107,   22,   24,   85,   15,   87,   88,   18,   90,
- /*   230 */    91,   16,   33,   55,   16,   86,   97,   22,   89,   20,
- /*   240 */    25,   58,  103,  104,   75,  106,   59,   98,    2,  100,
- /*   250 */   101,  102,   34,   35,   36,   37,   38,   39,   40,   41,
- /*   260 */    42,   43,   44,   45,   46,   47,    1,   16,   58,   15,
- /*   270 */    16,   49,   18,   22,   55,   15,   25,   17,   18,   60,
- /*   280 */    62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
- /*   290 */    72,   73,   32,  108,   32,  110,  111,    1,   33,   34,
- /*   300 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
- /*   310 */    45,   46,   47,    1,  107,   16,  109,   16,   22,   16,
- /*   320 */    48,   22,   87,   22,    1,   22,   91,   62,   63,   64,
- /*   330 */    65,   66,   67,   68,   69,   70,   71,   72,   73,   16,
- /*   340 */    15,  106,   29,   18,   18,   22,   34,   35,   36,   37,
- /*   350 */    38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
- /*   360 */     1,    2,   16,   16,   16,   16,  110,  111,   22,   22,
- /*   370 */    22,   22,   18,   61,   62,   63,   64,   65,   66,   67,
- /*   380 */    68,   69,   70,   71,   72,   73,   32,   15,   19,   15,
- /*   390 */    18,   30,   18,   34,   35,   36,   37,   38,   39,   40,
- /*   400 */    41,   42,   43,   44,   45,   46,   47,   49,   16,   48,
- /*   410 */    16,   16,   16,   55,   22,   57,   22,   22,   22,   61,
- /*   420 */    18,   62,   63,   64,   65,   66,   67,   68,   69,   70,
- /*   430 */    71,   72,   73,    1,   81,   19,   61,   86,   85,   95,
- /*   440 */    87,   88,   48,   48,   91,   92,   86,   49,   16,   89,
- /*   450 */    97,  100,   22,  109,   19,   57,  103,  104,   98,  106,
- /*   460 */   100,  101,  102,   82,   29,   84,   34,   35,   36,   37,
- /*   470 */    38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
- /*   480 */    18,   18,   81,   16,   49,   16,  107,   16,  109,   22,
- /*   490 */    20,   22,   57,   22,   62,   63,   64,   65,   66,   67,
- /*   500 */    68,   69,   70,   71,   72,   73,    1,    1,   81,  105,
- /*   510 */    15,   16,   85,   18,   87,   88,  112,   90,   91,  118,
- /*   520 */    86,   58,   16,   89,   97,   30,   20,   57,   22,   24,
- /*   530 */   103,  104,   98,  106,  100,  101,  102,   92,   93,   34,
- /*   540 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
- /*   550 */    45,   46,   47,    1,  105,   18,   16,   16,   16,   50,
- /*   560 */    50,  112,   22,   22,   22,   86,   86,   62,   63,   64,
- /*   570 */    65,   66,   67,   68,   69,   70,   71,   72,   73,  100,
- /*   580 */   100,   15,   18,   18,   18,   50,   34,   35,   36,   37,
- /*   590 */    38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
- /*   600 */    96,   26,   59,   16,   16,   29,   16,   18,   59,   22,
- /*   610 */    22,   99,   16,  109,   62,   63,   64,   65,   66,   67,
- /*   620 */    68,   69,   70,   71,   72,   73,    1,   75,   81,   17,
- /*   630 */    17,   95,   85,   55,   87,   88,   51,   90,   91,   32,
- /*   640 */    86,   95,   16,   89,   97,  109,   17,   22,   25,   17,
- /*   650 */   103,  104,   98,  106,  100,  109,   22,   49,   18,   34,
- /*   660 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
- /*   670 */    45,   46,   47,   17,  100,  108,    2,   20,   17,  111,
- /*   680 */   109,   22,  112,  114,  107,   92,   13,   62,   63,   64,
- /*   690 */    65,   66,   67,   68,   69,   70,   71,   72,   73,    1,
- /*   700 */    81,   99,    1,   83,   85,   81,   87,   88,   22,   85,
- /*   710 */    91,   87,   88,   98,   16,   91,   97,   95,  107,  119,
- /*   720 */   119,   97,  103,  104,   94,  106,  119,  103,  104,   94,
- /*   730 */   106,  109,   34,   35,   36,   37,   38,   39,   40,   41,
- /*   740 */    42,   43,   44,   45,   46,   47,    1,  119,  119,  119,
- /*   750 */   119,  119,  119,  119,  119,  119,  119,  119,   95,   95,
- /*   760 */    62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
- /*   770 */    72,   73,  109,  109,  119,  119,  119,  119,  119,   34,
- /*   780 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
- /*   790 */    45,   46,   47,  119,  119,   50,  119,  119,  119,  119,
- /*   800 */   119,  119,  119,  119,  119,  119,  119,   62,   63,   64,
- /*   810 */    65,   66,   67,   68,   69,   70,   71,   72,   73,    1,
- /*   820 */    81,  119,  119,   95,   85,   81,   87,   88,  119,   85,
- /*   830 */    91,   87,   88,  119,   16,   91,   97,  109,  119,  119,
- /*   840 */   119,   97,  103,  104,  119,  106,  119,  103,  104,  119,
- /*   850 */   106,  119,   34,   35,   36,   37,   38,   39,   40,   41,
- /*   860 */    42,   43,   44,   45,   46,   47,  119,  119,  119,  119,
- /*   870 */   119,  119,  119,  119,  119,  119,  119,  119,  119,   86,
- /*   880 */    62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
- /*   890 */    72,   73,    1,  100,  119,   81,  119,  119,   86,   85,
- /*   900 */   119,   87,   88,   10,  119,   91,  119,   16,   15,  119,
- /*   910 */    98,   97,  100,  119,   21,  119,   23,  103,  104,  119,
- /*   920 */   106,   28,  119,  119,   31,   34,   35,   36,   37,   38,
- /*   930 */    39,   40,   41,   42,   43,   44,   45,   46,   47,    1,
- /*   940 */   119,  119,  119,  119,  119,  119,  119,  119,  119,  119,
- /*   950 */   119,   95,   95,   62,   63,   64,   65,   66,   67,   68,
- /*   960 */    69,   70,   71,   72,   73,  109,  109,   74,   75,   76,
- /*   970 */   119,  119,   34,   35,   36,   37,   38,   39,   40,   41,
- /*   980 */    42,   43,   44,   45,   46,   47,  119,  119,   50,  119,
- /*   990 */   119,  119,  119,  119,  119,  119,  119,  119,  119,   86,
- /*  1000 */    62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
- /*  1010 */    72,   73,    1,  100,  119,   81,  119,  119,   86,   85,
- /*  1020 */   119,   87,   88,   10,  119,   91,  119,   16,   15,  119,
- /*  1030 */    98,   97,  100,  119,   21,  119,   23,  103,  104,  119,
- /*  1040 */   106,   28,  119,  119,   31,   34,   35,   36,   37,   38,
- /*  1050 */    39,   40,   41,   42,   43,   44,   45,   46,   47,    1,
- /*  1060 */   119,  119,  119,  119,  119,  119,  119,  119,  119,  119,
- /*  1070 */   119,   86,   95,   62,   63,   64,   65,   66,   67,   68,
- /*  1080 */    69,   70,   71,   72,   73,  100,  109,   74,   75,   76,
- /*  1090 */   119,  119,   34,   35,   36,   37,   38,   39,   40,   41,
- /*  1100 */    42,   43,   44,   45,   46,   47,  119,  119,  119,  119,
- /*  1110 */   119,  119,  119,  119,  119,  119,  119,  119,  119,  119,
- /*  1120 */    62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
- /*  1130 */    72,   73,  119,   86,   86,  119,   15,   89,   17,   18,
- /*  1140 */   119,  119,   21,  119,   23,   98,   98,  100,  100,   28,
- /*  1150 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1160 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1170 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1180 */    59,   60,   61,  119,  103,  104,   15,  106,   17,   18,
- /*  1190 */   119,  119,   21,  119,   23,   74,  115,  116,  119,   28,
- /*  1200 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1210 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1220 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1230 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1240 */   119,  119,   21,  119,   23,   74,  119,  116,  119,   28,
- /*  1250 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1260 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1270 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1280 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1290 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1300 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1310 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1320 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1330 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1340 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1350 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1360 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1370 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1380 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1390 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1400 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1410 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1420 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1430 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1440 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1450 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1460 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1470 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1480 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1490 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1500 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1510 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1520 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1530 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1540 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1550 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1560 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1570 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1580 */    59,   60,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1590 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1600 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1610 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1620 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1630 */    59,  119,  119,  119,  103,  104,   15,  106,   17,   18,
- /*  1640 */   119,  119,   21,  119,   23,   74,  119,  119,  119,   28,
- /*  1650 */   119,  119,   31,   32,  119,  119,   35,  119,  119,  119,
- /*  1660 */   119,  119,   81,  119,  119,  119,   85,  119,   87,   88,
- /*  1670 */    49,  119,   91,   52,   53,   54,   55,   56,   97,  119,
- /*  1680 */    59,  119,  119,  119,  103,  104,  119,  106,  119,  119,
- /*  1690 */   119,  119,  119,  119,  113,   74,  119,  119,  119,  119,
- /*  1700 */    81,  119,  119,  119,   85,   81,   87,   88,  119,   85,
- /*  1710 */    91,   87,   88,  119,  119,   91,   97,  119,  119,  119,
- /*  1720 */   119,   97,  103,  104,  119,  106,  119,  103,  104,  119,
- /*  1730 */   106,  119,  119,  119,   81,  119,  119,  113,   85,  119,
- /*  1740 */    87,   88,  119,  119,   91,  119,  119,  119,   81,  119,
- /*  1750 */    97,  119,   85,  119,   87,   88,  103,  104,   91,  106,
- /*  1760 */   119,  119,  119,  119,   97,  119,  113,  119,  119,  119,
- /*  1770 */   103,  104,  119,  106,  119,  119,  119,   81,  119,  119,
- /*  1780 */   113,   85,   81,   87,   88,  119,   85,   91,   87,   88,
- /*  1790 */   119,  119,   91,   97,  119,  119,  119,  119,   97,  103,
- /*  1800 */   104,  119,  106,  119,  103,  104,  119,  106,  119,   81,
- /*  1810 */   119,  119,  119,   85,  119,   87,   88,  119,  119,   91,
- /*  1820 */    81,  119,  119,  119,   85,   97,   87,   88,  119,  119,
- /*  1830 */    91,  103,  104,  119,  106,  119,   97,  119,  119,  119,
- /*  1840 */    81,  119,  103,  104,   85,  106,   87,   88,   81,  119,
- /*  1850 */    91,  119,   85,  119,   87,   88,   97,  119,   91,  119,
- /*  1860 */   119,  119,  103,  104,   97,  106,  119,  119,   81,  119,
- /*  1870 */   103,  104,   85,  106,   87,   88,  119,  119,   91,  119,
- /*  1880 */   119,  119,   81,  119,   97,  119,   85,  119,   87,   88,
- /*  1890 */   103,  104,   91,  106,  119,  119,  119,  119,   97,  119,
- /*  1900 */   119,  119,   81,  119,  103,  104,   85,  106,   87,   88,
- /*  1910 */   119,  119,   91,   81,  119,  119,  119,   85,   97,   87,
- /*  1920 */    88,  119,  119,   91,  103,  104,  119,  106,  119,   97,
- /*  1930 */   119,  119,  119,  119,  119,  103,  104,   81,  106,  119,
- /*  1940 */   119,   85,  119,   87,   88,   81,  119,   91,  119,   85,
- /*  1950 */   119,   87,  119,   97,  119,   91,  119,  119,  119,  103,
- /*  1960 */   104,   97,  106,  119,  119,  119,  119,  103,  104,  119,
- /*  1970 */   106,   81,  119,  119,  119,   85,  119,   87,  119,  119,
- /*  1980 */    81,   91,  119,  119,   85,  119,   87,   97,  119,  119,
- /*  1990 */    91,   81,  119,  103,  104,   85,  106,   87,  119,  119,
- /*  2000 */    81,   91,  103,  104,   85,  106,   87,   97,  119,  119,
- /*  2010 */    91,   81,  119,  103,  104,   85,  106,   87,  119,  119,
- /*  2020 */    81,   91,  103,  104,   85,  106,   87,  119,  119,  119,
- /*  2030 */    91,   81,  119,  103,  104,   85,  106,   87,  119,  119,
- /*  2040 */   119,   91,  103,  104,  119,  106,  119,  119,  119,  119,
- /*  2050 */   119,  119,  119,  103,  104,  119,  106,   81,  119,  119,
- /*  2060 */   119,   85,   81,   87,  119,  119,   85,   91,   87,  119,
- /*  2070 */   119,  119,   91,  119,  119,  119,  119,  119,  119,  103,
- /*  2080 */   104,  119,  106,  119,  103,  104,  119,  106,
+ /*     0 */     1,   81,   82,   83,    3,    4,    5,    6,    7,    8,
+ /*    10 */     9,   10,   11,   12,   16,   16,   15,   82,   87,   50,
+ /*    20 */    22,   22,   21,   25,   23,   56,   18,   58,   97,   28,
+ /*    30 */     2,   62,   31,   32,   35,   36,   37,   38,   39,   40,
+ /*    40 */    41,   42,   43,   44,   45,   46,   47,   48,    4,    5,
+ /*    50 */     6,    7,    8,  118,  119,   16,   12,   13,   14,   18,
+ /*    60 */     1,   22,   63,   64,   65,   66,   67,   68,   69,   70,
+ /*    70 */    71,   72,   73,   74,    1,   16,   82,   24,   30,   20,
+ /*    80 */    86,   22,   88,   89,   51,   91,   92,   34,   16,   16,
+ /*    90 */    19,   19,   98,   99,   22,   22,  102,  103,   50,  105,
+ /*   100 */    59,   79,   80,   81,   82,   83,   58,   18,   35,   36,
+ /*   110 */    37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+ /*   120 */    47,   48,   50,   16,   34,   87,   16,   56,   90,   22,
+ /*   130 */    58,   15,   22,   17,   18,   97,   63,   64,   65,   66,
+ /*   140 */    67,   68,   69,   70,   71,   72,   73,   74,    1,   33,
+ /*   150 */    82,  113,   62,  106,   86,  108,   88,   89,   15,   91,
+ /*   160 */    50,   18,   19,   16,   19,   20,   98,   99,   58,   22,
+ /*   170 */   102,  103,   15,  105,   15,   18,   19,   18,   92,   93,
+ /*   180 */   112,   22,   35,   36,   37,   38,   39,   40,   41,   42,
+ /*   190 */    43,   44,   45,   46,   47,   48,   15,   18,   15,   18,
+ /*   200 */    19,   18,   59,   58,   56,   15,   25,  106,   18,   61,
+ /*   210 */    63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
+ /*   220 */    73,   74,    1,  114,   82,   25,   87,   90,   86,   90,
+ /*   230 */    88,   89,   15,   91,   17,   18,   97,  100,  101,   20,
+ /*   240 */    98,   99,   59,   22,  102,  103,  106,  105,   27,   59,
+ /*   250 */   113,   26,  113,   30,  112,   51,   35,   36,   37,   38,
+ /*   260 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*   270 */    50,   87,   49,   16,   90,   56,   76,   16,   58,   22,
+ /*   280 */    61,   97,    1,   22,   63,   64,   65,   66,   67,   68,
+ /*   290 */    69,   70,   71,   72,   73,   74,    1,  113,   82,   62,
+ /*   300 */    95,   87,   86,   22,   88,   89,   49,   91,    2,   15,
+ /*   310 */    49,   97,   18,  108,   98,   99,   22,   22,  102,  103,
+ /*   320 */    16,  105,  108,   16,   30,   19,   22,   18,  112,   22,
+ /*   330 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
+ /*   340 */    45,   46,   47,   48,   18,   16,  107,   87,  109,  110,
+ /*   350 */    60,   22,   17,   18,   25,   50,   49,   97,   63,   64,
+ /*   360 */    65,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   370 */     1,   82,   87,  113,   87,   86,  114,   88,   89,   87,
+ /*   380 */    91,    1,   97,   15,   97,   16,   18,   98,   99,   97,
+ /*   390 */    22,  102,  103,  108,  105,   60,   16,   16,   30,   22,
+ /*   400 */   108,  112,   22,   22,   35,   36,   37,   38,   39,   40,
+ /*   410 */    41,   42,   43,   44,   45,   46,   47,   48,   16,   16,
+ /*   420 */    87,   16,   18,   15,   22,   22,   18,   22,  109,  110,
+ /*   430 */    97,   17,   63,   64,   65,   66,   67,   68,   69,   70,
+ /*   440 */    71,   72,   73,   74,    1,   82,  113,   88,   87,   86,
+ /*   450 */    91,   88,   89,   17,   91,   17,   18,   16,   97,   16,
+ /*   460 */    20,   98,   99,   22,  105,  102,  103,   16,  105,  108,
+ /*   470 */    18,   16,   15,   22,   83,   18,   85,   22,   35,   36,
+ /*   480 */    37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+ /*   490 */    47,   48,    1,   87,   87,   16,   16,   15,   58,   16,
+ /*   500 */    18,   22,   22,   97,   97,   22,   63,   64,   65,   66,
+ /*   510 */    67,   68,   69,   70,   71,   72,   73,   74,   16,  113,
+ /*   520 */   113,  106,   15,  108,   22,   18,   35,   36,   37,   38,
+ /*   530 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*   540 */    95,   16,   51,   16,   16,   16,   16,   22,   22,   22,
+ /*   550 */    22,   22,   17,  108,   63,   64,   65,   66,   67,   68,
+ /*   560 */    69,   70,   71,   72,   73,   74,    1,   82,  109,  110,
+ /*   570 */   104,   86,   16,   88,   89,   87,   91,  111,   22,   49,
+ /*   580 */    16,   16,   15,   98,   99,   97,   22,  102,  103,   16,
+ /*   590 */   105,   16,   16,   25,   50,   22,   15,   22,   22,   18,
+ /*   600 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
+ /*   610 */    45,   46,   47,   48,    1,  104,   18,   50,   17,   60,
+ /*   620 */    49,   33,  111,   51,   33,   82,   56,   95,   63,   64,
+ /*   630 */    65,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   640 */   108,   16,    2,   17,   52,   22,   18,   34,   35,   36,
+ /*   650 */    37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+ /*   660 */    47,   48,  119,  106,   87,   87,   97,  107,   20,   22,
+ /*   670 */   108,  110,    2,   17,   97,   97,   63,   64,   65,   66,
+ /*   680 */    67,   68,   69,   70,   71,   72,   73,   74,    1,   82,
+ /*   690 */   111,   95,  106,   86,   95,   88,   89,   94,   91,   22,
+ /*   700 */    95,   95,   92,   95,  108,   98,   99,  108,   96,  102,
+ /*   710 */   103,   24,  105,  108,  108,  115,  108,  113,    1,   84,
+ /*   720 */   108,   94,   35,   36,   37,   38,   39,   40,   41,   42,
+ /*   730 */    43,   44,   45,   46,   47,   48,   95,   13,  120,  120,
+ /*   740 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  108,
+ /*   750 */    63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
+ /*   760 */    73,   74,    1,   82,  120,  120,  120,   86,  120,   88,
+ /*   770 */    89,  120,   91,  120,   95,   95,  120,   16,  120,   98,
+ /*   780 */    99,  120,  120,  102,  103,  120,  105,  108,  108,  120,
+ /*   790 */   120,  120,  120,  120,  120,  120,   35,   36,   37,   38,
+ /*   800 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*   810 */     1,    2,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*   820 */   120,  120,  120,  120,   63,   64,   65,   66,   67,   68,
+ /*   830 */    69,   70,   71,   72,   73,   74,  120,  120,  120,  120,
+ /*   840 */   120,  120,  120,  120,   35,   36,   37,   38,   39,   40,
+ /*   850 */    41,   42,   43,   44,   45,   46,   47,   48,    1,  120,
+ /*   860 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*   870 */   120,  120,   63,   64,   65,   66,   67,   68,   69,   70,
+ /*   880 */    71,   72,   73,   74,  120,  120,  120,  120,  120,  120,
+ /*   890 */   120,  120,   35,   36,   37,   38,   39,   40,   41,   42,
+ /*   900 */    43,   44,   45,   46,   47,   48,    1,  120,   51,  120,
+ /*   910 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*   920 */    63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
+ /*   930 */    73,   74,  120,  120,   29,  120,  120,  120,  120,  120,
+ /*   940 */    35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
+ /*   950 */    45,   46,   47,   48,    1,  120,  120,  120,  120,  120,
+ /*   960 */   120,  120,  120,  120,  120,  120,  120,  120,   63,   64,
+ /*   970 */    65,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   980 */   120,  120,  120,  120,  120,  120,  120,  120,   35,   36,
+ /*   990 */    37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+ /*  1000 */    47,   48,    1,  120,  120,  120,  120,  120,  120,  120,
+ /*  1010 */   120,  120,  120,  120,  120,   62,   63,   64,   65,   66,
+ /*  1020 */    67,   68,   69,   70,   71,   72,   73,   74,  120,  120,
+ /*  1030 */   120,  120,  120,  120,  120,  120,   35,   36,   37,   38,
+ /*  1040 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
+ /*  1050 */     1,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*  1060 */   120,  120,  120,  120,   63,   64,   65,   66,   67,   68,
+ /*  1070 */    69,   70,   71,   72,   73,   74,  120,   76,  120,  120,
+ /*  1080 */   120,  120,  120,  120,   35,   36,   37,   38,   39,   40,
+ /*  1090 */    41,   42,   43,   44,   45,   46,   47,   48,  120,  120,
+ /*  1100 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*  1110 */   120,  120,   63,   64,   65,   66,   67,   68,   69,   70,
+ /*  1120 */    71,   72,   73,   74,   35,   36,   37,   38,   39,   40,
+ /*  1130 */    41,   42,   43,   44,   45,   46,   47,   48,  120,  120,
+ /*  1140 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*  1150 */   120,  120,   63,   64,   65,   66,   67,   68,   69,   70,
+ /*  1160 */    71,   72,   73,   74,  120,  120,  120,  120,   15,  120,
+ /*  1170 */    17,   18,  120,   82,   21,  120,   23,   86,  120,   88,
+ /*  1180 */   120,   28,   91,  120,   31,   32,   33,  120,  120,   36,
+ /*  1190 */    99,   16,  120,  102,  103,  120,  105,   22,  120,  120,
+ /*  1200 */   120,  120,  120,   50,   29,  120,   53,   54,   55,   56,
+ /*  1210 */    57,  120,  120,   60,   61,   62,  120,  120,  120,   15,
+ /*  1220 */   120,   17,   18,  120,   49,   21,  120,   23,   75,  120,
+ /*  1230 */   120,  120,   28,  120,  120,   31,   32,   33,  120,  120,
+ /*  1240 */    36,  120,  120,  120,  120,  120,   82,  120,  120,  120,
+ /*  1250 */    86,  120,   88,   89,   50,   91,  120,   53,   54,   55,
+ /*  1260 */    56,   57,   98,   99,   60,   61,  102,  103,  120,  105,
+ /*  1270 */    15,  120,   17,   18,  120,  120,   21,  120,   23,   75,
+ /*  1280 */   116,  117,  120,   28,  120,  120,   31,   32,   33,  120,
+ /*  1290 */   120,   36,  120,  120,  120,  120,  120,   82,  120,  120,
+ /*  1300 */   120,   86,  120,   88,   89,   50,   91,  120,   53,   54,
+ /*  1310 */    55,   56,   57,   98,   99,   60,   61,  102,  103,  120,
+ /*  1320 */   105,   15,  120,   17,   18,  120,  120,   21,  120,   23,
+ /*  1330 */    75,  120,  117,  120,   28,  120,  120,   31,   32,   33,
+ /*  1340 */   120,  120,   36,  120,  120,  120,  120,  120,   82,  120,
+ /*  1350 */   120,  120,   86,  120,   88,   89,   50,   91,  120,   53,
+ /*  1360 */    54,   55,   56,   57,   98,   99,   60,   61,  102,  103,
+ /*  1370 */   120,  105,   15,  120,   17,   18,  120,  120,   21,  120,
+ /*  1380 */    23,   75,  120,  120,  120,   28,  120,  120,   31,   32,
+ /*  1390 */    33,  120,  120,   36,  120,  120,  120,  120,  120,   82,
+ /*  1400 */   120,  120,  120,   86,  120,   88,   89,   50,   91,  120,
+ /*  1410 */    53,   54,   55,   56,   57,   98,   99,   60,   61,  102,
+ /*  1420 */   103,  120,  105,   15,  120,   17,   18,  120,  120,   21,
+ /*  1430 */   120,   23,   75,  120,  120,  120,   28,  120,  120,   31,
+ /*  1440 */    32,   33,  120,  120,   36,  120,  120,  120,  120,  120,
+ /*  1450 */    82,  120,  120,  120,   86,  120,   88,   89,   50,   91,
+ /*  1460 */   120,   53,   54,   55,   56,   57,   98,   99,   60,   61,
+ /*  1470 */   102,  103,  120,  105,   15,  120,   17,   18,  120,  120,
+ /*  1480 */    21,  120,   23,   75,  120,  120,  120,   28,  120,  120,
+ /*  1490 */    31,   32,   33,  120,  120,   36,  120,  120,  120,  120,
+ /*  1500 */   120,   82,  120,  120,  120,   86,  120,   88,   89,   50,
+ /*  1510 */    91,  120,   53,   54,   55,   56,   57,   98,   99,   60,
+ /*  1520 */    61,  102,  103,  120,  105,   15,  120,   17,   18,  120,
+ /*  1530 */   120,   21,  120,   23,   75,  120,  120,  120,   28,  120,
+ /*  1540 */   120,   31,   32,   33,  120,  120,   36,  120,  120,  120,
+ /*  1550 */   120,  120,   82,  120,  120,  120,   86,  120,   88,   89,
+ /*  1560 */    50,   91,  120,   53,   54,   55,   56,   57,   98,   99,
+ /*  1570 */    60,   61,  102,  103,  120,  105,   15,  120,   17,   18,
+ /*  1580 */   120,  120,   21,  120,   23,   75,  120,  120,  120,   28,
+ /*  1590 */   120,  120,   31,   32,   33,  120,  120,   36,  120,  120,
+ /*  1600 */   120,  120,  120,   82,  120,  120,  120,   86,  120,   88,
+ /*  1610 */    89,   50,   91,  120,   53,   54,   55,   56,   57,   98,
+ /*  1620 */    99,   60,   61,  102,  103,  120,  105,   15,  120,   17,
+ /*  1630 */    18,  120,  120,   21,  120,   23,   75,  120,  120,  120,
+ /*  1640 */    28,  120,  120,   31,   32,   33,  120,  120,   36,  120,
+ /*  1650 */   120,  120,  120,  120,   82,  120,  120,  120,   86,  120,
+ /*  1660 */    88,   89,   50,   91,  120,   53,   54,   55,   56,   57,
+ /*  1670 */    98,   99,   60,   61,  102,  103,  120,  105,   15,  120,
+ /*  1680 */    17,   18,  120,  120,   21,  120,   23,   75,  120,  120,
+ /*  1690 */   120,   28,  120,  120,   31,   32,   33,  120,  120,   36,
+ /*  1700 */   120,  120,  120,  120,  120,   82,  120,  120,  120,   86,
+ /*  1710 */   120,   88,   89,   50,   91,  120,   53,   54,   55,   56,
+ /*  1720 */    57,   98,   99,   60,  120,  102,  103,  120,  105,   15,
+ /*  1730 */   120,   17,   18,  120,  120,   21,  120,   23,   75,  120,
+ /*  1740 */   120,  120,   28,  120,  120,   31,   32,   33,   16,  120,
+ /*  1750 */    36,  120,  120,  120,   22,  120,   24,  120,   26,   27,
+ /*  1760 */   120,   29,   87,  120,   50,   90,   34,   53,   54,   55,
+ /*  1770 */    56,   57,   97,  120,   60,  100,  101,  120,  120,  120,
+ /*  1780 */   120,   49,   50,   51,  120,  120,  120,  120,  113,   75,
+ /*  1790 */    58,  120,  120,   87,   62,   82,   90,  120,  120,   86,
+ /*  1800 */   120,   88,   89,   97,   91,  120,  100,  101,   76,  120,
+ /*  1810 */   120,   98,   99,  120,  120,  102,  103,  120,  105,  113,
+ /*  1820 */    82,  120,  120,  120,   86,  120,   88,   89,  120,   91,
+ /*  1830 */   120,  120,  120,  120,  120,  120,   98,   99,  120,  120,
+ /*  1840 */   102,  103,   82,  105,  120,  120,   86,  120,   88,   89,
+ /*  1850 */   120,   91,  120,  120,  120,  120,  120,  120,   98,   99,
+ /*  1860 */   120,  120,  102,  103,   82,  105,  120,  120,   86,  120,
+ /*  1870 */    88,   89,  120,   91,  120,  120,  120,  120,  120,  120,
+ /*  1880 */    98,   99,   82,  120,  102,  103,   86,  105,   88,   89,
+ /*  1890 */   120,   91,  120,  120,  120,  120,  120,  120,   98,   99,
+ /*  1900 */   120,  120,  102,  103,  120,  105,  120,   82,  120,  120,
+ /*  1910 */   120,   86,  120,   88,   89,  120,   91,  120,  120,  120,
+ /*  1920 */   120,  120,  120,   98,   99,  120,  120,  102,  103,  120,
+ /*  1930 */   105,  120,  120,  120,   10,  120,  120,  120,  120,   15,
+ /*  1940 */   120,  120,   82,  120,  120,   21,   86,   23,   88,   89,
+ /*  1950 */   120,   91,   28,  120,  120,   31,   32,  120,   98,   99,
+ /*  1960 */   120,  120,  102,  103,   82,  105,  120,  120,   86,  120,
+ /*  1970 */    88,   89,  120,   91,  120,  120,  120,  120,  120,  120,
+ /*  1980 */    98,   99,  120,  120,  102,  103,   82,  105,  120,  120,
+ /*  1990 */    86,  120,   88,   89,  120,   91,  120,  120,  120,   75,
+ /*  2000 */    76,   77,   98,   99,  120,  120,  102,  103,  120,  105,
+ /*  2010 */    82,  120,  120,  120,   86,  120,   88,   89,  120,   91,
+ /*  2020 */   120,  120,  120,  120,  120,  120,   98,   99,   82,  120,
+ /*  2030 */   102,  103,   86,  105,   88,   89,  120,   91,  120,  120,
+ /*  2040 */   120,  120,  120,  120,   98,   99,   82,  120,  102,  103,
+ /*  2050 */    86,  105,   88,   89,  120,   91,  120,  120,  120,  120,
+ /*  2060 */   120,  120,   98,   99,   82,  120,  102,  103,   86,  105,
+ /*  2070 */    88,   89,  120,   91,  120,  120,  120,  120,  120,  120,
+ /*  2080 */    98,   99,   82,  120,  102,  103,   86,  105,   88,   89,
+ /*  2090 */   120,   91,  120,  120,  120,  120,  120,  120,   98,   99,
+ /*  2100 */    82,  120,  102,  103,   86,  105,   88,   89,  120,   91,
+ /*  2110 */   120,  120,  120,  120,  120,  120,   98,   99,   82,  120,
+ /*  2120 */   102,  103,   86,  105,   88,   89,  120,   91,  120,  120,
+ /*  2130 */   120,   10,  120,  120,   98,   99,   15,  120,  102,  103,
+ /*  2140 */   120,  105,   21,  120,   23,  120,  120,  120,  120,   28,
+ /*  2150 */    82,  120,   31,   32,   86,  120,   88,   89,  120,   91,
+ /*  2160 */   120,  120,  120,  120,  120,  120,   98,   99,   82,  120,
+ /*  2170 */   102,  103,   86,  105,   88,   89,  120,   91,  120,  120,
+ /*  2180 */   120,  120,  120,  120,   98,   99,   82,  120,  102,  103,
+ /*  2190 */    86,  105,   88,   89,  120,   91,   75,   76,   77,  120,
+ /*  2200 */   120,  120,   98,   99,   82,  120,  102,  103,   86,  105,
+ /*  2210 */    88,   89,  120,   91,  120,  120,  120,  120,  120,  120,
+ /*  2220 */    98,   99,   82,  120,  102,  103,   86,  105,   88,   89,
+ /*  2230 */   120,   91,  120,  120,  120,  120,  120,  120,   98,   99,
+ /*  2240 */    82,  120,  102,  103,   86,  105,   88,   89,  120,   91,
+ /*  2250 */   120,  120,  120,  120,  120,  120,   98,   99,   82,  120,
+ /*  2260 */   102,  103,   86,  105,   88,  120,  120,   91,   82,  120,
+ /*  2270 */   120,  120,   86,  120,   88,   99,   82,   91,  102,  103,
+ /*  2280 */    86,  105,   88,  120,  120,   91,   82,  120,  102,  103,
+ /*  2290 */    86,  105,   88,  120,   82,   91,  102,  103,   86,  105,
+ /*  2300 */    88,  120,  120,   91,   82,  120,  102,  103,   86,  105,
+ /*  2310 */    88,  120,   82,   91,  102,  103,   86,  105,   88,    1,
+ /*  2320 */   120,   91,   82,  120,  102,  103,   86,  105,   88,  120,
+ /*  2330 */   120,   91,  102,  103,   16,  105,  120,  120,   20,  120,
+ /*  2340 */    22,  120,  102,  103,   87,  105,   87,   90,  120,   90,
+ /*  2350 */   120,  120,   87,  120,   97,   90,   97,  100,  101,  100,
+ /*  2360 */   101,  120,   97,  120,  120,  100,  101,  120,   50,  120,
+ /*  2370 */   113,  120,  113,  120,   87,  120,   58,   90,  113,  120,
+ /*  2380 */   120,  120,  120,  120,   97,  120,  120,  100,  101,  120,
+ /*  2390 */   120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+ /*  2400 */   113,
 );
     const YY_SHIFT_USE_DFLT = -32;
-    const YY_SHIFT_MAX = 227;
+    const YY_SHIFT_MAX = 233;
     static public $yy_shift_ofst = array(
- /*     0 */     1, 1371, 1321, 1171, 1171, 1171, 1171, 1421, 1371, 1421,
- /*    10 */  1521, 1321, 1471, 1121, 1171, 1171, 1171, 1171, 1171, 1171,
- /*    20 */  1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
- /*    30 */  1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1271,
- /*    40 */  1271, 1221, 1571, 1621, 1571, 1571, 1571, 1571, 1571,  145,
- /*    50 */    72,   -1,  625,  625,  698,  552,  818,  891,  938,  432,
- /*    60 */   265,  218,  312,  505,  359,  745, 1011, 1058, 1058, 1058,
- /*    70 */  1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058,
- /*    80 */  1058, 1058, 1058,  146,  296,    1, 1013,  506,  187,  219,
- /*    90 */   323,  296,  200,  296,  893,   43,  111,  181,  394,  215,
- /*   100 */    34,  183,  251,  325,   86,  325,  470,  372,  325,  325,
- /*   110 */   374,  325,  325,  325,   86,  325,  372,  566,  325,  661,
- /*   120 */   430,  657,  430,  430,  659,  657,  135,  495,  159,  210,
- /*   130 */   110,  141,  254,   27,   27,   27,   10,  301,  299,  303,
- /*   140 */   348,  346,  347,  349,  588,  540,  471,  396,  469,  541,
- /*   150 */    27,  587,  542,   27,  467,  392,  657,  674,  657,  674,
- /*   160 */   673,  657,  686,  701,  686,  608,  661,  -32,  -32,  -32,
- /*   170 */   -32,  -32,   36,  435,  260,  358,  395,  -29,   44,  361,
- /*   180 */   -31,  174,  463,  199,  398,  169,  398,  178,  354,  115,
- /*   190 */   262,  313,  369,  222,  272,   57,  246,  640,  578,  613,
- /*   200 */   612,  596,  656,  576,  326,  585,  629,  608,  634,  632,
- /*   210 */   623,  607,  626,  590,  549,  509,  537,  462,  402,  375,
- /*   220 */   416,  564,  565,  543,  589,  575,  535,  510,
+ /*     0 */     1, 1306, 1204, 1204, 1204, 1204, 1612, 1306, 1153, 1204,
+ /*    10 */  1204, 1204, 1204, 1204, 1561, 1204, 1408, 1204, 1204, 1204,
+ /*    20 */  1204, 1204, 1510, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+ /*    30 */  1204, 1204, 1204, 1357, 1459, 1204, 1204, 1510, 1408, 1204,
+ /*    40 */  1204, 1204, 1255, 1255, 1663, 1663, 1663, 1663, 1714, 1663,
+ /*    50 */  1663,  221,  147,   -1,   73,  295,  295,  295,  369,  491,
+ /*    60 */   443,  613,  565,  905,  809,  857,  761,  953, 1001,  687,
+ /*    70 */  1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049,
+ /*    80 */  1049, 1049, 1049, 1049, 1049, 1049, 1089, 1089, 2318,   59,
+ /*    90 */   281,    1, 1924,  368,  294,  219,  335,  159,  380,  159,
+ /*   100 */   281,  281,  281, 2121,   44,  143,  181,   -2,  183,  145,
+ /*   110 */   329,  261,  408,  482,  408,  576,  440,  408,  408,  438,
+ /*   120 */   457,  408,  408,  408,  581,  507,  408,  408,  438,  507,
+ /*   130 */   648,  648,  377,  647,  656,  217,  190,  157,  479,  483,
+ /*   140 */   527,  480,  148,  525,  528,  405,  381,   39,  402,  455,
+ /*   150 */   441,  451,  403,  107,  502,  148,  148,  148,  567,  148,
+ /*   160 */   556,  564,  529,  575,  573,  304,  648,  670,  724,  544,
+ /*   170 */   677,  677,  648,  717,  670,  648,  656,  -32,  -32,  -32,
+ /*   180 */   -32, 1732,   72,  110, 1175,  116,  -31,  307,  257,   48,
+ /*   190 */   530,   41,   53,  220,   90,  223,  306,  200,   71,  220,
+ /*   200 */    33,  623,  571,  305,  588,  591,  626,  640,  544,  598,
+ /*   210 */   414,  628,  436,  568,  601,  526,  570,  535,  452,  404,
+ /*   220 */   625,  592,  559,  572,   89,   28,    8,  237,  309,  179,
+ /*   230 */   326,  290,  204,  225,
 );
-    const YY_REDUCE_USE_DFLT = -93;
-    const YY_REDUCE_MAX = 171;
+    const YY_REDUCE_USE_DFLT = -81;
+    const YY_REDUCE_MAX = 180;
     static public $yy_reduce_ofst = array(
- /*     0 */    42, 1081,  427, 1624, 1667, 1653, 1581,   -7, 1131,  547,
- /*    10 */    67,  139,  353,  624,  739,  744, 1728, 1759, 1739, 1801,
- /*    20 */  1821, 1281,  814, 1381, 1481,  619, 1431, 1531, 1619, 1331,
- /*    30 */   934, 1181, 1231, 1696, 1701, 1832, 1856, 1767, 1787, 1890,
- /*    40 */  1910, 1864, 1930, 1919, 1939, 1950, 1899, 1981, 1976,  434,
- /*    50 */   149,    0,  149,  360,  -75,  -75,  -75,  -75,  -75,  -75,
- /*    60 */   -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
- /*    70 */   -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
- /*    80 */   -75,  -75,  -75,  554, 1048,   -5,   14,  812,  235,  185,
- /*    90 */   932,   63,  -83, 1047,  401,  381,  379,  504,  985,  793,
- /*   100 */   256,  379,  793,  857,  449,  728,  256,  663,  207,  664,
- /*   110 */   622,  536,  344,  546,  404,  977,  857,  857,  856,  445,
- /*   120 */   913,  256,  480,  479,  351,  -92,  571,  571,  571,  571,
- /*   130 */   570,  571,  571,  567,  567,  567,  577,  574,  574,  574,
- /*   140 */   574,  574,  574,  574,  574,  574,  574,  574,  574,  574,
- /*   150 */   567,  574,  574,  567,  574,  574,  568,  569,  568,  569,
- /*   160 */   620,  568,  630,  615,  635,  611,  593,  602,  512,   79,
- /*   170 */    -2,  114,
+ /*     0 */    22, 1164,  289,   68,  142,  216,   -6, 1215, 2104, 1470,
+ /*    10 */  1266,  607, 1904, 1738, 1368, 1782, 1760, 1713, 1800, 1825,
+ /*    20 */  1882, 1860, 1623, 1572,  681,  485,  363, 1317, 1521, 1946,
+ /*    30 */  1419, 1928, 2122, 2158, 2140, 1982, 2000, 2018, 2036, 1964,
+ /*    40 */  2086, 2068, 2176, 1091, 2230, 2186, 2204, 2240, 2212, 2194,
+ /*    50 */  2222, 1675, 2259, 2287, 1706, 2265, 1706, 2257,  137,  137,
+ /*    60 */   137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
+ /*    70 */   137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
+ /*    80 */   137,  137,  137,  137,  137,  137,  137,  137,  184,   38,
+ /*    90 */   139,  -80,  -65,  214,  285,  239,  359,  361,  260,  292,
+ /*   100 */   407,  333,  406,  543,  391,  415,  612,  578,  415,  319,
+ /*   110 */   578,  577,  605,  606,  599,  488,  319,  205,  445,  466,
+ /*   120 */   596,  532,   47,  679,  599,  641,  680,  608,  511,  599,
+ /*   130 */   459,  319,  287,  -69,   86,  579,  562,  562,  569,  569,
+ /*   140 */   569,  569,  560,  569,  569,  569,  569,  569,  569,  569,
+ /*   150 */   569,  569,  569,  569,  569,  560,  560,  560,  557,  560,
+ /*   160 */   569,  569,  569,  569,  569,  569,  561,  600,  635,  586,
+ /*   170 */   627,  603,  561,  604,  600,  561,  610,  262,  140,  109,
+ /*   180 */   101,
 );
     static public $yyExpectedTokens = array(
-        /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 23, 28, 31, ),
-        /* 1 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 2 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 3 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 4 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 5 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 6 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 7 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 8 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 9 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 10 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 11 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 12 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 13 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 61, 74, ),
-        /* 14 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 15 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 16 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 17 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 18 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 19 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 20 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 21 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 22 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 23 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 24 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 25 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 26 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 27 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 28 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 29 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 30 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 31 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 32 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 33 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 34 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 35 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 36 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 37 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 38 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 39 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 40 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 41 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 60, 74, ),
-        /* 42 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 43 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 44 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 45 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 46 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 47 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 48 */ array(15, 17, 18, 21, 23, 28, 31, 32, 35, 49, 52, 53, 54, 55, 56, 59, 74, ),
-        /* 49 */ array(1, 22, 27, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 50 */ array(1, 16, 22, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 51 */ array(1, 16, 22, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 52 */ array(1, 22, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 53 */ array(1, 22, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 54 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 55 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, ),
-        /* 56 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 57 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 58 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 59 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 60 */ array(1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 61 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 62 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 63 */ array(1, 24, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 64 */ array(1, 2, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 65 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 66 */ array(1, 16, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 67 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 68 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 69 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 70 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 71 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 72 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 73 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 74 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 75 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 76 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 77 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 78 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 79 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 80 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 81 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 82 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ),
-        /* 83 */ array(1, 16, 20, 22, 49, 57, ),
-        /* 84 */ array(1, 22, ),
-        /* 85 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 23, 28, 31, ),
-        /* 86 */ array(10, 15, 21, 23, 28, 31, 74, 75, 76, ),
-        /* 87 */ array(1, 16, 20, 22, ),
-        /* 88 */ array(17, 18, 59, ),
-        /* 89 */ array(20, 55, 60, ),
-        /* 90 */ array(1, 16, 22, ),
-        /* 91 */ array(1, 22, ),
-        /* 92 */ array(2, 22, ),
-        /* 93 */ array(1, 22, ),
-        /* 94 */ array(10, 15, 21, 23, 28, 31, 74, 75, 76, ),
-        /* 95 */ array(4, 5, 6, 7, 8, 12, 13, 14, ),
-        /* 96 */ array(15, 18, 19, 58, ),
-        /* 97 */ array(15, 18, 19, 25, ),
-        /* 98 */ array(16, 22, 48, ),
-        /* 99 */ array(16, 22, 25, ),
-        /* 100 */ array(19, 20, 57, ),
-        /* 101 */ array(15, 18, 58, ),
-        /* 102 */ array(16, 22, 25, ),
-        /* 103 */ array(15, 18, ),
-        /* 104 */ array(17, 18, ),
-        /* 105 */ array(15, 18, ),
-        /* 106 */ array(20, 57, ),
-        /* 107 */ array(15, 18, ),
-        /* 108 */ array(15, 18, ),
-        /* 109 */ array(15, 18, ),
-        /* 110 */ array(15, 18, ),
-        /* 111 */ array(15, 18, ),
+        /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 23, 28, 31, 32, ),
+        /* 1 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 2 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 3 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 4 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 5 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 6 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 7 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 8 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 62, 75, ),
+        /* 9 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 10 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 11 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 12 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 13 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 14 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 15 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 16 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 17 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 18 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 19 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 20 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 21 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 22 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 23 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 24 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 25 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 26 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 27 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 28 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 29 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 30 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 31 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 32 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 33 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 34 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 35 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 36 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 37 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 38 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 39 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 40 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 41 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 42 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 43 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 61, 75, ),
+        /* 44 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 45 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 46 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 47 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 48 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 49 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 50 */ array(15, 17, 18, 21, 23, 28, 31, 32, 33, 36, 50, 53, 54, 55, 56, 57, 60, 75, ),
+        /* 51 */ array(1, 22, 27, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 52 */ array(1, 16, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 53 */ array(1, 16, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 54 */ array(1, 16, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 55 */ array(1, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 56 */ array(1, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 57 */ array(1, 22, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 58 */ array(1, 16, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 59 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 60 */ array(1, 16, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 61 */ array(1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 62 */ array(1, 16, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 63 */ array(1, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 64 */ array(1, 2, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 65 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 66 */ array(1, 16, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 67 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 68 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76, ),
+        /* 69 */ array(1, 24, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 70 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 71 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 72 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 73 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 74 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 75 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 76 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 77 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 78 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 79 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 80 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 81 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 82 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 83 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 84 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 85 */ array(1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 86 */ array(35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 87 */ array(35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, ),
+        /* 88 */ array(1, 16, 20, 22, 50, 58, ),
+        /* 89 */ array(1, 16, 20, 22, ),
+        /* 90 */ array(1, 22, ),
+        /* 91 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 21, 23, 28, 31, 32, ),
+        /* 92 */ array(10, 15, 21, 23, 28, 31, 32, 75, 76, 77, ),
+        /* 93 */ array(15, 18, 22, 30, ),
+        /* 94 */ array(15, 18, 22, 30, ),
+        /* 95 */ array(20, 56, 61, ),
+        /* 96 */ array(17, 18, 60, ),
+        /* 97 */ array(15, 18, 22, ),
+        /* 98 */ array(1, 16, 22, ),
+        /* 99 */ array(15, 18, 22, ),
+        /* 100 */ array(1, 22, ),
+        /* 101 */ array(1, 22, ),
+        /* 102 */ array(1, 22, ),
+        /* 103 */ array(10, 15, 21, 23, 28, 31, 32, 75, 76, 77, ),
+        /* 104 */ array(4, 5, 6, 7, 8, 12, 13, 14, ),
+        /* 105 */ array(15, 18, 19, 59, ),
+        /* 106 */ array(15, 18, 19, 25, ),
+        /* 107 */ array(16, 22, 25, ),
+        /* 108 */ array(15, 18, 59, ),
+        /* 109 */ array(19, 20, 58, ),
+        /* 110 */ array(16, 22, 25, ),
+        /* 111 */ array(16, 22, 49, ),
         /* 112 */ array(15, 18, ),
         /* 113 */ array(15, 18, ),
-        /* 114 */ array(17, 18, ),
-        /* 115 */ array(15, 18, ),
-        /* 116 */ array(15, 18, ),
+        /* 114 */ array(15, 18, ),
+        /* 115 */ array(16, 22, ),
+        /* 116 */ array(20, 58, ),
         /* 117 */ array(15, 18, ),
         /* 118 */ array(15, 18, ),
-        /* 119 */ array(17, ),
-        /* 120 */ array(22, ),
-        /* 121 */ array(20, ),
-        /* 122 */ array(22, ),
-        /* 123 */ array(22, ),
-        /* 124 */ array(22, ),
-        /* 125 */ array(20, ),
-        /* 126 */ array(15, 16, 18, 30, ),
-        /* 127 */ array(15, 16, 18, 30, ),
-        /* 128 */ array(15, 16, 18, ),
-        /* 129 */ array(15, 18, 58, ),
-        /* 130 */ array(15, 17, 18, ),
-        /* 131 */ array(15, 18, 19, ),
-        /* 132 */ array(15, 16, 18, ),
-        /* 133 */ array(55, 60, ),
-        /* 134 */ array(55, 60, ),
-        /* 135 */ array(55, 60, ),
-        /* 136 */ array(15, 49, ),
-        /* 137 */ array(16, 22, ),
+        /* 119 */ array(17, 18, ),
+        /* 120 */ array(15, 18, ),
+        /* 121 */ array(15, 18, ),
+        /* 122 */ array(15, 18, ),
+        /* 123 */ array(15, 18, ),
+        /* 124 */ array(15, 18, ),
+        /* 125 */ array(15, 18, ),
+        /* 126 */ array(15, 18, ),
+        /* 127 */ array(15, 18, ),
+        /* 128 */ array(17, 18, ),
+        /* 129 */ array(15, 18, ),
+        /* 130 */ array(20, ),
+        /* 131 */ array(20, ),
+        /* 132 */ array(22, ),
+        /* 133 */ array(22, ),
+        /* 134 */ array(17, ),
+        /* 135 */ array(15, 17, 18, ),
+        /* 136 */ array(15, 18, 59, ),
+        /* 137 */ array(15, 18, 19, ),
         /* 138 */ array(16, 22, ),
         /* 139 */ array(16, 22, ),
         /* 140 */ array(16, 22, ),
         /* 141 */ array(16, 22, ),
-        /* 142 */ array(16, 22, ),
+        /* 142 */ array(56, 61, ),
         /* 143 */ array(16, 22, ),
         /* 144 */ array(16, 22, ),
         /* 145 */ array(16, 22, ),
@@ -839,90 +908,90 @@ static public $yy_action = array(
         /* 147 */ array(16, 22, ),
         /* 148 */ array(16, 22, ),
         /* 149 */ array(16, 22, ),
-        /* 150 */ array(55, 60, ),
+        /* 150 */ array(16, 22, ),
         /* 151 */ array(16, 22, ),
         /* 152 */ array(16, 22, ),
-        /* 153 */ array(55, 60, ),
+        /* 153 */ array(16, 22, ),
         /* 154 */ array(16, 22, ),
-        /* 155 */ array(16, 22, ),
-        /* 156 */ array(20, ),
-        /* 157 */ array(2, ),
-        /* 158 */ array(20, ),
-        /* 159 */ array(2, ),
-        /* 160 */ array(13, ),
-        /* 161 */ array(20, ),
-        /* 162 */ array(22, ),
-        /* 163 */ array(1, ),
-        /* 164 */ array(22, ),
-        /* 165 */ array(49, ),
-        /* 166 */ array(17, ),
-        /* 167 */ array(),
-        /* 168 */ array(),
-        /* 169 */ array(),
-        /* 170 */ array(),
-        /* 171 */ array(),
-        /* 172 */ array(16, 22, 49, 57, ),
-        /* 173 */ array(19, 29, 49, 57, ),
-        /* 174 */ array(15, 17, 18, 32, ),
-        /* 175 */ array(49, 55, 57, 61, ),
-        /* 176 */ array(16, 22, 48, ),
-        /* 177 */ array(30, 49, 57, ),
-        /* 178 */ array(16, 48, ),
-        /* 179 */ array(30, 48, ),
-        /* 180 */ array(33, 61, ),
-        /* 181 */ array(2, 19, ),
-        /* 182 */ array(18, 58, ),
-        /* 183 */ array(24, 33, ),
-        /* 184 */ array(49, 57, ),
-        /* 185 */ array(25, 75, ),
-        /* 186 */ array(49, 57, ),
-        /* 187 */ array(19, 55, ),
-        /* 188 */ array(18, 32, ),
-        /* 189 */ array(18, ),
-        /* 190 */ array(32, ),
-        /* 191 */ array(29, ),
-        /* 192 */ array(19, ),
-        /* 193 */ array(49, ),
-        /* 194 */ array(48, ),
-        /* 195 */ array(22, ),
-        /* 196 */ array(2, ),
-        /* 197 */ array(18, ),
-        /* 198 */ array(55, ),
-        /* 199 */ array(17, ),
-        /* 200 */ array(17, ),
-        /* 201 */ array(16, ),
-        /* 202 */ array(17, ),
-        /* 203 */ array(29, ),
-        /* 204 */ array(18, ),
-        /* 205 */ array(51, ),
+        /* 155 */ array(56, 61, ),
+        /* 156 */ array(56, 61, ),
+        /* 157 */ array(56, 61, ),
+        /* 158 */ array(15, 50, ),
+        /* 159 */ array(56, 61, ),
+        /* 160 */ array(16, 22, ),
+        /* 161 */ array(16, 22, ),
+        /* 162 */ array(16, 22, ),
+        /* 163 */ array(16, 22, ),
+        /* 164 */ array(16, 22, ),
+        /* 165 */ array(16, 22, ),
+        /* 166 */ array(20, ),
+        /* 167 */ array(2, ),
+        /* 168 */ array(13, ),
+        /* 169 */ array(50, ),
+        /* 170 */ array(22, ),
+        /* 171 */ array(22, ),
+        /* 172 */ array(20, ),
+        /* 173 */ array(1, ),
+        /* 174 */ array(2, ),
+        /* 175 */ array(20, ),
+        /* 176 */ array(17, ),
+        /* 177 */ array(),
+        /* 178 */ array(),
+        /* 179 */ array(),
+        /* 180 */ array(),
+        /* 181 */ array(16, 22, 24, 26, 27, 29, 34, 49, 50, 51, 58, 62, 76, ),
+        /* 182 */ array(16, 19, 22, 50, 58, ),
+        /* 183 */ array(16, 22, 50, 58, ),
+        /* 184 */ array(16, 22, 29, 49, ),
+        /* 185 */ array(15, 17, 18, 33, ),
+        /* 186 */ array(50, 56, 58, 62, ),
+        /* 187 */ array(16, 22, 49, ),
+        /* 188 */ array(16, 22, 49, ),
+        /* 189 */ array(30, 50, 58, ),
+        /* 190 */ array(16, 49, ),
+        /* 191 */ array(18, 59, ),
+        /* 192 */ array(24, 34, ),
+        /* 193 */ array(50, 58, ),
+        /* 194 */ array(34, 62, ),
+        /* 195 */ array(30, 49, ),
+        /* 196 */ array(2, 19, ),
+        /* 197 */ array(25, 76, ),
+        /* 198 */ array(19, 56, ),
+        /* 199 */ array(50, 58, ),
+        /* 200 */ array(51, ),
+        /* 201 */ array(22, ),
+        /* 202 */ array(49, ),
+        /* 203 */ array(50, ),
+        /* 204 */ array(33, ),
+        /* 205 */ array(33, ),
         /* 206 */ array(17, ),
-        /* 207 */ array(49, ),
-        /* 208 */ array(22, ),
-        /* 209 */ array(17, ),
-        /* 210 */ array(25, ),
-        /* 211 */ array(32, ),
-        /* 212 */ array(16, ),
-        /* 213 */ array(16, ),
-        /* 214 */ array(59, ),
-        /* 215 */ array(50, ),
-        /* 216 */ array(18, ),
-        /* 217 */ array(18, ),
+        /* 207 */ array(2, ),
+        /* 208 */ array(50, ),
+        /* 209 */ array(18, ),
+        /* 210 */ array(17, ),
+        /* 211 */ array(18, ),
+        /* 212 */ array(17, ),
+        /* 213 */ array(25, ),
+        /* 214 */ array(17, ),
+        /* 215 */ array(22, ),
+        /* 216 */ array(56, ),
+        /* 217 */ array(17, ),
         /* 218 */ array(18, ),
-        /* 219 */ array(61, ),
-        /* 220 */ array(19, ),
-        /* 221 */ array(18, ),
-        /* 222 */ array(18, ),
-        /* 223 */ array(59, ),
+        /* 219 */ array(18, ),
+        /* 220 */ array(16, ),
+        /* 221 */ array(52, ),
+        /* 222 */ array(60, ),
+        /* 223 */ array(51, ),
         /* 224 */ array(18, ),
-        /* 225 */ array(26, ),
-        /* 226 */ array(50, ),
-        /* 227 */ array(50, ),
-        /* 228 */ array(),
-        /* 229 */ array(),
-        /* 230 */ array(),
-        /* 231 */ array(),
-        /* 232 */ array(),
-        /* 233 */ array(),
+        /* 225 */ array(2, ),
+        /* 226 */ array(18, ),
+        /* 227 */ array(62, ),
+        /* 228 */ array(18, ),
+        /* 229 */ array(18, ),
+        /* 230 */ array(18, ),
+        /* 231 */ array(60, ),
+        /* 232 */ array(51, ),
+        /* 233 */ array(26, ),
         /* 234 */ array(),
         /* 235 */ array(),
         /* 236 */ array(),
@@ -1058,51 +1127,58 @@ static public $yy_action = array(
         /* 366 */ array(),
         /* 367 */ array(),
         /* 368 */ array(),
+        /* 369 */ array(),
+        /* 370 */ array(),
+        /* 371 */ array(),
+        /* 372 */ array(),
+        /* 373 */ array(),
+        /* 374 */ array(),
 );
     static public $yy_default = array(
- /*     0 */   372,  545,  562,  516,  516,  516,  516,  562,  562,  562,
- /*    10 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  562,
- /*    20 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  562,
- /*    30 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  562,
- /*    40 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  430,
- /*    50 */   562,  562,  430,  430,  562,  562,  562,  562,  562,  562,
- /*    60 */   515,  562,  562,  562,  562,  562,  562,  546,  451,  447,
- /*    70 */   450,  452,  436,  547,  548,  456,  455,  432,  459,  439,
- /*    80 */   463,  415,  460,  474,  430,  369,  562,  562,  562,  528,
- /*    90 */   446,  430,  430,  430,  562,  562,  489,  562,  440,  464,
- /*   100 */   482,  489,  464,  562,  562,  562,  482,  562,  489,  562,
- /*   110 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  562,
- /*   120 */   430,  482,  430,  430,  430,  525,  562,  562,  562,  490,
- /*   130 */   562,  562,  562,  508,  506,  509,  489,  562,  562,  562,
- /*   140 */   562,  562,  562,  562,  562,  562,  562,  562,  562,  562,
- /*   150 */   507,  562,  562,  487,  562,  562,  529,  518,  503,  517,
- /*   160 */   387,  526,  561,  446,  561,  489,  562,  522,  522,  522,
- /*   170 */   489,  489,  474,  435,  562,  474,  440,  474,  440,  440,
- /*   180 */   562,  501,  562,  562,  474,  464,  461,  470,  562,  562,
- /*   190 */   562,  562,  435,  527,  440,  562,  501,  562,  470,  562,
- /*   200 */   562,  562,  562,  562,  562,  476,  562,  501,  562,  562,
- /*   210 */   464,  472,  562,  562,  562,  562,  562,  562,  562,  562,
- /*   220 */   562,  562,  562,  562,  562,  437,  562,  562,  555,  370,
- /*   230 */   553,  434,  438,  418,  417,  560,  442,  552,  559,  413,
- /*   240 */   558,  543,  498,  496,  476,  494,  511,  495,  497,  513,
- /*   250 */   485,  486,  514,  462,  512,  422,  423,  443,  416,  544,
- /*   260 */   510,  523,  524,  427,  502,  542,  445,  425,  424,  426,
- /*   270 */   429,  521,  501,  500,  414,  419,  420,  421,  468,  465,
- /*   280 */   483,  441,  488,  491,  499,  479,  473,  466,  467,  469,
- /*   290 */   471,  412,  428,  379,  378,  380,  381,  382,  377,  376,
- /*   300 */   371,  373,  374,  375,  383,  384,  393,  392,  394,  395,
- /*   310 */   396,  391,  390,  385,  386,  388,  389,  492,  493,  557,
- /*   320 */   399,  400,  401,  402,  398,  556,  481,  484,  505,  397,
- /*   330 */   403,  404,  410,  411,  549,  550,  551,  409,  408,  405,
- /*   340 */   406,  504,  407,  541,  540,  478,  477,  480,  453,  454,
- /*   350 */   449,  448,  444,  475,  519,  520,  457,  458,  536,  537,
- /*   360 */   538,  539,  535,  534,  530,  531,  532,  533,  554,
+ /*     0 */   378,  554,  525,  525,  525,  525,  571,  571,  571,  571,
+ /*    10 */   571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
+ /*    20 */   571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
+ /*    30 */   571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
+ /*    40 */   571,  571,  571,  571,  571,  571,  571,  571,  571,  571,
+ /*    50 */   571,  436,  571,  571,  571,  436,  436,  436,  571,  571,
+ /*    60 */   571,  524,  571,  441,  571,  571,  571,  571,  571,  571,
+ /*    70 */   464,  467,  458,  557,  556,  420,  463,  555,  446,  441,
+ /*    80 */   468,  460,  455,  438,  443,  459,  471,  472,  483,  571,
+ /*    90 */   436,  375,  571,  436,  436,  537,  571,  436,  454,  436,
+ /*   100 */   436,  436,  436,  571,  571,  498,  571,  473,  498,  491,
+ /*   110 */   473,  447,  571,  571,  571,  571,  491,  571,  571,  571,
+ /*   120 */   571,  571,  498,  571,  571,  571,  571,  571,  571,  571,
+ /*   130 */   534,  491,  436,  436,  571,  571,  499,  571,  571,  571,
+ /*   140 */   571,  571,  516,  571,  571,  571,  571,  571,  571,  571,
+ /*   150 */   571,  571,  571,  571,  571,  518,  496,  515,  498,  517,
+ /*   160 */   571,  571,  571,  571,  571,  571,  512,  527,  393,  498,
+ /*   170 */   570,  570,  535,  454,  526,  538,  571,  531,  498,  531,
+ /*   180 */   498,  449,  483,  483,  447,  571,  483,  447,  447,  483,
+ /*   190 */   447,  571,  571,  483,  571,  447,  510,  473,  479,  469,
+ /*   200 */   571,  571,  447,  536,  481,  571,  571,  510,  510,  571,
+ /*   210 */   571,  571,  571,  473,  571,  571,  479,  571,  571,  571,
+ /*   220 */   571,  485,  571,  571,  571,  510,  571,  571,  571,  571,
+ /*   230 */   571,  571,  571,  444,  495,  552,  421,  451,  551,  376,
+ /*   240 */   422,  507,  569,  504,  553,  445,  506,  485,  423,  450,
+ /*   250 */   533,  532,  522,  433,  511,  417,  418,  523,  427,  505,
+ /*   260 */   520,  503,  470,  519,  521,  561,  428,  494,  550,  430,
+ /*   270 */   429,  431,  432,  530,  510,  509,  419,  435,  424,  425,
+ /*   280 */   426,  477,  474,  449,  448,  492,  497,  500,  488,  482,
+ /*   290 */   475,  476,  478,  480,  416,  415,  386,  385,  387,  388,
+ /*   300 */   389,  384,  383,  379,  377,  380,  381,  382,  390,  391,
+ /*   310 */   400,  399,  401,  402,  434,  398,  397,  392,  394,  395,
+ /*   320 */   396,  508,  501,  406,  566,  407,  408,  409,  405,  404,
+ /*   330 */   493,  490,  514,  403,  565,  513,  410,  563,  560,  562,
+ /*   340 */   564,  567,  559,  558,  411,  412,  414,  413,  453,  549,
+ /*   350 */   486,  457,  487,  489,  461,  456,  529,  502,  452,  484,
+ /*   360 */   528,  462,  465,  545,  544,  546,  547,  548,  543,  542,
+ /*   370 */   466,  539,  540,  541,  568,
 );
-    const YYNOCODE = 120;
+    const YYNOCODE = 121;
     const YYSTACKDEPTH = 100;
-    const YYNSTATE = 369;
-    const YYNRULE = 193;
-    const YYERRORSYMBOL = 77;
+    const YYNSTATE = 375;
+    const YYNRULE = 196;
+    const YYERRORSYMBOL = 78;
     const YYERRSYMDT = 'yy0';
     const YYFALLBACK = 0;
     static public $yyFallback = array(
@@ -1138,29 +1214,29 @@ static public $yy_action = array(
   'RDEL',          'DOLLAR',        'ID',            'EQUAL',       
   'PTR',           'LDELIF',        'SPACE',         'LDELFOR',     
   'SEMICOLON',     'INCDEC',        'TO',            'STEP',        
-  'LDELFOREACH',   'AS',            'APTR',          'LDELSLASH',   
-  'INTEGER',       'COMMA',         'MATH',          'UNIMATH',     
-  'ANDSYM',        'ISIN',          'ISDIVBY',       'ISNOTDIVBY',  
-  'ISEVEN',        'ISNOTEVEN',     'ISEVENBY',      'ISNOTEVENBY', 
-  'ISODD',         'ISNOTODD',      'ISODDBY',       'ISNOTODDBY',  
-  'INSTANCEOF',    'OPENP',         'CLOSEP',        'QMARK',       
-  'NOT',           'TYPECAST',      'HEX',           'DOT',         
-  'SINGLEQUOTESTRING',  'DOUBLECOLON',   'AT',            'HATCH',       
-  'OPENB',         'CLOSEB',        'EQUALS',        'NOTEQUALS',   
-  'GREATERTHAN',   'LESSTHAN',      'GREATEREQUAL',  'LESSEQUAL',   
-  'IDENTITY',      'NONEIDENTITY',  'MOD',           'LAND',        
-  'LOR',           'LXOR',          'QUOTE',         'BACKTICK',    
-  'DOLLARID',      'error',         'start',         'template',    
-  'template_element',  'smartytag',     'literal',       'literal_elements',
-  'literal_element',  'value',         'attributes',    'variable',    
-  'expr',          'modifierlist',  'ternary',       'varindexed',  
+  'LDELFOREACH',   'AS',            'APTR',          'SMARTYBLOCKCHILD',
+  'LDELSLASH',     'INTEGER',       'COMMA',         'MATH',        
+  'UNIMATH',       'ANDSYM',        'ISIN',          'ISDIVBY',     
+  'ISNOTDIVBY',    'ISEVEN',        'ISNOTEVEN',     'ISEVENBY',    
+  'ISNOTEVENBY',   'ISODD',         'ISNOTODD',      'ISODDBY',     
+  'ISNOTODDBY',    'INSTANCEOF',    'OPENP',         'CLOSEP',      
+  'QMARK',         'NOT',           'TYPECAST',      'HEX',         
+  'DOT',           'SINGLEQUOTESTRING',  'DOUBLECOLON',   'AT',          
+  'HATCH',         'OPENB',         'CLOSEB',        'EQUALS',      
+  'NOTEQUALS',     'GREATERTHAN',   'LESSTHAN',      'GREATEREQUAL',
+  'LESSEQUAL',     'IDENTITY',      'NONEIDENTITY',  'MOD',         
+  'LAND',          'LOR',           'LXOR',          'QUOTE',       
+  'BACKTICK',      'DOLLARID',      'error',         'start',       
+  'template',      'template_element',  'smartytag',     'literal',     
+  'literal_elements',  'literal_element',  'value',         'attributes',  
+  'variable',      'expr',          'modifierlist',  'varindexed',  
   'statement',     'statements',    'optspace',      'varvar',      
-  'foraction',     'array',         'modifier',      'modparameters',
-  'attribute',     'ifcond',        'lop',           'function',    
-  'doublequoted_with_quotes',  'static_class_access',  'object',        'arrayindex',  
-  'indexdef',      'varvarele',     'objectchain',   'objectelement',
-  'method',        'params',        'modparameter',  'arrayelements',
-  'arrayelement',  'doublequoted',  'doublequotedcontent',
+  'foraction',     'attribute',     'ternary',       'array',       
+  'ifcond',        'lop',           'function',      'doublequoted_with_quotes',
+  'static_class_access',  'object',        'arrayindex',    'indexdef',    
+  'varvarele',     'objectchain',   'objectelement',  'method',      
+  'params',        'modifier',      'modparameters',  'modparameter',
+  'arrayelements',  'arrayelement',  'doublequoted',  'doublequotedcontent',
     );
 
     static public $yyRuleName = array(
@@ -1195,33 +1271,33 @@ static public $yy_action = array(
  /*  28 */ "smartytag ::= LDEL variable attributes RDEL",
  /*  29 */ "smartytag ::= LDEL expr modifierlist attributes RDEL",
  /*  30 */ "smartytag ::= LDEL expr attributes RDEL",
- /*  31 */ "smartytag ::= LDEL ternary attributes RDEL",
- /*  32 */ "smartytag ::= LDEL DOLLAR ID EQUAL value RDEL",
- /*  33 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr RDEL",
- /*  34 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes RDEL",
- /*  35 */ "smartytag ::= LDEL DOLLAR ID EQUAL ternary attributes RDEL",
- /*  36 */ "smartytag ::= LDEL varindexed EQUAL expr attributes RDEL",
- /*  37 */ "smartytag ::= LDEL varindexed EQUAL ternary attributes RDEL",
- /*  38 */ "smartytag ::= LDEL ID attributes RDEL",
- /*  39 */ "smartytag ::= LDEL ID RDEL",
- /*  40 */ "smartytag ::= LDEL ID PTR ID attributes RDEL",
- /*  41 */ "smartytag ::= LDEL ID modifierlist attributes RDEL",
- /*  42 */ "smartytag ::= LDEL ID PTR ID modifierlist attributes RDEL",
- /*  43 */ "smartytag ::= LDELIF SPACE expr RDEL",
- /*  44 */ "smartytag ::= LDELIF SPACE statement RDEL",
- /*  45 */ "smartytag ::= LDELFOR SPACE statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction RDEL",
- /*  46 */ "foraction ::= EQUAL expr",
- /*  47 */ "foraction ::= INCDEC",
- /*  48 */ "smartytag ::= LDELFOR SPACE statement TO expr attributes RDEL",
- /*  49 */ "smartytag ::= LDELFOR SPACE statement TO expr STEP expr RDEL",
- /*  50 */ "smartytag ::= LDELFOREACH attributes RDEL",
- /*  51 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar RDEL",
- /*  52 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar RDEL",
- /*  53 */ "smartytag ::= LDELFOREACH SPACE array AS DOLLAR varvar RDEL",
- /*  54 */ "smartytag ::= LDELFOREACH SPACE array AS DOLLAR varvar APTR DOLLAR varvar RDEL",
+ /*  31 */ "smartytag ::= LDEL DOLLAR ID EQUAL value RDEL",
+ /*  32 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr RDEL",
+ /*  33 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes RDEL",
+ /*  34 */ "smartytag ::= LDEL varindexed EQUAL expr attributes RDEL",
+ /*  35 */ "smartytag ::= LDEL ID attributes RDEL",
+ /*  36 */ "smartytag ::= LDEL ID RDEL",
+ /*  37 */ "smartytag ::= LDEL ID PTR ID attributes RDEL",
+ /*  38 */ "smartytag ::= LDEL ID modifierlist attributes RDEL",
+ /*  39 */ "smartytag ::= LDEL ID PTR ID modifierlist attributes RDEL",
+ /*  40 */ "smartytag ::= LDELIF SPACE expr RDEL",
+ /*  41 */ "smartytag ::= LDELIF SPACE expr attributes RDEL",
+ /*  42 */ "smartytag ::= LDELIF SPACE statement RDEL",
+ /*  43 */ "smartytag ::= LDELIF SPACE statement attributes RDEL",
+ /*  44 */ "smartytag ::= LDELFOR SPACE statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction attributes RDEL",
+ /*  45 */ "foraction ::= EQUAL expr",
+ /*  46 */ "foraction ::= INCDEC",
+ /*  47 */ "smartytag ::= LDELFOR SPACE statement TO expr attributes RDEL",
+ /*  48 */ "smartytag ::= LDELFOR SPACE statement TO expr STEP expr attributes RDEL",
+ /*  49 */ "smartytag ::= LDELFOREACH attributes RDEL",
+ /*  50 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar attributes RDEL",
+ /*  51 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL",
+ /*  52 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar attributes RDEL",
+ /*  53 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL",
+ /*  54 */ "smartytag ::= SMARTYBLOCKCHILD",
  /*  55 */ "smartytag ::= LDELSLASH ID RDEL",
  /*  56 */ "smartytag ::= LDELSLASH ID attributes RDEL",
- /*  57 */ "smartytag ::= LDELSLASH ID modifier modparameters attributes RDEL",
+ /*  57 */ "smartytag ::= LDELSLASH ID modifierlist attributes RDEL",
  /*  58 */ "smartytag ::= LDELSLASH ID PTR ID RDEL",
  /*  59 */ "attributes ::= attributes attribute",
  /*  60 */ "attributes ::= attribute",
@@ -1229,134 +1305,137 @@ static public $yy_action = array(
  /*  62 */ "attribute ::= SPACE ID EQUAL ID",
  /*  63 */ "attribute ::= SPACE ID EQUAL expr",
  /*  64 */ "attribute ::= SPACE ID EQUAL value",
- /*  65 */ "attribute ::= SPACE ID EQUAL ternary",
- /*  66 */ "attribute ::= SPACE ID",
- /*  67 */ "attribute ::= SPACE INTEGER EQUAL expr",
- /*  68 */ "statements ::= statement",
- /*  69 */ "statements ::= statements COMMA statement",
- /*  70 */ "statement ::= DOLLAR varvar EQUAL expr",
- /*  71 */ "expr ::= value",
- /*  72 */ "expr ::= DOLLAR ID COLON ID",
- /*  73 */ "expr ::= expr MATH value",
- /*  74 */ "expr ::= expr UNIMATH value",
- /*  75 */ "expr ::= expr ANDSYM value",
- /*  76 */ "expr ::= array",
- /*  77 */ "expr ::= expr modifierlist",
- /*  78 */ "expr ::= expr ifcond expr",
- /*  79 */ "expr ::= expr ISIN array",
- /*  80 */ "expr ::= expr ISIN value",
- /*  81 */ "expr ::= expr lop expr",
- /*  82 */ "expr ::= expr ISDIVBY expr",
- /*  83 */ "expr ::= expr ISNOTDIVBY expr",
- /*  84 */ "expr ::= expr ISEVEN",
- /*  85 */ "expr ::= expr ISNOTEVEN",
- /*  86 */ "expr ::= expr ISEVENBY expr",
- /*  87 */ "expr ::= expr ISNOTEVENBY expr",
- /*  88 */ "expr ::= expr ISODD",
- /*  89 */ "expr ::= expr ISNOTODD",
- /*  90 */ "expr ::= expr ISODDBY expr",
- /*  91 */ "expr ::= expr ISNOTODDBY expr",
- /*  92 */ "expr ::= value INSTANCEOF ID",
- /*  93 */ "expr ::= value INSTANCEOF value",
- /*  94 */ "ternary ::= OPENP expr CLOSEP QMARK expr COLON expr",
- /*  95 */ "value ::= variable",
- /*  96 */ "value ::= UNIMATH value",
- /*  97 */ "value ::= NOT value",
- /*  98 */ "value ::= TYPECAST value",
- /*  99 */ "value ::= variable INCDEC",
- /* 100 */ "value ::= HEX",
- /* 101 */ "value ::= INTEGER",
- /* 102 */ "value ::= INTEGER DOT INTEGER",
- /* 103 */ "value ::= INTEGER DOT",
- /* 104 */ "value ::= DOT INTEGER",
- /* 105 */ "value ::= ID",
- /* 106 */ "value ::= function",
- /* 107 */ "value ::= OPENP expr CLOSEP",
- /* 108 */ "value ::= SINGLEQUOTESTRING",
- /* 109 */ "value ::= doublequoted_with_quotes",
- /* 110 */ "value ::= ID DOUBLECOLON static_class_access",
- /* 111 */ "value ::= varindexed DOUBLECOLON static_class_access",
- /* 112 */ "value ::= smartytag",
- /* 113 */ "variable ::= varindexed",
- /* 114 */ "variable ::= DOLLAR varvar AT ID",
- /* 115 */ "variable ::= object",
- /* 116 */ "variable ::= HATCH ID HATCH",
- /* 117 */ "variable ::= HATCH variable HATCH",
- /* 118 */ "varindexed ::= DOLLAR varvar arrayindex",
- /* 119 */ "arrayindex ::= arrayindex indexdef",
- /* 120 */ "arrayindex ::=",
- /* 121 */ "indexdef ::= DOT DOLLAR varvar",
- /* 122 */ "indexdef ::= DOT DOLLAR varvar AT ID",
- /* 123 */ "indexdef ::= DOT ID",
- /* 124 */ "indexdef ::= DOT INTEGER",
- /* 125 */ "indexdef ::= DOT LDEL expr RDEL",
- /* 126 */ "indexdef ::= OPENB ID CLOSEB",
- /* 127 */ "indexdef ::= OPENB ID DOT ID CLOSEB",
- /* 128 */ "indexdef ::= OPENB expr CLOSEB",
- /* 129 */ "indexdef ::= OPENB CLOSEB",
- /* 130 */ "varvar ::= varvarele",
- /* 131 */ "varvar ::= varvar varvarele",
- /* 132 */ "varvarele ::= ID",
- /* 133 */ "varvarele ::= LDEL expr RDEL",
- /* 134 */ "object ::= varindexed objectchain",
- /* 135 */ "objectchain ::= objectelement",
- /* 136 */ "objectchain ::= objectchain objectelement",
- /* 137 */ "objectelement ::= PTR ID arrayindex",
- /* 138 */ "objectelement ::= PTR DOLLAR varvar arrayindex",
- /* 139 */ "objectelement ::= PTR LDEL expr RDEL arrayindex",
- /* 140 */ "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
- /* 141 */ "objectelement ::= PTR method",
- /* 142 */ "function ::= ID OPENP params CLOSEP",
- /* 143 */ "method ::= ID OPENP params CLOSEP",
- /* 144 */ "method ::= DOLLAR ID OPENP params CLOSEP",
- /* 145 */ "params ::= expr COMMA params",
- /* 146 */ "params ::= expr",
- /* 147 */ "params ::=",
- /* 148 */ "modifierlist ::= modifierlist modifier modparameters",
- /* 149 */ "modifierlist ::= modifier modparameters",
- /* 150 */ "modifier ::= VERT AT ID",
- /* 151 */ "modifier ::= VERT ID",
- /* 152 */ "modparameters ::= modparameters modparameter",
- /* 153 */ "modparameters ::=",
- /* 154 */ "modparameter ::= COLON value",
- /* 155 */ "modparameter ::= COLON array",
- /* 156 */ "static_class_access ::= method",
- /* 157 */ "static_class_access ::= method objectchain",
- /* 158 */ "static_class_access ::= ID",
- /* 159 */ "static_class_access ::= DOLLAR ID arrayindex",
- /* 160 */ "static_class_access ::= DOLLAR ID arrayindex objectchain",
- /* 161 */ "ifcond ::= EQUALS",
- /* 162 */ "ifcond ::= NOTEQUALS",
- /* 163 */ "ifcond ::= GREATERTHAN",
- /* 164 */ "ifcond ::= LESSTHAN",
- /* 165 */ "ifcond ::= GREATEREQUAL",
- /* 166 */ "ifcond ::= LESSEQUAL",
- /* 167 */ "ifcond ::= IDENTITY",
- /* 168 */ "ifcond ::= NONEIDENTITY",
- /* 169 */ "ifcond ::= MOD",
- /* 170 */ "lop ::= LAND",
- /* 171 */ "lop ::= LOR",
- /* 172 */ "lop ::= LXOR",
- /* 173 */ "array ::= OPENB arrayelements CLOSEB",
- /* 174 */ "arrayelements ::= arrayelement",
- /* 175 */ "arrayelements ::= arrayelements COMMA arrayelement",
- /* 176 */ "arrayelements ::=",
- /* 177 */ "arrayelement ::= value APTR expr",
- /* 178 */ "arrayelement ::= ID APTR expr",
- /* 179 */ "arrayelement ::= expr",
- /* 180 */ "doublequoted_with_quotes ::= QUOTE QUOTE",
- /* 181 */ "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
- /* 182 */ "doublequoted ::= doublequoted doublequotedcontent",
- /* 183 */ "doublequoted ::= doublequotedcontent",
- /* 184 */ "doublequotedcontent ::= BACKTICK variable BACKTICK",
- /* 185 */ "doublequotedcontent ::= BACKTICK expr BACKTICK",
- /* 186 */ "doublequotedcontent ::= DOLLARID",
- /* 187 */ "doublequotedcontent ::= LDEL variable RDEL",
- /* 188 */ "doublequotedcontent ::= LDEL expr RDEL",
- /* 189 */ "doublequotedcontent ::= smartytag",
- /* 190 */ "doublequotedcontent ::= OTHER",
- /* 191 */ "optspace ::= SPACE",
- /* 192 */ "optspace ::=",
+ /*  65 */ "attribute ::= SPACE ID",
+ /*  66 */ "attribute ::= SPACE expr",
+ /*  67 */ "attribute ::= SPACE value",
+ /*  68 */ "attribute ::= SPACE INTEGER EQUAL expr",
+ /*  69 */ "statements ::= statement",
+ /*  70 */ "statements ::= statements COMMA statement",
+ /*  71 */ "statement ::= DOLLAR varvar EQUAL expr",
+ /*  72 */ "expr ::= value",
+ /*  73 */ "expr ::= ternary",
+ /*  74 */ "expr ::= DOLLAR ID COLON ID",
+ /*  75 */ "expr ::= expr MATH value",
+ /*  76 */ "expr ::= expr UNIMATH value",
+ /*  77 */ "expr ::= expr ANDSYM value",
+ /*  78 */ "expr ::= array",
+ /*  79 */ "expr ::= expr modifierlist",
+ /*  80 */ "expr ::= expr ifcond expr",
+ /*  81 */ "expr ::= expr ISIN array",
+ /*  82 */ "expr ::= expr ISIN value",
+ /*  83 */ "expr ::= expr lop expr",
+ /*  84 */ "expr ::= expr ISDIVBY expr",
+ /*  85 */ "expr ::= expr ISNOTDIVBY expr",
+ /*  86 */ "expr ::= expr ISEVEN",
+ /*  87 */ "expr ::= expr ISNOTEVEN",
+ /*  88 */ "expr ::= expr ISEVENBY expr",
+ /*  89 */ "expr ::= expr ISNOTEVENBY expr",
+ /*  90 */ "expr ::= expr ISODD",
+ /*  91 */ "expr ::= expr ISNOTODD",
+ /*  92 */ "expr ::= expr ISODDBY expr",
+ /*  93 */ "expr ::= expr ISNOTODDBY expr",
+ /*  94 */ "expr ::= value INSTANCEOF ID",
+ /*  95 */ "expr ::= value INSTANCEOF value",
+ /*  96 */ "ternary ::= OPENP expr CLOSEP QMARK DOLLAR ID COLON expr",
+ /*  97 */ "ternary ::= OPENP expr CLOSEP QMARK expr COLON expr",
+ /*  98 */ "value ::= variable",
+ /*  99 */ "value ::= UNIMATH value",
+ /* 100 */ "value ::= NOT value",
+ /* 101 */ "value ::= TYPECAST value",
+ /* 102 */ "value ::= variable INCDEC",
+ /* 103 */ "value ::= HEX",
+ /* 104 */ "value ::= INTEGER",
+ /* 105 */ "value ::= INTEGER DOT INTEGER",
+ /* 106 */ "value ::= INTEGER DOT",
+ /* 107 */ "value ::= DOT INTEGER",
+ /* 108 */ "value ::= ID",
+ /* 109 */ "value ::= function",
+ /* 110 */ "value ::= OPENP expr CLOSEP",
+ /* 111 */ "value ::= SINGLEQUOTESTRING",
+ /* 112 */ "value ::= doublequoted_with_quotes",
+ /* 113 */ "value ::= ID DOUBLECOLON static_class_access",
+ /* 114 */ "value ::= varindexed DOUBLECOLON static_class_access",
+ /* 115 */ "value ::= smartytag",
+ /* 116 */ "variable ::= varindexed",
+ /* 117 */ "variable ::= DOLLAR varvar AT ID",
+ /* 118 */ "variable ::= object",
+ /* 119 */ "variable ::= HATCH ID HATCH",
+ /* 120 */ "variable ::= HATCH variable HATCH",
+ /* 121 */ "varindexed ::= DOLLAR varvar arrayindex",
+ /* 122 */ "arrayindex ::= arrayindex indexdef",
+ /* 123 */ "arrayindex ::=",
+ /* 124 */ "indexdef ::= DOT DOLLAR varvar",
+ /* 125 */ "indexdef ::= DOT DOLLAR varvar AT ID",
+ /* 126 */ "indexdef ::= DOT ID",
+ /* 127 */ "indexdef ::= DOT INTEGER",
+ /* 128 */ "indexdef ::= DOT LDEL expr RDEL",
+ /* 129 */ "indexdef ::= OPENB ID CLOSEB",
+ /* 130 */ "indexdef ::= OPENB ID DOT ID CLOSEB",
+ /* 131 */ "indexdef ::= OPENB expr CLOSEB",
+ /* 132 */ "indexdef ::= OPENB CLOSEB",
+ /* 133 */ "varvar ::= varvarele",
+ /* 134 */ "varvar ::= varvar varvarele",
+ /* 135 */ "varvarele ::= ID",
+ /* 136 */ "varvarele ::= LDEL expr RDEL",
+ /* 137 */ "object ::= varindexed objectchain",
+ /* 138 */ "objectchain ::= objectelement",
+ /* 139 */ "objectchain ::= objectchain objectelement",
+ /* 140 */ "objectelement ::= PTR ID arrayindex",
+ /* 141 */ "objectelement ::= PTR DOLLAR varvar arrayindex",
+ /* 142 */ "objectelement ::= PTR LDEL expr RDEL arrayindex",
+ /* 143 */ "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
+ /* 144 */ "objectelement ::= PTR method",
+ /* 145 */ "function ::= ID OPENP params CLOSEP",
+ /* 146 */ "method ::= ID OPENP params CLOSEP",
+ /* 147 */ "method ::= DOLLAR ID OPENP params CLOSEP",
+ /* 148 */ "params ::= expr COMMA params",
+ /* 149 */ "params ::= expr",
+ /* 150 */ "params ::=",
+ /* 151 */ "modifierlist ::= modifierlist modifier modparameters",
+ /* 152 */ "modifierlist ::= modifier modparameters",
+ /* 153 */ "modifier ::= VERT AT ID",
+ /* 154 */ "modifier ::= VERT ID",
+ /* 155 */ "modparameters ::= modparameters modparameter",
+ /* 156 */ "modparameters ::=",
+ /* 157 */ "modparameter ::= COLON value",
+ /* 158 */ "modparameter ::= COLON array",
+ /* 159 */ "static_class_access ::= method",
+ /* 160 */ "static_class_access ::= method objectchain",
+ /* 161 */ "static_class_access ::= ID",
+ /* 162 */ "static_class_access ::= DOLLAR ID arrayindex",
+ /* 163 */ "static_class_access ::= DOLLAR ID arrayindex objectchain",
+ /* 164 */ "ifcond ::= EQUALS",
+ /* 165 */ "ifcond ::= NOTEQUALS",
+ /* 166 */ "ifcond ::= GREATERTHAN",
+ /* 167 */ "ifcond ::= LESSTHAN",
+ /* 168 */ "ifcond ::= GREATEREQUAL",
+ /* 169 */ "ifcond ::= LESSEQUAL",
+ /* 170 */ "ifcond ::= IDENTITY",
+ /* 171 */ "ifcond ::= NONEIDENTITY",
+ /* 172 */ "ifcond ::= MOD",
+ /* 173 */ "lop ::= LAND",
+ /* 174 */ "lop ::= LOR",
+ /* 175 */ "lop ::= LXOR",
+ /* 176 */ "array ::= OPENB arrayelements CLOSEB",
+ /* 177 */ "arrayelements ::= arrayelement",
+ /* 178 */ "arrayelements ::= arrayelements COMMA arrayelement",
+ /* 179 */ "arrayelements ::=",
+ /* 180 */ "arrayelement ::= value APTR expr",
+ /* 181 */ "arrayelement ::= ID APTR expr",
+ /* 182 */ "arrayelement ::= expr",
+ /* 183 */ "doublequoted_with_quotes ::= QUOTE QUOTE",
+ /* 184 */ "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
+ /* 185 */ "doublequoted ::= doublequoted doublequotedcontent",
+ /* 186 */ "doublequoted ::= doublequotedcontent",
+ /* 187 */ "doublequotedcontent ::= BACKTICK variable BACKTICK",
+ /* 188 */ "doublequotedcontent ::= BACKTICK expr BACKTICK",
+ /* 189 */ "doublequotedcontent ::= DOLLARID",
+ /* 190 */ "doublequotedcontent ::= LDEL variable RDEL",
+ /* 191 */ "doublequotedcontent ::= LDEL expr RDEL",
+ /* 192 */ "doublequotedcontent ::= smartytag",
+ /* 193 */ "doublequotedcontent ::= OTHER",
+ /* 194 */ "optspace ::= SPACE",
+ /* 195 */ "optspace ::=",
     );
 
     function tokenName($tokenType)
@@ -1612,11 +1691,11 @@ static public $yy_action = array(
             while ($this->yyidx >= 0) {
                 $this->yy_pop_parser_stack();
             }
-#line 82 "smarty_internal_templateparser.y"
+#line 84 "smarty_internal_templateparser.y"
 
     $this->internalError = true;
     $this->compiler->trigger_template_error("Stack overflow in template parser");
-#line 1615 "smarty_internal_templateparser.php"
+#line 1694 "smarty_internal_templateparser.php"
             return;
         }
         $yytos = new TP_yyStackEntry;
@@ -1637,197 +1716,200 @@ static public $yy_action = array(
     }
 
     static public $yyRuleInfo = array(
-  array( 'lhs' => 78, 'rhs' => 1 ),
   array( 'lhs' => 79, 'rhs' => 1 ),
-  array( 'lhs' => 79, 'rhs' => 2 ),
-  array( 'lhs' => 79, 'rhs' => 0 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
   array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 80, 'rhs' => 1 ),
-  array( 'lhs' => 82, 'rhs' => 2 ),
-  array( 'lhs' => 82, 'rhs' => 3 ),
+  array( 'lhs' => 80, 'rhs' => 2 ),
+  array( 'lhs' => 80, 'rhs' => 0 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
+  array( 'lhs' => 81, 'rhs' => 1 ),
   array( 'lhs' => 83, 'rhs' => 2 ),
-  array( 'lhs' => 83, 'rhs' => 0 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 81, 'rhs' => 3 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 5 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 3 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 5 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 12 ),
+  array( 'lhs' => 83, 'rhs' => 3 ),
+  array( 'lhs' => 84, 'rhs' => 2 ),
+  array( 'lhs' => 84, 'rhs' => 0 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 82, 'rhs' => 3 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 6 ),
+  array( 'lhs' => 82, 'rhs' => 6 ),
+  array( 'lhs' => 82, 'rhs' => 7 ),
+  array( 'lhs' => 82, 'rhs' => 6 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 3 ),
+  array( 'lhs' => 82, 'rhs' => 6 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 82, 'rhs' => 7 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 82, 'rhs' => 13 ),
   array( 'lhs' => 96, 'rhs' => 2 ),
   array( 'lhs' => 96, 'rhs' => 1 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 8 ),
-  array( 'lhs' => 81, 'rhs' => 3 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 10 ),
-  array( 'lhs' => 81, 'rhs' => 7 ),
-  array( 'lhs' => 81, 'rhs' => 10 ),
-  array( 'lhs' => 81, 'rhs' => 3 ),
-  array( 'lhs' => 81, 'rhs' => 4 ),
-  array( 'lhs' => 81, 'rhs' => 6 ),
-  array( 'lhs' => 81, 'rhs' => 5 ),
-  array( 'lhs' => 86, 'rhs' => 2 ),
-  array( 'lhs' => 86, 'rhs' => 1 ),
-  array( 'lhs' => 86, 'rhs' => 0 ),
-  array( 'lhs' => 100, 'rhs' => 4 ),
-  array( 'lhs' => 100, 'rhs' => 4 ),
-  array( 'lhs' => 100, 'rhs' => 4 ),
-  array( 'lhs' => 100, 'rhs' => 4 ),
-  array( 'lhs' => 100, 'rhs' => 2 ),
-  array( 'lhs' => 100, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 7 ),
+  array( 'lhs' => 82, 'rhs' => 9 ),
+  array( 'lhs' => 82, 'rhs' => 3 ),
+  array( 'lhs' => 82, 'rhs' => 8 ),
+  array( 'lhs' => 82, 'rhs' => 11 ),
+  array( 'lhs' => 82, 'rhs' => 8 ),
+  array( 'lhs' => 82, 'rhs' => 11 ),
+  array( 'lhs' => 82, 'rhs' => 1 ),
+  array( 'lhs' => 82, 'rhs' => 3 ),
+  array( 'lhs' => 82, 'rhs' => 4 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 82, 'rhs' => 5 ),
+  array( 'lhs' => 87, 'rhs' => 2 ),
+  array( 'lhs' => 87, 'rhs' => 1 ),
+  array( 'lhs' => 87, 'rhs' => 0 ),
+  array( 'lhs' => 97, 'rhs' => 4 ),
+  array( 'lhs' => 97, 'rhs' => 4 ),
+  array( 'lhs' => 97, 'rhs' => 4 ),
+  array( 'lhs' => 97, 'rhs' => 2 ),
+  array( 'lhs' => 97, 'rhs' => 2 ),
+  array( 'lhs' => 97, 'rhs' => 2 ),
+  array( 'lhs' => 97, 'rhs' => 4 ),
   array( 'lhs' => 93, 'rhs' => 1 ),
   array( 'lhs' => 93, 'rhs' => 3 ),
   array( 'lhs' => 92, 'rhs' => 4 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 4 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 98, 'rhs' => 8 ),
+  array( 'lhs' => 98, 'rhs' => 7 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 4 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
   array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
   array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 90, 'rhs' => 7 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 4 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 3 ),
-  array( 'lhs' => 87, 'rhs' => 3 ),
   array( 'lhs' => 91, 'rhs' => 3 ),
+  array( 'lhs' => 106, 'rhs' => 2 ),
+  array( 'lhs' => 106, 'rhs' => 0 ),
+  array( 'lhs' => 107, 'rhs' => 3 ),
+  array( 'lhs' => 107, 'rhs' => 5 ),
+  array( 'lhs' => 107, 'rhs' => 2 ),
+  array( 'lhs' => 107, 'rhs' => 2 ),
+  array( 'lhs' => 107, 'rhs' => 4 ),
+  array( 'lhs' => 107, 'rhs' => 3 ),
+  array( 'lhs' => 107, 'rhs' => 5 ),
+  array( 'lhs' => 107, 'rhs' => 3 ),
   array( 'lhs' => 107, 'rhs' => 2 ),
-  array( 'lhs' => 107, 'rhs' => 0 ),
-  array( 'lhs' => 108, 'rhs' => 3 ),
-  array( 'lhs' => 108, 'rhs' => 5 ),
-  array( 'lhs' => 108, 'rhs' => 2 ),
-  array( 'lhs' => 108, 'rhs' => 2 ),
-  array( 'lhs' => 108, 'rhs' => 4 ),
-  array( 'lhs' => 108, 'rhs' => 3 ),
-  array( 'lhs' => 108, 'rhs' => 5 ),
-  array( 'lhs' => 108, 'rhs' => 3 ),
-  array( 'lhs' => 108, 'rhs' => 2 ),
   array( 'lhs' => 95, 'rhs' => 1 ),
   array( 'lhs' => 95, 'rhs' => 2 ),
+  array( 'lhs' => 108, 'rhs' => 1 ),
+  array( 'lhs' => 108, 'rhs' => 3 ),
+  array( 'lhs' => 105, 'rhs' => 2 ),
   array( 'lhs' => 109, 'rhs' => 1 ),
-  array( 'lhs' => 109, 'rhs' => 3 ),
-  array( 'lhs' => 106, 'rhs' => 2 ),
-  array( 'lhs' => 110, 'rhs' => 1 ),
+  array( 'lhs' => 109, 'rhs' => 2 ),
+  array( 'lhs' => 110, 'rhs' => 3 ),
+  array( 'lhs' => 110, 'rhs' => 4 ),
+  array( 'lhs' => 110, 'rhs' => 5 ),
+  array( 'lhs' => 110, 'rhs' => 6 ),
   array( 'lhs' => 110, 'rhs' => 2 ),
-  array( 'lhs' => 111, 'rhs' => 3 ),
+  array( 'lhs' => 102, 'rhs' => 4 ),
   array( 'lhs' => 111, 'rhs' => 4 ),
   array( 'lhs' => 111, 'rhs' => 5 ),
-  array( 'lhs' => 111, 'rhs' => 6 ),
-  array( 'lhs' => 111, 'rhs' => 2 ),
-  array( 'lhs' => 103, 'rhs' => 4 ),
-  array( 'lhs' => 112, 'rhs' => 4 ),
-  array( 'lhs' => 112, 'rhs' => 5 ),
+  array( 'lhs' => 112, 'rhs' => 3 ),
+  array( 'lhs' => 112, 'rhs' => 1 ),
+  array( 'lhs' => 112, 'rhs' => 0 ),
+  array( 'lhs' => 90, 'rhs' => 3 ),
+  array( 'lhs' => 90, 'rhs' => 2 ),
   array( 'lhs' => 113, 'rhs' => 3 ),
-  array( 'lhs' => 113, 'rhs' => 1 ),
-  array( 'lhs' => 113, 'rhs' => 0 ),
-  array( 'lhs' => 89, 'rhs' => 3 ),
-  array( 'lhs' => 89, 'rhs' => 2 ),
-  array( 'lhs' => 98, 'rhs' => 3 ),
-  array( 'lhs' => 98, 'rhs' => 2 ),
-  array( 'lhs' => 99, 'rhs' => 2 ),
-  array( 'lhs' => 99, 'rhs' => 0 ),
+  array( 'lhs' => 113, 'rhs' => 2 ),
   array( 'lhs' => 114, 'rhs' => 2 ),
-  array( 'lhs' => 114, 'rhs' => 2 ),
-  array( 'lhs' => 105, 'rhs' => 1 ),
-  array( 'lhs' => 105, 'rhs' => 2 ),
-  array( 'lhs' => 105, 'rhs' => 1 ),
-  array( 'lhs' => 105, 'rhs' => 3 ),
-  array( 'lhs' => 105, 'rhs' => 4 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 1 ),
+  array( 'lhs' => 114, 'rhs' => 0 ),
+  array( 'lhs' => 115, 'rhs' => 2 ),
+  array( 'lhs' => 115, 'rhs' => 2 ),
+  array( 'lhs' => 104, 'rhs' => 1 ),
+  array( 'lhs' => 104, 'rhs' => 2 ),
+  array( 'lhs' => 104, 'rhs' => 1 ),
+  array( 'lhs' => 104, 'rhs' => 3 ),
+  array( 'lhs' => 104, 'rhs' => 4 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
+  array( 'lhs' => 100, 'rhs' => 1 ),
   array( 'lhs' => 101, 'rhs' => 1 ),
   array( 'lhs' => 101, 'rhs' => 1 ),
   array( 'lhs' => 101, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 97, 'rhs' => 3 ),
-  array( 'lhs' => 115, 'rhs' => 1 ),
-  array( 'lhs' => 115, 'rhs' => 3 ),
-  array( 'lhs' => 115, 'rhs' => 0 ),
-  array( 'lhs' => 116, 'rhs' => 3 ),
-  array( 'lhs' => 116, 'rhs' => 3 ),
+  array( 'lhs' => 99, 'rhs' => 3 ),
   array( 'lhs' => 116, 'rhs' => 1 ),
-  array( 'lhs' => 104, 'rhs' => 2 ),
-  array( 'lhs' => 104, 'rhs' => 3 ),
-  array( 'lhs' => 117, 'rhs' => 2 ),
+  array( 'lhs' => 116, 'rhs' => 3 ),
+  array( 'lhs' => 116, 'rhs' => 0 ),
+  array( 'lhs' => 117, 'rhs' => 3 ),
+  array( 'lhs' => 117, 'rhs' => 3 ),
   array( 'lhs' => 117, 'rhs' => 1 ),
-  array( 'lhs' => 118, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 1 ),
-  array( 'lhs' => 118, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 2 ),
+  array( 'lhs' => 103, 'rhs' => 3 ),
+  array( 'lhs' => 118, 'rhs' => 2 ),
   array( 'lhs' => 118, 'rhs' => 1 ),
+  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 119, 'rhs' => 1 ),
+  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 119, 'rhs' => 1 ),
+  array( 'lhs' => 119, 'rhs' => 1 ),
   array( 'lhs' => 94, 'rhs' => 1 ),
   array( 'lhs' => 94, 'rhs' => 0 ),
     );
@@ -1851,22 +1933,23 @@ static public $yy_action = array(
         18 => 15,
         16 => 16,
         17 => 17,
-        96 => 17,
-        98 => 17,
         99 => 17,
-        157 => 17,
+        101 => 17,
+        102 => 17,
+        160 => 17,
         19 => 19,
         20 => 19,
-        71 => 19,
-        95 => 19,
-        100 => 19,
-        101 => 19,
-        106 => 19,
-        108 => 19,
+        72 => 19,
+        73 => 19,
+        98 => 19,
+        103 => 19,
+        104 => 19,
         109 => 19,
-        115 => 19,
-        156 => 19,
-        174 => 19,
+        111 => 19,
+        112 => 19,
+        118 => 19,
+        159 => 19,
+        177 => 19,
         21 => 21,
         22 => 21,
         23 => 23,
@@ -1876,29 +1959,29 @@ static public $yy_action = array(
         27 => 27,
         28 => 27,
         30 => 27,
-        31 => 27,
         29 => 29,
-        32 => 32,
-        33 => 32,
+        31 => 31,
+        32 => 31,
+        33 => 33,
         34 => 34,
-        35 => 34,
+        35 => 35,
         36 => 36,
-        37 => 36,
+        37 => 37,
         38 => 38,
         39 => 39,
         40 => 40,
+        42 => 40,
         41 => 41,
-        42 => 42,
-        43 => 43,
-        44 => 43,
+        43 => 41,
+        44 => 44,
         45 => 45,
         46 => 46,
+        66 => 46,
+        67 => 46,
+        149 => 46,
+        161 => 46,
+        182 => 46,
         47 => 47,
-        60 => 47,
-        146 => 47,
-        150 => 47,
-        158 => 47,
-        179 => 47,
         48 => 48,
         49 => 49,
         50 => 50,
@@ -1911,55 +1994,54 @@ static public $yy_action = array(
         57 => 57,
         58 => 58,
         59 => 59,
+        60 => 60,
+        69 => 60,
+        153 => 60,
         61 => 61,
         62 => 62,
         63 => 63,
         64 => 63,
-        65 => 63,
-        66 => 66,
-        67 => 67,
+        65 => 65,
         68 => 68,
-        69 => 69,
         70 => 70,
-        72 => 72,
-        73 => 73,
-        74 => 73,
-        75 => 73,
-        76 => 76,
-        130 => 76,
-        191 => 76,
-        77 => 77,
+        71 => 71,
+        74 => 74,
+        75 => 75,
+        76 => 75,
+        77 => 75,
         78 => 78,
-        81 => 78,
-        92 => 78,
+        133 => 78,
+        194 => 78,
         79 => 79,
         80 => 80,
+        83 => 80,
+        94 => 80,
+        81 => 81,
         82 => 82,
-        83 => 83,
         84 => 84,
-        89 => 84,
         85 => 85,
-        88 => 85,
         86 => 86,
         91 => 86,
         87 => 87,
         90 => 87,
-        93 => 93,
-        94 => 94,
+        88 => 88,
+        93 => 88,
+        89 => 89,
+        92 => 89,
+        95 => 95,
+        96 => 96,
         97 => 97,
-        102 => 102,
-        103 => 103,
-        104 => 104,
+        100 => 100,
         105 => 105,
+        106 => 106,
         107 => 107,
+        108 => 108,
         110 => 110,
-        111 => 111,
-        112 => 112,
         113 => 113,
         114 => 114,
+        115 => 115,
         116 => 116,
         117 => 117,
-        118 => 118,
         119 => 119,
         120 => 120,
         121 => 121,
@@ -1967,13 +2049,13 @@ static public $yy_action = array(
         123 => 123,
         124 => 124,
         125 => 125,
-        128 => 125,
         126 => 126,
         127 => 127,
+        128 => 128,
+        131 => 128,
         129 => 129,
-        131 => 131,
+        130 => 130,
         132 => 132,
-        133 => 133,
         134 => 134,
         135 => 135,
         136 => 136,
@@ -1986,18 +2068,17 @@ static public $yy_action = array(
         143 => 143,
         144 => 144,
         145 => 145,
+        146 => 146,
         147 => 147,
         148 => 148,
-        149 => 149,
+        150 => 150,
         151 => 151,
         152 => 152,
-        153 => 153,
-        192 => 153,
         154 => 154,
-        155 => 154,
-        159 => 159,
-        160 => 160,
-        161 => 161,
+        155 => 155,
+        156 => 156,
+        157 => 157,
+        158 => 157,
         162 => 162,
         163 => 163,
         164 => 164,
@@ -2010,29 +2091,33 @@ static public $yy_action = array(
         171 => 171,
         172 => 172,
         173 => 173,
+        174 => 174,
         175 => 175,
         176 => 176,
-        177 => 177,
         178 => 178,
+        179 => 179,
         180 => 180,
         181 => 181,
-        182 => 182,
         183 => 183,
         184 => 184,
-        185 => 184,
-        187 => 184,
+        185 => 185,
         186 => 186,
-        188 => 188,
+        187 => 187,
+        188 => 187,
+        190 => 187,
         189 => 189,
-        190 => 190,
+        191 => 191,
+        192 => 192,
+        193 => 193,
+        195 => 195,
     );
-#line 93 "smarty_internal_templateparser.y"
+#line 95 "smarty_internal_templateparser.y"
     function yy_r0(){ $this->_retvalue = $this->root_buffer->to_smarty_php();     }
-#line 2027 "smarty_internal_templateparser.php"
-#line 99 "smarty_internal_templateparser.y"
+#line 2112 "smarty_internal_templateparser.php"
+#line 101 "smarty_internal_templateparser.y"
     function yy_r1(){ $this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor);     }
-#line 2030 "smarty_internal_templateparser.php"
-#line 111 "smarty_internal_templateparser.y"
+#line 2115 "smarty_internal_templateparser.php"
+#line 113 "smarty_internal_templateparser.y"
     function yy_r4(){
                                           if ($this->compiler->has_code) {
                                             $tmp =''; foreach ($this->compiler->prefix_code as $code) {$tmp.=$code;} $this->compiler->prefix_code=array();
@@ -2043,55 +2128,55 @@ static public $yy_action = array(
                                          $this->compiler->has_variable_string = false;
                                          $this->block_nesting_level = count($this->compiler->_tag_stack);
                                             }
-#line 2042 "smarty_internal_templateparser.php"
-#line 123 "smarty_internal_templateparser.y"
+#line 2127 "smarty_internal_templateparser.php"
+#line 125 "smarty_internal_templateparser.y"
     function yy_r5(){ $this->_retvalue = new _smarty_tag($this, '');    }
-#line 2045 "smarty_internal_templateparser.php"
-#line 126 "smarty_internal_templateparser.y"
+#line 2130 "smarty_internal_templateparser.php"
+#line 128 "smarty_internal_templateparser.y"
     function yy_r6(){ $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2048 "smarty_internal_templateparser.php"
-#line 129 "smarty_internal_templateparser.y"
+#line 2133 "smarty_internal_templateparser.php"
+#line 131 "smarty_internal_templateparser.y"
     function yy_r7(){
-                                      if ($this->sec_obj->php_handling == SMARTY_PHP_PASSTHRU) {
+                                      if ($this->php_handling == Smarty::PHP_PASSTHRU) {
                                                                     $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor));
-                                      } elseif ($this->sec_obj->php_handling == SMARTY_PHP_QUOTE) {
+                                      } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
                                        $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_ALLOW) {
+                                      }elseif ($this->php_handling == Smarty::PHP_ALLOW) {
                                        $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<?php', true));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_REMOVE) {
+                                      }elseif ($this->php_handling == Smarty::PHP_REMOVE) {
                                        $this->_retvalue = new _smarty_text($this, '');
                                       }
                                          }
-#line 2061 "smarty_internal_templateparser.php"
-#line 141 "smarty_internal_templateparser.y"
+#line 2146 "smarty_internal_templateparser.php"
+#line 143 "smarty_internal_templateparser.y"
     function yy_r8(){if ($this->is_xml) {
                                        $this->compiler->tag_nocache = true; 
                                        $this->is_xml = true; 
                                        $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>", $this->compiler, true));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_PASSTHRU) {
+                                      }elseif ($this->php_handling == Smarty::PHP_PASSTHRU) {
                                                                     $this->_retvalue = new _smarty_text($this, '?<?php ?>>');
-                                      } elseif ($this->sec_obj->php_handling == SMARTY_PHP_QUOTE) {
+                                      } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
                                        $this->_retvalue = new _smarty_text($this, htmlspecialchars('?>', ENT_QUOTES));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_ALLOW) {
+                                      }elseif ($this->php_handling == Smarty::PHP_ALLOW) {
                                        $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('?>', true));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_REMOVE) {
+                                      }elseif ($this->php_handling == Smarty::PHP_REMOVE) {
                                        $this->_retvalue = new _smarty_text($this, '');
                                       }
                                          }
-#line 2077 "smarty_internal_templateparser.php"
-#line 157 "smarty_internal_templateparser.y"
+#line 2162 "smarty_internal_templateparser.php"
+#line 159 "smarty_internal_templateparser.y"
     function yy_r9(){
-                                      if ($this->sec_obj->php_handling == SMARTY_PHP_PASSTHRU) {
+                                      if ($this->php_handling == Smarty::PHP_PASSTHRU) {
                                                                     $this->_retvalue = new _smarty_text($this, '<<?php ?>%');
-                                      } elseif ($this->sec_obj->php_handling == SMARTY_PHP_QUOTE) {
+                                      } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
                                        $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_ALLOW) {
+                                      }elseif ($this->php_handling == Smarty::PHP_ALLOW) {
                                         if ($this->asp_tags) {
                                           $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<%', true));
                                         } else {
                                          $this->_retvalue = new _smarty_text($this, '<<?php ?>%');
                                         }
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_REMOVE) {
+                                      }elseif ($this->php_handling == Smarty::PHP_REMOVE) {
                                         if ($this->asp_tags) {
                                          $this->_retvalue = new _smarty_text($this, '');
                                         } else {
@@ -2099,20 +2184,20 @@ static public $yy_action = array(
                                         }
                                       }
                                         }
-#line 2098 "smarty_internal_templateparser.php"
-#line 178 "smarty_internal_templateparser.y"
+#line 2183 "smarty_internal_templateparser.php"
+#line 180 "smarty_internal_templateparser.y"
     function yy_r10(){
-                                      if ($this->sec_obj->php_handling == SMARTY_PHP_PASSTHRU) {
+                                      if ($this->php_handling == Smarty::PHP_PASSTHRU) {
                                                                     $this->_retvalue = new _smarty_text($this, '%<?php ?>>');
-                                      } elseif ($this->sec_obj->php_handling == SMARTY_PHP_QUOTE) {
+                                      } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
                                        $this->_retvalue = new _smarty_text($this, htmlspecialchars('%>', ENT_QUOTES));
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_ALLOW) {
+                                      }elseif ($this->php_handling == Smarty::PHP_ALLOW) {
                                         if ($this->asp_tags) {
                                           $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('%>', true));
                                         } else {
                                          $this->_retvalue = new _smarty_text($this, '%<?php ?>>');
                                         }
-                                      }elseif ($this->sec_obj->php_handling == SMARTY_PHP_REMOVE) {
+                                      }elseif ($this->php_handling == Smarty::PHP_REMOVE) {
                                         if ($this->asp_tags) {
                                          $this->_retvalue = new _smarty_text($this, '');
                                         } else {
@@ -2120,151 +2205,160 @@ static public $yy_action = array(
                                         }
                                       }
                                         }
-#line 2119 "smarty_internal_templateparser.php"
-#line 198 "smarty_internal_templateparser.y"
+#line 2204 "smarty_internal_templateparser.php"
+#line 200 "smarty_internal_templateparser.y"
     function yy_r11(){if ($this->lex->strip) {
                                        $this->_retvalue = new _smarty_text($this, preg_replace('![\$this->yystack[$this->yyidx + 0]->minor ]*[\r\n]+[\$this->yystack[$this->yyidx + 0]->minor ]*!', '', self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor)));     
                                      } else {
                                        $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor));    
                                      }
                                         }
-#line 2127 "smarty_internal_templateparser.php"
-#line 206 "smarty_internal_templateparser.y"
+#line 2212 "smarty_internal_templateparser.php"
+#line 208 "smarty_internal_templateparser.y"
     function yy_r12(){ $this->compiler->tag_nocache = true; $this->is_xml = true; $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true));    }
-#line 2130 "smarty_internal_templateparser.php"
-#line 209 "smarty_internal_templateparser.y"
+#line 2215 "smarty_internal_templateparser.php"
+#line 211 "smarty_internal_templateparser.y"
     function yy_r13(){if ($this->lex->strip) {
                                        $this->_retvalue = new _smarty_text($this, preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $this->yystack[$this->yyidx + 0]->minor)); 
                                      } else {
                                        $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);    
                                      }
                                         }
-#line 2138 "smarty_internal_templateparser.php"
-#line 215 "smarty_internal_templateparser.y"
+#line 2223 "smarty_internal_templateparser.php"
+#line 217 "smarty_internal_templateparser.y"
     function yy_r14(){
                                      $this->_retvalue = new _smarty_linebreak($this, $this->yystack[$this->yyidx + 0]->minor);
                                        }
-#line 2143 "smarty_internal_templateparser.php"
-#line 220 "smarty_internal_templateparser.y"
+#line 2228 "smarty_internal_templateparser.php"
+#line 222 "smarty_internal_templateparser.y"
     function yy_r15(){ $this->_retvalue = '';     }
-#line 2146 "smarty_internal_templateparser.php"
-#line 221 "smarty_internal_templateparser.y"
-    function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
-#line 2149 "smarty_internal_templateparser.php"
+#line 2231 "smarty_internal_templateparser.php"
 #line 223 "smarty_internal_templateparser.y"
+    function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
+#line 2234 "smarty_internal_templateparser.php"
+#line 225 "smarty_internal_templateparser.y"
     function yy_r17(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2152 "smarty_internal_templateparser.php"
-#line 226 "smarty_internal_templateparser.y"
-    function yy_r19(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 2155 "smarty_internal_templateparser.php"
+#line 2237 "smarty_internal_templateparser.php"
 #line 228 "smarty_internal_templateparser.y"
-    function yy_r21(){ $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor);     }
-#line 2158 "smarty_internal_templateparser.php"
+    function yy_r19(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
+#line 2240 "smarty_internal_templateparser.php"
 #line 230 "smarty_internal_templateparser.y"
+    function yy_r21(){ $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor);     }
+#line 2243 "smarty_internal_templateparser.php"
+#line 232 "smarty_internal_templateparser.y"
     function yy_r23(){ $this->_retvalue = self::escape_end_tag($this->yystack[$this->yyidx + 0]->minor);     }
-#line 2161 "smarty_internal_templateparser.php"
-#line 231 "smarty_internal_templateparser.y"
+#line 2246 "smarty_internal_templateparser.php"
+#line 233 "smarty_internal_templateparser.y"
     function yy_r24(){ $this->_retvalue = '<<?php ?>%';     }
-#line 2164 "smarty_internal_templateparser.php"
-#line 232 "smarty_internal_templateparser.y"
+#line 2249 "smarty_internal_templateparser.php"
+#line 234 "smarty_internal_templateparser.y"
     function yy_r25(){ $this->_retvalue = '%<?php ?>>';     }
-#line 2167 "smarty_internal_templateparser.php"
-#line 240 "smarty_internal_templateparser.y"
-    function yy_r26(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array('value'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2170 "smarty_internal_templateparser.php"
-#line 241 "smarty_internal_templateparser.y"
-    function yy_r27(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array_merge(array('value'=>$this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2173 "smarty_internal_templateparser.php"
+#line 2252 "smarty_internal_templateparser.php"
+#line 242 "smarty_internal_templateparser.y"
+    function yy_r26(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor));    }
+#line 2255 "smarty_internal_templateparser.php"
 #line 243 "smarty_internal_templateparser.y"
-    function yy_r29(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array_merge(array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2176 "smarty_internal_templateparser.php"
+    function yy_r27(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -2]->minor));    }
+#line 2258 "smarty_internal_templateparser.php"
+#line 245 "smarty_internal_templateparser.y"
+    function yy_r29(){ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor));    }
+#line 2261 "smarty_internal_templateparser.php"
 #line 253 "smarty_internal_templateparser.y"
-    function yy_r32(){ $this->_retvalue = $this->compiler->compileTag('assign',array('value'=>$this->yystack[$this->yyidx + -1]->minor,'var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'"));    }
-#line 2179 "smarty_internal_templateparser.php"
+    function yy_r31(){ $this->_retvalue = $this->compiler->compileTag('assign',array(array('value'=>$this->yystack[$this->yyidx + -1]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'")));    }
+#line 2264 "smarty_internal_templateparser.php"
 #line 255 "smarty_internal_templateparser.y"
-    function yy_r34(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array('value'=>$this->yystack[$this->yyidx + -2]->minor,'var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'"),$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2182 "smarty_internal_templateparser.php"
-#line 257 "smarty_internal_templateparser.y"
-    function yy_r36(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array('value'=>$this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2185 "smarty_internal_templateparser.php"
-#line 260 "smarty_internal_templateparser.y"
-    function yy_r38(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor);    }
-#line 2188 "smarty_internal_templateparser.php"
+    function yy_r33(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'")),$this->yystack[$this->yyidx + -1]->minor));    }
+#line 2267 "smarty_internal_templateparser.php"
+#line 256 "smarty_internal_templateparser.y"
+    function yy_r34(){ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>$this->yystack[$this->yyidx + -4]->minor['var'])),$this->yystack[$this->yyidx + -1]->minor),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -4]->minor['smarty_internal_index']));    }
+#line 2270 "smarty_internal_templateparser.php"
+#line 258 "smarty_internal_templateparser.y"
+    function yy_r35(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor);    }
+#line 2273 "smarty_internal_templateparser.php"
+#line 259 "smarty_internal_templateparser.y"
+    function yy_r36(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array());    }
+#line 2276 "smarty_internal_templateparser.php"
 #line 261 "smarty_internal_templateparser.y"
-    function yy_r39(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array());    }
-#line 2191 "smarty_internal_templateparser.php"
+    function yy_r37(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor));    }
+#line 2279 "smarty_internal_templateparser.php"
 #line 263 "smarty_internal_templateparser.y"
-    function yy_r40(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,array_merge(array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2194 "smarty_internal_templateparser.php"
-#line 265 "smarty_internal_templateparser.y"
-    function yy_r41(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
-                                                                                    $this->_retvalue .= $this->compiler->compileTag('private_modifier',array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
+    function yy_r38(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
+                                                                                    $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
                                                                                      }
-#line 2199 "smarty_internal_templateparser.php"
-#line 269 "smarty_internal_templateparser.y"
-    function yy_r42(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,array_merge(array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor),$this->yystack[$this->yyidx + -1]->minor)).'<?php echo ';
-                                                                                               $this->_retvalue .= $this->compiler->compileTag('private_modifier',array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
+#line 2284 "smarty_internal_templateparser.php"
+#line 267 "smarty_internal_templateparser.y"
+    function yy_r39(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor)).'<?php echo ';
+                                                                                               $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
                                                                                                 }
-#line 2204 "smarty_internal_templateparser.php"
-#line 273 "smarty_internal_templateparser.y"
-    function yy_r43(){ $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length)); $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2207 "smarty_internal_templateparser.php"
+#line 2289 "smarty_internal_templateparser.php"
+#line 271 "smarty_internal_templateparser.y"
+    function yy_r40(){ $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length)); $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));    }
+#line 2292 "smarty_internal_templateparser.php"
+#line 272 "smarty_internal_templateparser.y"
+    function yy_r41(){ $tag = trim(substr($this->yystack[$this->yyidx + -4]->minor,$this->lex->ldel_length)); $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + -1]->minor,array('if condition'=>$this->yystack[$this->yyidx + -2]->minor));    }
+#line 2295 "smarty_internal_templateparser.php"
 #line 276 "smarty_internal_templateparser.y"
-    function yy_r45(){
-                                                             $this->_retvalue = $this->compiler->compileTag('for',array('start'=>$this->yystack[$this->yyidx + -9]->minor,'ifexp'=>$this->yystack[$this->yyidx + -6]->minor,'varloop'=>$this->yystack[$this->yyidx + -2]->minor,'loop'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2211 "smarty_internal_templateparser.php"
+    function yy_r44(){
+                                                             $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -10]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -7]->minor),array('var'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),1);    }
+#line 2299 "smarty_internal_templateparser.php"
 #line 279 "smarty_internal_templateparser.y"
-    function yy_r46(){ $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2214 "smarty_internal_templateparser.php"
+    function yy_r45(){ $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2302 "smarty_internal_templateparser.php"
 #line 280 "smarty_internal_templateparser.y"
-    function yy_r47(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;    }
-#line 2217 "smarty_internal_templateparser.php"
+    function yy_r46(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;    }
+#line 2305 "smarty_internal_templateparser.php"
 #line 281 "smarty_internal_templateparser.y"
-    function yy_r48(){ $this->_retvalue = $this->compiler->compileTag('for',array_merge(array('start'=>$this->yystack[$this->yyidx + -4]->minor,'to'=>$this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2220 "smarty_internal_templateparser.php"
+    function yy_r47(){ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -4]->minor),array('to'=>$this->yystack[$this->yyidx + -2]->minor))),0);    }
+#line 2308 "smarty_internal_templateparser.php"
 #line 282 "smarty_internal_templateparser.y"
-    function yy_r49(){ $this->_retvalue = $this->compiler->compileTag('for',array('start'=>$this->yystack[$this->yyidx + -5]->minor,'to'=>$this->yystack[$this->yyidx + -3]->minor,'step'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2223 "smarty_internal_templateparser.php"
+    function yy_r48(){ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('to'=>$this->yystack[$this->yyidx + -4]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),0);    }
+#line 2311 "smarty_internal_templateparser.php"
 #line 284 "smarty_internal_templateparser.y"
-    function yy_r50(){ $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor);    }
-#line 2226 "smarty_internal_templateparser.php"
+    function yy_r49(){ $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor);    }
+#line 2314 "smarty_internal_templateparser.php"
 #line 286 "smarty_internal_templateparser.y"
-    function yy_r51(){
-                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array('from'=>$this->yystack[$this->yyidx + -4]->minor,'item'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2230 "smarty_internal_templateparser.php"
+    function yy_r50(){
+                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));    }
+#line 2318 "smarty_internal_templateparser.php"
 #line 288 "smarty_internal_templateparser.y"
-    function yy_r52(){
-                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array('from'=>$this->yystack[$this->yyidx + -7]->minor,'item'=>$this->yystack[$this->yyidx + -1]->minor,'key'=>$this->yystack[$this->yyidx + -4]->minor));    }
-#line 2234 "smarty_internal_templateparser.php"
+    function yy_r51(){
+                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));    }
+#line 2322 "smarty_internal_templateparser.php"
 #line 290 "smarty_internal_templateparser.y"
-    function yy_r53(){ 
-                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array('from'=>$this->yystack[$this->yyidx + -4]->minor,'item'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2238 "smarty_internal_templateparser.php"
+    function yy_r52(){ 
+                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));    }
+#line 2326 "smarty_internal_templateparser.php"
 #line 292 "smarty_internal_templateparser.y"
-    function yy_r54(){ 
-                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array('from'=>$this->yystack[$this->yyidx + -7]->minor,'item'=>$this->yystack[$this->yyidx + -1]->minor,'key'=>$this->yystack[$this->yyidx + -4]->minor));    }
-#line 2242 "smarty_internal_templateparser.php"
+    function yy_r53(){ 
+                                                            $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));    }
+#line 2330 "smarty_internal_templateparser.php"
 #line 296 "smarty_internal_templateparser.y"
+    function yy_r54(){ $this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler);    }
+#line 2333 "smarty_internal_templateparser.php"
+#line 300 "smarty_internal_templateparser.y"
     function yy_r55(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array());    }
-#line 2245 "smarty_internal_templateparser.php"
-#line 297 "smarty_internal_templateparser.y"
+#line 2336 "smarty_internal_templateparser.php"
+#line 301 "smarty_internal_templateparser.y"
     function yy_r56(){ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',$this->yystack[$this->yyidx + -1]->minor);    }
-#line 2248 "smarty_internal_templateparser.php"
-#line 298 "smarty_internal_templateparser.y"
-    function yy_r57(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor.'close',$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
-                                                                                         $this->_retvalue .= $this->compiler->compileTag('private_modifier',array('modifier'=>$this->yystack[$this->yyidx + -3]->minor,'params'=>'ob_get_clean()'.$this->yystack[$this->yyidx + -2]->minor)).'?>';
-                                                                                          }
-#line 2253 "smarty_internal_templateparser.php"
+#line 2339 "smarty_internal_templateparser.php"
 #line 302 "smarty_internal_templateparser.y"
-    function yy_r58(){  $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor));    }
-#line 2256 "smarty_internal_templateparser.php"
-#line 308 "smarty_internal_templateparser.y"
-    function yy_r59(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[key($this->yystack[$this->yyidx + 0]->minor)] = $this->yystack[$this->yyidx + 0]->minor[key($this->yystack[$this->yyidx + 0]->minor)];    }
-#line 2259 "smarty_internal_templateparser.php"
+    function yy_r57(){  $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
+                                                                                         $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
+                                                                                          }
+#line 2344 "smarty_internal_templateparser.php"
+#line 306 "smarty_internal_templateparser.y"
+    function yy_r58(){  $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor));    }
+#line 2347 "smarty_internal_templateparser.php"
 #line 312 "smarty_internal_templateparser.y"
+    function yy_r59(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;    }
+#line 2350 "smarty_internal_templateparser.php"
+#line 314 "smarty_internal_templateparser.y"
+    function yy_r60(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);    }
+#line 2353 "smarty_internal_templateparser.php"
+#line 316 "smarty_internal_templateparser.y"
     function yy_r61(){ $this->_retvalue = array();    }
-#line 2262 "smarty_internal_templateparser.php"
-#line 315 "smarty_internal_templateparser.y"
+#line 2356 "smarty_internal_templateparser.php"
+#line 319 "smarty_internal_templateparser.y"
     function yy_r62(){ if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
                                                   $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'true');
                                                  } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
@@ -2273,84 +2367,84 @@ static public $yy_action = array(
                                                   $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'null');
                                                  } else
                                                   $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>"'".$this->yystack[$this->yyidx + 0]->minor."'");    }
-#line 2272 "smarty_internal_templateparser.php"
-#line 323 "smarty_internal_templateparser.y"
-    function yy_r63(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);    }
-#line 2275 "smarty_internal_templateparser.php"
-#line 326 "smarty_internal_templateparser.y"
-    function yy_r66(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor=>'true');    }
-#line 2278 "smarty_internal_templateparser.php"
+#line 2366 "smarty_internal_templateparser.php"
 #line 327 "smarty_internal_templateparser.y"
-    function yy_r67(){$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);    }
-#line 2281 "smarty_internal_templateparser.php"
-#line 333 "smarty_internal_templateparser.y"
-    function yy_r68(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);    }
-#line 2284 "smarty_internal_templateparser.php"
-#line 334 "smarty_internal_templateparser.y"
-    function yy_r69(){ $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;    }
-#line 2287 "smarty_internal_templateparser.php"
-#line 336 "smarty_internal_templateparser.y"
-    function yy_r70(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor);    }
-#line 2290 "smarty_internal_templateparser.php"
-#line 345 "smarty_internal_templateparser.y"
-    function yy_r72(){$this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')';    }
-#line 2293 "smarty_internal_templateparser.php"
-#line 347 "smarty_internal_templateparser.y"
-    function yy_r73(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor;     }
-#line 2296 "smarty_internal_templateparser.php"
-#line 353 "smarty_internal_templateparser.y"
-    function yy_r76(){$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;    }
-#line 2299 "smarty_internal_templateparser.php"
-#line 357 "smarty_internal_templateparser.y"
-    function yy_r77(){  $this->_retvalue = $this->compiler->compileTag('private_modifier',array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor));     }
-#line 2302 "smarty_internal_templateparser.php"
-#line 362 "smarty_internal_templateparser.y"
-    function yy_r78(){$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2305 "smarty_internal_templateparser.php"
+    function yy_r63(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);    }
+#line 2369 "smarty_internal_templateparser.php"
+#line 329 "smarty_internal_templateparser.y"
+    function yy_r65(){ $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";    }
+#line 2372 "smarty_internal_templateparser.php"
+#line 332 "smarty_internal_templateparser.y"
+    function yy_r68(){$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);    }
+#line 2375 "smarty_internal_templateparser.php"
+#line 339 "smarty_internal_templateparser.y"
+    function yy_r70(){ $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;    }
+#line 2378 "smarty_internal_templateparser.php"
+#line 341 "smarty_internal_templateparser.y"
+    function yy_r71(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor);    }
+#line 2381 "smarty_internal_templateparser.php"
+#line 352 "smarty_internal_templateparser.y"
+    function yy_r74(){$this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')';    }
+#line 2384 "smarty_internal_templateparser.php"
+#line 354 "smarty_internal_templateparser.y"
+    function yy_r75(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor;     }
+#line 2387 "smarty_internal_templateparser.php"
+#line 360 "smarty_internal_templateparser.y"
+    function yy_r78(){$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;    }
+#line 2390 "smarty_internal_templateparser.php"
 #line 363 "smarty_internal_templateparser.y"
-    function yy_r79(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2308 "smarty_internal_templateparser.php"
-#line 364 "smarty_internal_templateparser.y"
-    function yy_r80(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2311 "smarty_internal_templateparser.php"
-#line 366 "smarty_internal_templateparser.y"
-    function yy_r82(){$this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2314 "smarty_internal_templateparser.php"
+    function yy_r79(){  $this->_retvalue = $this->compiler->compileTag('private_modifier',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor));     }
+#line 2393 "smarty_internal_templateparser.php"
 #line 367 "smarty_internal_templateparser.y"
-    function yy_r83(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2317 "smarty_internal_templateparser.php"
+    function yy_r80(){$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2396 "smarty_internal_templateparser.php"
 #line 368 "smarty_internal_templateparser.y"
-    function yy_r84(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';    }
-#line 2320 "smarty_internal_templateparser.php"
+    function yy_r81(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2399 "smarty_internal_templateparser.php"
 #line 369 "smarty_internal_templateparser.y"
-    function yy_r85(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';    }
-#line 2323 "smarty_internal_templateparser.php"
-#line 370 "smarty_internal_templateparser.y"
-    function yy_r86(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2326 "smarty_internal_templateparser.php"
+    function yy_r82(){$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2402 "smarty_internal_templateparser.php"
 #line 371 "smarty_internal_templateparser.y"
-    function yy_r87(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';    }
-#line 2329 "smarty_internal_templateparser.php"
-#line 377 "smarty_internal_templateparser.y"
-    function yy_r93(){$this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>'; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number;    }
-#line 2332 "smarty_internal_templateparser.php"
-#line 383 "smarty_internal_templateparser.y"
-    function yy_r94(){ $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2335 "smarty_internal_templateparser.php"
-#line 390 "smarty_internal_templateparser.y"
-    function yy_r97(){ $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2338 "smarty_internal_templateparser.php"
+    function yy_r84(){$this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2405 "smarty_internal_templateparser.php"
+#line 372 "smarty_internal_templateparser.y"
+    function yy_r85(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2408 "smarty_internal_templateparser.php"
+#line 373 "smarty_internal_templateparser.y"
+    function yy_r86(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';    }
+#line 2411 "smarty_internal_templateparser.php"
+#line 374 "smarty_internal_templateparser.y"
+    function yy_r87(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';    }
+#line 2414 "smarty_internal_templateparser.php"
+#line 375 "smarty_internal_templateparser.y"
+    function yy_r88(){$this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2417 "smarty_internal_templateparser.php"
+#line 376 "smarty_internal_templateparser.y"
+    function yy_r89(){$this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';    }
+#line 2420 "smarty_internal_templateparser.php"
+#line 382 "smarty_internal_templateparser.y"
+    function yy_r95(){$this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>'; $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number;    }
+#line 2423 "smarty_internal_templateparser.php"
+#line 388 "smarty_internal_templateparser.y"
+    function yy_r96(){ $this->_retvalue = $this->yystack[$this->yyidx + -6]->minor.' ? $_smarty_tpl->getVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'\')->value : '.$this->yystack[$this->yyidx + 0]->minor;  $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable('$this->yystack[$this->yyidx + -2]->minor', null, true, false)->nocache;    }
+#line 2426 "smarty_internal_templateparser.php"
+#line 389 "smarty_internal_templateparser.y"
+    function yy_r97(){ $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2429 "smarty_internal_templateparser.php"
 #line 396 "smarty_internal_templateparser.y"
-    function yy_r102(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2341 "smarty_internal_templateparser.php"
-#line 397 "smarty_internal_templateparser.y"
-    function yy_r103(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';     }
-#line 2344 "smarty_internal_templateparser.php"
-#line 398 "smarty_internal_templateparser.y"
-    function yy_r104(){ $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2347 "smarty_internal_templateparser.php"
-#line 400 "smarty_internal_templateparser.y"
-    function yy_r105(){ if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+    function yy_r100(){ $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;     }
+#line 2432 "smarty_internal_templateparser.php"
+#line 402 "smarty_internal_templateparser.y"
+    function yy_r105(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;     }
+#line 2435 "smarty_internal_templateparser.php"
+#line 403 "smarty_internal_templateparser.y"
+    function yy_r106(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';     }
+#line 2438 "smarty_internal_templateparser.php"
+#line 404 "smarty_internal_templateparser.y"
+    function yy_r107(){ $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;     }
+#line 2441 "smarty_internal_templateparser.php"
+#line 406 "smarty_internal_templateparser.y"
+    function yy_r108(){ if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
                                 $this->_retvalue = 'true';
                                } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
                                 $this->_retvalue = 'false';
@@ -2358,12 +2452,12 @@ static public $yy_action = array(
                                 $this->_retvalue = 'null';
                                } else
                                $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";     }
-#line 2357 "smarty_internal_templateparser.php"
-#line 411 "smarty_internal_templateparser.y"
-    function yy_r107(){ $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")";     }
-#line 2360 "smarty_internal_templateparser.php"
+#line 2451 "smarty_internal_templateparser.php"
 #line 417 "smarty_internal_templateparser.y"
-    function yy_r110(){if ((!$this->template->security || $this->smarty->security_handler->isTrustedStaticClass($this->yystack[$this->yyidx + -2]->minor, $this->compiler)) || isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
+    function yy_r110(){ $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")";     }
+#line 2454 "smarty_internal_templateparser.php"
+#line 423 "smarty_internal_templateparser.y"
+    function yy_r113(){if (!$this->security || isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor]) || $this->smarty->security_policy->isTrustedStaticClass($this->yystack[$this->yyidx + -2]->minor, $this->compiler)) {
                                                                                                                                                                                   if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
                                                                   $this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor;
                                                                                                                                                                                   } else {
@@ -2373,236 +2467,274 @@ static public $yy_action = array(
                                                                  $this->compiler->trigger_template_error ("static class '".$this->yystack[$this->yyidx + -2]->minor."' is undefined or not allowed by security setting");
                                                                 }
                                                                    }
-#line 2372 "smarty_internal_templateparser.php"
-#line 427 "smarty_internal_templateparser.y"
-    function yy_r111(){ if ($this->yystack[$this->yyidx + -2]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index']).'::'.$this->yystack[$this->yyidx + 0]->minor;} else {
+#line 2466 "smarty_internal_templateparser.php"
+#line 433 "smarty_internal_templateparser.y"
+    function yy_r114(){ if ($this->yystack[$this->yyidx + -2]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index']).'::'.$this->yystack[$this->yyidx + 0]->minor;} else {
                                                          $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor['var'] .')->value'.$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index'].'::'.$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor['var'],"'"), null, true, false)->nocache;}    }
-#line 2376 "smarty_internal_templateparser.php"
-#line 430 "smarty_internal_templateparser.y"
-    function yy_r112(){ $this->prefix_number++; $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>'; $this->_retvalue = '$_tmp'.$this->prefix_number;     }
-#line 2379 "smarty_internal_templateparser.php"
-#line 439 "smarty_internal_templateparser.y"
-    function yy_r113(){if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
+#line 2470 "smarty_internal_templateparser.php"
+#line 436 "smarty_internal_templateparser.y"
+    function yy_r115(){ $this->prefix_number++; $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>'; $this->_retvalue = '$_tmp'.$this->prefix_number;     }
+#line 2473 "smarty_internal_templateparser.php"
+#line 445 "smarty_internal_templateparser.y"
+    function yy_r116(){if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
                                       } else {
                                       if (isset($this->compiler->local_var[$this->yystack[$this->yyidx + 0]->minor['var']])) {
-                                          $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + 0]->minor['var'] .']->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+                                          $this->_retvalue = '(isset($_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + 0]->minor['var'] .']->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'].') ? $_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + 0]->minor['var'] .']->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'].' : null)';
+                                       } else {
+                                         if (isset($this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'])) {
+                                            $this->_retvalue = '(isset($_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor['var'] .')->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'].') ? $_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor['var'] .')->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'].' : null)';
                                          } else {
-                                          $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor['var'] .')->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+                                            $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor['var'] .')->value'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
                                          }
+                                       }
                                        $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + 0]->minor['var'],"'"), null, true, false)->nocache;}    }
-#line 2389 "smarty_internal_templateparser.php"
-#line 448 "smarty_internal_templateparser.y"
-    function yy_r114(){if (isset($this->compiler->local_var[$this->yystack[$this->yyidx + -2]->minor])) {
+#line 2487 "smarty_internal_templateparser.php"
+#line 458 "smarty_internal_templateparser.y"
+    function yy_r117(){if (isset($this->compiler->local_var[$this->yystack[$this->yyidx + -2]->minor])) {
                                                   $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + -2]->minor .']->'.$this->yystack[$this->yyidx + 0]->minor;
                                                  } else {
                                                   $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor;
                                                  }
                                                   $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor,"'"), null, true, false)->nocache;    }
-#line 2397 "smarty_internal_templateparser.php"
-#line 457 "smarty_internal_templateparser.y"
-    function yy_r116(){$this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')';    }
-#line 2400 "smarty_internal_templateparser.php"
-#line 458 "smarty_internal_templateparser.y"
-    function yy_r117(){$this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')';    }
-#line 2403 "smarty_internal_templateparser.php"
-#line 461 "smarty_internal_templateparser.y"
-    function yy_r118(){$this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);    }
-#line 2406 "smarty_internal_templateparser.php"
+#line 2495 "smarty_internal_templateparser.php"
 #line 467 "smarty_internal_templateparser.y"
-    function yy_r119(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2409 "smarty_internal_templateparser.php"
-#line 469 "smarty_internal_templateparser.y"
-    function yy_r120(){return;    }
-#line 2412 "smarty_internal_templateparser.php"
-#line 473 "smarty_internal_templateparser.y"
-    function yy_r121(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor .')->value]'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable('$this->yystack[$this->yyidx + 0]->minor', null, true, false)->nocache;    }
-#line 2415 "smarty_internal_templateparser.php"
-#line 474 "smarty_internal_templateparser.y"
-    function yy_r122(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor.']'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor,"'"), null, true, false)->nocache;    }
-#line 2418 "smarty_internal_templateparser.php"
-#line 475 "smarty_internal_templateparser.y"
-    function yy_r123(){ $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']";    }
-#line 2421 "smarty_internal_templateparser.php"
-#line 476 "smarty_internal_templateparser.y"
-    function yy_r124(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]";    }
-#line 2424 "smarty_internal_templateparser.php"
+    function yy_r119(){$this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')';    }
+#line 2498 "smarty_internal_templateparser.php"
+#line 468 "smarty_internal_templateparser.y"
+    function yy_r120(){$this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')';    }
+#line 2501 "smarty_internal_templateparser.php"
+#line 471 "smarty_internal_templateparser.y"
+    function yy_r121(){$this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);    }
+#line 2504 "smarty_internal_templateparser.php"
 #line 477 "smarty_internal_templateparser.y"
-    function yy_r125(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]";    }
-#line 2427 "smarty_internal_templateparser.php"
+    function yy_r122(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2507 "smarty_internal_templateparser.php"
 #line 479 "smarty_internal_templateparser.y"
-    function yy_r126(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable','[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';    }
-#line 2430 "smarty_internal_templateparser.php"
-#line 480 "smarty_internal_templateparser.y"
-    function yy_r127(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable','[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';    }
-#line 2433 "smarty_internal_templateparser.php"
+    function yy_r123(){return;    }
+#line 2510 "smarty_internal_templateparser.php"
+#line 483 "smarty_internal_templateparser.y"
+    function yy_r124(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + 0]->minor .')->value]'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable('$this->yystack[$this->yyidx + 0]->minor', null, true, false)->nocache;    }
+#line 2513 "smarty_internal_templateparser.php"
 #line 484 "smarty_internal_templateparser.y"
-    function yy_r129(){$this->_retvalue = '[]';    }
-#line 2436 "smarty_internal_templateparser.php"
-#line 492 "smarty_internal_templateparser.y"
-    function yy_r131(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2439 "smarty_internal_templateparser.php"
+    function yy_r125(){ $this->_retvalue = '[$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor.']'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -2]->minor,"'"), null, true, false)->nocache;    }
+#line 2516 "smarty_internal_templateparser.php"
+#line 485 "smarty_internal_templateparser.y"
+    function yy_r126(){ $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']";    }
+#line 2519 "smarty_internal_templateparser.php"
+#line 486 "smarty_internal_templateparser.y"
+    function yy_r127(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]";    }
+#line 2522 "smarty_internal_templateparser.php"
+#line 487 "smarty_internal_templateparser.y"
+    function yy_r128(){ $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]";    }
+#line 2525 "smarty_internal_templateparser.php"
+#line 489 "smarty_internal_templateparser.y"
+    function yy_r129(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';    }
+#line 2528 "smarty_internal_templateparser.php"
+#line 490 "smarty_internal_templateparser.y"
+    function yy_r130(){ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';    }
+#line 2531 "smarty_internal_templateparser.php"
 #line 494 "smarty_internal_templateparser.y"
-    function yy_r132(){$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';    }
-#line 2442 "smarty_internal_templateparser.php"
-#line 496 "smarty_internal_templateparser.y"
-    function yy_r133(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';    }
-#line 2445 "smarty_internal_templateparser.php"
-#line 501 "smarty_internal_templateparser.y"
-    function yy_r134(){ if ($this->yystack[$this->yyidx + -1]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;} else {
-                                                         $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor['var'] .')->value'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor['var'],"'"), null, true, false)->nocache;}    }
-#line 2449 "smarty_internal_templateparser.php"
+    function yy_r132(){$this->_retvalue = '[]';    }
+#line 2534 "smarty_internal_templateparser.php"
+#line 502 "smarty_internal_templateparser.y"
+    function yy_r134(){$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2537 "smarty_internal_templateparser.php"
 #line 504 "smarty_internal_templateparser.y"
-    function yy_r135(){$this->_retvalue  = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 2452 "smarty_internal_templateparser.php"
+    function yy_r135(){$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';    }
+#line 2540 "smarty_internal_templateparser.php"
 #line 506 "smarty_internal_templateparser.y"
-    function yy_r136(){$this->_retvalue  = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2455 "smarty_internal_templateparser.php"
-#line 508 "smarty_internal_templateparser.y"
-    function yy_r137(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2458 "smarty_internal_templateparser.php"
-#line 509 "smarty_internal_templateparser.y"
-    function yy_r138(){ $this->_retvalue = '->{$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor .')->value'.$this->yystack[$this->yyidx + 0]->minor.'}'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor,"'"), null, true, false)->nocache;    }
-#line 2461 "smarty_internal_templateparser.php"
-#line 510 "smarty_internal_templateparser.y"
-    function yy_r139(){ $this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';    }
-#line 2464 "smarty_internal_templateparser.php"
+    function yy_r136(){$this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';    }
+#line 2543 "smarty_internal_templateparser.php"
 #line 511 "smarty_internal_templateparser.y"
-    function yy_r140(){ $this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';    }
-#line 2467 "smarty_internal_templateparser.php"
-#line 513 "smarty_internal_templateparser.y"
-    function yy_r141(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2470 "smarty_internal_templateparser.php"
-#line 519 "smarty_internal_templateparser.y"
-    function yy_r142(){if (!$this->template->security || $this->smarty->security_handler->isTrustedPhpFunction($this->yystack[$this->yyidx + -3]->minor, $this->compiler)) {
-                                                                                                                                                                                   if ($this->yystack[$this->yyidx + -3]->minor == 'isset' || $this->yystack[$this->yyidx + -3]->minor == 'empty' || $this->yystack[$this->yyidx + -3]->minor == 'array' || is_callable($this->yystack[$this->yyidx + -3]->minor)) {
-                                                                                                                                                                                       $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $this->yystack[$this->yyidx + -1]->minor .")";
+    function yy_r137(){ if ($this->yystack[$this->yyidx + -1]->minor['var'] == '\'smarty\'') { $this->_retvalue =  $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;} else {
+                                                         $this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor['var'] .')->value'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor['var'],"'"), null, true, false)->nocache;}    }
+#line 2547 "smarty_internal_templateparser.php"
+#line 514 "smarty_internal_templateparser.y"
+    function yy_r138(){$this->_retvalue  = $this->yystack[$this->yyidx + 0]->minor;     }
+#line 2550 "smarty_internal_templateparser.php"
+#line 516 "smarty_internal_templateparser.y"
+    function yy_r139(){$this->_retvalue  = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;     }
+#line 2553 "smarty_internal_templateparser.php"
+#line 518 "smarty_internal_templateparser.y"
+    function yy_r140(){if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) == '_') {
+                                                      $this->compiler->trigger_template_error (self::Err1);
+                                                                                                                                                                                                          }
+                                                     $this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+                                                         }
+#line 2560 "smarty_internal_templateparser.php"
+#line 523 "smarty_internal_templateparser.y"
+    function yy_r141(){if ($this->security) {
+                                                                 $this->compiler->trigger_template_error (self::Err2);
+                                                                                                                                                                                                                                                        }
+                                                               $this->_retvalue = '->{$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -1]->minor .')->value'.$this->yystack[$this->yyidx + 0]->minor.'}'; $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable(trim($this->yystack[$this->yyidx + -1]->minor,"'"), null, true, false)->nocache;
+                                                                   }
+#line 2567 "smarty_internal_templateparser.php"
+#line 528 "smarty_internal_templateparser.y"
+    function yy_r142(){if ($this->security) {
+                                                                 $this->compiler->trigger_template_error (self::Err2);
+                                                                                                                                                                                                                                                          }
+                                                                                                                                                                                                $this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
+                                                                                                                                                                                                   }
+#line 2574 "smarty_internal_templateparser.php"
+#line 533 "smarty_internal_templateparser.y"
+    function yy_r143(){if ($this->security) {
+                                                                         $this->compiler->trigger_template_error (self::Err2);
+                                                                                                                                                                                                                                                                }
+                                                                       $this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
+                                                                          }
+#line 2581 "smarty_internal_templateparser.php"
+#line 539 "smarty_internal_templateparser.y"
+    function yy_r144(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2584 "smarty_internal_templateparser.php"
+#line 545 "smarty_internal_templateparser.y"
+    function yy_r145(){if (!$this->security || $this->smarty->security_policy->isTrustedPhpFunction($this->yystack[$this->yyidx + -3]->minor, $this->compiler)) {
+                                                                                                                                                                                   if (strcasecmp($this->yystack[$this->yyidx + -3]->minor,'isset') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'empty') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'array') === 0 || is_callable($this->yystack[$this->yyidx + -3]->minor)) {
+                                                                                                                                                                                       if (strcasecmp($this->yystack[$this->yyidx + -3]->minor,'isset') === 0) {
+                                                                                                                                                                                         $this->_retvalue = '('. $this->yystack[$this->yyidx + -1]->minor .' !== null)';
+                                                                                                                                                                                       } elseif (strcasecmp($this->yystack[$this->yyidx + -3]->minor,'empty') === 0){
+                                                                                                                                                                                          $this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + -1]->minor.';?>';
+                                                                                                                                                                                         $this->_retvalue = 'empty($_tmp'.$this->prefix_number.')';
+                                                                                                                                                                                       } else {
+                                                                                                                                                                                         $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $this->yystack[$this->yyidx + -1]->minor .")";
+                                                                                                                                                                                       }
                                                                                                                                                                                    } else {
                                                        $this->compiler->trigger_template_error ("unknown function \"" . $this->yystack[$this->yyidx + -3]->minor . "\"");
                                                       }
                                                     }    }
-#line 2479 "smarty_internal_templateparser.php"
-#line 530 "smarty_internal_templateparser.y"
-    function yy_r143(){ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $this->yystack[$this->yyidx + -1]->minor .")";    }
-#line 2482 "smarty_internal_templateparser.php"
-#line 531 "smarty_internal_templateparser.y"
-    function yy_r144(){ $this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'=$_smarty_tpl->getVariable(\''. $this->yystack[$this->yyidx + -3]->minor .'\')->value;?>'; $this->_retvalue = '$_tmp'.$this->prefix_number.'('. $this->yystack[$this->yyidx + -1]->minor .')';    }
-#line 2485 "smarty_internal_templateparser.php"
-#line 535 "smarty_internal_templateparser.y"
-    function yy_r145(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.",".$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2488 "smarty_internal_templateparser.php"
-#line 539 "smarty_internal_templateparser.y"
-    function yy_r147(){ return;    }
-#line 2491 "smarty_internal_templateparser.php"
-#line 544 "smarty_internal_templateparser.y"
-    function yy_r148(){$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor));    }
-#line 2494 "smarty_internal_templateparser.php"
-#line 545 "smarty_internal_templateparser.y"
-    function yy_r149(){$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor);    }
-#line 2497 "smarty_internal_templateparser.php"
-#line 548 "smarty_internal_templateparser.y"
-    function yy_r151(){ $this->_retvalue =  $this->yystack[$this->yyidx + 0]->minor;    }
-#line 2500 "smarty_internal_templateparser.php"
-#line 553 "smarty_internal_templateparser.y"
-    function yy_r152(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2503 "smarty_internal_templateparser.php"
-#line 555 "smarty_internal_templateparser.y"
-    function yy_r153(){$this->_retvalue = '';    }
-#line 2506 "smarty_internal_templateparser.php"
-#line 557 "smarty_internal_templateparser.y"
-    function yy_r154(){$this->_retvalue = ':'.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2509 "smarty_internal_templateparser.php"
-#line 567 "smarty_internal_templateparser.y"
-    function yy_r159(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2512 "smarty_internal_templateparser.php"
-#line 569 "smarty_internal_templateparser.y"
-    function yy_r160(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2515 "smarty_internal_templateparser.php"
-#line 578 "smarty_internal_templateparser.y"
-    function yy_r161(){$this->_retvalue = '==';    }
-#line 2518 "smarty_internal_templateparser.php"
-#line 579 "smarty_internal_templateparser.y"
-    function yy_r162(){$this->_retvalue = '!=';    }
-#line 2521 "smarty_internal_templateparser.php"
+#line 2600 "smarty_internal_templateparser.php"
+#line 563 "smarty_internal_templateparser.y"
+    function yy_r146(){if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) == '_') {
+                                                      $this->compiler->trigger_template_error (self::Err1);
+                                                                                                                                                                                                        }
+                                                   $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $this->yystack[$this->yyidx + -1]->minor .")";
+                                                      }
+#line 2607 "smarty_internal_templateparser.php"
+#line 568 "smarty_internal_templateparser.y"
+    function yy_r147(){if ($this->security) {
+                                                              $this->compiler->trigger_template_error (self::Err2);
+                                                                                                                                                                                                                                        }
+                                                           $this->prefix_number++; $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'=$_smarty_tpl->getVariable(\''. $this->yystack[$this->yyidx + -3]->minor .'\')->value;?>'; $this->_retvalue = '$_tmp'.$this->prefix_number.'('. $this->yystack[$this->yyidx + -1]->minor .')';
+                                                              }
+#line 2614 "smarty_internal_templateparser.php"
+#line 576 "smarty_internal_templateparser.y"
+    function yy_r148(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.",".$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2617 "smarty_internal_templateparser.php"
 #line 580 "smarty_internal_templateparser.y"
-    function yy_r163(){$this->_retvalue = '>';    }
-#line 2524 "smarty_internal_templateparser.php"
-#line 581 "smarty_internal_templateparser.y"
-    function yy_r164(){$this->_retvalue = '<';    }
-#line 2527 "smarty_internal_templateparser.php"
-#line 582 "smarty_internal_templateparser.y"
-    function yy_r165(){$this->_retvalue = '>=';    }
-#line 2530 "smarty_internal_templateparser.php"
-#line 583 "smarty_internal_templateparser.y"
-    function yy_r166(){$this->_retvalue = '<=';    }
-#line 2533 "smarty_internal_templateparser.php"
-#line 584 "smarty_internal_templateparser.y"
-    function yy_r167(){$this->_retvalue = '===';    }
-#line 2536 "smarty_internal_templateparser.php"
+    function yy_r150(){ return;    }
+#line 2620 "smarty_internal_templateparser.php"
 #line 585 "smarty_internal_templateparser.y"
-    function yy_r168(){$this->_retvalue = '!==';    }
-#line 2539 "smarty_internal_templateparser.php"
+    function yy_r151(){$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)));    }
+#line 2623 "smarty_internal_templateparser.php"
 #line 586 "smarty_internal_templateparser.y"
-    function yy_r169(){$this->_retvalue = '%';    }
-#line 2542 "smarty_internal_templateparser.php"
-#line 588 "smarty_internal_templateparser.y"
-    function yy_r170(){$this->_retvalue = '&&';    }
-#line 2545 "smarty_internal_templateparser.php"
+    function yy_r152(){$this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));    }
+#line 2626 "smarty_internal_templateparser.php"
 #line 589 "smarty_internal_templateparser.y"
-    function yy_r171(){$this->_retvalue = '||';    }
-#line 2548 "smarty_internal_templateparser.php"
-#line 590 "smarty_internal_templateparser.y"
-    function yy_r172(){$this->_retvalue = ' XOR ';    }
-#line 2551 "smarty_internal_templateparser.php"
-#line 595 "smarty_internal_templateparser.y"
-    function yy_r173(){ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';    }
-#line 2554 "smarty_internal_templateparser.php"
-#line 597 "smarty_internal_templateparser.y"
-    function yy_r175(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;     }
-#line 2557 "smarty_internal_templateparser.php"
+    function yy_r154(){ $this->_retvalue =  array($this->yystack[$this->yyidx + 0]->minor);    }
+#line 2629 "smarty_internal_templateparser.php"
+#line 594 "smarty_internal_templateparser.y"
+    function yy_r155(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);    }
+#line 2632 "smarty_internal_templateparser.php"
+#line 596 "smarty_internal_templateparser.y"
+    function yy_r156(){$this->_retvalue = array();    }
+#line 2635 "smarty_internal_templateparser.php"
 #line 598 "smarty_internal_templateparser.y"
-    function yy_r176(){ return;     }
-#line 2560 "smarty_internal_templateparser.php"
-#line 599 "smarty_internal_templateparser.y"
-    function yy_r177(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2563 "smarty_internal_templateparser.php"
-#line 600 "smarty_internal_templateparser.y"
-    function yy_r178(){ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;    }
-#line 2566 "smarty_internal_templateparser.php"
-#line 607 "smarty_internal_templateparser.y"
-    function yy_r180(){ $this->_retvalue = "''";     }
-#line 2569 "smarty_internal_templateparser.php"
+    function yy_r157(){$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);    }
+#line 2638 "smarty_internal_templateparser.php"
 #line 608 "smarty_internal_templateparser.y"
-    function yy_r181(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php();     }
-#line 2572 "smarty_internal_templateparser.php"
+    function yy_r162(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2641 "smarty_internal_templateparser.php"
 #line 610 "smarty_internal_templateparser.y"
-    function yy_r182(){ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
-#line 2575 "smarty_internal_templateparser.php"
-#line 611 "smarty_internal_templateparser.y"
-    function yy_r183(){ $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2578 "smarty_internal_templateparser.php"
-#line 613 "smarty_internal_templateparser.y"
-    function yy_r184(){ $this->_retvalue = new _smarty_code($this, $this->yystack[$this->yyidx + -1]->minor);     }
-#line 2581 "smarty_internal_templateparser.php"
-#line 615 "smarty_internal_templateparser.y"
-    function yy_r186(){if (isset($this->compiler->local_var["'".substr($this->yystack[$this->yyidx + 0]->minor,1)."'"])) {
+    function yy_r163(){ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2644 "smarty_internal_templateparser.php"
+#line 619 "smarty_internal_templateparser.y"
+    function yy_r164(){$this->_retvalue = '==';    }
+#line 2647 "smarty_internal_templateparser.php"
+#line 620 "smarty_internal_templateparser.y"
+    function yy_r165(){$this->_retvalue = '!=';    }
+#line 2650 "smarty_internal_templateparser.php"
+#line 621 "smarty_internal_templateparser.y"
+    function yy_r166(){$this->_retvalue = '>';    }
+#line 2653 "smarty_internal_templateparser.php"
+#line 622 "smarty_internal_templateparser.y"
+    function yy_r167(){$this->_retvalue = '<';    }
+#line 2656 "smarty_internal_templateparser.php"
+#line 623 "smarty_internal_templateparser.y"
+    function yy_r168(){$this->_retvalue = '>=';    }
+#line 2659 "smarty_internal_templateparser.php"
+#line 624 "smarty_internal_templateparser.y"
+    function yy_r169(){$this->_retvalue = '<=';    }
+#line 2662 "smarty_internal_templateparser.php"
+#line 625 "smarty_internal_templateparser.y"
+    function yy_r170(){$this->_retvalue = '===';    }
+#line 2665 "smarty_internal_templateparser.php"
+#line 626 "smarty_internal_templateparser.y"
+    function yy_r171(){$this->_retvalue = '!==';    }
+#line 2668 "smarty_internal_templateparser.php"
+#line 627 "smarty_internal_templateparser.y"
+    function yy_r172(){$this->_retvalue = '%';    }
+#line 2671 "smarty_internal_templateparser.php"
+#line 629 "smarty_internal_templateparser.y"
+    function yy_r173(){$this->_retvalue = '&&';    }
+#line 2674 "smarty_internal_templateparser.php"
+#line 630 "smarty_internal_templateparser.y"
+    function yy_r174(){$this->_retvalue = '||';    }
+#line 2677 "smarty_internal_templateparser.php"
+#line 631 "smarty_internal_templateparser.y"
+    function yy_r175(){$this->_retvalue = ' XOR ';    }
+#line 2680 "smarty_internal_templateparser.php"
+#line 636 "smarty_internal_templateparser.y"
+    function yy_r176(){ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';    }
+#line 2683 "smarty_internal_templateparser.php"
+#line 638 "smarty_internal_templateparser.y"
+    function yy_r178(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;     }
+#line 2686 "smarty_internal_templateparser.php"
+#line 639 "smarty_internal_templateparser.y"
+    function yy_r179(){ return;     }
+#line 2689 "smarty_internal_templateparser.php"
+#line 640 "smarty_internal_templateparser.y"
+    function yy_r180(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2692 "smarty_internal_templateparser.php"
+#line 641 "smarty_internal_templateparser.y"
+    function yy_r181(){ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;    }
+#line 2695 "smarty_internal_templateparser.php"
+#line 648 "smarty_internal_templateparser.y"
+    function yy_r183(){ $this->_retvalue = "''";     }
+#line 2698 "smarty_internal_templateparser.php"
+#line 649 "smarty_internal_templateparser.y"
+    function yy_r184(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php();     }
+#line 2701 "smarty_internal_templateparser.php"
+#line 651 "smarty_internal_templateparser.y"
+    function yy_r185(){ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
+#line 2704 "smarty_internal_templateparser.php"
+#line 652 "smarty_internal_templateparser.y"
+    function yy_r186(){ $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2707 "smarty_internal_templateparser.php"
+#line 654 "smarty_internal_templateparser.y"
+    function yy_r187(){ $this->_retvalue = new _smarty_code($this, $this->yystack[$this->yyidx + -1]->minor);     }
+#line 2710 "smarty_internal_templateparser.php"
+#line 656 "smarty_internal_templateparser.y"
+    function yy_r189(){if (isset($this->compiler->local_var["'".substr($this->yystack[$this->yyidx + 0]->minor,1)."'"])) {
                                                        $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value');
                                                       } else {
                                                        $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->getVariable(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')->value');
                                                       }
                                                       $this->compiler->tag_nocache = $this->compiler->tag_nocache | $this->template->getVariable(trim($this->yystack[$this->yyidx + 0]->minor,"'"), null, true, false)->nocache;
       }
-#line 2590 "smarty_internal_templateparser.php"
-#line 623 "smarty_internal_templateparser.y"
-    function yy_r188(){ $this->_retvalue = new _smarty_code($this, '('.$this->yystack[$this->yyidx + -1]->minor.')');     }
-#line 2593 "smarty_internal_templateparser.php"
-#line 624 "smarty_internal_templateparser.y"
-    function yy_r189(){
+#line 2719 "smarty_internal_templateparser.php"
+#line 664 "smarty_internal_templateparser.y"
+    function yy_r191(){ $this->_retvalue = new _smarty_code($this, '('.$this->yystack[$this->yyidx + -1]->minor.')');     }
+#line 2722 "smarty_internal_templateparser.php"
+#line 665 "smarty_internal_templateparser.y"
+    function yy_r192(){
    $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor);
       }
-#line 2598 "smarty_internal_templateparser.php"
-#line 627 "smarty_internal_templateparser.y"
-    function yy_r190(){ $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2601 "smarty_internal_templateparser.php"
+#line 2727 "smarty_internal_templateparser.php"
+#line 668 "smarty_internal_templateparser.y"
+    function yy_r193(){ $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2730 "smarty_internal_templateparser.php"
+#line 675 "smarty_internal_templateparser.y"
+    function yy_r195(){$this->_retvalue = '';    }
+#line 2733 "smarty_internal_templateparser.php"
 
     private $_retvalue;
 
@@ -2659,12 +2791,12 @@ static public $yy_action = array(
 
     function yy_syntax_error($yymajor, $TOKEN)
     {
-#line 75 "smarty_internal_templateparser.y"
+#line 77 "smarty_internal_templateparser.y"
 
     $this->internalError = true;
     $this->yymajor = $yymajor;
     $this->compiler->trigger_template_error();
-#line 2664 "smarty_internal_templateparser.php"
+#line 2796 "smarty_internal_templateparser.php"
     }
 
     function yy_accept()
@@ -2675,13 +2807,13 @@ static public $yy_action = array(
         while ($this->yyidx >= 0) {
             $stack = $this->yy_pop_parser_stack();
         }
-#line 67 "smarty_internal_templateparser.y"
+#line 69 "smarty_internal_templateparser.y"
 
     $this->successful = !$this->internalError;
     $this->internalError = false;
     $this->retvalue = $this->_retvalue;
     //echo $this->retvalue."\n\n";
-#line 2682 "smarty_internal_templateparser.php"
+#line 2814 "smarty_internal_templateparser.php"
     }
 
     function doParse($yymajor, $yytokenvalue)
index 01e5b2240b1230921f4c4105ece8680a099e03f9..3c64e58acb69621723d85e042ed5b57d5290a809 100644 (file)
@@ -60,6 +60,9 @@ class Smarty_Internal_Utility {
         $_error_count = 0; 
         // loop over array of template directories
         foreach((array)$this->smarty->template_dir as $_dir) {
+            if (strpos('/\\', substr($_dir, -1)) === false) {
+                $_dir .= DS;
+            } 
             $_compileDirs = new RecursiveDirectoryIterator($_dir);
             $_compile = new RecursiveIteratorIterator($_compileDirs);
             foreach ($_compile as $_fileinfo) {
@@ -69,7 +72,7 @@ class Smarty_Internal_Utility {
                 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
                    $_template_file = $_file;
                 } else {
-                    $_template_file = substr(substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file,1);
+                   $_template_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
                 }
                 echo '<br>', $_dir, '---', $_template_file;
                 flush();
@@ -118,6 +121,9 @@ class Smarty_Internal_Utility {
         $_error_count = 0; 
         // loop over array of template directories
         foreach((array)$this->smarty->config_dir as $_dir) {
+            if (strpos('/\\', substr($_dir, -1)) === false) {
+                $_dir .= DS;
+            } 
             $_compileDirs = new RecursiveDirectoryIterator($_dir);
             $_compile = new RecursiveIteratorIterator($_compileDirs);
             foreach ($_compile as $_fileinfo) {
@@ -127,7 +133,7 @@ class Smarty_Internal_Utility {
                 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
                     $_config_file = $_file;
                 } else {
-                    $_config_file = substr(substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file,1);
+                    $_config_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
                 } 
                 echo '<br>', $_dir, '---', $_config_file;
                 flush();
@@ -208,6 +214,19 @@ class Smarty_Internal_Utility {
         return $_count;
     } 
 
+    /**
+     * Return array of tag/attributes of all tags used by an template
+     * 
+     * @param object $templae template object
+     * @return array of tag/attributes
+     */
+       function getTags(Smarty_Internal_Template $template) 
+       {
+               $template->smarty->get_used_tags = true;
+               $template->compileTemplateSource();
+               return $template->compiler_object->used_tags;
+       }       
+       
     function testInstall()
     {
         echo "<PRE>\n";
index 6301f92f9fa12b80231301bb40512bcd928a3ba9..2895e8ae948cfb098b6937a2d2f798a321ed87e7 100644 (file)
@@ -60,68 +60,67 @@ class Smarty_Internal_Wrapper {
        switch($name_parts[0]) {
          case 'register':
          case 'unregister':
-           $myobj = $name_parts[0] == 'register' ? $this->smarty->register : $this->smarty->unregister;
            switch($name_parts[1]) {
-              case 'function':
-                 return call_user_func_array(array($myobj,'templateFunction'),$args);
-                 break;
               case 'object':
-                 return call_user_func_array(array($myobj,'templateObject'),$args);
-                 break;
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Object"),$args);
               case 'compiler_function':
-                 return call_user_func_array(array($myobj,'compilerFunction'),$args);
-                 break;
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Plugin"),array_merge(array('compiler'),$args));
+              case 'prefilter':
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('pre'),$args));
+              case 'postfilter':
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('post'),$args));
+              case 'outputfilter':
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Filter"),array_merge(array('output'),$args));
+             case 'resource':
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Resource"),$args);
               default:
-                 return call_user_func_array(array($myobj,$name_parts[1]),$args);
-                 break;
+                 return call_user_func_array(array($this->smarty,"{$name_parts[0]}Plugin"),array_merge(array($name_parts[1]),$args));
            }
-           break;
            case 'get':
            switch($name_parts[1]) {
               case 'template_vars':
                  return call_user_func_array(array($this->smarty,'getTemplateVars'),$args);
-                 break;
               case 'config_vars':
                  return call_user_func_array(array($this->smarty,'getConfigVars'),$args);
-                 break;
               default:
                  return call_user_func_array(array($myobj,$name_parts[1]),$args);
-                 break;
            }
-           break;
            case 'clear':
            switch($name_parts[1]) {
               case 'all_assign':
                  return call_user_func_array(array($this->smarty,'clearAllAssign'),$args);
-                 break;
+              case 'assign':
+                 return call_user_func_array(array($this->smarty,'clearAssign'),$args);
+              case 'all_cache':
+                 return call_user_func_array(array($this->smarty,'clearAllCache'),$args);
+              case 'cache':
+                 return call_user_func_array(array($this->smarty,'clearCache'),$args);
+              case 'compiled_template':
+                 return call_user_func_array(array($this->smarty,'clearCompiledTemplate'),$args);
            }
-           break;
            case 'config':
            switch($name_parts[1]) {
               case 'load':
                  return call_user_func_array(array($this->smarty,'configLoad'),$args);
-                 break;
            }
-           break;
-           default:
-             // convert foo_bar_baz to fooBarBaz style names
-             $name_parts = explode('_',$name);
-             foreach($name_parts as $idx=>$part) {
-                if($idx==0)
-                  $name_parts[$idx] = strtolower($part);
-                else
-                  $name_parts[$idx] = ucfirst($part);
-             }
-             $func_name = implode('',$name_parts);
-             if(!method_exists($this->smarty,$func_name)) {
-                throw new SmartyException("unknown method '$name'");
-                return false;
-             }
-             return call_user_func_array(array($this->smarty,$func_name),$args);
-           break;
+           case 'trigger':
+           switch($name_parts[1]) {
+              case 'error':
+                 return call_user_func_array(array($this,'trigger_error'),$args);
+           }
        }
-       return false;
+       throw new SmartyException("unknown method '$name'");
     }
-}
 
+    /**
+     * trigger Smarty error
+     *
+     * @param string $error_msg
+     * @param integer $error_type
+     */
+    function trigger_error($error_msg, $error_type = E_USER_WARNING)
+    {
+        trigger_error("Smarty error: $error_msg", $error_type);
+    }
+}
 ?>
\ No newline at end of file
index 0a0a0bb9b0884c2ff856284c68ca602c7c7dc331..cd066fb4e85a569728a3f9df10f6cff1b1e08343 100644 (file)
@@ -15,19 +15,18 @@ class Smarty_Security {
      * This determines how Smarty handles "<?php ... ?>" tags in templates.
      * possible values:
      * <ul>
-     *   <li>SMARTY_PHP_PASSTHRU -> echo PHP tags as they are</li>
-     *   <li>SMARTY_PHP_QUOTE    -> escape tags as entities</li>
-     *   <li>SMARTY_PHP_REMOVE   -> remove php tags</li>
-     *   <li>SMARTY_PHP_ALLOW    -> execute php tags</li>
+     *   <li>Smarty::PHP_PASSTHRU -> echo PHP tags as they are</li>
+     *   <li>Smarty::PHP_QUOTE    -> escape tags as entities</li>
+     *   <li>Smarty::PHP_REMOVE   -> remove php tags</li>
+     *   <li>Smarty::PHP_ALLOW    -> execute php tags</li>
      * </ul>
      * 
      * @var integer 
      */
-    public $php_handling = SMARTY_PHP_PASSTHRU;
+    public $php_handling = Smarty::PHP_PASSTHRU;
 
     /**
      * This is the list of template directories that are considered secure.
-     * One directory per array element. 
      * $template_dir is in this list implicitly.
      * 
      * @var array 
@@ -57,26 +56,26 @@ class Smarty_Security {
      * This is an array of trusted PHP functions.
      *
      * If empty all functions are allowed.
-     * If set to 'none' none is allowed.
+     * To disable all PHP functions set $php_functions = null.
      * @var array 
      */
     public $php_functions = array('isset', 'empty',
             'count', 'sizeof','in_array', 'is_array','time','nl2br');
 
     /**
-     * This is an array of trusted modifers.
+     * This is an array of trusted PHP modifers.
      *
      * If empty all modifiers are allowed.
-     * If set to 'none' none is allowed.
+     * To disable all modifier set $modifiers = null.
      * @var array 
      */
-    public $modifiers = array('escape','count');
+    public $php_modifiers = array('escape','count');
 
     /**
      * This is an array of trusted streams.
      *
      * If empty all streams are allowed.
-     * If set to 'none' none is allowed.
+     * To disable all streams set $streams = null.
      * @var array 
      */
     public $streams = array('file');
@@ -89,9 +88,142 @@ class Smarty_Security {
      */
     public $allow_super_globals = true;
     /**
-     * + flag if {php} tag can be executed
+     * + flag if the {php} and {include_php} tag can be executed
      */
     public $allow_php_tag = false;
+
+    public function __construct($smarty)
+    {
+        $this->smarty = $smarty; 
+       }
+    /**
+     * Check if PHP function is trusted.
+     * 
+     * @param string $function_name 
+     * @param object $compiler compiler object
+     * @return boolean true if function is trusted
+     */
+    function isTrustedPhpFunction($function_name, $compiler)
+    {
+        if (isset($this->php_functions) && (empty($this->php_functions) || in_array($function_name, $this->php_functions))) {
+            return true;
+        } else {
+            $compiler->trigger_template_error ("PHP function '{$function_name}' not allowed by security setting");
+            return false;
+        } 
+    } 
+
+    /**
+     * Check if static class is trusted.
+     * 
+     * @param string $class_name 
+     * @param object $compiler compiler object
+     * @return boolean true if class is trusted
+     */
+    function isTrustedStaticClass($class_name, $compiler)
+    {
+        if (isset($this->static_classes) && (empty($this->static_classes) || in_array($class_name, $this->static_classes))) {
+            return true;
+        } else {
+            $compiler->trigger_template_error ("access to static class '{$class_name}' not allowed by security setting");
+            return false;
+        } 
+    } 
+    /**
+     * Check if modifier is trusted.
+     * 
+     * @param string $modifier_name 
+     * @param object $compiler compiler object
+     * @return boolean true if modifier is trusted
+     */
+    function isTrustedModifier($modifier_name, $compiler)
+    {
+        if (isset($this->php_modifiers) && (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))) {
+            return true;
+        } else {
+            $compiler->trigger_template_error ("modifier '{$modifier_name}' not allowed by security setting");
+            return false;
+        } 
+    } 
+    /**
+     * Check if stream is trusted.
+     * 
+     * @param string $stream_name 
+     * @param object $compiler compiler object
+     * @return boolean true if stream is trusted
+     */
+    function isTrustedStream($stream_name)
+    {
+        if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) {
+            return true;
+        } else {
+            throw new SmartyException ("stream '{$stream_name}' not allowed by security setting");
+            return false;
+        } 
+    } 
+
+    /**
+     * Check if directory of file resource is trusted.
+     * 
+     * @param string $filepath 
+     * @param object $compiler compiler object
+     * @return boolean true if directory is trusted
+     */
+    function isTrustedResourceDir($filepath)
+    {
+        $_rp = realpath($filepath);
+        if (isset($this->smarty->template_dir)) {
+            foreach ((array)$this->smarty->template_dir as $curr_dir) {
+                if (($_cd = realpath($curr_dir)) !== false &&
+                        strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+                        (strlen($_rp) == strlen($_cd) || substr($_rp, strlen($_cd), 1) == DS)) {
+                    return true;
+                } 
+            } 
+        } 
+        if (!empty($this->smarty->security_policy->secure_dir)) {
+            foreach ((array)$this->smarty->security_policy->secure_dir as $curr_dir) {
+                if (($_cd = realpath($curr_dir)) !== false) {
+                    if ($_cd == $_rp) {
+                        return true;
+                    } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+                            (strlen($_rp) == strlen($_cd) || substr($_rp, strlen($_cd), 1) == DS)) {
+                        return true;
+                    } 
+                } 
+            } 
+        } 
+
+        throw new SmartyException ("directory '{$_rp}' not allowed by security setting");
+        return false;
+    } 
+    
+    /**
+     * Check if directory of file resource is trusted.
+     * 
+     * @param string $filepath 
+     * @param object $compiler compiler object
+     * @return boolean true if directory is trusted
+     */
+    function isTrustedPHPDir($filepath)
+    {
+        $_rp = realpath($filepath);
+        if (!empty($this->trusted_dir)) {
+            foreach ((array)$this->trusted_dir as $curr_dir) {
+                if (($_cd = realpath($curr_dir)) !== false) {
+                    if ($_cd == $_rp) {
+                        return true;
+                    } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+                            substr($_rp, strlen($_cd), 1) == DS) {
+                        return true;
+                    } 
+                } 
+            } 
+        } 
+
+        throw new SmartyException ("directory '{$_rp}' not allowed by security setting");
+        return false;
+    } 
 } 
 
 ?>
\ No newline at end of file