diff options
34 files changed, 2394 insertions, 1418 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a6e63be..47c4aab4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,7 @@ jobs: - "8.2" - "8.3" - "8.4" + - "8.5" compiler: - default diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ee214ba..da75ec2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [5.8.0] - 2026-02-15 +- Added support for Backed Enums for php versions >= 8.1 [#1171](https://github.com/smarty-php/smarty/pull/1171) +- Added support for new 'matches' operator doing regex matching [#1169](https://github.com/smarty-php/smarty/pull/1169) +- Update documentation to clarify that include inline is currently not implemented in Smarty v5 [#1152](https://github.com/smarty-php/smarty/issues/1152) +- Support for Laravel Collections style object chaining for objects return from function calls implemented as modifiers [#1151](https://github.com/smarty-php/smarty/issues/1151) + + +## [5.7.0] - 2025-11-19 +- PHP 8.5 support + + +## [5.6.0] - 2025-10-03 +- Added support for shorttags in functions [#1005](https://github.com/smarty-php/smarty/issues/1005) + + ## [5.5.2] - 2025-08-26 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8dfdf32b..9cba3624 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -115,5 +115,7 @@ If you are a maintainer, you can publish the document using [mike](https://githu mike deploy 5.x ``` +Then, push the `gh-pages` branch. + ## Attribution This guide is based on the **contributing.md**. [Make your own](https://contributing.md/)! @@ -7,7 +7,7 @@ Smarty is a template engine for PHP, facilitating the separation of presentation Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it. ## Requirements -Smarty v5 can be run with PHP 7.2 to PHP 8.4. +Smarty v5 can be run with PHP 7.2 to PHP 8.5. ## Installation Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/). diff --git a/docs/designers/language-basic-syntax/language-syntax-operators.md b/docs/designers/language-basic-syntax/language-syntax-operators.md index 98a56538..965327c3 100644 --- a/docs/designers/language-basic-syntax/language-syntax-operators.md +++ b/docs/designers/language-basic-syntax/language-syntax-operators.md @@ -50,6 +50,120 @@ separated from surrounding elements by spaces. Note that items listed in | is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 | | is in | | $a is in $b | exists in array | in_array($a, $b) | | is \[not\] in | | $a is not in $b | does not exist in array | !in_array($a, $b) | +| matches | | $a matches $b | regex pattern match | preg_match($b, $a) | + +## Regex Matching Operator + +The `matches` operator allows you to test if a string matches a regular expression pattern. + +### Basic Usage + +```smarty +{if "hello" matches "/^[a-z]+$/"} + String matches the pattern! +{/if} + +{if $email matches "/^[^@]+@[^@]+\.[^@]+$/"} + Valid email format +{else} + Invalid email format +{/if} +``` + +### Using Variables + +```smarty +{$pattern = '/^[a-zA-Z0-9]{8,}$/'} +{if $password matches $pattern} + Password meets requirements +{else} + Password must be at least 8 alphanumeric characters +{/if} +``` + +### Pattern Modifiers + +The `matches` operator supports all standard PHP regex modifiers: + +```smarty +{* Case insensitive matching *} +{if "HELLO" matches "/hello/i"} + Matches (case insensitive) +{/if} + +{* Multiline mode *} +{if "line1\nline2" matches "/line2$/m"} + Matches in multiline mode +{/if} + +{* Dot matches newlines *} +{if "hello\nworld" matches "/hello.world/s"} + Matches with dotall modifier +{/if} +``` + +### Complex Conditions + +The `matches` operator can be combined with other operators: + +```smarty +{if $username matches "/^[a-z]+$/" && $username|length > 3} + Valid username +{else} + Username must be lowercase letters and at least 4 characters +{/if} + +{if $input matches "/^[0-9]+$/" || $input matches "/^[a-z]+$/"} + Input is either numeric or lowercase letters +{else} + Invalid input format +{/if} +``` + +### Practical Examples + +**Email Validation:** +```smarty +{if $email matches "/^[^@\s]+@[^@\s]+\.[^@\s]+$/"} + Valid email address +{else} + Please enter a valid email address +{/if} +``` + +**Password Strength:** +```smarty +{if $password matches "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/"} + Strong password +{else} + Password must contain uppercase, lowercase, numbers and be at least 8 characters +{/if} +``` + +**URL Validation:** +```smarty +{if $url matches "/^https?:\/\/(www\.)?[a-z0-9\-]+(\.[a-z]{2,})+/i"} + Valid URL format +{else} + Please enter a valid URL +{/if} +``` + +**Numeric Validation:** +```smarty +{if $input matches "/^[0-9]+$/"} + Valid numeric input +{else} + Please enter numbers only +{/if} +``` + +### Notes + +- The `matches` operator uses PHP's `preg_match()` function internally +- Pattern delimiters must be valid regex delimiters (typically `/`) +- Invalid patterns will cause PHP warnings but won't break template execution +- For complex regex patterns, consider using variables for better readability ## Ternary You can use the `?:` (or ternary) operator to test one expression and present the value diff --git a/docs/designers/language-builtin-functions/language-function-include.md b/docs/designers/language-builtin-functions/language-function-include.md index 0710db7d..28d208e4 100644 --- a/docs/designers/language-builtin-functions/language-function-include.md +++ b/docs/designers/language-builtin-functions/language-function-include.md @@ -47,11 +47,13 @@ available within the included template. ## Option Flags -| Name | Description | -|---------|--------------------------------------------------------------------------------------| -| nocache | Disables caching of this subtemplate | -| caching | Enable caching of this subtemplate | -| inline | If set, merge the compile-code of the subtemplate into the compiled calling template | +| Name | Description | +|-----------|--------------------------------------------------------------------------------------| +| nocache | Disables caching of this subtemplate | +| caching | Enable caching of this subtemplate | +| inline \* | If set, merge the compile-code of the subtemplate into the compiled calling template | + +\* The `inline` option flag is currently not implemented in Smarty v5. Using it will not trigger an error, however. ## Examples ```smarty diff --git a/docs/designers/language-variables/language-assigned-variables.md b/docs/designers/language-variables/language-assigned-variables.md index 9465a89c..5dfa3648 100644 --- a/docs/designers/language-variables/language-assigned-variables.md +++ b/docs/designers/language-variables/language-assigned-variables.md @@ -123,4 +123,89 @@ this will output: ```html name: Zaphod Beeblebrox<br /> email: zaphod@slartibartfast.example.com<br /> -```
\ No newline at end of file +``` + +## Backed Enums (PHP 8.1+) + +Smarty supports accessing properties of [backed enums](https://www.php.net/manual/en/language.enumerations.backed.php) introduced in PHP 8.1. + +### Accessing Enum Properties + +You can access the `name` and `value` properties of backed enum cases: + +```smarty +{* Access enum case properties *} +<option id="{MyEnum::Foo->name}">{MyEnum::Foo->value}</option> +``` + +### Complete Example + +```php +<?php +use Smarty\Smarty; + +// Define a backed enum +enum Status: string { + case Active = 'active'; + case Inactive = 'inactive'; + case Pending = 'pending'; +} + +$smarty = new Smarty(); +$smarty->assign('currentStatus', Status::Active); +$smarty->display('template.tpl'); +``` + +`template.tpl`: + +```smarty +{* Display enum properties *} +Current status: {$currentStatus->name} (value: {$currentStatus->value}) + +{* Use in HTML attributes *} +<select name="status"> + <option value="{Status::Active->value}" {if $currentStatus->name === 'Active'}selected{/if}>Active</option> + <option value="{Status::Inactive->value}" {if $currentStatus->name === 'Inactive'}selected{/if}>Inactive</option> + <option value="{Status::Pending->value}" {if $currentStatus->name === 'Pending'}selected{/if}>Pending</option> +</select> +``` + +This would output: + +```html +Current status: Active (value: active) + +<select name="status"> + <option value="active" selected>Active</option> + <option value="inactive">Inactive</option> + <option value="pending">Pending</option> +</select> +``` + +### Integer-backed Enums + +Integer-backed enums work the same way: + +```php +<?php +enum Priority: int { + case Low = 1; + case Medium = 2; + case High = 3; +} + +$smarty->assign('priority', Priority::High); +``` + +```smarty +{* Access integer enum properties *} +Priority level: {$priority->value} ({$priority->name}) +``` + +Output: + +```html +Priority level: 3 (High) +``` + +> **Note**: Backed enum support requires PHP 8.1 or higher. The enum must be registered or available in the current namespace.
\ No newline at end of file diff --git a/docs/features.md b/docs/features.md index f9a873be..bab9cd1e 100644 --- a/docs/features.md +++ b/docs/features.md @@ -22,6 +22,8 @@ Some of Smarty's features: - [Template Inheritance](api/inheritance.md) for easy management of template content. - [Plugin](api/extending/introduction.md) architecture +- Regex pattern matching with the [`matches`](designers/language-basic-syntax/language-syntax-operators.md#regex-matching-operator) operator +- Support for PHP 8.1+ [backed enums](designers/language-variables/language-assigned-variables.md#backed-enums-php-81) ## Separation of presentation from application code - This means templates can certainly contain logic under the condition diff --git a/docs/getting-started.md b/docs/getting-started.md index 1ea927e9..17a0042b 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,7 +1,7 @@ # Getting started ## Requirements -Smarty can be run with PHP 7.2 to PHP 8.4. +Smarty can be run with PHP 7.2 to PHP 8.5. ## Installation Smarty can be installed with [Composer](https://getcomposer.org/). diff --git a/docs/index.md b/docs/index.md index e187ffbe..63cf15e0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,6 +8,25 @@ It allows you to write **templates**, using **variables**, **modifiers**, **func <p> The number of pixels is: {math equation="x * y" x=$height y=$width}. </p> + +<p> + {if $email matches "/^[^@]+@[^@]+\.[^@]+$/"} + Valid email address + {else} + Please enter a valid email + {/if} +</p> +``` +```html +<h1>Hello world</h1> + +<p> + The number of pixels is: 307200. +</p> + +<p> + Valid email address +</p> ``` When this template is rendered, with the value "Hello world" for the variable $title, 640 for $width, diff --git a/src/Cacheresource/File.php b/src/Cacheresource/File.php index 4b4198ec..3cb09b5e 100644 --- a/src/Cacheresource/File.php +++ b/src/Cacheresource/File.php @@ -127,8 +127,6 @@ class File extends Base && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1 ) { opcache_invalidate($_template->getCached()->filepath, true); - } elseif (function_exists('apc_compile_file')) { - apc_compile_file($_template->getCached()->filepath); } $cached = $_template->getCached(); $cached->timestamp = $cached->exists = is_file($cached->filepath); @@ -223,10 +221,8 @@ class File extends Base $_filepath = (string)$_file; // directory ? if ($_file->isDir()) { - if (!$_cache->isDot()) { - // delete folder if empty - @rmdir($_file->getPathname()); - } + // delete folder if empty + @rmdir($_file->getPathname()); } else { // delete only php files if (substr($_filepath, -4) !== '.php') { @@ -279,8 +275,6 @@ class File extends Base && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) ) { opcache_invalidate($_filepath, true); - } elseif (function_exists('apc_delete_file')) { - apc_delete_file($_filepath); } } } diff --git a/src/Compile/AttributeCompiler.php b/src/Compile/AttributeCompiler.php new file mode 100644 index 00000000..077c4cfc --- /dev/null +++ b/src/Compile/AttributeCompiler.php @@ -0,0 +1,144 @@ +<?php + +namespace Smarty\Compile; + +/** + * This class handles compiling the attributes. + */ +class AttributeCompiler +{ + /** + * Array of names of required attributes required by tag + * + * @var array + */ + protected $required_attributes = []; + + /** + * Array of names of optional attribute required by tag + * use array('_any') if there is no restriction of attributes names + * + * @var array + */ + protected $optional_attributes = []; + + /** + * Shorttag attribute order defined by its names + * + * @var array + */ + protected $shorttag_order = []; + + /** + * Array of names of valid option flags + * + * @var array + */ + protected $option_flags = []; + + public function __construct( + array $required_attributes = [], + array $optional_attributes = [], + array $shorttag_order = [], + array $option_flags = [] + ) { + $this->required_attributes = $required_attributes; + $this->optional_attributes = $optional_attributes; + $this->shorttag_order = $shorttag_order; + $this->option_flags = $option_flags; + } + + /** + * 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 + * the corresponding list. The keyword '_any' specifies that any attribute will be accepted + * as valid + * + * @param object $compiler compiler object + * @param array $attributes attributes applied to the tag + * + * @return array of mapped attributes for further processing + */ + public function getAttributes($compiler, $attributes) + { + $_indexed_attr = []; + $options = array_fill_keys($this->option_flags, true); + foreach ($attributes as $key => $mixed) { + // shorthand ? + if (!is_array($mixed)) { + // options flag ? + if (isset($options[trim($mixed, '\'"')])) { + $_indexed_attr[trim($mixed, '\'"')] = true; + // shorthand attribute ? + } elseif (isset($this->shorttag_order[$key])) { + $_indexed_attr[$this->shorttag_order[$key]] = $mixed; + } else { + // too many shorthands + $compiler->trigger_template_error('too many shorthand attributes', null, true); + } + // named attribute + } else { + foreach ($mixed as $k => $v) { + // options flag? + if (isset($options[$k])) { + if (is_bool($v)) { + $_indexed_attr[$k] = $v; + } else { + if (is_string($v)) { + $v = trim($v, '\'" '); + } + + // Mapping array for boolean option value + static $optionMap = [1 => true, 0 => false, 'true' => true, 'false' => false]; + + if (isset($optionMap[$v])) { + $_indexed_attr[$k] = $optionMap[$v]; + } else { + $compiler->trigger_template_error( + "illegal value '" . var_export($v, true) . + "' for options flag '{$k}'", + null, + true + ); + } + } + // must be named attribute + } else { + $_indexed_attr[$k] = $v; + } + } + } + } + // check if all required attributes present + foreach ($this->required_attributes as $attr) { + if (!isset($_indexed_attr[$attr])) { + $compiler->trigger_template_error("missing '{$attr}' attribute", null, true); + } + } + // check for not allowed attributes + if ($this->optional_attributes !== ['_any']) { + $allowedAttributes = array_fill_keys( + array_merge( + $this->required_attributes, + $this->optional_attributes, + $this->option_flags + ), + true + ); + foreach ($_indexed_attr as $key => $dummy) { + if (!isset($allowedAttributes[$key]) && $key !== 0) { + $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true); + } + } + } + // default 'false' for all options flags not set + foreach ($this->option_flags as $flag) { + if (!isset($_indexed_attr[$flag])) { + $_indexed_attr[$flag] = false; + } + } + + return $_indexed_attr; + } +} diff --git a/src/Compile/Base.php b/src/Compile/Base.php index 2d5c0c0e..10153501 100644 --- a/src/Compile/Base.php +++ b/src/Compile/Base.php @@ -82,84 +82,12 @@ abstract class Base implements CompilerInterface { * @return array of mapped attributes for further processing */ protected function getAttributes($compiler, $attributes) { - $_indexed_attr = []; - $options = array_fill_keys($this->option_flags, true); - foreach ($attributes as $key => $mixed) { - // shorthand ? - if (!is_array($mixed)) { - // options flag ? - if (isset($options[trim($mixed, '\'"')])) { - $_indexed_attr[trim($mixed, '\'"')] = true; - // shorthand attribute ? - } elseif (isset($this->shorttag_order[$key])) { - $_indexed_attr[$this->shorttag_order[$key]] = $mixed; - } else { - // too many shorthands - $compiler->trigger_template_error('too many shorthand attributes', null, true); - } - // named attribute - } else { - foreach ($mixed as $k => $v) { - // options flag? - if (isset($options[$k])) { - if (is_bool($v)) { - $_indexed_attr[$k] = $v; - } else { - if (is_string($v)) { - $v = trim($v, '\'" '); - } - - // Mapping array for boolean option value - static $optionMap = [1 => true, 0 => false, 'true' => true, 'false' => false]; - - if (isset($optionMap[$v])) { - $_indexed_attr[$k] = $optionMap[$v]; - } else { - $compiler->trigger_template_error( - "illegal value '" . var_export($v, true) . - "' for options flag '{$k}'", - null, - true - ); - } - } - // must be named attribute - } else { - $_indexed_attr[$k] = $v; - } - } - } - } - // check if all required attributes present - foreach ($this->required_attributes as $attr) { - if (!isset($_indexed_attr[$attr])) { - $compiler->trigger_template_error("missing '{$attr}' attribute", null, true); - } - } - // check for not allowed attributes - if ($this->optional_attributes !== ['_any']) { - $allowedAttributes = array_fill_keys( - array_merge( - $this->required_attributes, - $this->optional_attributes, - $this->option_flags - ), - true - ); - foreach ($_indexed_attr as $key => $dummy) { - if (!isset($allowedAttributes[$key]) && $key !== 0) { - $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true); - } - } - } - // default 'false' for all options flags not set - foreach ($this->option_flags as $flag) { - if (!isset($_indexed_attr[$flag])) { - $_indexed_attr[$flag] = false; - } - } - - return $_indexed_attr; + return (new AttributeCompiler( + $this->required_attributes, + $this->optional_attributes, + $this->shorttag_order, + $this->option_flags + ))->getAttributes($compiler, $attributes); } /** diff --git a/src/Compile/FunctionCallCompiler.php b/src/Compile/FunctionCallCompiler.php index 107dd98b..3ce50da2 100644 --- a/src/Compile/FunctionCallCompiler.php +++ b/src/Compile/FunctionCallCompiler.php @@ -3,24 +3,18 @@ * Smarty Internal Plugin Compile Registered Function * Compiles code for the execution of a registered function * - - * @author Uwe Tews */ namespace Smarty\Compile; use Smarty\Compiler\Template; -use Smarty\CompilerException; +use Smarty\FunctionHandler\AttributeFunctionHandlerInterface; /** * Smarty Internal Plugin Compile Registered Function Class - * - - */ class FunctionCallCompiler extends Base { - /** * Attribute definition: Overwrites base class. * @@ -51,16 +45,26 @@ class FunctionCallCompiler extends Base { */ public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null): string { + if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) { - // check and get attributes - $_attr = $this->getAttributes($compiler, $args); - unset($_attr['nocache']); + $attribute_overrides = []; - $_paramsArray = $this->formatParamsArray($_attr); - $_params = 'array(' . implode(',', $_paramsArray) . ')'; + if ($functionHandler instanceof AttributeFunctionHandlerInterface) { + $attribute_overrides = $functionHandler->getSupportedAttributes(); + } + // check and get attributes + $_attr = (new AttributeCompiler( + $attribute_overrides['required_attributes'] ?? $this->required_attributes, + $attribute_overrides['optional_attributes'] ?? $this->optional_attributes, + $attribute_overrides['shorttag_order'] ?? $this->shorttag_order, + $attribute_overrides['option_flags'] ?? $this->option_flags + ))->getAttributes($compiler, $args); - if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) { + unset($_attr['nocache']); + + $_paramsArray = $this->formatParamsArray($_attr); + $_params = 'array(' . implode(',', $_paramsArray) . ')'; // not cacheable? $compiler->tag_nocache = $compiler->tag_nocache || !$functionHandler->isCacheable(); diff --git a/src/FunctionHandler/AttributeBase.php b/src/FunctionHandler/AttributeBase.php new file mode 100644 index 00000000..71a035dc --- /dev/null +++ b/src/FunctionHandler/AttributeBase.php @@ -0,0 +1,77 @@ +<?php + +namespace Smarty\FunctionHandler; + +use Smarty\Template; + +/** + * Abstract implementation for function handlers which support custom attributes + */ +abstract class AttributeBase implements AttributeFunctionHandlerInterface +{ + /** + * Array of names of required attribute required by tag + * + * @var array + */ + protected array $required_attributes = []; + + /** + * Array of names of optional attribute required by tag + * use array('_any') if there is no restriction of attributes names + * + * @var array + */ + protected array $optional_attributes = []; + + /** + * Shorttag attribute order defined by its names + * + * @var array + */ + protected array $shorttag_order = []; + + /** + * Array of names of valid option flags + * + * @var array + */ + protected array $option_flags = []; + + /** + * Return whether the output is cacheable. + * @var bool + */ + protected bool $cacheable = true; + + /** + * Return whether the output is cacheable. + * @return bool + */ + public function isCacheable(): bool + { + return $this->cacheable; + } + + /** + * Function body + * @param mixed $params The supplied parameters. + * @param Smarty\Template $template + * @return mixed + */ + abstract public function handle($params, Template $template): ?string; + + /** + * Return the support attributes for this function. + * @return array<string, array> + */ + public function getSupportedAttributes(): array + { + return [ + 'required_attributes' => $this->required_attributes, + 'optional_attributes' => $this->optional_attributes, + 'shorttag_order' => $this->shorttag_order, + 'option_flags' => $this->option_flags, + ]; + } +} diff --git a/src/FunctionHandler/AttributeFunctionHandlerInterface.php b/src/FunctionHandler/AttributeFunctionHandlerInterface.php new file mode 100644 index 00000000..f76259ec --- /dev/null +++ b/src/FunctionHandler/AttributeFunctionHandlerInterface.php @@ -0,0 +1,15 @@ +<?php + +namespace Smarty\FunctionHandler; + +/** + * Function handler interface with support for specifying supported properties + */ +interface AttributeFunctionHandlerInterface extends FunctionHandlerInterface +{ + /** + * Returns an array with the supported attributes, flags, and shorttags + * @return array<string, array> + */ + public function getSupportedAttributes(): array; +} diff --git a/src/Lexer/TemplateLexer.php b/src/Lexer/TemplateLexer.php index 2e7f3305..8c28448e 100644 --- a/src/Lexer/TemplateLexer.php +++ b/src/Lexer/TemplateLexer.php @@ -160,6 +160,7 @@ class TemplateLexer 'LOGOP' => '"<", "==" ... logical operator', 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', 'SCOND' => '"is even" ... if condition', + 'MATCHES' => '"matches" regex operator', ); /** @@ -567,7 +568,7 @@ class TemplateLexer public function yylex3() { if (!isset($this->yy_global_pattern3)) { - $this->yy_global_pattern3 = $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+(not\\s+)?in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS"); + $this->yy_global_pattern3 = $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+(not\\s+)?in\\s+)|\G(\\s+matches\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -662,119 +663,124 @@ class TemplateLexer public function yy_r3_10() { - $this->token = \Smarty\Parser\TemplateParser::TP_AS; + $this->token = \Smarty\Parser\TemplateParser::TP_MATCHES; } public function yy_r3_11() { - $this->token = \Smarty\Parser\TemplateParser::TP_TO; + $this->token = \Smarty\Parser\TemplateParser::TP_AS; } public function yy_r3_12() { - $this->token = \Smarty\Parser\TemplateParser::TP_STEP; + $this->token = \Smarty\Parser\TemplateParser::TP_TO; } public function yy_r3_13() { - $this->token = \Smarty\Parser\TemplateParser::TP_INSTANCEOF; + $this->token = \Smarty\Parser\TemplateParser::TP_STEP; } public function yy_r3_14() { + $this->token = \Smarty\Parser\TemplateParser::TP_INSTANCEOF; + } + public function yy_r3_15() + { + $this->token = \Smarty\Parser\TemplateParser::TP_LOGOP; } - public function yy_r3_16() + public function yy_r3_17() { $this->token = \Smarty\Parser\TemplateParser::TP_SLOGOP; } - public function yy_r3_18() + public function yy_r3_19() { $this->token = \Smarty\Parser\TemplateParser::TP_TLOGOP; } - public function yy_r3_21() + public function yy_r3_22() { $this->token = \Smarty\Parser\TemplateParser::TP_SINGLECOND; } - public function yy_r3_24() + public function yy_r3_25() { $this->token = \Smarty\Parser\TemplateParser::TP_NOT; } - public function yy_r3_25() + public function yy_r3_26() { $this->token = \Smarty\Parser\TemplateParser::TP_TYPECAST; } - public function yy_r3_29() + public function yy_r3_30() { $this->token = \Smarty\Parser\TemplateParser::TP_OPENP; } - public function yy_r3_30() + public function yy_r3_31() { $this->token = \Smarty\Parser\TemplateParser::TP_CLOSEP; } - public function yy_r3_31() + public function yy_r3_32() { $this->token = \Smarty\Parser\TemplateParser::TP_OPENB; } - public function yy_r3_32() + public function yy_r3_33() { $this->token = \Smarty\Parser\TemplateParser::TP_CLOSEB; } - public function yy_r3_33() + public function yy_r3_34() { $this->token = \Smarty\Parser\TemplateParser::TP_PTR; } - public function yy_r3_34() + public function yy_r3_35() { $this->token = \Smarty\Parser\TemplateParser::TP_APTR; } - public function yy_r3_35() + public function yy_r3_36() { $this->token = \Smarty\Parser\TemplateParser::TP_EQUAL; } - public function yy_r3_36() + public function yy_r3_37() { $this->token = \Smarty\Parser\TemplateParser::TP_INCDEC; } - public function yy_r3_38() + public function yy_r3_39() { $this->token = \Smarty\Parser\TemplateParser::TP_UNIMATH; } - public function yy_r3_40() + public function yy_r3_41() { $this->token = \Smarty\Parser\TemplateParser::TP_MATH; } - public function yy_r3_42() + public function yy_r3_43() { $this->token = \Smarty\Parser\TemplateParser::TP_AT; } - public function yy_r3_43() + public function yy_r3_44() { $this->token = \Smarty\Parser\TemplateParser::TP_ARRAYOPEN; } - public function yy_r3_44() + public function yy_r3_45() { $this->token = \Smarty\Parser\TemplateParser::TP_HATCH; } - public function yy_r3_45() + public function yy_r3_46() { // resolve conflicts with shorttag and right_delimiter starting with '=' @@ -786,73 +792,73 @@ class TemplateLexer $this->token = \Smarty\Parser\TemplateParser::TP_ATTR; } } - public function yy_r3_46() + public function yy_r3_47() { $this->token = \Smarty\Parser\TemplateParser::TP_NAMESPACE; } - public function yy_r3_49() + public function yy_r3_50() { $this->token = \Smarty\Parser\TemplateParser::TP_ID; } - public function yy_r3_50() + public function yy_r3_51() { $this->token = \Smarty\Parser\TemplateParser::TP_INTEGER; } - public function yy_r3_51() + public function yy_r3_52() { $this->token = \Smarty\Parser\TemplateParser::TP_BACKTICK; $this->yypopstate(); } - public function yy_r3_52() + public function yy_r3_53() { $this->token = \Smarty\Parser\TemplateParser::TP_VERT; } - public function yy_r3_53() + public function yy_r3_54() { $this->token = \Smarty\Parser\TemplateParser::TP_DOT; } - public function yy_r3_54() + public function yy_r3_55() { $this->token = \Smarty\Parser\TemplateParser::TP_COMMA; } - public function yy_r3_55() + public function yy_r3_56() { $this->token = \Smarty\Parser\TemplateParser::TP_SEMICOLON; } - public function yy_r3_56() + public function yy_r3_57() { $this->token = \Smarty\Parser\TemplateParser::TP_DOUBLECOLON; } - public function yy_r3_57() + public function yy_r3_58() { $this->token = \Smarty\Parser\TemplateParser::TP_COLON; } - public function yy_r3_58() + public function yy_r3_59() { $this->token = \Smarty\Parser\TemplateParser::TP_QMARK; } - public function yy_r3_59() + public function yy_r3_60() { $this->token = \Smarty\Parser\TemplateParser::TP_HEX; } - public function yy_r3_60() + public function yy_r3_61() { $this->token = \Smarty\Parser\TemplateParser::TP_SPACE; } - public function yy_r3_61() + public function yy_r3_62() { $this->token = \Smarty\Parser\TemplateParser::TP_TEXT; diff --git a/src/Lexer/TemplateLexer.plex b/src/Lexer/TemplateLexer.plex index 282a99cf..c3d01600 100644 --- a/src/Lexer/TemplateLexer.plex +++ b/src/Lexer/TemplateLexer.plex @@ -160,6 +160,7 @@ class TemplateLexer 'LOGOP' => '"<", "==" ... logical operator', 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', 'SCOND' => '"is even" ... if condition', + 'MATCHES' => '"matches" regex operator', ); /** @@ -325,6 +326,7 @@ class TemplateLexer tlop = ~\s+is\s+(not\s+)?(odd|even|div)\s+by\s+~ scond = ~\s+is\s+(not\s+)?(odd|even)~ isin = ~\s+is\s+(not\s+)?in\s+~ + matches = ~\s+matches\s+~ as = ~\s+as\s+~ to = ~\s+to\s+~ step = ~\s+step\s+~ @@ -469,6 +471,9 @@ class TemplateLexer isin { $this->token = \Smarty\Parser\TemplateParser::TP_ISIN; } + matches { + $this->token = \Smarty\Parser\TemplateParser::TP_MATCHES; + } as { $this->token = \Smarty\Parser\TemplateParser::TP_AS; } diff --git a/src/Parser/TemplateParser.php b/src/Parser/TemplateParser.php index 772df98d..6414d502 100644 --- a/src/Parser/TemplateParser.php +++ b/src/Parser/TemplateParser.php @@ -260,674 +260,710 @@ class TemplateParser const TP_SLOGOP = 54; const TP_TLOGOP = 55; const TP_SINGLECOND = 56; - const TP_ARRAYOPEN = 57; - const TP_QUOTE = 58; - const TP_BACKTICK = 59; - const YY_NO_ACTION = 542; - const YY_ACCEPT_ACTION = 541; - const YY_ERROR_ACTION = 540; + const TP_MATCHES = 57; + const TP_ARRAYOPEN = 58; + const TP_QUOTE = 59; + const TP_BACKTICK = 60; + const YY_NO_ACTION = 553; + const YY_ACCEPT_ACTION = 552; + const YY_ERROR_ACTION = 551; - const YY_SZ_ACTTAB = 2565; + const YY_SZ_ACTTAB = 2723; public static $yy_action = array( - 33, 106, 269, 306, 179, 305, 200, 247, 248, 249, - 1, 264, 138, 237, 202, 361, 6, 87, 284, 222, - 338, 361, 112, 107, 400, 321, 217, 261, 218, 130, - 224, 400, 21, 400, 49, 44, 400, 32, 45, 46, - 278, 226, 400, 282, 400, 203, 400, 53, 4, 139, - 302, 231, 28, 102, 225, 5, 54, 247, 248, 249, - 1, 20, 135, 192, 193, 271, 6, 87, 246, 222, - 216, 29, 112, 229, 7, 159, 217, 261, 218, 140, - 208, 272, 21, 509, 53, 44, 13, 302, 45, 46, - 278, 226, 149, 235, 153, 203, 257, 53, 4, 328, - 302, 302, 256, 304, 143, 5, 54, 247, 248, 249, - 1, 302, 100, 394, 86, 236, 6, 87, 3, 222, - 102, 257, 112, 144, 97, 394, 217, 261, 218, 102, - 224, 394, 21, 256, 446, 44, 178, 305, 45, 46, - 278, 226, 302, 282, 200, 203, 446, 53, 4, 115, - 302, 47, 22, 285, 41, 5, 54, 247, 248, 249, - 1, 139, 137, 267, 202, 141, 6, 87, 14, 222, - 541, 99, 112, 151, 15, 446, 217, 261, 218, 314, - 224, 216, 21, 256, 233, 44, 9, 446, 45, 46, - 278, 226, 325, 282, 268, 203, 53, 53, 4, 302, - 302, 152, 257, 361, 320, 5, 54, 247, 248, 249, - 1, 264, 137, 102, 194, 361, 6, 87, 37, 222, - 102, 361, 112, 257, 89, 316, 217, 261, 218, 314, - 224, 216, 21, 36, 49, 44, 200, 40, 45, 46, - 278, 226, 115, 282, 237, 203, 14, 53, 4, 115, - 302, 238, 15, 155, 107, 5, 54, 247, 248, 249, - 1, 466, 136, 256, 202, 200, 6, 87, 466, 222, - 255, 171, 112, 264, 446, 310, 217, 261, 218, 158, - 224, 257, 11, 142, 157, 44, 446, 183, 45, 46, - 278, 226, 26, 282, 256, 203, 49, 53, 4, 446, - 302, 184, 260, 323, 176, 5, 54, 247, 248, 249, - 1, 446, 137, 264, 189, 291, 6, 87, 183, 222, - 200, 302, 112, 253, 178, 305, 217, 261, 218, 263, - 213, 18, 21, 200, 184, 44, 49, 15, 45, 46, - 278, 226, 146, 282, 269, 203, 25, 53, 4, 220, - 302, 312, 107, 152, 290, 5, 54, 247, 248, 249, - 1, 219, 137, 147, 187, 130, 6, 87, 259, 222, - 16, 19, 112, 256, 167, 258, 217, 261, 218, 111, - 224, 173, 21, 96, 256, 44, 200, 23, 45, 46, - 278, 226, 177, 282, 227, 203, 335, 53, 4, 174, - 302, 180, 305, 170, 90, 5, 54, 247, 248, 249, - 1, 184, 137, 256, 202, 91, 6, 87, 482, 222, - 160, 482, 112, 214, 197, 482, 217, 261, 218, 184, - 188, 181, 21, 245, 302, 44, 164, 140, 45, 46, - 278, 226, 466, 282, 13, 203, 166, 53, 4, 466, - 302, 42, 43, 286, 12, 5, 54, 247, 248, 249, - 1, 264, 139, 447, 202, 40, 6, 87, 293, 294, - 295, 296, 112, 17, 311, 447, 217, 261, 218, 337, - 224, 183, 21, 260, 49, 48, 244, 245, 45, 46, - 278, 226, 24, 282, 303, 203, 8, 53, 4, 92, - 302, 42, 43, 286, 12, 5, 54, 247, 248, 249, - 1, 10, 139, 9, 202, 317, 6, 87, 293, 294, - 295, 296, 112, 116, 299, 35, 217, 261, 218, 225, - 224, 198, 21, 98, 34, 44, 329, 324, 45, 46, - 278, 226, 448, 282, 448, 203, 161, 53, 4, 172, - 302, 129, 175, 225, 232, 5, 54, 288, 215, 216, - 252, 101, 93, 109, 243, 191, 103, 85, 450, 162, - 450, 24, 101, 330, 182, 273, 274, 300, 298, 301, - 250, 251, 281, 204, 283, 113, 289, 262, 300, 298, - 301, 121, 288, 215, 216, 252, 270, 93, 109, 275, - 190, 103, 60, 277, 279, 225, 237, 101, 280, 297, - 273, 274, 129, 239, 199, 266, 107, 281, 204, 283, - 7, 289, 101, 300, 298, 301, 288, 88, 216, 254, - 163, 114, 109, 265, 191, 103, 85, 200, 300, 298, - 301, 101, 200, 259, 273, 274, 19, 165, 326, 362, - 258, 281, 204, 283, 396, 289, 234, 300, 298, 301, - 288, 362, 216, 327, 200, 114, 396, 362, 201, 119, - 72, 336, 396, 37, 259, 101, 393, 19, 273, 274, - 154, 258, 228, 339, 94, 281, 204, 283, 393, 289, - 256, 300, 298, 301, 393, 38, 314, 288, 314, 216, - 314, 314, 114, 207, 319, 201, 119, 72, 314, 314, - 314, 314, 101, 221, 184, 273, 274, 156, 314, 314, - 314, 95, 281, 204, 283, 314, 289, 256, 300, 298, - 301, 314, 314, 314, 288, 314, 216, 314, 314, 108, - 206, 319, 201, 122, 51, 314, 120, 314, 314, 101, - 314, 184, 273, 274, 314, 314, 314, 314, 314, 281, - 204, 283, 314, 289, 314, 300, 298, 301, 288, 314, - 216, 314, 314, 114, 314, 314, 201, 122, 67, 314, - 314, 314, 314, 101, 314, 314, 273, 274, 314, 314, - 314, 314, 314, 281, 204, 283, 314, 289, 314, 300, - 298, 301, 288, 314, 216, 314, 314, 114, 212, 314, - 201, 122, 67, 314, 314, 314, 314, 101, 314, 314, - 273, 274, 314, 314, 314, 314, 314, 281, 204, 283, - 314, 289, 314, 300, 298, 301, 288, 314, 216, 314, - 314, 114, 205, 314, 201, 119, 72, 314, 314, 314, - 314, 101, 314, 314, 273, 274, 314, 314, 314, 314, - 314, 281, 204, 283, 314, 289, 314, 300, 298, 301, - 314, 314, 314, 288, 314, 216, 314, 314, 114, 314, - 318, 201, 122, 78, 314, 314, 314, 314, 101, 314, - 482, 273, 274, 482, 314, 314, 314, 482, 281, 204, - 283, 314, 289, 209, 211, 298, 301, 288, 314, 216, - 314, 314, 108, 314, 314, 201, 122, 58, 314, 238, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 482, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 118, 64, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 196, 117, 59, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 104, 84, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 105, 83, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 55, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 66, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 104, 56, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 65, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 57, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 58, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 68, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 69, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 70, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 71, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 73, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 195, - 122, 61, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 62, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 63, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 74, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 75, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 76, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 77, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 79, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 210, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 80, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 81, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 82, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 50, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 52, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 168, 314, 114, 314, - 314, 201, 134, 314, 314, 314, 256, 314, 101, 47, - 22, 285, 41, 314, 314, 314, 314, 333, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 145, 314, 114, 314, 314, 201, 128, 314, 314, 314, - 256, 314, 101, 47, 22, 285, 41, 314, 314, 314, - 314, 287, 281, 204, 283, 315, 289, 314, 300, 298, - 301, 247, 248, 249, 2, 314, 313, 314, 314, 314, - 6, 87, 259, 314, 314, 19, 112, 314, 14, 258, - 217, 261, 218, 314, 15, 39, 314, 14, 14, 42, - 43, 286, 12, 15, 15, 314, 314, 314, 42, 43, - 286, 12, 314, 314, 314, 314, 293, 294, 295, 296, - 308, 27, 314, 314, 315, 293, 294, 295, 296, 314, - 247, 248, 249, 2, 314, 313, 314, 110, 314, 6, - 87, 314, 314, 314, 314, 112, 314, 314, 148, 217, - 261, 218, 314, 42, 43, 286, 12, 314, 42, 43, - 286, 12, 314, 314, 314, 314, 314, 314, 314, 314, - 293, 294, 295, 296, 314, 293, 294, 295, 296, 309, - 27, 314, 314, 240, 241, 242, 133, 223, 314, 247, - 248, 249, 1, 314, 482, 314, 314, 482, 6, 87, - 3, 482, 466, 314, 112, 314, 276, 314, 217, 261, - 218, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 132, 314, 314, 314, 314, 314, 101, 314, 466, 314, - 314, 466, 314, 482, 314, 466, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 314, 288, 314, 216, 314, - 200, 114, 314, 314, 201, 123, 314, 314, 314, 314, - 314, 101, 365, 314, 314, 314, 230, 314, 314, 314, - 314, 281, 204, 283, 14, 289, 314, 300, 298, 301, - 15, 314, 288, 446, 216, 314, 169, 114, 314, 314, - 201, 124, 314, 314, 314, 446, 256, 101, 314, 47, - 22, 285, 41, 314, 314, 314, 314, 281, 204, 283, - 314, 289, 314, 300, 298, 301, 314, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 125, 314, 314, 314, - 314, 314, 101, 314, 314, 314, 314, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 314, 314, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 126, 314, 314, 314, 314, 314, 101, 314, - 314, 314, 314, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 314, 288, 314, - 216, 314, 314, 114, 314, 314, 201, 127, 314, 314, - 314, 314, 314, 101, 314, 314, 314, 314, 314, 314, - 314, 314, 314, 281, 204, 283, 314, 289, 314, 300, - 298, 301, 314, 314, 288, 314, 216, 223, 314, 114, - 314, 314, 201, 131, 482, 314, 314, 482, 314, 101, - 314, 482, 466, 314, 314, 314, 276, 314, 314, 281, - 204, 283, 314, 289, 314, 300, 298, 301, 314, 314, - 409, 314, 314, 314, 314, 314, 314, 314, 466, 314, - 314, 466, 314, 482, 223, 466, 292, 314, 314, 314, - 314, 482, 314, 314, 482, 314, 314, 36, 482, 466, - 314, 223, 446, 276, 409, 409, 409, 409, 482, 314, - 314, 482, 314, 314, 446, 482, 466, 314, 314, 30, - 276, 409, 409, 409, 409, 466, 482, 314, 466, 482, - 482, 314, 466, 482, 466, 314, 314, 314, 276, 314, - 314, 314, 466, 314, 314, 466, 332, 482, 314, 466, - 314, 314, 314, 314, 314, 331, 42, 43, 286, 12, - 466, 314, 314, 466, 314, 482, 314, 466, 314, 42, - 43, 286, 12, 293, 294, 295, 296, 307, 314, 42, - 43, 286, 12, 185, 314, 314, 293, 294, 295, 296, - 186, 314, 314, 314, 322, 314, 293, 294, 295, 296, - 42, 43, 286, 12, 31, 314, 42, 43, 286, 12, - 314, 334, 314, 42, 43, 286, 12, 293, 294, 295, - 296, 314, 314, 293, 294, 295, 296, 314, 314, 314, - 293, 294, 295, 296, 42, 43, 286, 12, 42, 43, - 286, 12, 482, 314, 314, 482, 314, 314, 314, 482, - 466, 293, 294, 295, 296, 293, 294, 295, 296, 314, - 314, 314, 259, 314, 314, 19, 314, 314, 314, 258, - 314, 314, 314, 314, 314, 314, 466, 314, 14, 466, - 150, 482, 314, 466, 15, + 30, 47, 22, 292, 41, 14, 48, 252, 253, 254, + 1, 15, 142, 242, 208, 206, 6, 88, 206, 228, + 244, 205, 114, 109, 406, 206, 223, 266, 224, 103, + 230, 406, 21, 406, 226, 44, 406, 29, 45, 46, + 283, 232, 406, 287, 406, 209, 406, 54, 4, 14, + 304, 186, 333, 290, 231, 15, 5, 86, 252, 253, + 254, 1, 103, 139, 400, 199, 241, 6, 88, 518, + 228, 552, 101, 114, 153, 258, 400, 223, 266, 224, + 144, 213, 400, 21, 261, 453, 44, 13, 144, 45, + 46, 283, 232, 206, 240, 13, 209, 453, 54, 4, + 332, 304, 206, 40, 262, 368, 156, 5, 86, 252, + 253, 254, 1, 143, 102, 272, 87, 368, 6, 88, + 310, 228, 103, 368, 114, 319, 156, 222, 223, 266, + 224, 274, 230, 184, 21, 290, 143, 44, 235, 10, + 45, 46, 283, 232, 175, 287, 273, 209, 54, 54, + 4, 304, 304, 251, 183, 222, 290, 180, 5, 86, + 252, 253, 254, 1, 20, 141, 198, 208, 276, 6, + 88, 54, 228, 315, 304, 114, 190, 265, 453, 223, + 266, 224, 206, 230, 277, 21, 147, 238, 44, 190, + 453, 45, 46, 283, 232, 329, 287, 3, 209, 103, + 54, 4, 146, 304, 304, 289, 98, 311, 23, 5, + 86, 252, 253, 254, 1, 269, 141, 134, 200, 367, + 6, 88, 25, 228, 304, 367, 114, 108, 117, 453, + 223, 266, 224, 34, 230, 233, 21, 167, 53, 44, + 304, 453, 45, 46, 283, 232, 103, 287, 37, 209, + 103, 54, 4, 336, 304, 157, 206, 262, 367, 145, + 5, 86, 252, 253, 254, 1, 269, 140, 402, 208, + 367, 6, 88, 304, 228, 117, 367, 114, 155, 117, + 402, 223, 266, 224, 260, 230, 402, 11, 261, 53, + 44, 206, 24, 45, 46, 283, 232, 206, 287, 166, + 209, 262, 54, 4, 183, 304, 290, 163, 262, 399, + 262, 5, 86, 252, 253, 254, 1, 261, 141, 165, + 195, 399, 6, 88, 36, 228, 274, 399, 114, 261, + 242, 113, 223, 266, 224, 91, 219, 344, 21, 341, + 109, 44, 18, 189, 45, 46, 283, 232, 15, 287, + 242, 209, 473, 54, 4, 189, 304, 243, 269, 473, + 109, 177, 5, 86, 252, 253, 254, 1, 33, 141, + 148, 193, 92, 6, 88, 264, 228, 304, 19, 114, + 261, 53, 263, 223, 266, 224, 159, 230, 327, 21, + 10, 150, 44, 190, 206, 45, 46, 283, 232, 151, + 287, 109, 209, 161, 54, 4, 269, 304, 182, 261, + 118, 171, 168, 5, 86, 252, 253, 254, 1, 16, + 141, 261, 208, 8, 6, 88, 181, 228, 290, 53, + 114, 319, 97, 222, 223, 266, 224, 185, 194, 290, + 21, 325, 297, 44, 298, 317, 45, 46, 283, 232, + 174, 287, 473, 209, 134, 54, 4, 189, 304, 473, + 261, 178, 220, 203, 5, 86, 252, 253, 254, 1, + 187, 143, 250, 208, 40, 6, 88, 489, 90, 321, + 489, 114, 17, 265, 489, 223, 266, 224, 343, 230, + 269, 21, 291, 190, 49, 249, 250, 45, 46, 283, + 232, 268, 287, 8, 209, 322, 54, 4, 7, 304, + 204, 453, 31, 53, 100, 5, 86, 252, 253, 254, + 1, 93, 143, 453, 208, 162, 6, 88, 455, 95, + 455, 454, 114, 225, 9, 261, 223, 266, 224, 231, + 230, 99, 21, 454, 176, 44, 119, 328, 45, 46, + 283, 232, 457, 287, 457, 209, 169, 54, 4, 170, + 304, 190, 32, 32, 334, 335, 5, 86, 179, 295, + 221, 222, 257, 248, 94, 111, 255, 197, 105, 85, + 35, 256, 231, 188, 104, 115, 267, 278, 279, 284, + 164, 124, 275, 280, 96, 286, 210, 288, 282, 296, + 261, 302, 301, 303, 295, 221, 222, 257, 231, 94, + 111, 300, 196, 105, 60, 285, 89, 239, 342, 104, + 158, 160, 278, 279, 37, 330, 190, 345, 331, 38, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 295, + 322, 222, 259, 322, 116, 111, 322, 197, 105, 85, + 322, 322, 264, 322, 104, 19, 322, 278, 279, 263, + 322, 322, 322, 322, 322, 286, 210, 288, 322, 296, + 322, 302, 301, 303, 295, 322, 222, 322, 112, 116, + 322, 322, 207, 121, 71, 322, 322, 322, 322, 104, + 322, 234, 278, 279, 42, 43, 293, 12, 322, 322, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 322, + 322, 305, 306, 307, 308, 309, 295, 322, 222, 212, + 324, 116, 322, 322, 207, 121, 71, 14, 322, 489, + 322, 104, 489, 15, 278, 279, 489, 473, 42, 43, + 293, 12, 286, 210, 288, 322, 296, 322, 302, 301, + 303, 322, 322, 322, 322, 305, 306, 307, 308, 309, + 322, 211, 324, 473, 322, 322, 473, 295, 489, 222, + 473, 322, 110, 322, 322, 207, 125, 51, 322, 123, + 264, 322, 104, 19, 322, 278, 279, 263, 322, 322, + 322, 322, 322, 286, 210, 288, 322, 296, 322, 302, + 301, 303, 295, 322, 222, 322, 322, 116, 322, 322, + 207, 125, 67, 133, 322, 322, 236, 104, 322, 227, + 278, 279, 322, 104, 322, 322, 322, 322, 286, 210, + 288, 322, 296, 322, 302, 301, 303, 322, 322, 322, + 302, 301, 303, 295, 217, 222, 322, 322, 116, 322, + 322, 207, 121, 71, 322, 322, 322, 322, 104, 322, + 322, 278, 279, 322, 322, 322, 322, 322, 322, 286, + 210, 288, 322, 296, 322, 302, 301, 303, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 125, 77, 323, + 322, 322, 322, 104, 322, 322, 278, 279, 322, 322, + 322, 322, 322, 322, 286, 210, 288, 322, 296, 214, + 216, 301, 303, 322, 322, 295, 322, 222, 322, 322, + 116, 322, 322, 207, 125, 67, 322, 322, 322, 322, + 104, 322, 322, 278, 279, 322, 322, 322, 322, 322, + 322, 286, 210, 288, 322, 296, 322, 302, 301, 303, + 295, 322, 222, 322, 322, 110, 322, 218, 207, 125, + 58, 322, 243, 322, 322, 104, 322, 322, 278, 279, + 322, 322, 264, 322, 322, 19, 286, 210, 288, 263, + 296, 322, 302, 301, 303, 322, 322, 295, 14, 222, + 154, 322, 116, 322, 15, 207, 122, 62, 322, 322, + 489, 322, 104, 489, 322, 278, 279, 489, 322, 322, + 322, 322, 322, 286, 210, 288, 322, 296, 322, 302, + 301, 303, 295, 322, 222, 322, 322, 116, 322, 322, + 202, 120, 59, 322, 322, 322, 322, 104, 322, 489, + 278, 279, 322, 322, 322, 322, 322, 322, 286, 210, + 288, 322, 296, 322, 302, 301, 303, 322, 322, 295, + 322, 222, 322, 322, 116, 322, 322, 207, 106, 84, + 322, 322, 322, 322, 104, 322, 322, 278, 279, 322, + 322, 322, 322, 322, 322, 286, 210, 288, 322, 296, + 322, 302, 301, 303, 295, 322, 222, 322, 322, 116, + 322, 322, 207, 107, 83, 322, 322, 322, 322, 104, + 322, 322, 278, 279, 322, 322, 322, 322, 322, 322, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 322, + 322, 295, 322, 222, 322, 322, 116, 322, 322, 207, + 125, 55, 322, 322, 322, 322, 104, 322, 322, 278, + 279, 322, 322, 322, 322, 322, 322, 286, 210, 288, + 322, 296, 322, 302, 301, 303, 295, 322, 222, 322, + 322, 116, 322, 322, 207, 125, 66, 322, 322, 322, + 322, 104, 322, 322, 278, 279, 322, 322, 322, 322, + 322, 322, 286, 210, 288, 322, 296, 322, 302, 301, + 303, 322, 322, 295, 322, 222, 322, 322, 116, 322, + 322, 207, 106, 56, 322, 322, 322, 322, 104, 322, + 322, 278, 279, 322, 322, 322, 322, 322, 322, 286, + 210, 288, 322, 296, 322, 302, 301, 303, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 125, 65, 322, + 322, 322, 322, 104, 322, 322, 278, 279, 322, 322, + 322, 322, 322, 322, 286, 210, 288, 322, 296, 322, + 302, 301, 303, 322, 322, 295, 322, 222, 322, 322, + 116, 322, 322, 207, 125, 57, 322, 322, 322, 322, + 104, 322, 322, 278, 279, 322, 322, 322, 322, 322, + 322, 286, 210, 288, 322, 296, 322, 302, 301, 303, + 295, 322, 222, 322, 322, 116, 322, 322, 207, 125, + 58, 322, 322, 322, 322, 104, 322, 322, 278, 279, + 322, 322, 322, 322, 322, 322, 286, 210, 288, 322, + 296, 322, 302, 301, 303, 322, 322, 295, 322, 222, + 322, 322, 116, 322, 322, 207, 125, 68, 322, 322, + 322, 322, 104, 322, 322, 278, 279, 322, 322, 322, + 322, 322, 322, 286, 210, 288, 322, 296, 322, 302, + 301, 303, 295, 322, 222, 322, 322, 116, 322, 322, + 207, 125, 69, 322, 322, 322, 322, 104, 322, 322, + 278, 279, 322, 322, 322, 322, 322, 322, 286, 210, + 288, 322, 296, 322, 302, 301, 303, 322, 322, 295, + 322, 222, 322, 322, 116, 322, 322, 207, 125, 70, + 322, 322, 322, 322, 104, 322, 322, 278, 279, 322, + 322, 322, 322, 322, 322, 286, 210, 288, 322, 296, + 322, 302, 301, 303, 295, 322, 222, 322, 322, 116, + 322, 322, 207, 125, 72, 322, 322, 322, 322, 104, + 322, 322, 278, 279, 322, 322, 322, 322, 322, 322, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 322, + 322, 295, 322, 222, 322, 322, 116, 322, 322, 201, + 125, 61, 322, 322, 322, 322, 104, 322, 322, 278, + 279, 322, 322, 322, 322, 322, 322, 286, 210, 288, + 322, 296, 322, 302, 301, 303, 295, 322, 222, 322, + 322, 116, 322, 322, 207, 125, 73, 322, 322, 322, + 322, 104, 322, 322, 278, 279, 322, 322, 322, 322, + 322, 322, 286, 210, 288, 322, 296, 322, 302, 301, + 303, 322, 322, 295, 322, 222, 322, 322, 116, 322, + 322, 207, 125, 74, 322, 322, 322, 322, 104, 322, + 322, 278, 279, 322, 322, 322, 322, 322, 322, 286, + 210, 288, 322, 296, 322, 302, 301, 303, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 125, 75, 322, + 322, 322, 322, 104, 322, 322, 278, 279, 322, 322, + 322, 322, 322, 322, 286, 210, 288, 322, 296, 322, + 302, 301, 303, 322, 322, 295, 322, 222, 322, 322, + 116, 322, 322, 207, 125, 76, 322, 322, 322, 322, + 104, 322, 322, 278, 279, 322, 322, 322, 322, 322, + 322, 286, 210, 288, 322, 296, 322, 302, 301, 303, + 295, 322, 222, 322, 322, 116, 322, 322, 207, 125, + 78, 322, 322, 322, 322, 104, 322, 322, 278, 279, + 322, 322, 322, 322, 322, 322, 286, 210, 288, 322, + 296, 322, 215, 301, 303, 322, 322, 295, 322, 222, + 322, 322, 116, 322, 322, 207, 125, 79, 322, 322, + 322, 322, 104, 322, 322, 278, 279, 322, 322, 322, + 322, 322, 322, 286, 210, 288, 322, 296, 322, 302, + 301, 303, 295, 322, 222, 322, 322, 116, 322, 322, + 207, 125, 63, 322, 322, 322, 322, 104, 322, 322, + 278, 279, 322, 322, 322, 322, 322, 322, 286, 210, + 288, 322, 296, 322, 302, 301, 303, 322, 322, 295, + 322, 222, 322, 322, 116, 322, 322, 207, 125, 64, + 322, 322, 322, 322, 104, 322, 322, 278, 279, 322, + 322, 322, 322, 322, 322, 286, 210, 288, 322, 296, + 322, 302, 301, 303, 295, 322, 222, 322, 322, 116, + 322, 322, 207, 125, 80, 322, 322, 322, 322, 104, + 322, 322, 278, 279, 322, 322, 322, 322, 322, 322, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 322, + 322, 295, 322, 222, 322, 322, 116, 322, 322, 207, + 125, 81, 322, 322, 322, 322, 104, 322, 322, 278, + 279, 322, 322, 322, 322, 322, 322, 286, 210, 288, + 322, 296, 322, 302, 301, 303, 295, 322, 222, 322, + 322, 116, 322, 322, 207, 125, 82, 322, 322, 322, + 322, 104, 322, 322, 278, 279, 322, 322, 322, 322, + 322, 322, 286, 210, 288, 322, 296, 322, 302, 301, + 303, 322, 322, 295, 322, 222, 322, 322, 116, 322, + 322, 207, 125, 50, 322, 322, 322, 322, 104, 322, + 322, 278, 279, 322, 322, 322, 322, 322, 322, 286, + 210, 288, 322, 296, 322, 302, 301, 303, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 125, 52, 322, + 322, 322, 322, 104, 322, 322, 278, 279, 322, 322, + 322, 322, 322, 322, 286, 210, 288, 322, 296, 322, + 302, 301, 303, 322, 322, 295, 322, 222, 322, 322, + 116, 322, 322, 207, 138, 322, 322, 322, 322, 295, + 104, 222, 322, 322, 116, 322, 322, 207, 131, 339, + 322, 286, 210, 288, 104, 296, 322, 302, 301, 303, + 322, 322, 322, 294, 322, 286, 210, 288, 322, 296, + 320, 302, 301, 303, 322, 322, 252, 253, 254, 2, + 322, 318, 322, 322, 322, 6, 88, 322, 322, 322, + 322, 114, 322, 322, 152, 223, 266, 224, 322, 322, + 322, 39, 322, 14, 42, 43, 293, 12, 322, 15, + 322, 322, 322, 322, 42, 43, 293, 12, 322, 322, + 322, 305, 306, 307, 308, 309, 313, 26, 322, 322, + 320, 305, 306, 307, 308, 309, 252, 253, 254, 2, + 322, 318, 322, 322, 322, 6, 88, 264, 322, 322, + 19, 114, 322, 322, 263, 223, 266, 224, 337, 42, + 43, 293, 12, 14, 42, 43, 293, 12, 322, 15, + 322, 322, 322, 322, 322, 322, 305, 306, 307, 308, + 309, 305, 306, 307, 308, 309, 314, 26, 316, 322, + 245, 246, 247, 137, 229, 322, 252, 253, 254, 1, + 322, 489, 322, 322, 489, 6, 88, 3, 489, 473, + 322, 114, 322, 281, 322, 223, 266, 224, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 136, 322, 322, + 322, 322, 322, 104, 322, 473, 322, 322, 473, 322, + 489, 322, 473, 322, 286, 210, 288, 322, 296, 322, + 302, 301, 303, 322, 295, 322, 222, 172, 322, 116, + 322, 322, 207, 126, 322, 322, 322, 261, 322, 104, + 47, 22, 292, 41, 322, 48, 322, 322, 322, 322, + 286, 210, 288, 322, 296, 322, 302, 301, 303, 322, + 295, 322, 222, 322, 149, 116, 322, 322, 207, 127, + 322, 322, 322, 322, 261, 104, 322, 47, 22, 292, + 41, 322, 48, 322, 322, 322, 286, 210, 288, 322, + 296, 322, 302, 301, 303, 322, 295, 322, 222, 322, + 173, 116, 322, 322, 207, 128, 322, 322, 322, 322, + 261, 104, 322, 47, 22, 292, 41, 133, 48, 322, + 271, 322, 286, 210, 288, 322, 296, 104, 302, 301, + 303, 322, 295, 322, 222, 322, 322, 116, 322, 270, + 207, 129, 322, 322, 302, 301, 303, 104, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, 286, 210, + 288, 322, 296, 322, 302, 301, 303, 322, 295, 322, + 222, 322, 322, 116, 322, 322, 207, 130, 322, 322, + 322, 322, 322, 104, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 286, 210, 288, 322, 296, 322, + 302, 301, 303, 322, 295, 322, 222, 322, 322, 116, + 322, 206, 207, 132, 322, 322, 322, 322, 322, 104, + 322, 322, 322, 371, 322, 322, 322, 237, 322, 322, + 286, 210, 288, 322, 296, 14, 302, 301, 303, 322, + 295, 15, 222, 415, 453, 116, 322, 322, 207, 135, + 322, 322, 322, 322, 322, 104, 453, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 286, 210, 288, 322, + 296, 322, 302, 301, 303, 453, 322, 415, 415, 415, + 415, 322, 322, 322, 322, 322, 322, 453, 322, 322, + 322, 322, 322, 322, 415, 415, 415, 415, 415, 229, + 322, 322, 322, 322, 322, 322, 489, 322, 322, 489, + 322, 322, 229, 489, 473, 322, 322, 322, 281, 489, + 322, 322, 489, 322, 322, 36, 489, 473, 322, 322, + 322, 281, 322, 322, 322, 322, 322, 322, 322, 338, + 473, 322, 322, 473, 322, 489, 322, 473, 299, 322, + 322, 322, 322, 473, 322, 322, 473, 322, 489, 322, + 473, 28, 42, 43, 293, 12, 322, 312, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, 322, 305, + 306, 307, 308, 309, 42, 43, 293, 12, 322, 322, + 42, 43, 293, 12, 191, 42, 43, 293, 12, 326, + 192, 305, 306, 307, 308, 309, 340, 305, 306, 307, + 308, 309, 305, 306, 307, 308, 309, 42, 43, 293, + 12, 322, 322, 42, 43, 293, 12, 322, 322, 42, + 43, 293, 12, 322, 305, 306, 307, 308, 309, 322, + 305, 306, 307, 308, 309, 229, 305, 306, 307, 308, + 309, 27, 489, 322, 322, 489, 322, 322, 489, 489, + 473, 489, 322, 322, 281, 489, 473, 322, 322, 322, + 281, 322, 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 473, 322, 322, 473, + 322, 489, 473, 473, 322, 473, 322, 489, 322, 473, + 322, 42, 43, 293, 12, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, 305, 306, + 307, 308, 309, ); public static $yy_lookahead = array( - 2, 80, 100, 13, 102, 103, 1, 9, 10, 11, - 12, 21, 14, 70, 16, 25, 18, 19, 93, 21, - 77, 31, 24, 80, 13, 104, 28, 29, 30, 104, - 32, 20, 34, 22, 44, 37, 25, 39, 40, 41, - 42, 43, 31, 45, 33, 47, 35, 49, 50, 14, - 52, 16, 12, 17, 43, 57, 58, 9, 10, 11, - 12, 12, 14, 14, 16, 16, 18, 19, 65, 21, - 67, 12, 24, 14, 34, 16, 28, 29, 30, 43, - 32, 32, 34, 1, 49, 37, 50, 52, 40, 41, - 42, 43, 72, 45, 99, 47, 101, 49, 50, 51, - 52, 52, 82, 69, 14, 57, 58, 9, 10, 11, - 12, 52, 14, 13, 16, 15, 18, 19, 15, 21, - 17, 101, 24, 72, 34, 25, 28, 29, 30, 17, - 32, 31, 34, 82, 34, 37, 102, 103, 40, 41, - 42, 43, 52, 45, 1, 47, 46, 49, 50, 46, - 52, 85, 86, 87, 88, 57, 58, 9, 10, 11, - 12, 14, 14, 16, 16, 80, 18, 19, 25, 21, - 61, 62, 24, 72, 31, 34, 28, 29, 30, 65, - 32, 67, 34, 82, 43, 37, 33, 46, 40, 41, - 42, 43, 51, 45, 47, 47, 49, 49, 50, 52, - 52, 99, 101, 13, 51, 57, 58, 9, 10, 11, - 12, 21, 14, 17, 16, 25, 18, 19, 15, 21, - 17, 31, 24, 101, 110, 111, 28, 29, 30, 65, - 32, 67, 34, 15, 44, 37, 1, 2, 40, 41, - 42, 43, 46, 45, 70, 47, 25, 49, 50, 46, - 52, 77, 31, 72, 80, 57, 58, 9, 10, 11, - 12, 43, 14, 82, 16, 1, 18, 19, 50, 21, - 82, 76, 24, 21, 34, 111, 28, 29, 30, 99, - 32, 101, 34, 14, 72, 37, 46, 106, 40, 41, - 42, 43, 27, 45, 82, 47, 44, 49, 50, 34, - 52, 106, 107, 51, 76, 57, 58, 9, 10, 11, - 12, 46, 14, 21, 16, 51, 18, 19, 106, 21, - 1, 52, 24, 69, 102, 103, 28, 29, 30, 16, - 32, 25, 34, 1, 106, 37, 44, 31, 40, 41, - 42, 43, 70, 45, 100, 47, 27, 49, 50, 17, - 52, 59, 80, 99, 93, 57, 58, 9, 10, 11, - 12, 48, 14, 72, 16, 104, 18, 19, 9, 21, - 20, 12, 24, 82, 72, 16, 28, 29, 30, 79, - 32, 76, 34, 33, 82, 37, 1, 2, 40, 41, - 42, 43, 14, 45, 16, 47, 14, 49, 50, 76, - 52, 102, 103, 72, 80, 57, 58, 9, 10, 11, - 12, 106, 14, 82, 16, 80, 18, 19, 9, 21, - 99, 12, 24, 63, 64, 16, 28, 29, 30, 106, - 32, 6, 34, 8, 52, 37, 99, 43, 40, 41, - 42, 43, 43, 45, 50, 47, 99, 49, 50, 50, - 52, 36, 37, 38, 39, 57, 58, 9, 10, 11, - 12, 21, 14, 34, 16, 2, 18, 19, 53, 54, - 55, 56, 24, 15, 59, 46, 28, 29, 30, 21, - 32, 106, 34, 107, 44, 37, 7, 8, 40, 41, - 42, 43, 33, 45, 35, 47, 34, 49, 50, 99, - 52, 36, 37, 38, 39, 57, 58, 9, 10, 11, - 12, 34, 14, 33, 16, 35, 18, 19, 53, 54, - 55, 56, 24, 46, 103, 15, 28, 29, 30, 43, - 32, 64, 34, 81, 33, 37, 35, 51, 40, 41, - 42, 43, 33, 45, 35, 47, 99, 49, 50, 81, - 52, 70, 81, 43, 73, 57, 58, 65, 66, 67, - 68, 80, 70, 71, 7, 73, 74, 75, 33, 99, - 35, 33, 80, 35, 16, 83, 84, 96, 97, 98, - 13, 13, 90, 91, 92, 16, 94, 16, 96, 97, - 98, 16, 65, 66, 67, 68, 16, 70, 71, 14, - 73, 74, 75, 16, 32, 43, 70, 80, 32, 16, - 83, 84, 70, 77, 78, 73, 80, 90, 91, 92, - 34, 94, 80, 96, 97, 98, 65, 16, 67, 68, - 49, 70, 71, 91, 73, 74, 75, 1, 96, 97, - 98, 80, 1, 9, 83, 84, 12, 49, 51, 13, - 16, 90, 91, 92, 13, 94, 16, 96, 97, 98, - 65, 25, 67, 51, 1, 70, 25, 31, 73, 74, - 75, 16, 31, 15, 9, 80, 13, 12, 83, 84, - 72, 16, 48, 35, 76, 90, 91, 92, 25, 94, - 82, 96, 97, 98, 31, 22, 112, 65, 112, 67, - 112, 112, 70, 108, 109, 73, 74, 75, 112, 112, - 112, 112, 80, 48, 106, 83, 84, 72, 112, 112, - 112, 76, 90, 91, 92, 112, 94, 82, 96, 97, - 98, 112, 112, 112, 65, 112, 67, 112, 112, 70, - 108, 109, 73, 74, 75, 112, 77, 112, 112, 80, - 112, 106, 83, 84, 112, 112, 112, 112, 112, 90, - 91, 92, 112, 94, 112, 96, 97, 98, 65, 112, - 67, 112, 112, 70, 112, 112, 73, 74, 75, 112, - 112, 112, 112, 80, 112, 112, 83, 84, 112, 112, - 112, 112, 112, 90, 91, 92, 112, 94, 112, 96, - 97, 98, 65, 112, 67, 112, 112, 70, 105, 112, - 73, 74, 75, 112, 112, 112, 112, 80, 112, 112, - 83, 84, 112, 112, 112, 112, 112, 90, 91, 92, - 112, 94, 112, 96, 97, 98, 65, 112, 67, 112, - 112, 70, 105, 112, 73, 74, 75, 112, 112, 112, - 112, 80, 112, 112, 83, 84, 112, 112, 112, 112, - 112, 90, 91, 92, 112, 94, 112, 96, 97, 98, - 112, 112, 112, 65, 112, 67, 112, 112, 70, 112, - 109, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 9, 83, 84, 12, 112, 112, 112, 16, 90, 91, - 92, 112, 94, 95, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 77, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 48, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 72, 112, 70, 112, - 112, 73, 74, 112, 112, 112, 82, 112, 80, 85, - 86, 87, 88, 112, 112, 112, 112, 89, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 72, 112, 70, 112, 112, 73, 74, 112, 112, 112, - 82, 112, 80, 85, 86, 87, 88, 112, 112, 112, - 112, 89, 90, 91, 92, 3, 94, 112, 96, 97, - 98, 9, 10, 11, 12, 112, 14, 112, 112, 112, - 18, 19, 9, 112, 112, 12, 24, 112, 25, 16, - 28, 29, 30, 112, 31, 23, 112, 25, 25, 36, - 37, 38, 39, 31, 31, 112, 112, 112, 36, 37, - 38, 39, 112, 112, 112, 112, 53, 54, 55, 56, - 58, 59, 112, 112, 3, 53, 54, 55, 56, 112, - 9, 10, 11, 12, 112, 14, 112, 20, 112, 18, - 19, 112, 112, 112, 112, 24, 112, 112, 26, 28, - 29, 30, 112, 36, 37, 38, 39, 112, 36, 37, - 38, 39, 112, 112, 112, 112, 112, 112, 112, 112, - 53, 54, 55, 56, 112, 53, 54, 55, 56, 58, - 59, 112, 112, 3, 4, 5, 6, 2, 112, 9, - 10, 11, 12, 112, 9, 112, 112, 12, 18, 19, - 15, 16, 17, 112, 24, 112, 21, 112, 28, 29, - 30, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 112, 112, 112, 112, 112, 80, 112, 43, 112, - 112, 46, 112, 48, 112, 50, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 112, 65, 112, 67, 112, - 1, 70, 112, 112, 73, 74, 112, 112, 112, 112, - 112, 80, 13, 112, 112, 112, 17, 112, 112, 112, - 112, 90, 91, 92, 25, 94, 112, 96, 97, 98, - 31, 112, 65, 34, 67, 112, 72, 70, 112, 112, - 73, 74, 112, 112, 112, 46, 82, 80, 112, 85, - 86, 87, 88, 112, 112, 112, 112, 90, 91, 92, - 112, 94, 112, 96, 97, 98, 112, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 112, 112, 112, - 112, 112, 80, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 112, 112, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 112, 112, 112, 112, 112, 80, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 112, 65, 112, - 67, 112, 112, 70, 112, 112, 73, 74, 112, 112, - 112, 112, 112, 80, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 90, 91, 92, 112, 94, 112, 96, - 97, 98, 112, 112, 65, 112, 67, 2, 112, 70, - 112, 112, 73, 74, 9, 112, 112, 12, 112, 80, - 112, 16, 17, 112, 112, 112, 21, 112, 112, 90, - 91, 92, 112, 94, 112, 96, 97, 98, 112, 112, - 2, 112, 112, 112, 112, 112, 112, 112, 43, 112, - 112, 46, 112, 48, 2, 50, 51, 112, 112, 112, - 112, 9, 112, 112, 12, 112, 112, 15, 16, 17, - 112, 2, 34, 21, 36, 37, 38, 39, 9, 112, - 112, 12, 112, 112, 46, 16, 17, 112, 112, 2, - 21, 53, 54, 55, 56, 43, 9, 112, 46, 12, - 48, 112, 50, 16, 17, 112, 112, 112, 21, 112, - 112, 112, 43, 112, 112, 46, 13, 48, 112, 50, - 112, 112, 112, 112, 112, 35, 36, 37, 38, 39, - 43, 112, 112, 46, 112, 48, 112, 50, 112, 36, - 37, 38, 39, 53, 54, 55, 56, 13, 112, 36, - 37, 38, 39, 13, 112, 112, 53, 54, 55, 56, - 13, 112, 112, 112, 51, 112, 53, 54, 55, 56, - 36, 37, 38, 39, 2, 112, 36, 37, 38, 39, - 112, 13, 112, 36, 37, 38, 39, 53, 54, 55, - 56, 112, 112, 53, 54, 55, 56, 112, 112, 112, - 53, 54, 55, 56, 36, 37, 38, 39, 36, 37, - 38, 39, 9, 112, 112, 12, 112, 112, 112, 16, - 17, 53, 54, 55, 56, 53, 54, 55, 56, 112, - 112, 112, 9, 112, 112, 12, 112, 112, 112, 16, - 112, 112, 112, 112, 112, 112, 43, 112, 25, 46, - 27, 48, 112, 50, 31, + 2, 86, 87, 88, 89, 25, 91, 9, 10, 11, + 12, 31, 14, 71, 16, 1, 18, 19, 1, 21, + 78, 79, 24, 81, 13, 1, 28, 29, 30, 17, + 32, 20, 34, 22, 17, 37, 25, 39, 40, 41, + 42, 43, 31, 45, 33, 47, 35, 49, 50, 25, + 52, 104, 105, 106, 43, 31, 58, 59, 9, 10, + 11, 12, 17, 14, 13, 16, 15, 18, 19, 1, + 21, 62, 63, 24, 73, 70, 25, 28, 29, 30, + 43, 32, 31, 34, 83, 34, 37, 50, 43, 40, + 41, 42, 43, 1, 45, 50, 47, 46, 49, 50, + 51, 52, 1, 2, 103, 13, 101, 58, 59, 9, + 10, 11, 12, 14, 14, 16, 16, 25, 18, 19, + 70, 21, 17, 31, 24, 66, 101, 68, 28, 29, + 30, 102, 32, 104, 34, 106, 14, 37, 16, 34, + 40, 41, 42, 43, 77, 45, 47, 47, 49, 49, + 50, 52, 52, 66, 104, 68, 106, 77, 58, 59, + 9, 10, 11, 12, 12, 14, 14, 16, 16, 18, + 19, 49, 21, 114, 52, 24, 109, 110, 34, 28, + 29, 30, 1, 32, 32, 34, 14, 43, 37, 109, + 46, 40, 41, 42, 43, 51, 45, 15, 47, 17, + 49, 50, 14, 52, 52, 95, 34, 13, 27, 58, + 59, 9, 10, 11, 12, 21, 14, 107, 16, 25, + 18, 19, 27, 21, 52, 31, 24, 81, 46, 34, + 28, 29, 30, 12, 32, 14, 34, 16, 44, 37, + 52, 46, 40, 41, 42, 43, 17, 45, 15, 47, + 17, 49, 50, 107, 52, 101, 1, 103, 13, 81, + 58, 59, 9, 10, 11, 12, 21, 14, 13, 16, + 25, 18, 19, 52, 21, 46, 31, 24, 73, 46, + 25, 28, 29, 30, 83, 32, 31, 34, 83, 44, + 37, 1, 2, 40, 41, 42, 43, 1, 45, 101, + 47, 103, 49, 50, 104, 52, 106, 73, 103, 13, + 103, 58, 59, 9, 10, 11, 12, 83, 14, 73, + 16, 25, 18, 19, 15, 21, 102, 31, 24, 83, + 71, 80, 28, 29, 30, 81, 32, 78, 34, 14, + 81, 37, 25, 109, 40, 41, 42, 43, 31, 45, + 71, 47, 43, 49, 50, 109, 52, 78, 21, 50, + 81, 77, 58, 59, 9, 10, 11, 12, 12, 14, + 73, 16, 81, 18, 19, 9, 21, 52, 12, 24, + 83, 44, 16, 28, 29, 30, 101, 32, 51, 34, + 34, 71, 37, 109, 1, 40, 41, 42, 43, 73, + 45, 81, 47, 101, 49, 50, 21, 52, 14, 83, + 16, 73, 101, 58, 59, 9, 10, 11, 12, 20, + 14, 83, 16, 33, 18, 19, 104, 21, 106, 44, + 24, 66, 33, 68, 28, 29, 30, 104, 32, 106, + 34, 51, 95, 37, 51, 60, 40, 41, 42, 43, + 73, 45, 43, 47, 107, 49, 50, 109, 52, 50, + 83, 77, 64, 65, 58, 59, 9, 10, 11, 12, + 6, 14, 8, 16, 2, 18, 19, 9, 113, 114, + 12, 24, 15, 110, 16, 28, 29, 30, 21, 32, + 21, 34, 106, 109, 37, 7, 8, 40, 41, 42, + 43, 16, 45, 33, 47, 35, 49, 50, 34, 52, + 65, 34, 33, 44, 35, 58, 59, 9, 10, 11, + 12, 101, 14, 46, 16, 73, 18, 19, 33, 77, + 35, 34, 24, 48, 34, 83, 28, 29, 30, 43, + 32, 82, 34, 46, 82, 37, 46, 51, 40, 41, + 42, 43, 33, 45, 35, 47, 101, 49, 50, 101, + 52, 109, 33, 33, 35, 35, 58, 59, 82, 66, + 67, 68, 69, 7, 71, 72, 13, 74, 75, 76, + 15, 13, 43, 16, 81, 16, 16, 84, 85, 32, + 73, 16, 16, 14, 77, 92, 93, 94, 16, 96, + 83, 98, 99, 100, 66, 67, 68, 69, 43, 71, + 72, 16, 74, 75, 76, 32, 16, 16, 16, 81, + 49, 49, 84, 85, 15, 51, 109, 35, 51, 22, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 66, + 115, 68, 69, 115, 71, 72, 115, 74, 75, 76, + 115, 115, 9, 115, 81, 12, 115, 84, 85, 16, + 115, 115, 115, 115, 115, 92, 93, 94, 115, 96, + 115, 98, 99, 100, 66, 115, 68, 115, 20, 71, + 115, 115, 74, 75, 76, 115, 115, 115, 115, 81, + 115, 48, 84, 85, 36, 37, 38, 39, 115, 115, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 115, + 115, 53, 54, 55, 56, 57, 66, 115, 68, 111, + 112, 71, 115, 115, 74, 75, 76, 25, 115, 9, + 115, 81, 12, 31, 84, 85, 16, 17, 36, 37, + 38, 39, 92, 93, 94, 115, 96, 115, 98, 99, + 100, 115, 115, 115, 115, 53, 54, 55, 56, 57, + 115, 111, 112, 43, 115, 115, 46, 66, 48, 68, + 50, 115, 71, 115, 115, 74, 75, 76, 115, 78, + 9, 115, 81, 12, 115, 84, 85, 16, 115, 115, + 115, 115, 115, 92, 93, 94, 115, 96, 115, 98, + 99, 100, 66, 115, 68, 115, 115, 71, 115, 115, + 74, 75, 76, 71, 115, 115, 74, 81, 115, 48, + 84, 85, 115, 81, 115, 115, 115, 115, 92, 93, + 94, 115, 96, 115, 98, 99, 100, 115, 115, 115, + 98, 99, 100, 66, 108, 68, 115, 115, 71, 115, + 115, 74, 75, 76, 115, 115, 115, 115, 81, 115, + 115, 84, 85, 115, 115, 115, 115, 115, 115, 92, + 93, 94, 115, 96, 115, 98, 99, 100, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 76, 112, + 115, 115, 115, 81, 115, 115, 84, 85, 115, 115, + 115, 115, 115, 115, 92, 93, 94, 115, 96, 97, + 98, 99, 100, 115, 115, 66, 115, 68, 115, 115, + 71, 115, 115, 74, 75, 76, 115, 115, 115, 115, + 81, 115, 115, 84, 85, 115, 115, 115, 115, 115, + 115, 92, 93, 94, 115, 96, 115, 98, 99, 100, + 66, 115, 68, 115, 115, 71, 115, 108, 74, 75, + 76, 115, 78, 115, 115, 81, 115, 115, 84, 85, + 115, 115, 9, 115, 115, 12, 92, 93, 94, 16, + 96, 115, 98, 99, 100, 115, 115, 66, 25, 68, + 27, 115, 71, 115, 31, 74, 75, 76, 115, 115, + 9, 115, 81, 12, 115, 84, 85, 16, 115, 115, + 115, 115, 115, 92, 93, 94, 115, 96, 115, 98, + 99, 100, 66, 115, 68, 115, 115, 71, 115, 115, + 74, 75, 76, 115, 115, 115, 115, 81, 115, 48, + 84, 85, 115, 115, 115, 115, 115, 115, 92, 93, + 94, 115, 96, 115, 98, 99, 100, 115, 115, 66, + 115, 68, 115, 115, 71, 115, 115, 74, 75, 76, + 115, 115, 115, 115, 81, 115, 115, 84, 85, 115, + 115, 115, 115, 115, 115, 92, 93, 94, 115, 96, + 115, 98, 99, 100, 66, 115, 68, 115, 115, 71, + 115, 115, 74, 75, 76, 115, 115, 115, 115, 81, + 115, 115, 84, 85, 115, 115, 115, 115, 115, 115, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 115, + 115, 66, 115, 68, 115, 115, 71, 115, 115, 74, + 75, 76, 115, 115, 115, 115, 81, 115, 115, 84, + 85, 115, 115, 115, 115, 115, 115, 92, 93, 94, + 115, 96, 115, 98, 99, 100, 66, 115, 68, 115, + 115, 71, 115, 115, 74, 75, 76, 115, 115, 115, + 115, 81, 115, 115, 84, 85, 115, 115, 115, 115, + 115, 115, 92, 93, 94, 115, 96, 115, 98, 99, + 100, 115, 115, 66, 115, 68, 115, 115, 71, 115, + 115, 74, 75, 76, 115, 115, 115, 115, 81, 115, + 115, 84, 85, 115, 115, 115, 115, 115, 115, 92, + 93, 94, 115, 96, 115, 98, 99, 100, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 76, 115, + 115, 115, 115, 81, 115, 115, 84, 85, 115, 115, + 115, 115, 115, 115, 92, 93, 94, 115, 96, 115, + 98, 99, 100, 115, 115, 66, 115, 68, 115, 115, + 71, 115, 115, 74, 75, 76, 115, 115, 115, 115, + 81, 115, 115, 84, 85, 115, 115, 115, 115, 115, + 115, 92, 93, 94, 115, 96, 115, 98, 99, 100, + 66, 115, 68, 115, 115, 71, 115, 115, 74, 75, + 76, 115, 115, 115, 115, 81, 115, 115, 84, 85, + 115, 115, 115, 115, 115, 115, 92, 93, 94, 115, + 96, 115, 98, 99, 100, 115, 115, 66, 115, 68, + 115, 115, 71, 115, 115, 74, 75, 76, 115, 115, + 115, 115, 81, 115, 115, 84, 85, 115, 115, 115, + 115, 115, 115, 92, 93, 94, 115, 96, 115, 98, + 99, 100, 66, 115, 68, 115, 115, 71, 115, 115, + 74, 75, 76, 115, 115, 115, 115, 81, 115, 115, + 84, 85, 115, 115, 115, 115, 115, 115, 92, 93, + 94, 115, 96, 115, 98, 99, 100, 115, 115, 66, + 115, 68, 115, 115, 71, 115, 115, 74, 75, 76, + 115, 115, 115, 115, 81, 115, 115, 84, 85, 115, + 115, 115, 115, 115, 115, 92, 93, 94, 115, 96, + 115, 98, 99, 100, 66, 115, 68, 115, 115, 71, + 115, 115, 74, 75, 76, 115, 115, 115, 115, 81, + 115, 115, 84, 85, 115, 115, 115, 115, 115, 115, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 115, + 115, 66, 115, 68, 115, 115, 71, 115, 115, 74, + 75, 76, 115, 115, 115, 115, 81, 115, 115, 84, + 85, 115, 115, 115, 115, 115, 115, 92, 93, 94, + 115, 96, 115, 98, 99, 100, 66, 115, 68, 115, + 115, 71, 115, 115, 74, 75, 76, 115, 115, 115, + 115, 81, 115, 115, 84, 85, 115, 115, 115, 115, + 115, 115, 92, 93, 94, 115, 96, 115, 98, 99, + 100, 115, 115, 66, 115, 68, 115, 115, 71, 115, + 115, 74, 75, 76, 115, 115, 115, 115, 81, 115, + 115, 84, 85, 115, 115, 115, 115, 115, 115, 92, + 93, 94, 115, 96, 115, 98, 99, 100, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 76, 115, + 115, 115, 115, 81, 115, 115, 84, 85, 115, 115, + 115, 115, 115, 115, 92, 93, 94, 115, 96, 115, + 98, 99, 100, 115, 115, 66, 115, 68, 115, 115, + 71, 115, 115, 74, 75, 76, 115, 115, 115, 115, + 81, 115, 115, 84, 85, 115, 115, 115, 115, 115, + 115, 92, 93, 94, 115, 96, 115, 98, 99, 100, + 66, 115, 68, 115, 115, 71, 115, 115, 74, 75, + 76, 115, 115, 115, 115, 81, 115, 115, 84, 85, + 115, 115, 115, 115, 115, 115, 92, 93, 94, 115, + 96, 115, 98, 99, 100, 115, 115, 66, 115, 68, + 115, 115, 71, 115, 115, 74, 75, 76, 115, 115, + 115, 115, 81, 115, 115, 84, 85, 115, 115, 115, + 115, 115, 115, 92, 93, 94, 115, 96, 115, 98, + 99, 100, 66, 115, 68, 115, 115, 71, 115, 115, + 74, 75, 76, 115, 115, 115, 115, 81, 115, 115, + 84, 85, 115, 115, 115, 115, 115, 115, 92, 93, + 94, 115, 96, 115, 98, 99, 100, 115, 115, 66, + 115, 68, 115, 115, 71, 115, 115, 74, 75, 76, + 115, 115, 115, 115, 81, 115, 115, 84, 85, 115, + 115, 115, 115, 115, 115, 92, 93, 94, 115, 96, + 115, 98, 99, 100, 66, 115, 68, 115, 115, 71, + 115, 115, 74, 75, 76, 115, 115, 115, 115, 81, + 115, 115, 84, 85, 115, 115, 115, 115, 115, 115, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 115, + 115, 66, 115, 68, 115, 115, 71, 115, 115, 74, + 75, 76, 115, 115, 115, 115, 81, 115, 115, 84, + 85, 115, 115, 115, 115, 115, 115, 92, 93, 94, + 115, 96, 115, 98, 99, 100, 66, 115, 68, 115, + 115, 71, 115, 115, 74, 75, 76, 115, 115, 115, + 115, 81, 115, 115, 84, 85, 115, 115, 115, 115, + 115, 115, 92, 93, 94, 115, 96, 115, 98, 99, + 100, 115, 115, 66, 115, 68, 115, 115, 71, 115, + 115, 74, 75, 76, 115, 115, 115, 115, 81, 115, + 115, 84, 85, 115, 115, 115, 115, 115, 115, 92, + 93, 94, 115, 96, 115, 98, 99, 100, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 76, 115, + 115, 115, 115, 81, 115, 115, 84, 85, 115, 115, + 115, 115, 115, 115, 92, 93, 94, 115, 96, 115, + 98, 99, 100, 115, 115, 66, 115, 68, 115, 115, + 71, 115, 115, 74, 75, 115, 115, 115, 115, 66, + 81, 68, 115, 115, 71, 115, 115, 74, 75, 90, + 115, 92, 93, 94, 81, 96, 115, 98, 99, 100, + 115, 115, 115, 90, 115, 92, 93, 94, 115, 96, + 3, 98, 99, 100, 115, 115, 9, 10, 11, 12, + 115, 14, 115, 115, 115, 18, 19, 115, 115, 115, + 115, 24, 115, 115, 26, 28, 29, 30, 115, 115, + 115, 23, 115, 25, 36, 37, 38, 39, 115, 31, + 115, 115, 115, 115, 36, 37, 38, 39, 115, 115, + 115, 53, 54, 55, 56, 57, 59, 60, 115, 115, + 3, 53, 54, 55, 56, 57, 9, 10, 11, 12, + 115, 14, 115, 115, 115, 18, 19, 9, 115, 115, + 12, 24, 115, 115, 16, 28, 29, 30, 35, 36, + 37, 38, 39, 25, 36, 37, 38, 39, 115, 31, + 115, 115, 115, 115, 115, 115, 53, 54, 55, 56, + 57, 53, 54, 55, 56, 57, 59, 60, 60, 115, + 3, 4, 5, 6, 2, 115, 9, 10, 11, 12, + 115, 9, 115, 115, 12, 18, 19, 15, 16, 17, + 115, 24, 115, 21, 115, 28, 29, 30, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 115, 115, + 115, 115, 115, 81, 115, 43, 115, 115, 46, 115, + 48, 115, 50, 115, 92, 93, 94, 115, 96, 115, + 98, 99, 100, 115, 66, 115, 68, 73, 115, 71, + 115, 115, 74, 75, 115, 115, 115, 83, 115, 81, + 86, 87, 88, 89, 115, 91, 115, 115, 115, 115, + 92, 93, 94, 115, 96, 115, 98, 99, 100, 115, + 66, 115, 68, 115, 73, 71, 115, 115, 74, 75, + 115, 115, 115, 115, 83, 81, 115, 86, 87, 88, + 89, 115, 91, 115, 115, 115, 92, 93, 94, 115, + 96, 115, 98, 99, 100, 115, 66, 115, 68, 115, + 73, 71, 115, 115, 74, 75, 115, 115, 115, 115, + 83, 81, 115, 86, 87, 88, 89, 71, 91, 115, + 74, 115, 92, 93, 94, 115, 96, 81, 98, 99, + 100, 115, 66, 115, 68, 115, 115, 71, 115, 93, + 74, 75, 115, 115, 98, 99, 100, 81, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 92, 93, + 94, 115, 96, 115, 98, 99, 100, 115, 66, 115, + 68, 115, 115, 71, 115, 115, 74, 75, 115, 115, + 115, 115, 115, 81, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 92, 93, 94, 115, 96, 115, + 98, 99, 100, 115, 66, 115, 68, 115, 115, 71, + 115, 1, 74, 75, 115, 115, 115, 115, 115, 81, + 115, 115, 115, 13, 115, 115, 115, 17, 115, 115, + 92, 93, 94, 115, 96, 25, 98, 99, 100, 115, + 66, 31, 68, 2, 34, 71, 115, 115, 74, 75, + 115, 115, 115, 115, 115, 81, 46, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 92, 93, 94, 115, + 96, 115, 98, 99, 100, 34, 115, 36, 37, 38, + 39, 115, 115, 115, 115, 115, 115, 46, 115, 115, + 115, 115, 115, 115, 53, 54, 55, 56, 57, 2, + 115, 115, 115, 115, 115, 115, 9, 115, 115, 12, + 115, 115, 2, 16, 17, 115, 115, 115, 21, 9, + 115, 115, 12, 115, 115, 15, 16, 17, 115, 115, + 115, 21, 115, 115, 115, 115, 115, 115, 115, 13, + 43, 115, 115, 46, 115, 48, 115, 50, 51, 115, + 115, 115, 115, 43, 115, 115, 46, 115, 48, 115, + 50, 2, 36, 37, 38, 39, 115, 13, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 53, + 54, 55, 56, 57, 36, 37, 38, 39, 115, 115, + 36, 37, 38, 39, 13, 36, 37, 38, 39, 51, + 13, 53, 54, 55, 56, 57, 13, 53, 54, 55, + 56, 57, 53, 54, 55, 56, 57, 36, 37, 38, + 39, 115, 115, 36, 37, 38, 39, 115, 115, 36, + 37, 38, 39, 115, 53, 54, 55, 56, 57, 115, + 53, 54, 55, 56, 57, 2, 53, 54, 55, 56, + 57, 2, 9, 115, 115, 12, 115, 115, 9, 16, + 17, 12, 115, 115, 21, 16, 17, 115, 115, 115, + 21, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 43, 115, 115, 46, + 115, 48, 43, 50, 115, 46, 115, 48, 115, 50, + 115, 36, 37, 38, 39, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 53, 54, + 55, 56, 57, ); - const YY_SHIFT_USE_DFLT = -11; - const YY_SHIFT_MAX = 239; + const YY_SHIFT_USE_DFLT = -21; + const YY_SHIFT_MAX = 244; public static $yy_shift_ofst = array( - -11, 98, 98, 148, 198, 198, 248, 148, 148, 198, - 148, 248, -2, 48, 298, 148, 148, 148, 298, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 348, 148, 148, 148, 148, 148, 398, 148, 148, 148, - 448, 498, 498, 498, 498, 498, 498, 498, 498, 147, - 1962, 1953, 1953, 35, 1952, 2007, 2012, 2413, 2400, 2423, - 2444, 415, 2450, 2457, 2482, 2478, 465, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 2139, 90, 143, 2011, - 2533, 1963, 36, 103, 143, 143, 90, 90, 235, 2070, - 2075, 634, 59, 636, 641, 663, 359, 359, 203, 221, - 269, 221, 306, 332, 196, 378, 378, 264, 385, 319, - 221, 5, 5, 5, 5, 5, 5, 5, 5, 112, - 112, 82, 5, -11, -11, 2315, 2362, 2379, 2397, 2513, - 49, 665, 409, 218, 221, 221, 458, 221, 382, 221, - 382, 221, 394, 394, 221, 221, 221, 221, 394, 40, - 394, 394, 394, 399, 394, 399, 394, 221, 221, 221, - 221, 5, 463, 5, 5, 463, 5, 462, 112, 112, - 112, -11, -11, -11, -11, -11, -11, 2348, 11, 100, - -10, 190, 881, 141, 265, 292, 252, 425, 479, 350, - 313, 440, 240, 429, 477, 459, 480, 153, 486, 501, - 509, 535, 538, 510, 557, 567, 568, 558, 569, 571, - 575, 580, 585, 587, 562, 572, 576, 586, 593, 462, - 611, 581, 598, 640, 597, 612, 655, 658, 648, 673, + -21, 100, 100, 151, 202, 202, 253, 151, 202, 151, + 151, 253, -2, 49, 304, 151, 151, 151, 304, 151, + 151, 151, 151, 151, 151, 151, 151, 355, 151, 151, + 151, 151, 151, 151, 151, 151, 406, 151, 151, 151, + 457, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 2048, 702, 702, 99, 122, 658, 2038, 2526, 2093, 2548, + 2554, 2098, 2559, 2581, 2587, 2593, 2665, 2665, 2665, 2665, + 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, + 2665, 2665, 2665, 2665, 2665, 2665, 2037, 2410, 172, 24, + 2097, 963, 2108, 45, 182, 24, 24, 172, 172, 101, + 12, 2157, 2162, 221, 643, 92, 255, 296, 366, 366, + 233, -20, 188, -20, 317, 17, 229, 394, 105, 394, + 393, 181, 290, -20, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 12, 12, 68, 14, -21, -21, 2497, + 2510, 2643, 2649, 720, 152, 771, 468, 309, -20, -20, + 467, -20, 325, -20, 325, -20, 37, 37, 409, 37, + 409, 37, -20, -20, -20, -20, 37, 356, 37, 37, + 37, -20, -20, -20, -20, 14, 472, 14, 14, 472, + 14, 12, 474, 12, 12, 12, 12, -21, -21, -21, + -21, -21, -21, 2441, 11, 51, 194, 245, 991, 144, + 195, 385, 337, 464, 488, 399, 485, 469, 477, 497, + 500, 470, 390, 496, 479, 495, 519, 529, 530, 565, + 566, 563, 568, 567, 569, 570, 575, 576, 579, 582, + 539, 557, 583, 474, 595, 571, 572, 600, 601, 574, + 577, 602, 609, 592, 607, ); - const YY_REDUCE_USE_DFLT = -99; - const YY_REDUCE_MAX = 186; + const YY_REDUCE_USE_DFLT = -86; + const YY_REDUCE_MAX = 192; public static $yy_reduce_ofst = array( - 109, 492, 527, 561, 595, 632, 669, 703, 737, 771, - 808, 842, 876, 910, 944, 978, 1012, 1046, 1080, 1114, - 1148, 1182, 1216, 1250, 1284, 1318, 1352, 1386, 1420, 1454, - 1488, 1522, 1556, 1590, 1624, 1658, 1692, 1726, 1760, 1794, - 1828, 1862, 2036, 2071, 2107, 2142, 2178, 2213, 2249, 542, - 1824, 1858, 2104, 481, 114, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 608, 536, 645, 164, - 20, 101, -98, 34, 181, 212, -57, 174, 195, 3, - 254, -5, -79, 228, 228, 228, 180, -5, 222, 51, - 272, 291, 302, 305, 222, -75, 261, 228, 228, 228, - 331, 323, 228, 228, 228, 228, 228, 228, 228, 222, - 299, 228, 228, 360, 228, 102, 102, 102, 102, 102, - 85, 122, 102, 102, 188, 188, 300, 188, 324, 188, - 335, 188, 244, 244, 188, 188, 188, 188, 244, 321, - 244, 244, 244, 337, 244, 347, 244, 188, 188, 188, - 188, 375, 376, 375, 375, 376, 375, 400, 421, 421, - 421, 467, 452, 468, 471, 447, 470, + 9, 503, 538, 573, 608, 650, 701, 736, 777, 812, + 849, 884, 921, 956, 993, 1028, 1065, 1100, 1137, 1172, + 1209, 1244, 1281, 1316, 1353, 1388, 1425, 1460, 1497, 1532, + 1569, 1604, 1641, 1676, 1713, 1748, 1785, 1820, 1857, 1892, + 1929, 1943, 2122, 2158, 2194, 2230, 2266, 2302, 2338, 2374, + 2154, 2191, 2227, 2246, 742, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, 365, 452, -58, 517, + 59, 1, 205, 29, 50, 234, 246, 259, 279, 67, + -53, 87, 5, 146, 154, 80, 80, 80, 198, 154, + 200, 297, 320, 326, 338, 284, 200, 110, 322, 347, + 80, 80, 80, 377, 384, 80, 80, 80, 80, 80, + 80, 80, 80, 200, 333, 80, 80, 398, 80, 25, + 25, 25, 25, 25, 178, 207, 25, 25, 201, 201, + 251, 201, 254, 201, 291, 201, 224, 224, 285, 224, + 302, 224, 201, 201, 201, 201, 224, 311, 224, 224, + 224, 201, 201, 201, 201, 348, 373, 348, 348, 373, + 348, 386, 420, 386, 386, 386, 386, 445, 459, 462, + 486, 455, 458, ); public static $yyExpectedTokens = array( array(), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(2, 9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 39, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 51, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), - array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 57, 58, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(2, 9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 39, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 51, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 21, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(9, 10, 11, 12, 14, 16, 18, 19, 24, 28, 29, 30, 32, 34, 37, 40, 41, 42, 43, 45, 47, 49, 50, 52, 58, 59, ), + array(23, 25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), array(14, 16, 47, 49, 52, ), - array(23, 25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(25, 31, 36, 37, 38, 39, 53, 54, 55, 56, ), array(14, 16, 49, 52, ), - array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 58, 59, ), - array(20, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(26, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(13, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(35, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 51, 53, 54, 55, 56, ), - array(13, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, 59, ), - array(13, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(13, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(2, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(13, 36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), - array(36, 37, 38, 39, 53, 54, 55, 56, ), + array(20, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(26, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(35, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 51, 53, 54, 55, 56, 57, ), + array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, 60, ), + array(2, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(13, 36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(36, 37, 38, 39, 53, 54, 55, 56, 57, ), + array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 59, 60, ), array(1, 13, 17, 25, 31, 34, 46, ), array(14, 34, 52, ), array(1, 25, 31, ), - array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 58, 59, ), + array(3, 9, 10, 11, 12, 14, 18, 19, 24, 28, 29, 30, 59, 60, ), array(9, 12, 16, 25, 27, 31, ), array(9, 12, 16, 25, 31, ), array(17, 43, 50, ), @@ -937,10 +973,11 @@ public static $yy_action = array( array(14, 34, 52, ), array(14, 34, 52, ), array(1, 2, ), + array(17, ), array(3, 4, 5, 6, 9, 10, 11, 12, 18, 19, 24, 28, 29, 30, ), array(2, 9, 12, 15, 16, 17, 21, 43, 46, 48, 50, ), - array(9, 12, 16, 48, ), array(12, 14, 16, 52, ), + array(9, 12, 16, 48, ), array(1, 13, 25, 31, ), array(1, 13, 25, 31, ), array(1, 13, 25, 31, ), @@ -954,10 +991,11 @@ public static $yy_action = array( array(1, 17, ), array(17, 46, ), array(14, 16, ), + array(17, 34, ), array(14, 16, ), array(1, 51, ), - array(1, 2, ), array(1, 27, ), + array(1, 2, ), array(25, 31, ), array(1, ), array(1, ), @@ -967,6 +1005,7 @@ public static $yy_action = array( array(1, ), array(1, ), array(1, ), + array(1, ), array(17, ), array(17, ), array(1, ), @@ -992,6 +1031,10 @@ public static $yy_action = array( array(25, 31, ), array(43, 50, ), array(43, 50, ), + array(43, 50, ), + array(43, 50, ), + array(43, 50, ), + array(43, 50, ), array(25, 31, ), array(25, 31, ), array(25, 31, ), @@ -1001,10 +1044,6 @@ public static $yy_action = array( array(43, 50, ), array(43, 50, ), array(43, 50, ), - array(43, 50, ), - array(43, 50, ), - array(43, 50, ), - array(43, 50, ), array(25, 31, ), array(25, 31, ), array(25, 31, ), @@ -1015,17 +1054,19 @@ public static $yy_action = array( array(1, ), array(2, ), array(1, ), + array(17, ), array(34, ), array(17, ), array(17, ), array(17, ), + array(17, ), array(), array(), array(), array(), array(), array(), - array(2, 34, 36, 37, 38, 39, 46, 53, 54, 55, 56, ), + array(2, 34, 36, 37, 38, 39, 46, 53, 54, 55, 56, 57, ), array(13, 20, 22, 25, 31, 33, 35, 43, ), array(13, 15, 25, 31, 34, 46, ), array(13, 21, 25, 31, 44, ), @@ -1033,7 +1074,7 @@ public static $yy_action = array( array(9, 12, 16, 48, ), array(34, 43, 46, 51, ), array(27, 34, 46, ), - array(21, 44, 59, ), + array(21, 44, 60, ), array(21, 44, 51, ), array(6, 8, ), array(7, 8, ), @@ -1044,13 +1085,13 @@ public static $yy_action = array( array(34, 46, ), array(34, 46, ), array(33, 35, ), - array(33, 35, ), array(33, 51, ), array(43, 51, ), array(33, 35, ), array(33, 35, ), array(33, 35, ), array(33, 35, ), + array(33, 35, ), array(15, 43, ), array(7, ), array(13, ), @@ -1067,11 +1108,10 @@ public static $yy_action = array( array(32, ), array(34, ), array(16, ), - array(34, ), - array(16, ), array(49, ), array(49, ), array(16, ), + array(16, ), array(51, ), array(51, ), array(16, ), @@ -1178,48 +1218,50 @@ public static $yy_action = array( array(), array(), array(), + array(), ); public static $yy_default = array( - 350, 540, 540, 540, 525, 525, 540, 501, 501, 524, - 452, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 390, 369, 390, 540, 540, 540, 395, 540, 540, 540, - 363, 540, 540, 540, 540, 540, 374, 500, 413, 420, - 499, 526, 528, 527, 419, 421, 418, 422, 451, 449, - 397, 401, 402, 392, 395, 363, 433, 540, 390, 540, - 390, 390, 514, 454, 390, 390, 540, 540, 381, 340, - 453, 466, 540, 404, 404, 404, 466, 466, 454, 390, - 540, 390, 390, 384, 454, 540, 540, 404, 404, 404, - 371, 386, 404, 411, 424, 425, 426, 412, 417, 454, - 511, 424, 410, 348, 508, 453, 453, 453, 453, 453, - 540, 468, 466, 482, 360, 370, 540, 373, 540, 378, - 540, 379, 463, 464, 364, 366, 367, 368, 492, 466, - 491, 494, 493, 457, 458, 459, 460, 380, 376, 377, - 372, 382, 502, 385, 387, 503, 442, 466, 488, 515, - 512, 348, 507, 507, 507, 466, 466, 433, 429, 433, - 423, 423, 467, 433, 433, 423, 423, 346, 540, 540, - 540, 423, 433, 443, 540, 540, 540, 540, 429, 540, - 461, 461, 540, 429, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 429, 431, 540, 513, 540, 482, - 540, 540, 540, 540, 540, 438, 540, 540, 540, 398, - 341, 342, 343, 344, 345, 347, 349, 351, 352, 353, - 354, 355, 356, 357, 359, 388, 389, 484, 485, 486, - 506, 383, 504, 505, 427, 436, 437, 446, 447, 465, - 469, 470, 471, 405, 406, 407, 408, 409, 428, 430, - 432, 434, 438, 439, 440, 414, 415, 416, 441, 444, - 445, 479, 477, 516, 517, 518, 519, 455, 456, 490, - 461, 462, 483, 498, 358, 489, 536, 537, 529, 530, - 531, 534, 533, 535, 538, 539, 532, 521, 523, 522, - 520, 495, 480, 478, 476, 473, 474, 475, 481, 496, - 497, 435, 472, 510, 487, 482, 391, 375, 399, 403, + 356, 551, 551, 551, 536, 536, 551, 510, 535, 459, + 510, 551, 551, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, + 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, + 396, 375, 396, 551, 551, 551, 401, 551, 551, 551, + 369, 551, 551, 551, 551, 551, 380, 509, 419, 537, + 427, 539, 538, 426, 428, 425, 429, 458, 456, 508, + 403, 407, 408, 398, 401, 369, 551, 440, 551, 396, + 551, 396, 396, 524, 461, 396, 396, 551, 551, 387, + 496, 346, 460, 551, 473, 410, 410, 410, 473, 473, + 461, 396, 551, 396, 396, 390, 461, 551, 522, 551, + 410, 410, 410, 377, 392, 410, 417, 431, 432, 433, + 418, 423, 424, 461, 520, 431, 416, 354, 517, 460, + 460, 460, 460, 460, 551, 475, 473, 489, 366, 376, + 551, 379, 551, 384, 551, 385, 470, 471, 464, 465, + 466, 467, 370, 372, 373, 374, 501, 473, 500, 503, + 502, 386, 382, 383, 378, 388, 511, 391, 393, 512, + 449, 523, 473, 495, 525, 521, 497, 354, 516, 516, + 516, 473, 473, 440, 436, 440, 430, 430, 474, 440, + 440, 430, 430, 352, 551, 551, 551, 430, 440, 450, + 551, 551, 551, 436, 551, 468, 468, 551, 551, 436, + 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, + 436, 438, 551, 489, 551, 551, 551, 551, 551, 551, + 445, 551, 551, 551, 404, 347, 348, 349, 350, 351, + 353, 355, 357, 358, 359, 360, 361, 362, 363, 365, + 394, 395, 491, 492, 493, 515, 389, 513, 514, 434, + 443, 444, 453, 454, 472, 476, 477, 478, 411, 412, + 413, 414, 415, 435, 437, 439, 441, 445, 446, 447, + 498, 499, 420, 421, 422, 448, 451, 452, 486, 484, + 462, 463, 468, 469, 490, 526, 527, 528, 529, 530, + 364, 547, 548, 540, 541, 542, 545, 544, 546, 549, + 550, 543, 532, 534, 533, 531, 487, 485, 483, 480, + 481, 482, 488, 505, 507, 506, 504, 442, 479, 519, + 494, 489, 397, 381, 405, 409, ); - const YYNOCODE = 113; + const YYNOCODE = 116; const YYSTACKDEPTH = 500; - const YYNSTATE = 340; - const YYNRULE = 200; - const YYERRORSYMBOL = 60; + const YYNSTATE = 346; + const YYNRULE = 205; + const YYERRORSYMBOL = 61; const YYERRSYMDT = 'yy0'; const YYFALLBACK = 0; public static $yyFallback = array( @@ -1262,20 +1304,21 @@ public static $yy_action = array( 'INSTANCEOF', 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', 'OPENB', 'CLOSEB', 'DOLLAR', 'LOGOP', 'SLOGOP', 'TLOGOP', - 'SINGLECOND', 'ARRAYOPEN', 'QUOTE', 'BACKTICK', - 'error', 'start', 'template', 'literal_e2', - 'literal_e1', 'smartytag', 'tagbody', 'tag', - 'outattr', 'eqoutattr', 'varindexed', 'output', - 'attributes', 'variablevalue', 'value', 'expr', - 'modifierlist', 'statement', 'statements', 'foraction', - 'varvar', 'modparameters', 'attribute', 'nullcoalescing', - 'ternary', 'tlop', 'lop', 'scond', - 'isin', 'array', 'function', 'ns1', - 'doublequoted_with_quotes', 'static_class_access', 'arraydef', 'variablelist', - 'variable', 'object', 'configvariable', 'arrayindex', - 'indexdef', 'varvarele', 'objectchain', 'objectelement', - 'method', 'params', 'modifier', 'modparameter', - 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent', + 'SINGLECOND', 'MATCHES', 'ARRAYOPEN', 'QUOTE', + 'BACKTICK', 'error', 'start', 'template', + 'literal_e2', 'literal_e1', 'smartytag', 'tagbody', + 'tag', 'outattr', 'eqoutattr', 'varindexed', + 'output', 'attributes', 'variablevalue', 'value', + 'expr', 'modifierlist', 'statement', 'statements', + 'foraction', 'varvar', 'modparameters', 'attribute', + 'nullcoalescing', 'ternary', 'tlop', 'lop', + 'scond', 'isin', 'array', 'matchop', + 'function', 'ns1', 'doublequoted_with_quotes', 'static_class_access', + 'arraydef', 'variablelist', 'variable', 'object', + 'configvariable', 'arrayindex', 'indexdef', 'varvarele', + 'objectchain', 'optobjectchain', 'objectelement', 'method', + 'params', 'modifier', 'modparameter', 'arrayelements', + 'arrayelement', 'doublequoted', 'doublequotedcontent', ); public static $yyRuleName = array( @@ -1357,6 +1400,7 @@ public static $yy_action = array( 'isin ::= ISIN', 'expr ::= expr isin array', 'expr ::= expr isin value', + 'expr ::= expr matchop value', 'nullcoalescing ::= expr QMARK QMARK expr', 'ternary ::= expr QMARK DOLLARID COLON expr', 'ternary ::= expr QMARK value COLON expr', @@ -1428,6 +1472,8 @@ public static $yy_action = array( 'varvarele ::= SIMPELOUTPUT', 'varvarele ::= LDEL expr RDEL', 'object ::= varindexed objectchain', + 'optobjectchain ::=', + 'optobjectchain ::= objectchain', 'objectchain ::= objectelement', 'objectchain ::= objectchain objectelement', 'objectelement ::= PTR ID arrayindex', @@ -1435,7 +1481,7 @@ public static $yy_action = array( 'objectelement ::= PTR LDEL expr RDEL arrayindex', 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', 'objectelement ::= PTR method', - 'function ::= ns1 OPENP variablelist CLOSEP', + 'function ::= ns1 OPENP variablelist CLOSEP optobjectchain', 'method ::= ID OPENP params CLOSEP', 'method ::= DOLLARID OPENP params CLOSEP', 'params ::= params COMMA expr', @@ -1453,12 +1499,14 @@ public static $yy_action = array( 'static_class_access ::= method', 'static_class_access ::= method objectchain', 'static_class_access ::= ID', + 'static_class_access ::= ID objectchain', 'static_class_access ::= DOLLARID arrayindex', 'static_class_access ::= DOLLARID arrayindex objectchain', 'lop ::= LOGOP', 'lop ::= SLOGOP', 'tlop ::= TLOGOP', 'scond ::= SINGLECOND', + 'matchop ::= MATCHES', 'arraydef ::= OPENB arrayelements CLOSEB', 'arraydef ::= ARRAYOPEN arrayelements CLOSEP', 'arrayelements ::= arrayelement', @@ -1794,206 +1842,211 @@ public static $yy_action = array( } public static $yyRuleInfo = array( - array( 0 => 61, 1 => 1 ), - array( 0 => 62, 1 => 2 ), - array( 0 => 62, 1 => 2 ), - array( 0 => 62, 1 => 2 ), - array( 0 => 62, 1 => 4 ), + array( 0 => 62, 1 => 1 ), + array( 0 => 63, 1 => 2 ), + array( 0 => 63, 1 => 2 ), + array( 0 => 63, 1 => 2 ), array( 0 => 63, 1 => 4 ), - array( 0 => 63, 1 => 1 ), - array( 0 => 64, 1 => 2 ), - array( 0 => 64, 1 => 0 ), - array( 0 => 62, 1 => 2 ), - array( 0 => 62, 1 => 0 ), - array( 0 => 65, 1 => 1 ), - array( 0 => 65, 1 => 1 ), - array( 0 => 65, 1 => 1 ), - array( 0 => 65, 1 => 3 ), + array( 0 => 64, 1 => 4 ), + array( 0 => 64, 1 => 1 ), array( 0 => 65, 1 => 2 ), + array( 0 => 65, 1 => 0 ), + array( 0 => 63, 1 => 2 ), + array( 0 => 63, 1 => 0 ), array( 0 => 66, 1 => 1 ), + array( 0 => 66, 1 => 1 ), + array( 0 => 66, 1 => 1 ), + array( 0 => 66, 1 => 3 ), array( 0 => 66, 1 => 2 ), - array( 0 => 66, 1 => 2 ), - array( 0 => 69, 1 => 2 ), - array( 0 => 68, 1 => 2 ), - array( 0 => 71, 1 => 1 ), - array( 0 => 71, 1 => 1 ), - array( 0 => 71, 1 => 1 ), - array( 0 => 67, 1 => 3 ), - array( 0 => 67, 1 => 2 ), - array( 0 => 67, 1 => 4 ), - array( 0 => 67, 1 => 5 ), - array( 0 => 67, 1 => 6 ), - array( 0 => 67, 1 => 2 ), - array( 0 => 67, 1 => 3 ), - array( 0 => 67, 1 => 2 ), - array( 0 => 67, 1 => 3 ), - array( 0 => 67, 1 => 8 ), - array( 0 => 79, 1 => 2 ), - array( 0 => 79, 1 => 1 ), - array( 0 => 67, 1 => 5 ), - array( 0 => 67, 1 => 7 ), - array( 0 => 67, 1 => 6 ), - array( 0 => 67, 1 => 8 ), + array( 0 => 67, 1 => 1 ), array( 0 => 67, 1 => 2 ), - array( 0 => 67, 1 => 3 ), - array( 0 => 67, 1 => 4 ), - array( 0 => 65, 1 => 1 ), array( 0 => 67, 1 => 2 ), - array( 0 => 67, 1 => 3 ), - array( 0 => 67, 1 => 4 ), - array( 0 => 67, 1 => 5 ), - array( 0 => 72, 1 => 2 ), + array( 0 => 70, 1 => 2 ), + array( 0 => 69, 1 => 2 ), array( 0 => 72, 1 => 1 ), - array( 0 => 72, 1 => 0 ), - array( 0 => 82, 1 => 4 ), - array( 0 => 82, 1 => 2 ), - array( 0 => 82, 1 => 2 ), - array( 0 => 82, 1 => 2 ), - array( 0 => 82, 1 => 2 ), - array( 0 => 82, 1 => 2 ), - array( 0 => 82, 1 => 4 ), - array( 0 => 78, 1 => 1 ), + array( 0 => 72, 1 => 1 ), + array( 0 => 72, 1 => 1 ), + array( 0 => 68, 1 => 3 ), + array( 0 => 68, 1 => 2 ), + array( 0 => 68, 1 => 4 ), + array( 0 => 68, 1 => 5 ), + array( 0 => 68, 1 => 6 ), + array( 0 => 68, 1 => 2 ), + array( 0 => 68, 1 => 3 ), + array( 0 => 68, 1 => 2 ), + array( 0 => 68, 1 => 3 ), + array( 0 => 68, 1 => 8 ), + array( 0 => 80, 1 => 2 ), + array( 0 => 80, 1 => 1 ), + array( 0 => 68, 1 => 5 ), + array( 0 => 68, 1 => 7 ), + array( 0 => 68, 1 => 6 ), + array( 0 => 68, 1 => 8 ), + array( 0 => 68, 1 => 2 ), + array( 0 => 68, 1 => 3 ), + array( 0 => 68, 1 => 4 ), + array( 0 => 66, 1 => 1 ), + array( 0 => 68, 1 => 2 ), + array( 0 => 68, 1 => 3 ), + array( 0 => 68, 1 => 4 ), + array( 0 => 68, 1 => 5 ), + array( 0 => 73, 1 => 2 ), + array( 0 => 73, 1 => 1 ), + array( 0 => 73, 1 => 0 ), + array( 0 => 83, 1 => 4 ), + array( 0 => 83, 1 => 2 ), + array( 0 => 83, 1 => 2 ), + array( 0 => 83, 1 => 2 ), + array( 0 => 83, 1 => 2 ), + array( 0 => 83, 1 => 2 ), + array( 0 => 83, 1 => 4 ), + array( 0 => 79, 1 => 1 ), + array( 0 => 79, 1 => 3 ), array( 0 => 78, 1 => 3 ), - array( 0 => 77, 1 => 3 ), - array( 0 => 77, 1 => 3 ), - array( 0 => 77, 1 => 3 ), - array( 0 => 77, 1 => 3 ), + array( 0 => 78, 1 => 3 ), + array( 0 => 78, 1 => 3 ), + array( 0 => 78, 1 => 3 ), + array( 0 => 76, 1 => 1 ), + array( 0 => 76, 1 => 1 ), + array( 0 => 76, 1 => 1 ), + array( 0 => 76, 1 => 2 ), + array( 0 => 76, 1 => 2 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 2 ), + array( 0 => 89, 1 => 1 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 76, 1 => 3 ), + array( 0 => 84, 1 => 4 ), + array( 0 => 85, 1 => 5 ), + array( 0 => 85, 1 => 5 ), + array( 0 => 85, 1 => 5 ), + array( 0 => 85, 1 => 4 ), array( 0 => 75, 1 => 1 ), + array( 0 => 75, 1 => 2 ), + array( 0 => 75, 1 => 2 ), + array( 0 => 75, 1 => 2 ), + array( 0 => 75, 1 => 2 ), array( 0 => 75, 1 => 1 ), array( 0 => 75, 1 => 1 ), + array( 0 => 75, 1 => 3 ), array( 0 => 75, 1 => 2 ), array( 0 => 75, 1 => 2 ), + array( 0 => 75, 1 => 1 ), + array( 0 => 75, 1 => 1 ), array( 0 => 75, 1 => 3 ), array( 0 => 75, 1 => 3 ), array( 0 => 75, 1 => 3 ), + array( 0 => 75, 1 => 1 ), + array( 0 => 75, 1 => 1 ), array( 0 => 75, 1 => 3 ), - array( 0 => 75, 1 => 3 ), + array( 0 => 75, 1 => 1 ), array( 0 => 75, 1 => 2 ), - array( 0 => 88, 1 => 1 ), - array( 0 => 75, 1 => 3 ), + array( 0 => 75, 1 => 1 ), + array( 0 => 75, 1 => 1 ), array( 0 => 75, 1 => 3 ), - array( 0 => 83, 1 => 4 ), - array( 0 => 84, 1 => 5 ), - array( 0 => 84, 1 => 5 ), - array( 0 => 84, 1 => 5 ), - array( 0 => 84, 1 => 4 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 2 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 1 ), - array( 0 => 74, 1 => 3 ), - array( 0 => 91, 1 => 1 ), - array( 0 => 91, 1 => 1 ), - array( 0 => 95, 1 => 3 ), - array( 0 => 95, 1 => 3 ), - array( 0 => 95, 1 => 1 ), - array( 0 => 95, 1 => 1 ), - array( 0 => 95, 1 => 0 ), - array( 0 => 96, 1 => 1 ), - array( 0 => 96, 1 => 1 ), - array( 0 => 96, 1 => 3 ), - array( 0 => 96, 1 => 1 ), - array( 0 => 98, 1 => 3 ), - array( 0 => 98, 1 => 4 ), + array( 0 => 93, 1 => 1 ), + array( 0 => 93, 1 => 1 ), + array( 0 => 97, 1 => 3 ), + array( 0 => 97, 1 => 3 ), + array( 0 => 97, 1 => 1 ), + array( 0 => 97, 1 => 1 ), + array( 0 => 97, 1 => 0 ), + array( 0 => 98, 1 => 1 ), + array( 0 => 98, 1 => 1 ), array( 0 => 98, 1 => 3 ), - array( 0 => 98, 1 => 4 ), - array( 0 => 73, 1 => 1 ), - array( 0 => 73, 1 => 1 ), - array( 0 => 70, 1 => 2 ), - array( 0 => 70, 1 => 2 ), - array( 0 => 99, 1 => 2 ), - array( 0 => 99, 1 => 0 ), - array( 0 => 100, 1 => 2 ), - array( 0 => 100, 1 => 2 ), - array( 0 => 100, 1 => 4 ), - array( 0 => 100, 1 => 2 ), - array( 0 => 100, 1 => 2 ), - array( 0 => 100, 1 => 4 ), - array( 0 => 100, 1 => 3 ), - array( 0 => 100, 1 => 5 ), - array( 0 => 100, 1 => 3 ), - array( 0 => 100, 1 => 3 ), - array( 0 => 100, 1 => 3 ), - array( 0 => 100, 1 => 3 ), + array( 0 => 98, 1 => 1 ), array( 0 => 100, 1 => 3 ), + array( 0 => 100, 1 => 4 ), array( 0 => 100, 1 => 3 ), - array( 0 => 100, 1 => 2 ), - array( 0 => 80, 1 => 1 ), - array( 0 => 80, 1 => 1 ), - array( 0 => 80, 1 => 2 ), - array( 0 => 101, 1 => 1 ), - array( 0 => 101, 1 => 1 ), - array( 0 => 101, 1 => 3 ), - array( 0 => 97, 1 => 2 ), - array( 0 => 102, 1 => 1 ), + array( 0 => 100, 1 => 4 ), + array( 0 => 74, 1 => 1 ), + array( 0 => 74, 1 => 1 ), + array( 0 => 71, 1 => 2 ), + array( 0 => 71, 1 => 2 ), + array( 0 => 101, 1 => 2 ), + array( 0 => 101, 1 => 0 ), array( 0 => 102, 1 => 2 ), + array( 0 => 102, 1 => 2 ), + array( 0 => 102, 1 => 4 ), + array( 0 => 102, 1 => 2 ), + array( 0 => 102, 1 => 2 ), + array( 0 => 102, 1 => 4 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 5 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 3 ), + array( 0 => 102, 1 => 2 ), + array( 0 => 81, 1 => 1 ), + array( 0 => 81, 1 => 1 ), + array( 0 => 81, 1 => 2 ), + array( 0 => 103, 1 => 1 ), + array( 0 => 103, 1 => 1 ), array( 0 => 103, 1 => 3 ), - array( 0 => 103, 1 => 3 ), - array( 0 => 103, 1 => 5 ), - array( 0 => 103, 1 => 6 ), - array( 0 => 103, 1 => 2 ), - array( 0 => 90, 1 => 4 ), - array( 0 => 104, 1 => 4 ), - array( 0 => 104, 1 => 4 ), - array( 0 => 105, 1 => 3 ), - array( 0 => 105, 1 => 1 ), + array( 0 => 99, 1 => 2 ), array( 0 => 105, 1 => 0 ), - array( 0 => 76, 1 => 3 ), - array( 0 => 76, 1 => 2 ), + array( 0 => 105, 1 => 1 ), + array( 0 => 104, 1 => 1 ), + array( 0 => 104, 1 => 2 ), array( 0 => 106, 1 => 3 ), + array( 0 => 106, 1 => 3 ), + array( 0 => 106, 1 => 5 ), + array( 0 => 106, 1 => 6 ), array( 0 => 106, 1 => 2 ), - array( 0 => 81, 1 => 2 ), - array( 0 => 81, 1 => 0 ), - array( 0 => 107, 1 => 2 ), - array( 0 => 107, 1 => 3 ), - array( 0 => 107, 1 => 2 ), - array( 0 => 93, 1 => 1 ), - array( 0 => 93, 1 => 2 ), - array( 0 => 93, 1 => 1 ), - array( 0 => 93, 1 => 2 ), - array( 0 => 93, 1 => 3 ), - array( 0 => 86, 1 => 1 ), - array( 0 => 86, 1 => 1 ), - array( 0 => 85, 1 => 1 ), - array( 0 => 87, 1 => 1 ), - array( 0 => 94, 1 => 3 ), - array( 0 => 94, 1 => 3 ), - array( 0 => 108, 1 => 1 ), + array( 0 => 92, 1 => 5 ), + array( 0 => 107, 1 => 4 ), + array( 0 => 107, 1 => 4 ), array( 0 => 108, 1 => 3 ), - array( 0 => 108, 1 => 2 ), + array( 0 => 108, 1 => 1 ), array( 0 => 108, 1 => 0 ), + array( 0 => 77, 1 => 3 ), + array( 0 => 77, 1 => 2 ), array( 0 => 109, 1 => 3 ), - array( 0 => 109, 1 => 3 ), - array( 0 => 109, 1 => 1 ), - array( 0 => 92, 1 => 2 ), - array( 0 => 92, 1 => 3 ), + array( 0 => 109, 1 => 2 ), + array( 0 => 82, 1 => 2 ), + array( 0 => 82, 1 => 0 ), array( 0 => 110, 1 => 2 ), - array( 0 => 110, 1 => 1 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 3 ), + array( 0 => 110, 1 => 3 ), + array( 0 => 110, 1 => 2 ), + array( 0 => 95, 1 => 1 ), + array( 0 => 95, 1 => 2 ), + array( 0 => 95, 1 => 1 ), + array( 0 => 95, 1 => 2 ), + array( 0 => 95, 1 => 2 ), + array( 0 => 95, 1 => 3 ), + array( 0 => 87, 1 => 1 ), + array( 0 => 87, 1 => 1 ), + array( 0 => 86, 1 => 1 ), + array( 0 => 88, 1 => 1 ), + array( 0 => 91, 1 => 1 ), + array( 0 => 96, 1 => 3 ), + array( 0 => 96, 1 => 3 ), array( 0 => 111, 1 => 1 ), array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 1 ), - array( 0 => 111, 1 => 1 ), + array( 0 => 111, 1 => 2 ), + array( 0 => 111, 1 => 0 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 1 ), + array( 0 => 94, 1 => 2 ), + array( 0 => 94, 1 => 3 ), + array( 0 => 113, 1 => 2 ), + array( 0 => 113, 1 => 1 ), + array( 0 => 114, 1 => 3 ), + array( 0 => 114, 1 => 3 ), + array( 0 => 114, 1 => 1 ), + array( 0 => 114, 1 => 3 ), + array( 0 => 114, 1 => 3 ), + array( 0 => 114, 1 => 1 ), + array( 0 => 114, 1 => 1 ), ); public static $yyReduceMap = array( @@ -2013,20 +2066,22 @@ public static $yy_action = array( 64 => 6, 65 => 6, 66 => 6, - 83 => 6, - 88 => 6, + 84 => 6, 89 => 6, - 94 => 6, - 98 => 6, + 90 => 6, + 95 => 6, 99 => 6, - 103 => 6, + 100 => 6, 104 => 6, - 106 => 6, - 122 => 6, - 182 => 6, - 188 => 6, + 105 => 6, + 107 => 6, + 123 => 6, + 151 => 6, + 187 => 6, + 193 => 6, 7 => 7, 8 => 8, + 150 => 8, 9 => 9, 11 => 11, 12 => 12, @@ -2064,21 +2119,21 @@ public static $yy_action = array( 48 => 48, 49 => 49, 58 => 49, - 110 => 49, 111 => 49, - 160 => 49, - 164 => 49, - 168 => 49, - 170 => 49, + 112 => 49, + 163 => 49, + 167 => 49, + 171 => 49, + 173 => 49, 50 => 50, - 112 => 50, - 161 => 50, - 167 => 50, + 113 => 50, + 164 => 50, + 170 => 50, 51 => 51, 52 => 52, 53 => 52, 54 => 54, - 145 => 54, + 146 => 54, 57 => 57, 59 => 59, 60 => 60, @@ -2099,29 +2154,29 @@ public static $yy_action = array( 78 => 78, 79 => 79, 80 => 80, - 81 => 80, - 82 => 82, - 84 => 84, - 86 => 84, - 87 => 84, - 125 => 84, + 81 => 81, + 82 => 81, + 83 => 83, 85 => 85, - 90 => 90, + 87 => 85, + 88 => 85, + 126 => 85, + 86 => 86, 91 => 91, 92 => 92, 93 => 93, - 95 => 95, + 94 => 94, 96 => 96, - 97 => 96, - 100 => 100, + 97 => 97, + 98 => 97, 101 => 101, 102 => 102, - 105 => 105, - 107 => 107, + 103 => 103, + 106 => 106, 108 => 108, - 109 => 108, - 159 => 108, - 113 => 113, + 109 => 109, + 110 => 109, + 162 => 109, 114 => 114, 115 => 115, 116 => 116, @@ -2130,35 +2185,33 @@ public static $yy_action = array( 119 => 119, 120 => 120, 121 => 121, - 123 => 123, + 122 => 122, 124 => 124, - 126 => 126, - 185 => 126, + 125 => 125, 127 => 127, + 190 => 127, 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, - 140 => 132, 133 => 133, + 141 => 133, 134 => 134, 135 => 135, - 136 => 135, - 138 => 135, - 139 => 135, - 137 => 137, - 141 => 141, + 136 => 136, + 137 => 136, + 139 => 136, + 140 => 136, + 138 => 138, 142 => 142, 143 => 143, - 189 => 143, 144 => 144, - 146 => 146, + 194 => 144, + 145 => 145, 147 => 147, 148 => 148, 149 => 149, - 150 => 150, - 151 => 151, 152 => 152, 153 => 153, 154 => 154, @@ -2166,14 +2219,14 @@ public static $yy_action = array( 156 => 156, 157 => 157, 158 => 158, - 162 => 162, - 163 => 163, + 159 => 159, + 160 => 160, + 161 => 161, 165 => 165, 166 => 166, + 168 => 168, 169 => 169, - 171 => 171, 172 => 172, - 173 => 173, 174 => 174, 175 => 175, 176 => 176, @@ -2181,21 +2234,26 @@ public static $yy_action = array( 178 => 178, 179 => 179, 180 => 180, - 181 => 180, + 181 => 181, + 182 => 182, 183 => 183, 184 => 184, - 186 => 186, - 187 => 187, - 190 => 190, + 185 => 185, + 186 => 185, + 188 => 188, + 189 => 189, 191 => 191, 192 => 192, - 193 => 193, - 196 => 193, - 194 => 194, - 197 => 194, 195 => 195, + 196 => 196, + 197 => 197, 198 => 198, + 201 => 198, 199 => 199, + 202 => 199, + 200 => 200, + 203 => 203, + 204 => 204, ); // line 245 "src/Parser/TemplateParser.y" public function yy_r0(){ @@ -2537,43 +2595,47 @@ public static $yy_action = array( } // line 685 "src/Parser/TemplateParser.y" public function yy_r78(){ - $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?? '.$this->yystack[$this->yyidx + 0]->minor; + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor . $this->yystack[$this->yyidx + 0]->minor . ',' . $this->yystack[$this->yyidx + -2]->minor . ') '; } -// line 692 "src/Parser/TemplateParser.y" +// line 690 "src/Parser/TemplateParser.y" public function yy_r79(){ - $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -2]->minor,1)); - $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? $_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\') : '.$this->yystack[$this->yyidx + 0]->minor; + $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?? '.$this->yystack[$this->yyidx + 0]->minor; } // line 697 "src/Parser/TemplateParser.y" public function yy_r80(){ + $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -2]->minor,1)); + $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? $_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\') : '.$this->yystack[$this->yyidx + 0]->minor; + } +// line 702 "src/Parser/TemplateParser.y" + public function yy_r81(){ $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor; } -// line 706 "src/Parser/TemplateParser.y" - public function yy_r82(){ +// line 711 "src/Parser/TemplateParser.y" + public function yy_r83(){ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?: '.$this->yystack[$this->yyidx + 0]->minor; } -// line 716 "src/Parser/TemplateParser.y" - public function yy_r84(){ - $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; - } // line 721 "src/Parser/TemplateParser.y" public function yy_r85(){ - $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor; + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -// line 742 "src/Parser/TemplateParser.y" - public function yy_r90(){ - $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; +// line 726 "src/Parser/TemplateParser.y" + public function yy_r86(){ + $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor; } -// line 746 "src/Parser/TemplateParser.y" +// line 747 "src/Parser/TemplateParser.y" public function yy_r91(){ - $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'; + $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; } -// line 750 "src/Parser/TemplateParser.y" +// line 751 "src/Parser/TemplateParser.y" public function yy_r92(){ - $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor; + $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'; } // line 755 "src/Parser/TemplateParser.y" public function yy_r93(){ + $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor; + } +// line 760 "src/Parser/TemplateParser.y" + public function yy_r94(){ if (defined($this->yystack[$this->yyidx + 0]->minor)) { if ($this->security) { $this->security->isTrustedConstant($this->yystack[$this->yyidx + 0]->minor, $this->compiler); @@ -2583,16 +2645,16 @@ public static $yy_action = array( $this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\''; } } -// line 772 "src/Parser/TemplateParser.y" - public function yy_r95(){ +// line 777 "src/Parser/TemplateParser.y" + public function yy_r96(){ $this->_retvalue = '('. $this->yystack[$this->yyidx + -1]->minor .')'; } -// line 776 "src/Parser/TemplateParser.y" - public function yy_r96(){ +// line 781 "src/Parser/TemplateParser.y" + public function yy_r97(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -// line 794 "src/Parser/TemplateParser.y" - public function yy_r100(){ +// line 799 "src/Parser/TemplateParser.y" + public function yy_r101(){ if ($this->security && $this->security->static_classes !== array()) { $this->compiler->trigger_template_error('dynamic static class not allowed by security setting'); } @@ -2605,19 +2667,19 @@ public static $yy_action = array( } $this->_retvalue = $prefixVar .'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1]; } -// line 809 "src/Parser/TemplateParser.y" - public function yy_r101(){ +// line 814 "src/Parser/TemplateParser.y" + public function yy_r102(){ $prefixVar = $this->compiler->getNewPrefixVariable(); $tmp = $this->compiler->appendCode('<?php ob_start();?>', (string) $this->yystack[$this->yyidx + 0]->minor); $this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>")); $this->_retvalue = $prefixVar; } -// line 816 "src/Parser/TemplateParser.y" - public function yy_r102(){ +// line 821 "src/Parser/TemplateParser.y" + public function yy_r103(){ $this->_retvalue = $this->compiler->compileModifier($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor); } -// line 829 "src/Parser/TemplateParser.y" - public function yy_r105(){ +// line 834 "src/Parser/TemplateParser.y" + public function yy_r106(){ if (!in_array(strtolower($this->yystack[$this->yyidx + -2]->minor), array('self', 'parent')) && (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->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[0].$this->yystack[$this->yyidx + 0]->minor[1]; @@ -2628,21 +2690,21 @@ public static $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 848 "src/Parser/TemplateParser.y" - public function yy_r107(){ +// line 853 "src/Parser/TemplateParser.y" + public function yy_r108(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -// line 856 "src/Parser/TemplateParser.y" - public function yy_r108(){ +// line 861 "src/Parser/TemplateParser.y" + public function yy_r109(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor)); } -// line 883 "src/Parser/TemplateParser.y" - public function yy_r113(){ +// line 888 "src/Parser/TemplateParser.y" + public function yy_r114(){ $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + 0]->minor,1)); $this->_retvalue = array('$_smarty_tpl->hasVariable(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')','$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')'); } -// line 887 "src/Parser/TemplateParser.y" - public function yy_r114(){ +// line 892 "src/Parser/TemplateParser.y" + public function yy_r115(){ if ($this->yystack[$this->yyidx + 0]->minor['var'] === '\'smarty\'') { $smarty_var = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']); $this->_retvalue = array('true', $smarty_var); @@ -2654,118 +2716,118 @@ public static $yy_action = array( $this->_retvalue = array('true', '$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor['var'] . ')'.$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']); } } -// line 901 "src/Parser/TemplateParser.y" - public function yy_r115(){ - $this->_retvalue = array('true', '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor); - } // line 906 "src/Parser/TemplateParser.y" public function yy_r116(){ - $this->_retvalue = array('true', $this->yystack[$this->yyidx + 0]->minor); + $this->_retvalue = array('true', '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor); } // line 911 "src/Parser/TemplateParser.y" public function yy_r117(){ - $this->_retvalue = $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -1]->minor . '\''); + $this->_retvalue = array('true', $this->yystack[$this->yyidx + 0]->minor); } -// line 915 "src/Parser/TemplateParser.y" +// line 916 "src/Parser/TemplateParser.y" public function yy_r118(){ - $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -2]->minor . '\'') . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)'; + $this->_retvalue = $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -1]->minor . '\''); } -// line 919 "src/Parser/TemplateParser.y" +// line 920 "src/Parser/TemplateParser.y" public function yy_r119(){ - $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -1]->minor); + $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -2]->minor . '\'') . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)'; } -// line 923 "src/Parser/TemplateParser.y" +// line 924 "src/Parser/TemplateParser.y" public function yy_r120(){ - $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -2]->minor) . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)'; + $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -1]->minor); } -// line 927 "src/Parser/TemplateParser.y" +// line 928 "src/Parser/TemplateParser.y" public function yy_r121(){ + $this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -2]->minor) . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)'; + } +// line 932 "src/Parser/TemplateParser.y" + public function yy_r122(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor[1]; } -// line 935 "src/Parser/TemplateParser.y" - public function yy_r123(){ +// line 940 "src/Parser/TemplateParser.y" + public function yy_r124(){ $this->_retvalue = array('var'=>'\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\'', 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor); } -// line 938 "src/Parser/TemplateParser.y" - public function yy_r124(){ +// line 943 "src/Parser/TemplateParser.y" + public function yy_r125(){ $this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor); } -// line 951 "src/Parser/TemplateParser.y" - public function yy_r126(){ +// line 956 "src/Parser/TemplateParser.y" + public function yy_r127(){ return; } -// line 957 "src/Parser/TemplateParser.y" - public function yy_r127(){ +// line 962 "src/Parser/TemplateParser.y" + public function yy_r128(){ $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + 0]->minor,1)); $this->_retvalue = '[$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\')]'; } -// line 961 "src/Parser/TemplateParser.y" - public function yy_r128(){ - $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + 0]->minor); - $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor . ')]'; - } // line 966 "src/Parser/TemplateParser.y" public function yy_r129(){ - $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -2]->minor); - $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -2]->minor . ')->'.$this->yystack[$this->yyidx + 0]->minor.']'; + $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + 0]->minor); + $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + 0]->minor . ')]'; } // line 971 "src/Parser/TemplateParser.y" public function yy_r130(){ - $this->_retvalue = '[\''. $this->yystack[$this->yyidx + 0]->minor .'\']'; + $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -2]->minor); + $this->_retvalue = '[$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -2]->minor . ')->'.$this->yystack[$this->yyidx + 0]->minor.']'; } -// line 975 "src/Parser/TemplateParser.y" +// line 976 "src/Parser/TemplateParser.y" public function yy_r131(){ - $this->_retvalue = '['. $this->yystack[$this->yyidx + 0]->minor .']'; + $this->_retvalue = '[\''. $this->yystack[$this->yyidx + 0]->minor .'\']'; } // line 980 "src/Parser/TemplateParser.y" public function yy_r132(){ - $this->_retvalue = '['. $this->yystack[$this->yyidx + -1]->minor .']'; + $this->_retvalue = '['. $this->yystack[$this->yyidx + 0]->minor .']'; } // line 985 "src/Parser/TemplateParser.y" public function yy_r133(){ - $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']'; + $this->_retvalue = '['. $this->yystack[$this->yyidx + -1]->minor .']'; } -// line 989 "src/Parser/TemplateParser.y" +// line 990 "src/Parser/TemplateParser.y" public function yy_r134(){ - $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']'; + $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']'; } -// line 992 "src/Parser/TemplateParser.y" +// line 994 "src/Parser/TemplateParser.y" public function yy_r135(){ + $this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']'; + } +// line 997 "src/Parser/TemplateParser.y" + public function yy_r136(){ $this->_retvalue = '['.$this->yystack[$this->yyidx + -1]->minor.']'; } -// line 998 "src/Parser/TemplateParser.y" - public function yy_r137(){ +// line 1003 "src/Parser/TemplateParser.y" + public function yy_r138(){ $this->compiler->triggerTagNoCache(substr($this->yystack[$this->yyidx + -1]->minor,1)); $this->_retvalue = '[$_smarty_tpl->getValue(\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\')]'; } -// line 1015 "src/Parser/TemplateParser.y" - public function yy_r141(){ - $this->_retvalue = '[]'; - } -// line 1025 "src/Parser/TemplateParser.y" +// line 1020 "src/Parser/TemplateParser.y" public function yy_r142(){ - $this->_retvalue = '\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\''; + $this->_retvalue = '[]'; } -// line 1029 "src/Parser/TemplateParser.y" +// line 1030 "src/Parser/TemplateParser.y" public function yy_r143(){ - $this->_retvalue = '\'\''; + $this->_retvalue = '\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\''; } // line 1034 "src/Parser/TemplateParser.y" public function yy_r144(){ + $this->_retvalue = '\'\''; + } +// line 1039 "src/Parser/TemplateParser.y" + public function yy_r145(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1042 "src/Parser/TemplateParser.y" - public function yy_r146(){ +// line 1047 "src/Parser/TemplateParser.y" + public function yy_r147(){ $var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()), ' $'); $this->compiler->triggerTagNoCache($var); $this->_retvalue = '$_smarty_tpl->getValue(\''.$var.'\')'; } -// line 1049 "src/Parser/TemplateParser.y" - public function yy_r147(){ +// line 1054 "src/Parser/TemplateParser.y" + public function yy_r148(){ $this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')'; } -// line 1056 "src/Parser/TemplateParser.y" - public function yy_r148(){ +// line 1061 "src/Parser/TemplateParser.y" + public function yy_r149(){ if ($this->yystack[$this->yyidx + -1]->minor['var'] === '\'smarty\'') { $this->_retvalue = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor; } else { @@ -2773,93 +2835,93 @@ public static $yy_action = array( $this->_retvalue = '$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor['var'] . ')'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor; } } -// line 1066 "src/Parser/TemplateParser.y" - public function yy_r149(){ +// line 1081 "src/Parser/TemplateParser.y" + public function yy_r152(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -// line 1071 "src/Parser/TemplateParser.y" - public function yy_r150(){ +// line 1086 "src/Parser/TemplateParser.y" + public function yy_r153(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -// line 1076 "src/Parser/TemplateParser.y" - public function yy_r151(){ +// line 1091 "src/Parser/TemplateParser.y" + public function yy_r154(){ 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 1083 "src/Parser/TemplateParser.y" - public function yy_r152(){ +// line 1098 "src/Parser/TemplateParser.y" + public function yy_r155(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -1]->minor); $this->_retvalue = '->{$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor . ')'.$this->yystack[$this->yyidx + 0]->minor.'}'; } -// line 1091 "src/Parser/TemplateParser.y" - public function yy_r153(){ +// line 1106 "src/Parser/TemplateParser.y" + public function yy_r156(){ 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 1098 "src/Parser/TemplateParser.y" - public function yy_r154(){ +// line 1113 "src/Parser/TemplateParser.y" + public function yy_r157(){ 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 1106 "src/Parser/TemplateParser.y" - public function yy_r155(){ +// line 1121 "src/Parser/TemplateParser.y" + public function yy_r158(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1114 "src/Parser/TemplateParser.y" - public function yy_r156(){ +// line 1129 "src/Parser/TemplateParser.y" + public function yy_r159(){ - if ($this->yystack[$this->yyidx + -3]->minor == 'isset') { + if ($this->yystack[$this->yyidx + -4]->minor == 'isset') { $this->_retvalue = '(true'; - if (count($this->yystack[$this->yyidx + -1]->minor) == 0) { + if (count($this->yystack[$this->yyidx + -2]->minor) == 0) { throw new CompilerException("Invalid number of arguments for isset. isset expects at least one parameter."); } - foreach ($this->yystack[$this->yyidx + -1]->minor as $value) { + foreach ($this->yystack[$this->yyidx + -2]->minor as $value) { if (is_array($value)) { $this->_retvalue .= ' && (' . $value[0] . ' && null !== (' . $value[1] . ' ?? null))'; } else { $this->_retvalue .= ' && (' . $value . ' !== null)'; } } - $this->_retvalue .= ')'; - } elseif ($this->yystack[$this->yyidx + -3]->minor == 'empty') { - if (count($this->yystack[$this->yyidx + -1]->minor) != 1) { + $this->_retvalue .= ')' . $this->yystack[$this->yyidx + 0]->minor; + } elseif ($this->yystack[$this->yyidx + -4]->minor == 'empty') { + if (count($this->yystack[$this->yyidx + -2]->minor) != 1) { throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter."); } - if (is_array($this->yystack[$this->yyidx + -1]->minor[0])) { - $this->_retvalue .= '( !' . $this->yystack[$this->yyidx + -1]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -1]->minor[0][1] . '))'; + if (is_array($this->yystack[$this->yyidx + -2]->minor[0])) { + $this->_retvalue = '( !' . $this->yystack[$this->yyidx + -2]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -2]->minor[0][1] . '))' . $this->yystack[$this->yyidx + 0]->minor; } else { - $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -1]->minor[0]; + $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -2]->minor[0] . $this->yystack[$this->yyidx + 0]->minor; } } else { $p = array(); - foreach ($this->yystack[$this->yyidx + -1]->minor as $value) { + foreach ($this->yystack[$this->yyidx + -2]->minor as $value) { if (is_array($value)) { $p[] = $value[1]; } else { $p[] = $value; } } - $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -3]->minor, $p); + $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -4]->minor, $p) . $this->yystack[$this->yyidx + 0]->minor; } } -// line 1155 "src/Parser/TemplateParser.y" - public function yy_r157(){ +// line 1170 "src/Parser/TemplateParser.y" + public function yy_r160(){ 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 . '('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; } -// line 1162 "src/Parser/TemplateParser.y" - public function yy_r158(){ +// line 1177 "src/Parser/TemplateParser.y" + public function yy_r161(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } @@ -2868,52 +2930,56 @@ public static $yy_action = array( $this->compiler->appendPrefixCode("<?php {$prefixVar} = \$_smarty_tpl->getValue('".substr($this->yystack[$this->yyidx + -3]->minor,1).'\')'.';?>'); $this->_retvalue = $prefixVar .'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; } -// line 1191 "src/Parser/TemplateParser.y" - public function yy_r162(){ +// line 1206 "src/Parser/TemplateParser.y" + public function yy_r165(){ $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 1195 "src/Parser/TemplateParser.y" - public function yy_r163(){ +// line 1210 "src/Parser/TemplateParser.y" + public function yy_r166(){ $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)); } -// line 1203 "src/Parser/TemplateParser.y" - public function yy_r165(){ +// line 1218 "src/Parser/TemplateParser.y" + public function yy_r168(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -// line 1211 "src/Parser/TemplateParser.y" - public function yy_r166(){ +// line 1226 "src/Parser/TemplateParser.y" + public function yy_r169(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor); } -// line 1224 "src/Parser/TemplateParser.y" - public function yy_r169(){ +// line 1239 "src/Parser/TemplateParser.y" + public function yy_r172(){ $this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor); } -// line 1233 "src/Parser/TemplateParser.y" - public function yy_r171(){ +// line 1248 "src/Parser/TemplateParser.y" + public function yy_r174(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method'); } -// line 1238 "src/Parser/TemplateParser.y" - public function yy_r172(){ +// line 1253 "src/Parser/TemplateParser.y" + public function yy_r175(){ $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method'); } -// line 1243 "src/Parser/TemplateParser.y" - public function yy_r173(){ +// line 1258 "src/Parser/TemplateParser.y" + public function yy_r176(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, ''); } -// line 1248 "src/Parser/TemplateParser.y" - public function yy_r174(){ +// line 1263 "src/Parser/TemplateParser.y" + public function yy_r177(){ + $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); + } +// line 1268 "src/Parser/TemplateParser.y" + public function yy_r178(){ $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property'); } -// line 1253 "src/Parser/TemplateParser.y" - public function yy_r175(){ +// line 1273 "src/Parser/TemplateParser.y" + public function yy_r179(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor, 'property'); } -// line 1259 "src/Parser/TemplateParser.y" - public function yy_r176(){ +// line 1279 "src/Parser/TemplateParser.y" + public function yy_r180(){ $this->_retvalue = ' '. trim($this->yystack[$this->yyidx + 0]->minor) . ' '; } -// line 1263 "src/Parser/TemplateParser.y" - public function yy_r177(){ +// line 1283 "src/Parser/TemplateParser.y" + public function yy_r181(){ static $lops = array( 'eq' => ' == ', 'ne' => ' != ', @@ -2932,8 +2998,8 @@ public static $yy_action = array( $op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $lops[$op]; } -// line 1282 "src/Parser/TemplateParser.y" - public function yy_r178(){ +// line 1302 "src/Parser/TemplateParser.y" + public function yy_r182(){ static $tlops = array( 'isdivby' => array('op' => ' % ', 'pre' => '!('), 'isnotdivby' => array('op' => ' % ', 'pre' => '('), @@ -2945,8 +3011,8 @@ public static $yy_action = array( $op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $tlops[$op]; } -// line 1295 "src/Parser/TemplateParser.y" - public function yy_r179(){ +// line 1315 "src/Parser/TemplateParser.y" + public function yy_r183(){ static $scond = array ( 'iseven' => '!(1 & ', 'isnoteven' => '(1 & ', @@ -2956,58 +3022,62 @@ public static $yy_action = array( $op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $scond[$op]; } -// line 1309 "src/Parser/TemplateParser.y" - public function yy_r180(){ +// line 1326 "src/Parser/TemplateParser.y" + public function yy_r184(){ + $this->_retvalue = 'preg_match('; + } +// line 1333 "src/Parser/TemplateParser.y" + public function yy_r185(){ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')'; } -// line 1320 "src/Parser/TemplateParser.y" - public function yy_r183(){ +// line 1344 "src/Parser/TemplateParser.y" + public function yy_r188(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor; } -// line 1324 "src/Parser/TemplateParser.y" - public function yy_r184(){ +// line 1348 "src/Parser/TemplateParser.y" + public function yy_r189(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.','; } -// line 1332 "src/Parser/TemplateParser.y" - public function yy_r186(){ +// line 1356 "src/Parser/TemplateParser.y" + public function yy_r191(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1336 "src/Parser/TemplateParser.y" - public function yy_r187(){ +// line 1360 "src/Parser/TemplateParser.y" + public function yy_r192(){ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1352 "src/Parser/TemplateParser.y" - public function yy_r190(){ +// line 1376 "src/Parser/TemplateParser.y" + public function yy_r195(){ $this->compiler->leaveDoubleQuote(); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php($this); } -// line 1358 "src/Parser/TemplateParser.y" - public function yy_r191(){ +// line 1382 "src/Parser/TemplateParser.y" + public function yy_r196(){ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -// line 1363 "src/Parser/TemplateParser.y" - public function yy_r192(){ +// line 1387 "src/Parser/TemplateParser.y" + public function yy_r197(){ $this->_retvalue = new Dq($this, $this->yystack[$this->yyidx + 0]->minor); } -// line 1367 "src/Parser/TemplateParser.y" - public function yy_r193(){ +// line 1391 "src/Parser/TemplateParser.y" + public function yy_r198(){ $this->_retvalue = new Code('(string)'.$this->yystack[$this->yyidx + -1]->minor); } -// line 1371 "src/Parser/TemplateParser.y" - public function yy_r194(){ +// line 1395 "src/Parser/TemplateParser.y" + public function yy_r199(){ $this->_retvalue = new Code('(string)('.$this->yystack[$this->yyidx + -1]->minor.')'); } -// line 1375 "src/Parser/TemplateParser.y" - public function yy_r195(){ +// line 1399 "src/Parser/TemplateParser.y" + public function yy_r200(){ $this->_retvalue = new Code('(string)$_smarty_tpl->getValue(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')'); } -// line 1387 "src/Parser/TemplateParser.y" - public function yy_r198(){ +// line 1411 "src/Parser/TemplateParser.y" + public function yy_r203(){ $this->_retvalue = new Tag($this, $this->yystack[$this->yyidx + 0]->minor); } -// line 1391 "src/Parser/TemplateParser.y" - public function yy_r199(){ +// line 1415 "src/Parser/TemplateParser.y" + public function yy_r204(){ $this->_retvalue = new DqContent($this->yystack[$this->yyidx + 0]->minor); } diff --git a/src/Parser/TemplateParser.y b/src/Parser/TemplateParser.y index 544148f1..fecd247d 100644 --- a/src/Parser/TemplateParser.y +++ b/src/Parser/TemplateParser.y @@ -681,6 +681,11 @@ expr(res) ::= expr(e1) isin(c) value(v). { res = c . e1.',(array)'.v.')'; } + // regex matching + expr(res) ::= expr(e1) matchop(c) value(e2). { + res = c . e2 . ',' . e1 . ') '; +} + // null coalescing nullcoalescing(res) ::= expr(v) QMARK QMARK expr(e2). { res = v.' ?? '.e2; @@ -1062,12 +1067,22 @@ object(res) ::= varindexed(vi) objectchain(oc). { } } + // optional objectchain - empty +optobjectchain(res) ::= . { + res = ''; +} + + // optional objectchain - present +optobjectchain(res) ::= objectchain(oc). { + res = oc; +} + // single element objectchain(res) ::= objectelement(oe). { res = oe; } - // chain of elements + // chain of elements objectchain(res) ::= objectchain(oc) objectelement(oe). { res = oc.oe; } @@ -1111,7 +1126,7 @@ objectelement(res)::= PTR method(f). { // // function // -function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { +function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP optobjectchain(oc). { if (f == 'isset') { res = '(true'; @@ -1125,15 +1140,15 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { res .= ' && (' . $value . ' !== null)'; } } - res .= ')'; + res .= ')' . oc; } elseif (f == 'empty') { if (count(v) != 1) { throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter."); } if (is_array(v[0])) { - res .= '( !' . v[0][0] . ' || empty(' . v[0][1] . '))'; + res = '( !' . v[0][0] . ' || empty(' . v[0][1] . '))' . oc; } else { - res = 'false == ' . v[0]; + res = 'false == ' . v[0] . oc; } } else { $p = array(); @@ -1144,7 +1159,7 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { $p[] = $value; } } - res = $this->compiler->compileModifierInExpression(f, $p); + res = $this->compiler->compileModifierInExpression(f, $p) . oc; } } @@ -1244,6 +1259,11 @@ static_class_access(res) ::= ID(v). { res = array(v, ''); } + // static class constant with object chain +static_class_access(res) ::= ID(v) objectchain(oc). { + res = array(v, oc); +} + // static class variables static_class_access(res) ::= DOLLARID(v) arrayindex(a). { res = array(v, a, 'property'); @@ -1303,6 +1323,10 @@ scond(res) ::= SINGLECOND(o). { res = $scond[$op]; } +matchop(res) ::= MATCHES(o). { + res = 'preg_match('; +} + // // ARRAY element assignment // diff --git a/src/Smarty.php b/src/Smarty.php index efad0c1d..5665ff45 100644 --- a/src/Smarty.php +++ b/src/Smarty.php @@ -54,7 +54,7 @@ class Smarty extends \Smarty\TemplateBase { /** * smarty version */ - const SMARTY_VERSION = '5.5.2'; + const SMARTY_VERSION = '5.8.0'; /** * define caching modes @@ -1344,10 +1344,8 @@ class Smarty extends \Smarty\TemplateBase { } $_filepath = (string)$_file; if ($_file->isDir()) { - if (!$_compile->isDot()) { - // delete folder if empty - @rmdir($_file->getPathname()); - } + // delete folder if empty + @rmdir($_file->getPathname()); } else { // delete only php files if (substr($_filepath, -4) !== '.php') { @@ -1385,8 +1383,6 @@ class Smarty extends \Smarty\TemplateBase { && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api')) < 1) ) { opcache_invalidate($_filepath, true); - } elseif (function_exists('apc_delete_file')) { - apc_delete_file($_filepath); } } } diff --git a/src/Template/Compiled.php b/src/Template/Compiled.php index 5a07db0e..e5e2aec7 100644 --- a/src/Template/Compiled.php +++ b/src/Template/Compiled.php @@ -251,8 +251,6 @@ class Compiled extends GeneratedPhpFile { && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) ) { opcache_invalidate($this->filepath, true); - } elseif (function_exists('apc_compile_file')) { - apc_compile_file($this->filepath); } } if (defined('HHVM_VERSION')) { diff --git a/src/TemplateBase.php b/src/TemplateBase.php index f01d1107..e06b5917 100644 --- a/src/TemplateBase.php +++ b/src/TemplateBase.php @@ -104,7 +104,7 @@ abstract class TemplateBase extends Data { } // register the object $smarty->registered_objects[$object_name] = - [$object, (array)$allowed_methods_properties, (boolean)$format, (array)$block_methods]; + [$object, (array)$allowed_methods_properties, (bool)$format, (array)$block_methods]; return $this; } diff --git a/tests/PHPUnit_Smarty.php b/tests/PHPUnit_Smarty.php index 029c8f90..39663c1f 100644 --- a/tests/PHPUnit_Smarty.php +++ b/tests/PHPUnit_Smarty.php @@ -291,10 +291,8 @@ KEY `name` (`name`) } // directory ? if ($file->isDir()) { - if (!$ri->isDot()) { - // delete folder if empty - @rmdir($file->getPathname()); - } + // delete folder if empty + @rmdir($file->getPathname()); } else { unlink($file->getPathname()); } diff --git a/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php b/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php deleted file mode 100644 index d75382d0..00000000 --- a/tests/UnitTests/CacheResourceTests/Apc/CacheResourceCustomApcTest.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/** - * Smarty PHPunit tests for cache resource Apc - * - - * @author Uwe Tews - */ -include_once __DIR__ . '/../Memcache/CacheResourceCustomMemcacheTest.php'; -include_once __DIR__ . '/../_shared/PHPunitplugins/cacheresource.apctest.php'; - -/** - * class for cache resource file tests - * - * - * @preserveGlobalState disabled - * - */ -class CacheResourceCustomApcTest extends CacheResourceCustomMemcacheTest -{ - public function setUp(): void - { - if (!function_exists('apc_cache_info') || ini_get('apc.enable_cli')) { - $this->markTestSkipped('APC cache not available'); - } - $this->setUpSmarty(__DIR__); - parent::setUp(); - $this->smarty->setCachingType('apc'); - $this->smarty->registerCacheResource('apc', new Smarty_CacheResource_Apctest()); - } -} - diff --git a/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php b/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php deleted file mode 100644 index 38b061dc..00000000 --- a/tests/UnitTests/CacheResourceTests/_shared/PHPunitplugins/cacheresource.apctest.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -use Smarty\Smarty; -use Smarty\Template; -use Smarty\Template\Cached; - -require_once __DIR__ . '/../../../__shared/cacheresources/cacheresource.apc.php'; - -class Smarty_CacheResource_Apctest extends Smarty_CacheResource_Apc -{ - public $lockTime = 0; - - public function hasLock(Smarty $smarty, Cached $cached) - { - if ($this->lockTime) { - $this->lockTime--; - if (!$this->lockTime) { - $this->releaseLock($smarty, $cached); - } - } - return parent::hasLock($smarty, $cached); - } - - public function get(Template $_template) - { - $this->contents = array(); - $this->timestamps = array(); - $t = $this->getContent($_template); - - return $t ? $t : null; - } - -} diff --git a/tests/UnitTests/Compile/AttributeCompilerTest.php b/tests/UnitTests/Compile/AttributeCompilerTest.php new file mode 100644 index 00000000..9a8fbf98 --- /dev/null +++ b/tests/UnitTests/Compile/AttributeCompilerTest.php @@ -0,0 +1,193 @@ +<?php + +use Smarty\Compile\AttributeCompiler; +use Smarty\Compiler\Template; + +class AttributeCompilerTest extends PHPUnit\Framework\TestCase +{ + /** + * The template compiler. + */ + private $template_compiler; + + /** + * The attributes + */ + private $attributes = []; + + /** + * @inheritDoc + * Set up attribute compiler class + */ + protected function setUp(): void + { + $this->template_compiler = $this->createMock(Template::class); + + // reset attributes to empty arrays + $this->attributes = [ + 'required_attributes' => [], + 'optional_attributes' => [], + 'shorttag_order' => [], + 'option_flags' => [], + ]; + } + + /** + * Create the attribute compiler for testing. + */ + private function createAttributeCompiler() { + return new AttributeCompiler( + $this->attributes['required_attributes'], + $this->attributes['optional_attributes'], + $this->attributes['shorttag_order'], + $this->attributes['option_flags'] + ); + } + + /** + * Tests shorthand attribute compiling. + */ + public function testAttributeCompiler(): void + { + $this->attributes['shorttag_order'] = ['shorttag']; + $this->attributes['required_attributes'] = ['required']; + $this->attributes['option_flags'] = ['option', 'option_two']; + + $payload = [ + 0 => 'shorttag value', + 1 => [ + 'required' => 'required_value' + ], + 2 => 'option', + ]; + + $this->assertEquals( + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, $payload), + [ + 'shorttag' => 'shorttag value', + 'required' => 'required_value', + 'option' => true, + 'option_two' => false, + ] + ); + } + + /** + * Tests normal optional attribute compiling. + */ + public function testAttributeCompilerOptionalArguments(): void + { + $this->attributes['optional_attributes'] = ['optional']; + + $payload = [ + 0 => [ + 'optional' => 'optional value' + ], + ]; + + $this->assertEquals( + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, $payload), + [ + 'optional' => 'optional value', + ] + ); + + $this->assertEquals( + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, []), + [] + ); + } + + /** + * Tests any attribute compiling. + */ + public function testAttributeCompilerAnyOptionalArguments(): void + { + $this->attributes['optional_attributes'] = ['_any']; + + $payload = [ + 0 => [ + 'optional' => 'optional value' + ], + 1 => [ + 'optional_two' => 'optional value two' + ], + ]; + + $this->assertEquals( + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, $payload), + [ + 'optional' => 'optional value', + 'optional_two' => 'optional value two', + ] + ); + } + + /** + * Test if the attribute compiler tries to throw a too many shorthand attributes error. + */ + public function testAttributeCompilerTooManyShorthands(): void + { + $payload = [ + 0 => 'option one', + ]; + + $this->template_compiler + ->expects(self::once()) + ->method('trigger_template_error') + ->with('too many shorthand attributes', null, true); + + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, $payload); + } + + /** + * Test if the attribute compiler tries to throw a missing required attribute error. + */ + public function testAttributeCompilerWithMissingRequiredAttributes(): void + { + $this->attributes['required_attributes'] = ['required']; + + $this->template_compiler + ->expects(self::once()) + ->method('trigger_template_error') + ->with('missing \'required\' attribute', null, true); + + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, []); + } + + /** + * Test if the attribute compiler tries to throw a illegal value template error. + */ + public function testAttributeCompilerWithInvalidOptionAttribute(): void + { + $this->attributes['option_flags'] = ['option']; + + $this->template_compiler + ->expects(self::once()) + ->method('trigger_template_error') + ->with('illegal value \'\'foo\'\' for options flag \'option\'', null, true); + + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, [0 => ['option' => 'foo']]); + } + + /** + * Test if the attribute compiler tries to throw an unexpected attribute error. + */ + public function testAttributeCompilerWithInvalidUnexpectedAttribute(): void + { + $this->template_compiler + ->expects(self::once()) + ->method('trigger_template_error') + ->with('unexpected \'unexpected\' attribute', null, true); + + $this->createAttributeCompiler() + ->getAttributes($this->template_compiler, [0 => ['unexpected' => 'bar']]); + } +} diff --git a/tests/UnitTests/Compile/FunctionCallCompilerTest.php b/tests/UnitTests/Compile/FunctionCallCompilerTest.php new file mode 100644 index 00000000..2eb0e5a1 --- /dev/null +++ b/tests/UnitTests/Compile/FunctionCallCompilerTest.php @@ -0,0 +1,62 @@ +<?php + +use Smarty\Compile\FunctionCallCompiler; +use Smarty\Compiler\Template; +use Smarty\FunctionHandler\AttributeFunctionHandlerInterface; +use Smarty\Smarty; + +class FunctionCallCompilerTest extends PHPUnit\Framework\TestCase +{ + /** + * @inheritDoc + * Set up attribute compiler class + */ + protected function setUp(): void + { + $this->smarty = $this->createMock(Smarty::class); + $this->template_compiler = $this->createMock(Template::class); + $this->template_compiler + ->expects(self::once()) + ->method('getSmarty') + ->willReturn($this->smarty); + } + + public function testAttributeFunctionHandlerInterface(): void + { + $attribute_function_handler = $this->createMock(AttributeFunctionHandlerInterface::class); + + $attribute_function_handler + ->expects(self::once()) + ->method('getSupportedAttributes') + ->willReturn([ + 'required_attributes' => ['required'], + 'optional_attributes' => ['optional'], + 'shorttag_order' => ['short'], + 'option_flags' => ['option'], + ]); + + $args = [ + 0 => 'short', + 1 => 'option', + 2 => [ + 'optional' => 'optional', + ], + 3 => [ + 'required' => 'required', + ], + ]; + + $this->smarty + ->expects(self::once()) + ->method('getFunctionHandler') + ->with('method') + ->willReturn($attribute_function_handler); + + $function_call_compiler = new FunctionCallCompiler(); + + $this->assertEquals( + $function_call_compiler->compile($args, $this->template_compiler, [], null, 'method'), + '$_smarty_tpl->getSmarty()->getFunctionHandler(\'method\')->handle(array(\'short\'=>short,\'option\'=>1,\'optional\'=>optional,\'required\'=>required), $_smarty_tpl)' + ); + } +} diff --git a/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php b/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php index 7836172c..b3c231ac 100644 --- a/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php +++ b/tests/UnitTests/TemplateSource/StaticClass/StaticClassAccessTest.php @@ -64,6 +64,21 @@ class StaticClassAccessTest extends PHPUnit_Smarty $this->assertEquals('3', $this->smarty->fetch($tpl)); } + /** + * test static class constant chain + */ + public function testRegisteredBackedEnum() + { + if (PHP_VERSION_ID < 80100) { + $this->markTestSkipped('Enums only available after PHP >= 8.1'); + return; + } else { + $this->smarty->registerClass('RegisteredBackedEnum', MyBackedEnum::class); + $tpl = $this->smarty->createTemplate('eval:{RegisteredBackedEnum::A->value}'); + $this->assertEquals('3', $this->smarty->fetch($tpl)); + } + } + /** * test static class method */ @@ -134,3 +149,7 @@ class mystaticclass return $i * $i; } } + +if (PHP_VERSION_ID >= 80100) { + eval('enum MyBackedEnum: int { case A = 3; }'); +}
\ No newline at end of file diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php new file mode 100644 index 00000000..c1e34bdd --- /dev/null +++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php @@ -0,0 +1,208 @@ +<?php +/** + * Smarty PHPunit tests for object chain functionality after function calls + * Tests the new feature: {$x = collect($data)->filter()->values()->toJson()} + * + * @author Smarty Vibe + */ + +/** + * Helper class to simulate a chainable collection object + */ +class ChainableCollection +{ + private $data; + + public function __construct($data) + { + $this->data = $data; + } + + public function filter() + { + $this->data = array_filter($this->data); + return $this; + } + + public function values() + { + $this->data = array_values($this->data); + return $this; + } + + public function toJson() + { + return json_encode($this->data); + } + + public function toArray() + { + return $this->data; + } + + public function count() + { + return count($this->data); + } +} + +/** + * Modifier plugin that returns a chainable object (simulates collect()) + */ +function smarty_modifier_collect($data) +{ + return new ChainableCollection($data); +} + +/** + * Modifier plugin that returns an object with methods + */ +function smarty_modifier_create_object($value = null) +{ + return new class { + public function getName() { + return 'TestObject'; + } + + public function getNext() { + return new class { + public function getValue() { + return 'ChainedValue'; + } + }; + } + }; +} + +/** + * class for function object chain tests + * + * @preserveGlobalState disabled + * + */ +class FunctionObjectChainTest extends PHPUnit_Smarty +{ + public function setUp(): void + { + $this->setUpSmarty(__DIR__); + + // Register modifier plugins that return chainable objects + // These are called like functions: {collect($data)} + $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'collect', 'smarty_modifier_collect'); + $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'create_object', 'smarty_modifier_create_object'); + } + + public function testInit() + { + $this->cleanDirs(); + } + + /** + * Test the NEW feature: function call followed by method chain + * This is the core test for: {$x = collect($data)->filter()->values()->toJson()} + */ + public function testFunctionCallWithMethodChain() + { + $data = [1, 2, 0, 3, null, 4, '', 5]; + $this->smarty->assign('data', $data); + + // Test the new syntax: function()->method()->method()->method() + $result = $this->smarty->fetch('string:{collect($data)->filter()->values()->toJson()}'); + $this->assertEquals('[1,2,3,4,5]', $result); + } + + /** + * Test function call with method chain assigned to a variable + * This tests: {$x = collect($data)->filter()->values()->toJson()} + */ + public function testFunctionCallWithMethodChainAssignment() + { + $data = ['a', 'b', '', 'c', null, 'd']; + $this->smarty->assign('data', $data); + + // Test assignment with chained methods + $result = $this->smarty->fetch('string:{$result = collect($data)->filter()->values()->toJson()}{$result}'); + $this->assertEquals('["a","b","c","d"]', $result); + } + + /** + * Test function call with single method chain + */ + public function testFunctionCallWithSingleMethod() + { + $data = [1, 2, 3]; + $this->smarty->assign('data', $data); + + $result = $this->smarty->fetch('string:{collect($data)->count()}'); + $this->assertEquals('3', $result); + } + + /** + * Test function call with nested method chains + */ + public function testFunctionCallWithNestedChain() + { + $result = $this->smarty->fetch('string:{create_object("")->getNext()->getValue()}'); + $this->assertEquals('ChainedValue', $result); + } + + /** + * Test that old syntax still works (two-step process) + */ + public function testOldSyntaxStillWorks() + { + $data = [1, 2, 0, 3]; + $this->smarty->assign('data', $data); + + // Old syntax: assign to variable first, then chain + $result = $this->smarty->fetch('string:{$x = collect($data)}{$x->filter()->values()->toJson()}'); + $this->assertEquals('[1,2,3]', $result); + } + + /** + * Test object chain functionality using template file + */ + public function testFunctionObjectChainFromTemplateFile() + { + $data = ['foo', '', 'bar', null, 'baz']; + $this->smarty->assign('data', $data); + + $result = $this->smarty->fetch('test_function_chain.tpl'); + // Expected: JSON of filtered array and count + $this->assertStringContainsString('["foo","bar","baz"]', $result); + $this->assertStringContainsString('3', $result); + } + + /** + * Test complex chaining with multiple operations + * This demonstrates the power of the new feature + */ + public function testComplexChaining() + { + $data = [1, 2, 0, 3, '', 4, null, 5, false, 6]; + $this->smarty->assign('data', $data); + + // Complex chain: collect -> filter -> values -> toArray + $result = $this->smarty->fetch('string:{$filtered = collect($data)->filter()->values()->toArray()}{$filtered|@json_encode}'); + $this->assertEquals('[1,2,3,4,5,6]', $result); + } + + /** + * Test that demonstrates the benefit: one line vs multiple lines + */ + public function testNewSyntaxVsOldSyntax() + { + $data = [10, 20, 0, 30]; + $this->smarty->assign('data', $data); + + // NEW syntax (single line) + $new = $this->smarty->fetch('string:{collect($data)->filter()->count()}'); + + // OLD syntax (multiple steps) + $old = $this->smarty->fetch('string:{$temp = collect($data)}{$temp = $temp->filter()}{$temp->count()}'); + + // Both should produce the same result + $this->assertEquals('3', $new); + $this->assertEquals($new, $old); + } +}
\ No newline at end of file diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl new file mode 100644 index 00000000..5d576834 --- /dev/null +++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl @@ -0,0 +1,4 @@ +{* Test template for NEW function object chain feature *} +{* Test: function()->method()->method()->method() *} +{collect($data)->filter()->values()->toJson()} +{collect($data)->filter()->count()}
\ No newline at end of file diff --git a/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php b/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php new file mode 100644 index 00000000..206b67ce --- /dev/null +++ b/tests/UnitTests/TemplateSource/ValueTests/Operators/MatchesOperatorTest.php @@ -0,0 +1,118 @@ +<?php + +require_once __DIR__ . '/../../../../Bootstrap.php'; + +class MatchesOperatorTest extends PHPUnit_Smarty { + public function setUp(): void + { + $this->setUpSmarty(__DIR__); + } + + public function testInit() + { + $this->cleanDirs(); + } + + /** + * Test basic regex matching functionality + */ + public function testBasicMatches() { + // Test string matching pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello" matches "/^[a-z]+$/"}Match!{else}No match{/if}')); + + // Test no match + $this->assertEquals('No match', $this->smarty->fetch('string:{if "123" matches "/^[a-z]+$/"}Match!{else}No match{/if}')); + + // Test with variables + $this->smarty->assign('name', 'hello'); + $this->smarty->assign('pattern', '/^[a-z]+$/'); + $this->assertEquals('Match!', $this->smarty->fetch('string:{if $name matches $pattern}Match!{else}No match{/if}')); + + // Test no match with variables + $this->smarty->assign('number', '123'); + $this->assertEquals('No match', $this->smarty->fetch('string:{if $number matches $pattern}Match!{else}No match{/if}')); + } + + /** + * Test different regex patterns + */ + public function testDifferentPatterns() { + // Test numeric pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "123" matches "/^[0-9]+$/"}Match!{else}No match{/if}')); + + // Test email pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "test@example.com" matches "/^[^@]+@[^@]+\.[^@]+$/"}Match!{else}No match{/if}')); + + // Test case insensitive pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "Hello" matches "/hello/i"}Match!{else}No match{/if}')); + + // Test pattern with special characters + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello-world" matches "/^[a-z-]+$/"}Match!{else}No match{/if}')); + } + + /** + * Test regex patterns with modifiers + */ + public function testPatternModifiers() { + // Test case insensitive modifier + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "HELLO" matches "/hello/i"}Match!{else}No match{/if}')); + + // Test multiline modifier + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello\nworld" matches "/world$/m"}Match!{else}No match{/if}')); + + // Test dotall modifier + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "hello\nworld" matches "/hello.world/s"}Match!{else}No match{/if}')); + } + + /** + * Test complex expressions with matches operator + */ + public function testComplexExpressions() { + // Test with logical AND + $this->smarty->assign('name', 'hello'); + $this->smarty->assign('pattern', '/^[a-z]+$/'); + $this->smarty->assign('length', 5); + $this->assertEquals('Valid!', $this->smarty->fetch('string:{if $name matches $pattern && $length > 3}Valid!{else}Invalid{/if}')); + + // Test with logical OR + $this->assertEquals('Valid!', $this->smarty->fetch('string:{if $name matches $pattern || $length < 3}Valid!{else}Invalid{/if}')); + + // Test in elseif + $this->assertEquals('ElseIf!', $this->smarty->fetch('string:{if $name matches "/^[0-9]+$/"}No{elseif $name matches $pattern}ElseIf!{else}Else{/if}')); + + // Test in while loop condition (should work with constant patterns) + $result = $this->smarty->fetch('string:{assign var="i" value=0}{while $i < 2 && "test" matches "/test/"}{$i}{assign var="i" value=$i+1}{/while}'); + $this->assertEquals('01', $result); + } + + /** + * Test edge cases and error handling + */ + public function testEdgeCases() { + // Test with empty string + $this->assertEquals('No match', $this->smarty->fetch('string:{if "" matches "/.+/"}Match!{else}No match{/if}')); + + // Test with complex pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "abc123" matches "/^[a-z]+[0-9]+$/"}Match!{else}No match{/if}')); + + // Test with single character pattern + $this->assertEquals('Match!', $this->smarty->fetch('string:{if "a" matches "/a/"}Match!{else}No match{/if}')); + } + + /** + * Test that invalid patterns still work (they will cause PHP warnings but not break the template) + * Note: This test is commented out because invalid patterns cause PHP warnings that fail the test + * In production, invalid patterns would cause warnings but the template would still execute + */ + /* + public function testInvalidPatterns() { + // This will cause a PHP warning but should not break the template execution + $this->smarty->assign('invalid_pattern', 'not-a-valid-pattern'); + $this->smarty->assign('name', 'hello'); + + // The template should execute and reach the else branch due to the invalid pattern + $result = $this->smarty->fetch('string:{if $name matches $invalid_pattern}Match!{else}No match{/if}'); + $this->assertEquals('No match', $result); + } + */ +}
\ No newline at end of file diff --git a/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php b/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php deleted file mode 100644 index 3f437888..00000000 --- a/tests/UnitTests/__shared/cacheresources/cacheresource.apc.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php - -/** - * APC CacheResource - * CacheResource Implementation based on the KeyValueStore API to use - * memcache as the storage resource for Smarty's output caching. - * * - * - - * @author Uwe Tews - */ -class Smarty_CacheResource_Apc extends \Smarty\Cacheresource\KeyValueStore -{ - - /** - * Read values for a set of keys from cache - * - * @param array $keys list of keys to fetch - * - * @return array list of values with the given keys used as indexes - * @return boolean true on success, false on failure - */ - protected function read(array $keys) - { - $_res = array(); - $res = apc_fetch($keys); - foreach ($res as $k => $v) { - $_res[ $k ] = $v; - } - return $_res; - } - - /** - * Save values for a set of keys to cache - * - * @param array $keys list of values to save - * @param int $expire expiration time - * - * @return boolean true on success, false on failure - */ - protected function write(array $keys, $expire = null) - { - foreach ($keys as $k => $v) { - apc_store($k, $v, $expire); - } - return true; - } - - /** - * Remove values from cache - * - * @param array $keys list of keys to delete - * - * @return boolean true on success, false on failure - */ - protected function delete(array $keys) - { - foreach ($keys as $k) { - apc_delete($k); - } - return true; - } - - /** - * Remove *all* values from cache - * - * @return boolean true on success, false on failure - */ - protected function purge() - { - return apc_clear_cache('user'); - } -} diff --git a/utilities/testrunners/php85/Dockerfile b/utilities/testrunners/php85/Dockerfile new file mode 100644 index 00000000..46bde811 --- /dev/null +++ b/utilities/testrunners/php85/Dockerfile @@ -0,0 +1,10 @@ +FROM php:8.5-rc-cli-bullseye + +## Basic utilities +RUN apt-get update -yqq && apt-get install -y curl apt-utils git zip unzip + +## Composer +COPY ./utilities/testrunners/shared/install-composer.sh /root/install-composer.sh +WORKDIR /root +RUN sh ./install-composer.sh +RUN mv ./composer.phar /usr/local/bin/composer |
